X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswffont.c;h=6344fd3363d060c7687dc4fd17fff2910b3ad37a;hb=8526dcf3a698c688e2cc4430ae106b5ecf70677f;hp=4a7596b882b3f6771a233e8750bc847325755820;hpb=46d9941a3140ef287a2cd0d4ed48d6d2c279aa5f;p=swftools.git diff --git a/lib/modules/swffont.c b/lib/modules/swffont.c index 4a7596b..6344fd3 100644 --- a/lib/modules/swffont.c +++ b/lib/modules/swffont.c @@ -34,12 +34,22 @@ void swf_SetLoadFontParameters(int _scale, int _skip_unused, int _full_unicode) #ifdef HAVE_FREETYPE +#ifdef HAVE_FT2BUILD_H +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H +#include FT_SIZES_H +#include FT_SFNT_NAMES_H +#include FT_TRUETYPE_IDS_H +#include FT_OUTLINE_H +#else #include #include #include #include #include #include +#endif #define FT_SCALE 1 #define FT_SUBPIXELS 64 @@ -109,6 +119,7 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) int*glyph2glyph; FT_Size size; int max_unicode = 0; + int charmap = -1; if(ftlibrary == 0) { if(FT_Init_FreeType(&ftlibrary)) { @@ -128,24 +139,19 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) return 0; } - font = malloc(sizeof(SWFFONT)); - memset(font, 0, sizeof(SWFFONT)); + font = rfx_calloc(sizeof(SWFFONT)); font->id = -1; font->version = 2; - font->layout = malloc(sizeof(SWFLAYOUT)); - memset(font->layout, 0, sizeof(SWFLAYOUT)); - font->layout->bounds = malloc(face->num_glyphs*sizeof(SRECT)); + font->layout = rfx_calloc(sizeof(SWFLAYOUT)); + font->layout->bounds = rfx_calloc(face->num_glyphs*sizeof(SRECT)); font->style = ((face->style_flags&FT_STYLE_FLAG_ITALIC)?FONT_STYLE_ITALIC:0) |((face->style_flags&FT_STYLE_FLAG_BOLD)?FONT_STYLE_BOLD:0); font->encoding = FONT_ENCODING_UNICODE; - font->glyph2ascii = malloc(face->num_glyphs*sizeof(U16)); - memset(font->glyph2ascii, 0, face->num_glyphs*sizeof(U16)); + font->glyph2ascii = rfx_calloc(face->num_glyphs*sizeof(U16)); font->maxascii = 0; - font->glyph = malloc(face->num_glyphs*sizeof(SWFGLYPH)); - memset(font->glyph, 0, face->num_glyphs*sizeof(SWFGLYPH)); + font->glyph = rfx_calloc(face->num_glyphs*sizeof(SWFGLYPH)); if(FT_HAS_GLYPH_NAMES(face)) { - font->glyphnames = malloc(face->num_glyphs*sizeof(char*)); - memset(font->glyphnames,0,face->num_glyphs*sizeof(char*)); + font->glyphnames = rfx_calloc(face->num_glyphs*sizeof(char*)); } font->layout->ascent = abs(face->ascender)*FT_SCALE*loadfont_scale*20/FT_SUBPIXELS/2; //face->bbox.xMin; @@ -157,38 +163,53 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) if(name && *name) font->name = (U8*)strdup(name); -/* // Map Glyphs to Unicode, version 1 (quick and dirty): - int t; - for(t=0;t<65536;t++) { - int index = FT_Get_Char_Index(face, t); - if(index>=0 && indexnum_glyphs) { - if(font->glyph2ascii[index]<0) - font->glyph2ascii[index] = t; - } - }*/ - - // Map Glyphs to Unicode, version 2 (much nicer): - // (The third way would be the AGL algorithm, as proposed - // by Werner Lemberg on freetype@freetype.org) - - charcode = FT_Get_First_Char(face, &gindex); - while(gindex != 0) + while(1) { - if(gindex >= 0 && gindexnum_glyphs) { - if(!font->glyph2ascii[gindex]) { - font->glyph2ascii[gindex] = charcode; - if(charcode + 1 > font->maxascii) { - font->maxascii = charcode + 1; + /* // Map Glyphs to Unicode, version 1 (quick and dirty): + int t; + for(t=0;t<65536;t++) { + int index = FT_Get_Char_Index(face, t); + if(index>=0 && indexnum_glyphs) { + if(font->glyph2ascii[index]<0) + font->glyph2ascii[index] = t; + } + }*/ + + // Map Glyphs to Unicode, version 2 (much nicer): + // (The third way would be the AGL algorithm, as proposed + // by Werner Lemberg on freetype@freetype.org) + + charcode = FT_Get_First_Char(face, &gindex); + while(gindex != 0) + { + if(gindex >= 0 && gindexnum_glyphs) { + if(!font->glyph2ascii[gindex]) { + font->glyph2ascii[gindex] = charcode; + if(charcode + 1 > font->maxascii) { + font->maxascii = charcode + 1; + } } } + charcode = FT_Get_Next_Char(face, charcode, &gindex); } - charcode = FT_Get_Next_Char(face, charcode, &gindex); + + /* if we didn't find a single encoding character, try + the font's charmaps instead. That usually means that + the encoding is no longer unicode. + TODO: find a way to convert the encoding to unicode + */ + if(font->maxascii == 0 && charmap < face->num_charmaps - 1) { + charmap++; + FT_Set_Charmap(face, face->charmaps[charmap]); + font->encoding = 0;//anything but unicode FIXME + } else + break; } if(full_unicode) font->maxascii = 65535; - font->ascii2glyph = malloc(font->maxascii*sizeof(int)); + font->ascii2glyph = rfx_calloc(font->maxascii*sizeof(int)); for(t=0;tmaxascii;t++) { int g = FT_Get_Char_Index(face, t); @@ -206,7 +227,7 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) font->numchars = 0; - glyph2glyph = (int*)malloc(face->num_glyphs*sizeof(int)); + glyph2glyph = (int*)rfx_calloc(face->num_glyphs*sizeof(int)); for(t=0; t < face->num_glyphs; t++) { FT_Glyph glyph; @@ -299,7 +320,7 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) font->ascii2glyph[t] = glyph2glyph[font->ascii2glyph[t]]; } } - free(glyph2glyph); + rfx_free(glyph2glyph); FT_Done_Face(face); FT_Done_FreeType(ftlibrary);ftlibrary=0; @@ -362,16 +383,14 @@ SWFFONT* swf_LoadT1Font(char*filename) underline = T1_GetUnderlinePosition(nr); bbox = T1_GetFontBBox(nr); - font = (SWFFONT*)malloc(sizeof(SWFFONT)); - memset(font, 0, sizeof(SWFFONT)); + font = (SWFFONT*)rfx_calloc(sizeof(SWFFONT)); font->version = 2; if(fontname) font->name = (U8*)strdup(fontname); else font->name = 0; - font->layout = (SWFLAYOUT*)malloc(sizeof(SWFLAYOUT)); - memset(font->layout, 0, sizeof(SWFLAYOUT)); + font->layout = (SWFLAYOUT*)rfx_calloc(sizeof(SWFLAYOUT)); num = 0; charname = charnames; @@ -393,23 +412,18 @@ SWFFONT* swf_LoadT1Font(char*filename) font->style = (/*bold*/0?FONT_STYLE_BOLD:0) + (angle>0.05?FONT_STYLE_ITALIC:0); - font->glyph = (SWFGLYPH*)malloc(num*sizeof(SWFGLYPH)); - memset(font->glyph, 0, num*sizeof(SWFGLYPH)); - font->glyph2ascii = (U16*)malloc(num*sizeof(U16)); - memset(font->glyph2ascii, 0, num*sizeof(U16)); - font->ascii2glyph = (int*)malloc(font->maxascii*sizeof(int)); - memset(font->ascii2glyph, -1, font->maxascii*sizeof(int)); + font->glyph = (SWFGLYPH*)rfx_calloc(num*sizeof(SWFGLYPH)); + font->glyph2ascii = (U16*)rfx_calloc(num*sizeof(U16)); + font->ascii2glyph = (int*)rfx_calloc(font->maxascii*sizeof(int)); font->layout->ascent = (U16)(underline - bbox.lly); font->layout->descent = (U16)(bbox.ury - underline); font->layout->leading = (U16)(font->layout->ascent - font->layout->descent - (bbox.lly - bbox.ury)); - font->layout->bounds = (SRECT*)malloc(sizeof(SRECT)*num); - memset(font->layout->bounds, 0, sizeof(SRECT)*num); + font->layout->bounds = (SRECT*)rfx_calloc(sizeof(SRECT)*num); font->layout->kerningcount = 0; font->layout->kerning = 0; - font->glyphnames = malloc(num*sizeof(char*)); - memset(font->glyphnames, 0, num*sizeof(char*)); + font->glyphnames = rfx_calloc(num*sizeof(char*)); num = 0; @@ -477,7 +491,7 @@ SWFFONT* swf_LoadT1Font(char*filename) T1_DeleteFont(nr); for(t=0;t<256;t++) - free(encoding[t]); + rfx_free(encoding[t]); return font; } @@ -493,8 +507,7 @@ SWFFONT* swf_LoadT1Font(char*filename) SWFFONT* swf_DummyFont() { - SWFFONT*font = (SWFFONT*)malloc(sizeof(SWFFONT)); - memset(font, 0, sizeof(SWFFONT)); + SWFFONT*font = (SWFFONT*)rfx_calloc(sizeof(SWFFONT)); return font; }