aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/fontsrv
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/fontsrv')
-rw-r--r--src/cmd/fontsrv/a.h1
-rw-r--r--src/cmd/fontsrv/main.c3
-rw-r--r--src/cmd/fontsrv/mkfile1
-rw-r--r--src/cmd/fontsrv/osx.c3
-rw-r--r--src/cmd/fontsrv/x11.c85
5 files changed, 49 insertions, 44 deletions
diff --git a/src/cmd/fontsrv/a.h b/src/cmd/fontsrv/a.h
index 3344d28e..164b1bd6 100644
--- a/src/cmd/fontsrv/a.h
+++ b/src/cmd/fontsrv/a.h
@@ -30,6 +30,5 @@ Memsubfont* mksubfont(XFont*, char*, int, int, int, int);
extern XFont *xfont;
extern int nxfont;
void *emalloc9p(ulong);
-extern Memsubfont *defont;
void drawpjw(Memimage*, Fontchar*, int, int, int, int);
diff --git a/src/cmd/fontsrv/main.c b/src/cmd/fontsrv/main.c
index b00802d8..37f0da32 100644
--- a/src/cmd/fontsrv/main.c
+++ b/src/cmd/fontsrv/main.c
@@ -13,8 +13,6 @@
#include "a.h"
-Memsubfont *defont;
-
void
usage(void)
{
@@ -526,7 +524,6 @@ main(int argc, char **argv)
fmtinstall('R', Rfmt);
fmtinstall('P', Pfmt);
memimageinit();
- defont = getmemdefont();
loadfonts();
qsort(xfont, nxfont, sizeof xfont[0], fontcmp);
diff --git a/src/cmd/fontsrv/mkfile b/src/cmd/fontsrv/mkfile
index eed0355a..8ad99dbc 100644
--- a/src/cmd/fontsrv/mkfile
+++ b/src/cmd/fontsrv/mkfile
@@ -1,4 +1,5 @@
<$PLAN9/src/mkhdr
+<|osxvers
<|sh ../devdraw/mkwsysrules.sh
<|sh freetyperules.sh $WSYSTYPE $X11H
diff --git a/src/cmd/fontsrv/osx.c b/src/cmd/fontsrv/osx.c
index b28ee252..c01ae6ce 100644
--- a/src/cmd/fontsrv/osx.c
+++ b/src/cmd/fontsrv/osx.c
@@ -277,6 +277,9 @@ mksubfont(XFont *f, char *name, int lo, int hi, int size, int antialias)
CGContextSetAllowsAntialiasing(ctxt, antialias);
CGContextSetTextPosition(ctxt, 0, 0); // XXX
+#if OSX_VERSION >= 101400
+ CGContextSetAllowsFontSmoothing(ctxt, false);
+#endif
x = 0;
for(i=lo; i<=hi; i++, fc++) {
diff --git a/src/cmd/fontsrv/x11.c b/src/cmd/fontsrv/x11.c
index a097ca4d..4137f9ca 100644
--- a/src/cmd/fontsrv/x11.c
+++ b/src/cmd/fontsrv/x11.c
@@ -40,7 +40,7 @@ loadfonts(void)
int index;
FcPattern *pat = sysfonts->fonts[i];
- if(FcPatternGetString(pat, FC_FULLNAME, 0, &fullname) != FcResultMatch ||
+ if(FcPatternGetString(pat, FC_POSTSCRIPT_NAME, 0, &fullname) != FcResultMatch ||
FcPatternGetString(pat, FC_FILE, 0, &fontfile) != FcResultMatch ||
FcPatternGetInteger(pat, FC_INDEX, 0, &index) != FcResultMatch)
continue;
@@ -66,21 +66,18 @@ load(XFont *f)
return;
e = FT_New_Face(lib, f->fontfile, f->index, &face);
-
if(e){
fprint(2, "load failed for %s (%s) index:%d\n", f->name, f->fontfile, f->index);
return;
}
-
if(!FT_IS_SCALABLE(face)) {
fprint(2, "%s is a non scalable font, skipping\n", f->name);
FT_Done_Face(face);
- f->loaded = 1;
+ f->loaded = 1;
return;
}
-
f->unit = face->units_per_EM;
- f->height = (int)((face->ascender - face->descender) * 1.2);
+ f->height = (int)((face->ascender - face->descender) * 1.35);
f->originy = face->descender; // bbox.yMin (or descender) is negative, becase the baseline is y-coord 0
for(charcode=FT_Get_First_Char(face, &glyph_index); glyph_index != 0;
@@ -96,7 +93,11 @@ load(XFont *f)
f->nrange++;
}
}
-
+ // libdraw expects U+0000 to be present
+ if(!f->range[0]) {
+ f->range[0] = 1;
+ f->nrange++;
+ }
FT_Done_Face(face);
f->loaded = 1;
}
@@ -108,14 +109,13 @@ mksubfont(XFont *xf, char *name, int lo, int hi, int size, int antialias)
FT_Error e;
Memimage *m, *mc, *m1;
double pixel_size;
- int x, y, y0;
+ int w, x, y, y0;
int i;
Fontchar *fc, *fc0;
Memsubfont *sf;
//Point rect_points[4];
e = FT_New_Face(lib, xf->fontfile, xf->index, &face);
-
if(e){
fprint(2, "load failed for %s (%s) index:%d\n", xf->name, xf->fontfile, xf->index);
return nil;
@@ -129,16 +129,16 @@ mksubfont(XFont *xf, char *name, int lo, int hi, int size, int antialias)
}
pixel_size = (dpi*size)/72.0;
- x = (int)((face->max_advance_width) * pixel_size/xf->unit + 0.99999999);
+ w = x = (int)((face->max_advance_width) * pixel_size/xf->unit + 0.99999999);
y = (int)((face->ascender - face->descender) * pixel_size/xf->unit + 0.99999999);
y0 = (int)(-face->descender * pixel_size/xf->unit + 0.99999999);
- m = allocmemimage(Rect(0, 0, x*(hi+1-lo), y), antialias ? GREY8 : GREY1);
+ m = allocmemimage(Rect(0, 0, x*(hi+1-lo)+1, y+1), antialias ? GREY8 : GREY1);
if(m == nil) {
FT_Done_Face(face);
return nil;
}
- mc = allocmemimage(Rect(0, 0, x, y), antialias ? GREY8 : GREY1);
+ mc = allocmemimage(Rect(0, 0, x+1, y+1), antialias ? GREY8 : GREY1);
if(mc == nil) {
freememimage(m);
FT_Done_Face(face);
@@ -165,41 +165,42 @@ mksubfont(XFont *xf, char *name, int lo, int hi, int size, int antialias)
x = 0;
for(i=lo; i<=hi; i++, fc++) {
- int r;
+ int k, r;
int advance;
memfillcolor(mc, DBlack);
- e = FT_Load_Char(face, i, FT_LOAD_RENDER|FT_LOAD_NO_HINTING|(antialias ? 0:FT_LOAD_TARGET_MONO));
- if(e){
- fprint(2, "FT_Load_Char failed for %d\n", i);
- //mempoly(mc, rect_points, 4, Endsquare, Endsquare, 0, memopaque, ZP, S);
- memimageline(mc, m->r.min, Pt(m->r.max.x, m->r.min.y), Endsquare, Endsquare, 0, memopaque, ZP, S);
- memimageline(mc, m->r.min, Pt(m->r.min.x, m->r.max.y), Endsquare, Endsquare, 0, memopaque, ZP, S);
- memimageline(mc, Pt(m->r.max.x, m->r.min.y), m->r.max, Endsquare, Endsquare, 0, memopaque, ZP, S);
- memimageline(mc, Pt(m->r.min.x, m->r.max.y), m->r.max, Endsquare, Endsquare, 0, memopaque, ZP, S);
- memimageline(mc, m->r.min, m->r.max, Endsquare, Endsquare, 0, memopaque, ZP, S);
- advance = Dx(m->r);
-
- memimagedraw(m, Rect(x, 0, x + advance, y), mc, ZP, memopaque, ZP, S);
- } else {
- FT_Bitmap *bitmap = &face->glyph->bitmap;
- uchar *base = byteaddr(mc, mc->r.min);
- advance = (face->glyph->advance.x+32) >> 6;
-
- for(r=0; r < bitmap->rows; r++)
- memmove(base + r*mc->width*sizeof(u32int), bitmap->buffer + r*bitmap->pitch, bitmap->pitch);
-
- memimagedraw(m, Rect(x, 0, x + advance, y), mc,
- Pt(-face->glyph->bitmap_left, -(y - y0 - face->glyph->bitmap_top)),
- memopaque, ZP, S);
- }
-
fc->x = x;
fc->top = 0;
- fc->bottom = y;
- fc->left = 0;
+ fc->bottom = Dy(m->r);
+ e = 1;
+ k = FT_Get_Char_Index(face, i);
+ if(k != 0) {
+ e = FT_Load_Glyph(face, k, FT_LOAD_RENDER|FT_LOAD_NO_HINTING|(antialias ? 0:FT_LOAD_TARGET_MONO));
+ }
+ if(e || face->glyph->advance.x <= 0) {
+ fc->width = 0;
+ fc->left = 0;
+ if(i == 0) {
+ drawpjw(m, fc, x, w, y, y - y0);
+ x += fc->width;
+ }
+ continue;
+ }
+
+ FT_Bitmap *bitmap = &face->glyph->bitmap;
+ uchar *base = byteaddr(mc, mc->r.min);
+ advance = (face->glyph->advance.x+32) >> 6;
+
+ for(r=0; r < bitmap->rows; r++)
+ memmove(base + r*mc->width*sizeof(u32int), bitmap->buffer + r*bitmap->pitch, bitmap->pitch);
+
+ memimagedraw(m, Rect(x, 0, x + advance, y), mc,
+ Pt(-face->glyph->bitmap_left, -(y - y0 - face->glyph->bitmap_top)),
+ memopaque, ZP, S);
+
fc->width = advance;
+ fc->left = 0;
x += advance;
#ifdef DEBUG_FT_BITMAP
@@ -229,6 +230,10 @@ mksubfont(XFont *xf, char *name, int lo, int hi, int size, int antialias)
// round up to 32-bit boundary
// so that in-memory data is same
// layout as in-file data.
+ if(x == 0)
+ x = 1;
+ if(y == 0)
+ y = 1;
if(antialias)
x += -x & 3;
else