diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-09-03 19:07:48 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-09-03 19:07:48 +0200 |
commit | 72a5fbd8ea41d44c5b8d6ab3483c7701e0126726 (patch) | |
tree | d471e584eac426b4730117de7cf74446b1a0b785 /sys/src/cmd/mothra/libpanel | |
parent | c8dd01d5f673d62555ac773a61798901784445de (diff) |
mothra: subscript and superscript support
Diffstat (limited to 'sys/src/cmd/mothra/libpanel')
-rw-r--r-- | sys/src/cmd/mothra/libpanel/panel.h | 7 | ||||
-rw-r--r-- | sys/src/cmd/mothra/libpanel/rtext.c | 18 |
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; |