Introduction
Introduction Statistics Contact Development Disclaimer Help
Merge pull request #1 from siebenmann/xft-fix - sam - An updated version of the…
git clone git://vernunftzentrum.de/sam.git
Log
Files
Refs
LICENSE
---
commit 552fde3f668763fa3256e05261aa88b0bd966388
parent f8d68c3f2e8aa987821894c9b82aa63bb411e714
Author: Rob King <[email protected]>
Date: Tue, 4 Aug 2015 18:38:37 -0500
Merge pull request #1 from siebenmann/xft-fix
Fix samterm's view of the font height of Xft fonts
Diffstat:
include/frame.h | 1 +
libXg/menuhit.c | 21 +++++++++++++--------
libframe/frdelete.c | 10 +++++-----
libframe/frdraw.c | 3 +--
libframe/frinit.c | 7 +++++--
libframe/frinsert.c | 15 ++++++++-------
libframe/frptofchar.c | 2 +-
libframe/frselect.c | 6 +++---
libframe/frutil.c | 6 +++---
samterm/flayer.c | 4 ++--
samterm/main.c | 2 +-
samterm/scroll.c | 2 +-
12 files changed, 44 insertions(+), 35 deletions(-)
---
diff --git a/include/frame.h b/include/frame.h
@@ -27,6 +27,7 @@ struct Frame
short left; /* left edge of text */
ushort nbox, nalloc;
ushort maxtab; /* max size of tab, in pi…
+ ushort fheight; /* font height, in pixels */
ushort nchars; /* # runes in frame */
ushort nlines; /* # lines with text */
ushort maxlines; /* total # lines in frame */
diff --git a/libXg/menuhit.c b/libXg/menuhit.c
@@ -25,6 +25,11 @@ static uchar menutxtbits[] = {
0x22, 0x22, 0x88, 0x88, 0x22, 0x22, 0x88, 0x88,
};
+static int
+fontheight() {
+ return font->ascent + font->descent;
+}
+
/*
* r is a rectangle holding the text elements.
* return the rectangle, including its black edge, holding element i.
@@ -34,8 +39,8 @@ menurect(Rectangle r, int i)
{
if(i < 0)
return Rect(0, 0, 0, 0);
- r.min.y += (font->height+Vspacing)*i;
- r.max.y = r.min.y+font->height+Vspacing;
+ r.min.y += (fontheight()+Vspacing)*i;
+ r.max.y = r.min.y+fontheight()+Vspacing;
return inset(r, Border-Margin);
}
@@ -48,7 +53,7 @@ menusel(Rectangle r, Point p)
{
if(!ptinrect(p, r))
return -1;
- return (p.y-r.min.y)/(font->height+Vspacing);
+ return (p.y-r.min.y)/(fontheight()+Vspacing);
}
/*
@@ -92,7 +97,7 @@ menupaint(Menu *menu, Rectangle textr, int off, int nitemdraw…
r = inset(textr, Border-Margin);
bitblt(&screen, r.min, &screen, r, 0);
pt = Pt(textr.min.x+textr.max.x, textr.min.y);
- for(i = 0; i<nitemdrawn; i++, pt.y += font->height+Vspacing){
+ for(i = 0; i<nitemdrawn; i++, pt.y += fontheight()+Vspacing){
item = menu->item? menu->item[i+off] : (*menu->gen)(i+off);
string(&screen,
Pt((pt.x-strwidth(font, item))/2, pt.y),
@@ -144,7 +149,7 @@ menuhit(int but, Mouse *m, Menu *menu)
}
if(menu->lasthit<0 || menu->lasthit>=nitem)
menu->lasthit = 0;
- screenitem = (Dy(screen.r)-10)/(font->height+Vspacing);
+ screenitem = (Dy(screen.r)-10)/(fontheight()+Vspacing);
if(nitem>Maxunscroll || nitem>screenitem){
scrolling = 1;
nitemdrawn = Nscroll;
@@ -164,8 +169,8 @@ menuhit(int but, Mouse *m, Menu *menu)
off = 0;
lasti = menu->lasthit;
}
- r = inset(Rect(0, 0, wid, nitemdrawn*(font->height+Vspacing)), -Margin…
- r = rsubp(r, Pt(wid/2, lasti*(font->height+Vspacing)+font->height/2));
+ r = inset(Rect(0, 0, wid, nitemdrawn*(fontheight()+Vspacing)), -Margin…
+ r = rsubp(r, Pt(wid/2, lasti*(fontheight()+Vspacing)+fontheight()/2));
r = raddp(r, m->xy);
pt = Pt(0, 0);
if(r.max.x>screen.r.max.x)
@@ -180,7 +185,7 @@ menuhit(int but, Mouse *m, Menu *menu)
textr.max.x = menur.max.x-Margin;
textr.min.x = textr.max.x-maxwid;
textr.min.y = menur.min.y+Margin;
- textr.max.y = textr.min.y + nitemdrawn*(font->height+Vspacing);
+ textr.max.y = textr.min.y + nitemdrawn*(fontheight()+Vspacing);
if(scrolling){
scrollr = inset(menur, Border);
scrollr.max.x = scrollr.min.x+Scrollwid;
diff --git a/libframe/frdelete.c b/libframe/frdelete.c
@@ -52,7 +52,7 @@ frdelete(Frame *f, ulong p0, ulong p1)
r.min = pt1;
r.max = pt1;
r.max.x += b->wid;
- r.max.y += f->font->height;
+ r.max.y += f->fheight;
bitblt(f->b, pt0, f->b, r, S);
if(pt0.y == pt1.y)
r.min.x = r.max.x-(pt1.x-pt0.x);
@@ -72,9 +72,9 @@ frdelete(Frame *f, ulong p0, ulong p1)
if(n1 < f->nbox){
int q0, q1, q2;
- q0 = pt0.y+f->font->height;
- q1 = pt1.y+f->font->height;
- q2 = pt2.y+f->font->height;
+ q0 = pt0.y+f->fheight;
+ q1 = pt1.y+f->fheight;
+ q2 = pt2.y+f->fheight;
bitblt(f->b, pt0, f->b, Rect(pt1.x, pt1.y, f->r.max.x,…
bitblt(f->b, Pt(f->r.min.x, q0), f->b, Rect(f->r.min.x…
frselectf(f, Pt(pt2.x, pt2.y-(pt1.y-pt0.y)), pt2, 0);
@@ -99,6 +99,6 @@ frdelete(Frame *f, ulong p0, ulong p1)
f->nchars -= p1-p0;
pt0 = frptofchar(f, f->nchars);
n = f->nlines;
- f->nlines = (pt0.y-f->r.min.y)/f->font->height+(pt0.x>f->left);
+ f->nlines = (pt0.y-f->r.min.y)/f->fheight+(pt0.x>f->left);
return n - f->nlines;
}
diff --git a/libframe/frdraw.c b/libframe/frdraw.c
@@ -22,7 +22,6 @@ _frdraw(Frame *f, Point pt)
{
Frbox *b;
int nb, n;
-
for(b=f->box,nb=0; nb<f->nbox; nb++, b++){
_frcklinewrap0(f, &pt, b);
if(pt.y == f->r.max.y){
@@ -41,7 +40,7 @@ _frdraw(Frame *f, Point pt)
pt.x += b->wid;
}else{
if(b->a.b.bc == '\n')
- pt.x = f->left, pt.y+=f->font->height;
+ pt.x = f->left, pt.y+=f->fheight;
else
pt.x += _frnewwid(f, pt, b);
}
diff --git a/libframe/frinit.c b/libframe/frinit.c
@@ -8,6 +8,9 @@ void
frinit(Frame *f, Rectangle r, XftFont *ft, Bitmap *b)
{
f->font = ft;
+ /* ft->height is NOT CORRECT; we must use ascent + descent to
+ clear the lowest edge of characters. - cks */
+ f->fheight = ft->ascent + ft->descent;
f->maxtab = 8*charwidth(ft, '0');
f->nbox = 0;
f->nalloc = 0;
@@ -26,9 +29,9 @@ frsetrects(Frame *f, Rectangle r, Bitmap *b)
f->b = b;
f->entire = r;
f->r = r;
- f->r.max.y -= (r.max.y-r.min.y)%f->font->height;
+ f->r.max.y -= (r.max.y-r.min.y)%f->fheight;
f->left = r.min.x+1;
- f->maxlines = (r.max.y-r.min.y)/f->font->height;
+ f->maxlines = (r.max.y-r.min.y)/f->fheight;
}
void
diff --git a/libframe/frinsert.c b/libframe/frinsert.c
@@ -20,6 +20,7 @@ bxscan(Frame *f, Rune *sp, Rune *ep, Point *ppt)
frame.r = f->r;
frame.b = f->b;
frame.font = f->font;
+ frame.fheight = f->font->ascent + f->font->descent;
frame.maxtab = f->maxtab;
frame.left = f->left;
frame.nbox = 0;
@@ -169,14 +170,14 @@ frinsert(Frame *f, Rune *sp, Rune *ep, ulong p0)
_frdelbox(f, n0, f->nbox-1);
}
if(n0 == f->nbox)
- f->nlines = (pt1.y-f->r.min.y)/f->font->height+(pt1.x>f->left);
+ f->nlines = (pt1.y-f->r.min.y)/f->fheight+(pt1.x>f->left);
else if(pt1.y!=pt0.y){
int q0, q1;
y = f->r.max.y;
- q0 = pt0.y+f->font->height;
- q1 = pt1.y+f->font->height;
- f->nlines += (q1-q0)/f->font->height;
+ q0 = pt0.y+f->fheight;
+ q1 = pt1.y+f->fheight;
+ f->nlines += (q1-q0)/f->fheight;
if(f->nlines > f->maxlines)
chopframe(f, ppt1, p0, nn0);
if(pt1.y < y){
@@ -201,14 +202,14 @@ frinsert(Frame *f, Rune *sp, Rune *ep, ulong p0)
r.min = pts[npts].pt0;
r.max = r.min;
r.max.x += b->wid;
- r.max.y += f->font->height;
+ r.max.y += f->fheight;
bitblt(f->b, pt, f->b, r, S);
if(pt.y < y){ /* clear bit hanging off right */
r.min = pt;
r.max = pt;
r.min.x += b->wid;
r.max.x = f->r.max.x;
- r.max.y += f->font->height;
+ r.max.y += f->fheight;
bitblt(f->b, r.min, f->b, r, 0);
}
y = pt.y;
@@ -216,7 +217,7 @@ frinsert(Frame *f, Rune *sp, Rune *ep, ulong p0)
r.min = pt;
r.max = pt;
r.max.x += b->wid;
- r.max.y += f->font->height;
+ r.max.y += f->fheight;
if(r.max.x >= f->r.max.x)
r.max.x = f->r.max.x;
bitblt(f->b, r.min, f->b, r, 0);
diff --git a/libframe/frptofchar.c b/libframe/frptofchar.c
@@ -57,7 +57,7 @@ Point
_frgrid(Frame *f, Point p)
{
p.y -= f->r.min.y;
- p.y -= p.y%f->font->height;
+ p.y -= p.y%f->fheight;
p.y += f->r.min.y;
if(p.x > f->r.max.x)
p.x = f->r.max.x;
diff --git a/libframe/frselect.c b/libframe/frselect.c
@@ -57,9 +57,9 @@ frselectf(Frame *f, Point p0, Point p1, Fcode c)
p1.x = f->r.min.x;
q0 = p0;
q1 = p1;
- q0.y += f->font->height;
- q1.y += f->font->height;
- n = (p1.y-p0.y)/f->font->height;
+ q0.y += f->fheight;
+ q1.y += f->fheight;
+ n = (p1.y-p0.y)/f->fheight;
if(f->b == 0)
berror("frselectf b==0");
if(p0.y == f->r.max.y)
diff --git a/libframe/frutil.c b/libframe/frutil.c
@@ -35,7 +35,7 @@ _frcklinewrap(Frame *f, Point *p, Frbox *b)
{
if((b->nrune<0? b->a.b.minwid : b->wid) > f->r.max.x-p->x){
p->x = f->left;
- p->y += f->font->height;
+ p->y += f->fheight;
}
}
@@ -44,7 +44,7 @@ _frcklinewrap0(Frame *f, Point *p, Frbox *b)
{
if(_frcanfit(f, *p, b) == 0){
p->x = f->left;
- p->y += f->font->height;
+ p->y += f->fheight;
}
}
@@ -53,7 +53,7 @@ _fradvance(Frame *f, Point *p, Frbox *b)
{
if(b->nrune<0 && b->a.b.bc=='\n'){
p->x = f->left;
- p->y += f->font->height;
+ p->y += f->fheight;
}else
p->x += b->wid;
}
diff --git a/samterm/flayer.c b/samterm/flayer.c
@@ -334,9 +334,9 @@ flreshape(Rectangle dr)
r.min.x = dr.min.x;
if(r.max.x-r.min.x<100)
r.max.x = dr.max.x;
- if(r.max.y-r.min.y<2*FLMARGIN+f->font->height)
+ if(r.max.y-r.min.y<2*FLMARGIN+f->fheight)
r.min.y = dr.min.y;
- if(r.max.y-r.min.y<2*FLMARGIN+f->font->height)
+ if(r.max.y-r.min.y<2*FLMARGIN+f->fheight)
r.max.y = dr.max.y;
if(!move)
l->visible = None;
diff --git a/samterm/main.c b/samterm/main.c
@@ -385,7 +385,7 @@ onethird(Flayer *l, long a)
if(a > t->rasp.nrunes)
a = t->rasp.nrunes;
s = inset(l->scroll, 1);
- lines = ((s.max.y-s.min.y)/l->f.font->height+1)/3;
+ lines = ((s.max.y-s.min.y)/l->f.fheight+1)/3;
if (lines < 2)
lines = 2;
outTsll(Torigin, t->tag, a, lines);
diff --git a/samterm/scroll.c b/samterm/scroll.c
@@ -129,7 +129,7 @@ scroll(Flayer *l, int pbut, int but)
scrflip(l, r);
p0 = 0;
if(but == 1)
- p0 = (long)(my-s.min.y)/l->f.font->height+1;
+ p0 = (long)(my-s.min.y)/l->f.fheight+1;
else if(but == 2){
if(tot > 1024L*1024L)
p0 = ((tot>>10)*(y-s.min.y)/h)<<10;
You are viewing proxied material from vernunftzentrum.de. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.