From: Timo Korvola Date: Thu, 8 Mar 2018 20:43:35 +0000 (+0200) Subject: Support for loading a scalable graphics font. X-Git-Url: https://scope-eye.net/git/?a=commitdiff_plain;h=ccbe895ddc836dacca82f567ffc5fd421fb63090;p=liskon_frotz.git Support for loading a scalable graphics font. A graphics font can be specified with the "graphics" option (Fonts section) of .sfrotzrc. The font is assumed to have fixed width equal to height and em size (no line gap). It is scaled to match the width and height of the fixed width text font (not usually equal, so the graphics font gets stretched). Any size specification in the option is ignored. Now someone just needs to draw that font. I made a quick autotrace in Fontforge but it is rather hideous. --- diff --git a/src/sdl/sf_fonts.c b/src/sdl/sf_fonts.c index 2a2a039..1963875 100644 --- a/src/sdl/sf_fonts.c +++ b/src/sdl/sf_fonts.c @@ -27,7 +27,7 @@ typedef struct { int glyphs[0]; // offsets to glyphs from start of rec } SF_bdffont; -char * m_fontfiles[8]; +char * m_fontfiles[9]; static char s[1026]; @@ -710,10 +710,10 @@ static void destroySFonly( SFONT *f) extern SFONT *SF_font3, *SF_font3double; -SFONT * (*ttfontloader)( char *fspec, int *err) = NULL; +SFONT * (*ttfontloader)( char *fspec, SFONT *like, int *err) = NULL; void (*ttfontsdone)() = NULL; -static SFONT *tryloadfont( char *fspec) +static SFONT *tryloadfont( char *fspec, SFONT *like) { int err,size; char *p; @@ -722,7 +722,7 @@ static SFONT *tryloadfont( char *fspec) p = strchr(fspec,'|'); if (p) *p = 0; if (ttfontloader) - b = ttfontloader(fspec,&err); + b = ttfontloader(fspec, like, &err); if (!b) b = loadfont(fspec,&err,&size); if (b) break; @@ -824,10 +824,11 @@ void sf_initfonts() if (!m_vga_fonts) { - for (i=0;i<8;i++) + for (i = 0; i <= 8; i++) if (m_fontfiles[i]) { - SFONT *b = tryloadfont(m_fontfiles[i]); + SFONT *b = tryloadfont(m_fontfiles[i], + i == 8 ? myfonts[FIXED_WIDTH_FONT] : NULL); if (!b) fprintf(stderr,"WARNING: could not load font%d [%s]\n",i,m_fontfiles[i]); else { @@ -839,10 +840,11 @@ void sf_initfonts() if (ttfontsdone) ttfontsdone(); // now set the graphics font - if (myfonts[4]->height(myfonts[4]) < 16) - myfonts[8] = SF_font3; - else - myfonts[8] = SF_font3double; + if (!myfonts[8]) + if (myfonts[4]->height(myfonts[4]) < 16) + myfonts[8] = SF_font3; + else + myfonts[8] = SF_font3double; //for (i=0;i<8;i++){ SFONT *s = myfonts[i]; printf("%d %p %d %d %d %d %d\n", //i,s,s->minchar(s),s->maxchar(s),s->ascent(s),s->descent(s),s->height(s));} diff --git a/src/sdl/sf_frotz.h b/src/sdl/sf_frotz.h index 50acf92..8e706f6 100644 --- a/src/sdl/sf_frotz.h +++ b/src/sdl/sf_frotz.h @@ -86,7 +86,7 @@ extern int AcHeight; extern int m_random_seed; extern int m_fullscreen; extern int m_reqW, m_reqH; -extern char * m_fontfiles[8]; +extern char * m_fontfiles[9]; extern bool m_localfiles; extern int m_no_sound; extern int m_vga_fonts; @@ -131,7 +131,7 @@ typedef struct { typedef struct sfontstruct SFONT; -extern SFONT * (*ttfontloader)( char *fspec, int *err); +extern SFONT * (*ttfontloader)( char *fspec, SFONT *like, int *err); extern void (*ttfontsdone)(); struct sfontstruct { diff --git a/src/sdl/sf_ftype.c b/src/sdl/sf_ftype.c index e17de93..8d4457d 100644 --- a/src/sdl/sf_ftype.c +++ b/src/sdl/sf_ftype.c @@ -202,7 +202,7 @@ static void setglyph( MYFONT *f, FT_Face face, int ch) f->glyphs[ch] = res; } -static SFONT * loadftype( char *fname, int size, int *err) +static SFONT * loadftype( char *fname, int size, SFONT *like, int *err) { MYFONT *res; FT_Face face; @@ -219,7 +219,11 @@ static SFONT * loadftype( char *fname, int size, int *err) *err = FT_New_Face( library, fname, 0, &face ); /* create face object */ if (*err){ res->sfont.destroy(&res->sfont); return NULL; } - *err = FT_Set_Pixel_Sizes( face, size, size); + if (like) { + SF_glyph *zero = like->getglyph(like, '0', TRUE); + *err = FT_Set_Pixel_Sizes( face, zero->dx, like->height(like)); + } else + *err = FT_Set_Pixel_Sizes( face, size, size); if (*err){ res->sfont.destroy(&res->sfont); return NULL; } res->ascent = face->size->metrics.ascender/64; @@ -247,7 +251,7 @@ static SFONT * loadftype( char *fname, int size, int *err) #define SYSFONTS "/usr/share/fonts/freetype" #endif -SFONT * sf_loadftype( char *fspec, int *err) +SFONT * sf_loadftype( char *fspec, SFONT *like, int *err) { char buf[FILENAME_MAX], *fn, *at, *fenv; int size = DEFSIZE, fnlen=-1; @@ -273,7 +277,7 @@ SFONT * sf_loadftype( char *fspec, int *err) if (!fn) return NULL; - return loadftype(fn,size,err); + return loadftype(fn, size, like, err); } ////////////////////////////////////////// diff --git a/src/sdl/sf_resource.c b/src/sdl/sf_resource.c index f80f5da..2ea3ec7 100644 --- a/src/sdl/sf_resource.c +++ b/src/sdl/sf_resource.c @@ -442,6 +442,7 @@ void sf_readsettings(void) m_fontfiles[5] = sf_GetProfileString("Fonts","fixedbold",NULL); m_fontfiles[6] = sf_GetProfileString("Fonts","fixeditalic",NULL); m_fontfiles[7] = sf_GetProfileString("Fonts","fixedbolditalic",NULL); + m_fontfiles[8] = sf_GetProfileString("Fonts","graphics",NULL); ResDir = sf_GetProfileString("Resources","Dir",ResDir); ResPict = sf_GetProfileString("Resources","Pict",ResPict);