summaryrefslogtreecommitdiff
path: root/sys/src/cmd/mothra/libpanel
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-09-03 19:07:48 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2015-09-03 19:07:48 +0200
commit72a5fbd8ea41d44c5b8d6ab3483c7701e0126726 (patch)
treed471e584eac426b4730117de7cf74446b1a0b785 /sys/src/cmd/mothra/libpanel
parentc8dd01d5f673d62555ac773a61798901784445de (diff)
mothra: subscript and superscript support
Diffstat (limited to 'sys/src/cmd/mothra/libpanel')
-rw-r--r--sys/src/cmd/mothra/libpanel/panel.h7
-rw-r--r--sys/src/cmd/mothra/libpanel/rtext.c18
2 files changed, 15 insertions, 10 deletions
diff --git a/sys/src/cmd/mothra/libpanel/panel.h b/sys/src/cmd/mothra/libpanel/panel.h
index 7c06bc2fd..3d73a81bd 100644
--- a/sys/src/cmd/mothra/libpanel/panel.h
+++ b/sys/src/cmd/mothra/libpanel/panel.h
@@ -13,6 +13,7 @@ struct Rtext{
void *user; /* user data */
int space; /* how much space before, if no break */
int indent; /* how much space before, after a break */
+ int voff; /* vertical offset (for subscripts and superscripts) */
Image *b; /* what to display, if nonzero */
Panel *p; /* what to display, if nonzero and b==0 */
Font *font; /* font in which to draw text */
@@ -173,9 +174,9 @@ void plinittextview(Panel *, int, Point, Rtext *, void (*)(Panel *, int, Rtext *
/*
* Rtext constructors & destructor
*/
-Rtext *plrtstr(Rtext **, int, int, Font *, char *, int, void *);
-Rtext *plrtbitmap(Rtext **, int, int, Image *, int, void *);
-Rtext *plrtpanel(Rtext **, int, int, Panel *, void *);
+Rtext *plrtstr(Rtext **, int, int, int, Font *, char *, int, void *);
+Rtext *plrtbitmap(Rtext **, int, int, int, Image *, int, void *);
+Rtext *plrtpanel(Rtext **, int, int, int, Panel *, void *);
void plrtfree(Rtext *);
void plrtseltext(Rtext *, Rtext *, Rtext *);
char *plrtsnarftext(Rtext *);
diff --git a/sys/src/cmd/mothra/libpanel/rtext.c b/sys/src/cmd/mothra/libpanel/rtext.c
index 92f195633..8f8fe4704 100644
--- a/sys/src/cmd/mothra/libpanel/rtext.c
+++ b/sys/src/cmd/mothra/libpanel/rtext.c
@@ -13,13 +13,14 @@
#define LEAD 4 /* extra space between lines */
#define BORD 2 /* extra border for images */
-Rtext *pl_rtnew(Rtext **t, int space, int indent, Image *b, Panel *p, Font *f, char *s, int flags, void *user){
+Rtext *pl_rtnew(Rtext **t, int space, int indent, int voff, Image *b, Panel *p, Font *f, char *s, int flags, void *user){
Rtext *new;
new=pl_emalloc(sizeof(Rtext));
new->flags=flags;
new->user=user;
new->space=space;
new->indent=indent;
+ new->voff=voff;
new->b=b;
new->p=p;
new->font=f;
@@ -34,14 +35,14 @@ Rtext *pl_rtnew(Rtext **t, int space, int indent, Image *b, Panel *p, Font *f, c
(*t)->last=new;
return new;
}
-Rtext *plrtpanel(Rtext **t, int space, int indent, Panel *p, void *user){
- return pl_rtnew(t, space, indent, 0, p, 0, 0, 1, user);
+Rtext *plrtpanel(Rtext **t, int space, int indent, int voff, Panel *p, void *user){
+ return pl_rtnew(t, space, indent, voff, 0, p, 0, 0, 1, user);
}
-Rtext *plrtstr(Rtext **t, int space, int indent, Font *f, char *s, int flags, void *user){
- return pl_rtnew(t, space, indent, 0, 0, f, s, flags, user);
+Rtext *plrtstr(Rtext **t, int space, int indent, int voff, Font *f, char *s, int flags, void *user){
+ return pl_rtnew(t, space, indent, voff, 0, 0, f, s, flags, user);
}
-Rtext *plrtbitmap(Rtext **t, int space, int indent, Image *b, int flags, void *user){
- return pl_rtnew(t, space, indent, b, 0, 0, 0, flags, user);
+Rtext *plrtbitmap(Rtext **t, int space, int indent, int voff, Image *b, int flags, void *user){
+ return pl_rtnew(t, space, indent, voff, b, 0, 0, 0, flags, user);
}
void plrtfree(Rtext *t){
Rtext *next;
@@ -102,6 +103,7 @@ Point pl_rtfmt(Rtext *t, int wid){
d=tp->font->height-a;
w=tp->wid=stringwidth(tp->font, tp->text);
}
+ a-=tp->voff,d+=tp->voff;
if(x+w+space>wid) break;
if(a>ascent) ascent=a;
if(d>descent) descent=d;
@@ -128,6 +130,7 @@ Point pl_rtfmt(Rtext *t, int wid){
for(;;){
t->topy=topy;
t->r.min.x=p.x;
+ p.y+=t->voff;
if(t->b){
t->r.max.y=p.y+BORD;
t->r.min.y=p.y-(t->b->r.max.y-t->b->r.min.y)-BORD;
@@ -143,6 +146,7 @@ Point pl_rtfmt(Rtext *t, int wid){
t->r.max.y=t->r.min.y+t->font->height;
p.x+=t->wid;
}
+ p.y-=t->voff;
t->r.max.x=p.x;
t->nextline=eline;
t=t->next;