From 9ffcd174168b37e7c434a61235acaab3bc6422fa Mon Sep 17 00:00:00 2001 From: Greg Date: Tue, 15 Nov 2011 15:32:18 -0800 Subject: [PATCH] fix termcs1 special case kluge, add MWTF_CMAP_DEFAULT/0/1 to GdSetFontAttr for freetype --- src/ChangeLog | 2 ++ src/FIXME | 1 - src/demos/nanox/ftdemo.c | 6 +++++- src/engine/font_freetype2.c | 37 ++++++++++++++++++++++++++++--------- src/include/mwtypes.h | 6 +++++- 5 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 67312e32..20fa7eef 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,5 @@ +15 Nov 2011 + * fix termcs1 freetype kluge, add MWTF_CMAP_DEFAULT/0/1 charmap select to GdSetFontAttr 26 Sep 2011 * added MWTF_BOLD flag to GrSetFontAttr to simulate bold fonts using FT2, nonrotated only * deprecate demos/nanox/move.c demo diff --git a/src/FIXME b/src/FIXME index ff829998..8b91e961 100644 --- a/src/FIXME +++ b/src/FIXME @@ -25,7 +25,6 @@ GdBlit Frame->Pixmap fails, needs src rotate (and test) GdStretchBlit Frame->Frame and Frame->Pixmap fails, needs src/dst rotate (and test) convblits could be updated with rotation macros, move macros to convblit.h compression flipy in mwin/winresbmp.c::resDecodeBitmap, remove duplicate bmp support -fix special case of termcs*.ttf symbol fonts investigate why link with /usr/local/lib/libfreetype.so doesn't work! remove printf/fprinf from all demo programs, add methods to nano-X.h check optimization for gcc, will -O0 allow static inlines to be optimized? diff --git a/src/demos/nanox/ftdemo.c b/src/demos/nanox/ftdemo.c index 755fed45..d3ae6f60 100644 --- a/src/demos/nanox/ftdemo.c +++ b/src/demos/nanox/ftdemo.c @@ -13,6 +13,8 @@ #define FONTNAME "fonts/type1/bchr.pfb" #elif HAVE_FREETYPE_2_SUPPORT #define FONTNAME "lt1-r-omega-serif" +//#define FONTNAME "termcs1" +//#define FONTNAME "lucon" //#define FONTNAME "cour" #elif HAVE_PCF_SUPPORT //#define FONTNAME "jiskan24.pcf.gz" @@ -149,6 +151,8 @@ void Render(GR_WINDOW_ID window) if (bold) flags |= GR_TFBOLD; +// flags |= MWTF_CMAP_0; /* termcs1 only*/ + GrGetScreenInfo(&info); GrSetGCBackground(gid, WHITE); GrSetGCForeground (gid, WHITE); @@ -162,7 +166,7 @@ void Render(GR_WINDOW_ID window) /* Draw menu */ GrSetGCFont(gid, fontid); - GrSetFontAttr(fontid, flags&(GR_TFANTIALIAS|GR_TFKERNING|GR_TFBOLD), -1); + GrSetFontAttr(fontid, flags & ~GR_TFUNDERLINE, -1); GrText(window, gid, 5, 20, "+ Rotate string clockwise", 25, GR_TFASCII); GrText(window, gid, 5, 40, "- Rotate string counter-clockwise", 34, GR_TFASCII); GrText(window, gid, 5, 60, "a Toggle anti-aliasing", 22, GR_TFASCII); diff --git a/src/engine/font_freetype2.c b/src/engine/font_freetype2.c index 04ce323f..a6516b1f 100644 --- a/src/engine/font_freetype2.c +++ b/src/engine/font_freetype2.c @@ -201,6 +201,7 @@ typedef struct { FT_Face face; #endif FT_Matrix matrix; + int charmap; /* -1 for default (currently UNICODE), >= 0 for specific charset */ } MWFREETYPE2FONT, *PMWFREETYPE2FONT; @@ -313,7 +314,6 @@ freetype2_face_requester(FTC_FaceID face_id, FT_Library library, { freetype2_fontdata *fontdata = (freetype2_fontdata *) face_id; // simple typecast FT_Error rr; - char *p; assert(fontdata); @@ -330,11 +330,6 @@ freetype2_face_requester(FTC_FaceID face_id, FT_Library library, assert(filename); rr = FT_New_Face(library, filename, 0, aface); - /* FIXME special case termcs*.ttf*/ - if ((p = strrchr(filename, '.')) != NULL && strcasecmp(p, ".ttf") == 0) { - if (&p[-7] >= filename && isprefix(&p[-7], "termcs")) - FT_Set_Charmap(*aface, (*aface)->charmaps[1]); - } } return rr; @@ -354,7 +349,7 @@ freetype2_face_requester(FTC_FaceID face_id, FT_Library library, */ #if HAVE_FREETYPE_VERSION_AFTER_OR_EQUAL(2,3,9) #define LOOKUP_CHAR(pf_,face_,ch_) \ - (FTC_CMapCache_Lookup(freetype2_cache_cmap, (pf_)->imagedesc.face_id, -1, (ch_))) + (FTC_CMapCache_Lookup(freetype2_cache_cmap, (pf_)->imagedesc.face_id, (pf_)->charmap, (ch_))) #else #define LOOKUP_CHAR(pf_,face_,ch_) \ (FTC_CMapCache_Lookup(freetype2_cache_cmap, &((pf_)->cmapdesc), (ch_))) @@ -614,6 +609,7 @@ freetype2_createfont_internal(freetype2_fontdata * faceid, char *filename, MWCOO pf->fontprocs = &freetype2_fontprocs; pf->faceid = faceid; pf->filename = filename; + pf->charmap = -1; #if HAVE_FREETYPE_2_CACHE #if HAVE_FREETYPE_VERSION_AFTER_OR_EQUAL(2,3,9) pf->imagedesc.face_id = faceid; @@ -658,9 +654,10 @@ freetype2_createfont_internal(freetype2_fontdata * faceid, char *filename, MWCOO } error = FT_Select_Charmap(pf->face, FT_ENCODING_UNICODE); - //error = FT_Set_Charmap(pf->face, pf->face->charmaps[1]); + pf->charmap = -1; + if (error != FT_Err_Ok) { - EPRINTF("freetype2_createfont_internal: No unicode map table, error 0x%x\n", error); + EPRINTF("freetype2_createfont_internal: Can't set default UNICODE encoding 0x%x\n", error); goto out; } #endif @@ -897,12 +894,34 @@ freetype2_setfontattr(PMWFONT pfont, int setflags, int clrflags) { PMWFREETYPE2FONT pf = (PMWFREETYPE2FONT)pfont; int oldattr = pf->fontattr; + int error = FT_Err_Ok; assert(pfont); pfont->fontattr &= ~clrflags; pfont->fontattr |= setflags; + if(pfont->fontattr & MWTF_CMAP_0) { +#if !HAVE_FREETYPE_2_CMAP_CACHE + error = FT_Set_Charmap(pf->face, pf->face->charmaps[0]); +#endif + pf->charmap = 0; + } else if(pfont->fontattr & MWTF_CMAP_1) { +#if !HAVE_FREETYPE_2_CMAP_CACHE + error = FT_Set_Charmap(pf->face, pf->face->charmaps[1]); +#endif + pf->charmap = 1; + } else { +#if !HAVE_FREETYPE_2_CMAP_CACHE + error = FT_Select_Charmap(pf->face, FT_ENCODING_UNICODE); +#endif + pf->charmap = -1; + } + + if (error != FT_Err_Ok) { + EPRINTF("freetype2_setfontattr: Cannot load charmap %d 0x%x\n", pf->charmap, error); + } + #if HAVE_FREETYPE_2_CACHE #if HAVE_FREETYPE_VERSION_AFTER_OR_EQUAL(2,1,3) pf->imagedesc.flags = FT_LOAD_DEFAULT; diff --git a/src/include/mwtypes.h b/src/include/mwtypes.h index 7e4b1fcd..af8ac868 100644 --- a/src/include/mwtypes.h +++ b/src/include/mwtypes.h @@ -1,7 +1,7 @@ #ifndef _MWTYPES_H #define _MWTYPES_H /* - * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2005, 2010 Greg Haerr + * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2005, 2010, 2011 Greg Haerr * Portions Copyright (c) 2002 by Koninklijke Philips Electronics N.V. * * Exported Microwindows engine typedefs and defines @@ -79,6 +79,10 @@ #define MWTF_UNDERLINE 0x0004 /* draw underline*/ #define MWTF_BOLD 0x0008 /* draw bold glyph (not present on all renderers)*/ +#define MWTF_CMAP_DEFAULT 0x0010 /* use default (unicode) charset in truetype font (not required)*/ +#define MWTF_CMAP_0 0x0020 /* use charmap 0 in truetype font*/ +#define MWTF_CMAP_1 0x0040 /* use charmap 1 in truetype font*/ + #define MWTF_FREETYPE 0x1000 /* FIXME: remove*/ #define MWTF_SCALEHEIGHT 0x2000 /* font can scale height seperately*/ #define MWTF_SCALEWIDTH 0x4000 /* font can scale width seperately*/