X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fmodules%2Fswffont.c;h=9a572e1f7e66bbe520b9522c910d28d657136a74;hp=db4eab75ee56f413cc1c5c63510fd38e61da8c3d;hb=22f4b2fb5eab04dff324b61eeef8cb3f0c99dc69;hpb=5d8d800fc5ba13dadea83dd0ca63bfe1211d9372 diff --git a/lib/modules/swffont.c b/lib/modules/swffont.c index db4eab7..9a572e1 100644 --- a/lib/modules/swffont.c +++ b/lib/modules/swffont.c @@ -21,7 +21,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifdef USE_FREETYPE +#ifdef HAVE_FREETYPE #include #include @@ -89,7 +89,7 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) { FT_Face face; FT_Error error; - const char* name; + const char* name = 0; FT_ULong charcode; FT_UInt gindex; SWFFONT* font; @@ -135,8 +135,9 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) font->layout->leading = -face->bbox.xMin; font->layout->kerningcount = 0; + name = FT_Get_Postscript_Name(face); if(name && *name) - font->name = (U8*)strdup(FT_Get_Postscript_Name(face)); + font->name = (U8*)strdup(name); /* // Map Glyphs to Unicode, version 1 (quick and dirty): int t; @@ -243,7 +244,7 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) return font; } -#else //USE_FREETYPE +#else //HAVE_FREETYPE SWFFONT* swf_LoadTrueTypeFont(char*filename) { @@ -257,6 +258,8 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) #include +static int t1lib_initialized = 0; + SWFFONT* swf_LoadT1Font(char*filename) { SWFFONT * font; @@ -267,12 +270,16 @@ SWFFONT* swf_LoadT1Font(char*filename) int s,num; char*encoding[256]; char**charnames; - char*charname; - - T1_SetBitmapPad( 16); - if ((T1_InitLib(NO_LOGFILE)==NULL)){ - fprintf(stderr, "Initialization of t1lib failed\n"); - return 0; + char**charname; + int c; + + if(!t1lib_initialized) { + T1_SetBitmapPad(16); + if ((T1_InitLib(NO_LOGFILE)==NULL)){ + fprintf(stderr, "Initialization of t1lib failed\n"); + return 0; + } + t1lib_initialized = 1; } nr = T1_AddFont(filename); T1_LoadFont(nr); @@ -293,18 +300,21 @@ SWFFONT* swf_LoadT1Font(char*filename) memset(font, 0, sizeof(SWFFONT)); font->version = 2; - font->name = (U8*)strdup(fontname); + if(fontname) + font->name = (U8*)strdup(fontname); + else + font->name = 0; font->layout = (SWFLAYOUT*)malloc(sizeof(SWFLAYOUT)); memset(font->layout, 0, sizeof(SWFLAYOUT)); num = 0; - charname = charnames[0]; + charname = charnames; while(*charname) { charname++; num++; } - font->maxascii = 256; + font->maxascii = num; font->numchars = num; font->style = (/*bold*/0?FONT_STYLE_BOLD:0) + (angle>0.05?FONT_STYLE_ITALIC:0); @@ -324,31 +334,69 @@ SWFFONT* swf_LoadT1Font(char*filename) memset(font->layout->bounds, 0, sizeof(SRECT)*num); font->layout->kerningcount = 0; font->layout->kerning = 0; + font->glyphnames = malloc(num*sizeof(char*)); + memset(font->glyphnames, 0, num*sizeof(char*)); num = 0; - - charname = charnames[0]; - while(*charname) { - int c; - T1_OUTLINE * outline = T1_GetCharOutline(nr, c, 100.0, 0); - int firstx = outline->dest.x/0xffff; - font->ascii2glyph[s] = num; - font->glyph2ascii[num] = s; - - /* fix bounding box */ - SHAPE2*shape2; + charname = charnames; + for(c=0;cnumchars;c++) { + drawer_t draw; SRECT bbox; - shape2 = swf_ShapeToShape2(font->glyph[s].shape); - if(!shape2) { fprintf(stderr, "Shape parse error\n");exit(1);} - bbox = swf_GetShapeBoundingBox(shape2); - swf_Shape2Free(shape2); - font->layout->bounds[num] = bbox; - //font->glyph[num].advance = (int)(width/6.4); // 128/20 - font->glyph[num].advance = bbox.xmax/20; - if(!font->glyph[num].advance) { - font->glyph[num].advance = firstx; + T1_OUTLINE * outline; + FPOINT pos,last; + int firstx; + + outline = T1_GetCharOutline(nr, c, 100.0, 0); + firstx = outline->dest.x/0xffff; + + pos.x = 0; + pos.y = 0; + last = pos; + + font->glyphnames[c] = strdup(*charname); + + if(cmaxascii) + font->ascii2glyph[c] = c; + font->glyph2ascii[c] = c; + + swf_Shape01DrawerInit(&draw, 0); + + while(outline) { + pos.x += (outline->dest.x/(float)0xffff); + pos.y += (outline->dest.y/(float)0xffff); + + if(outline->type == T1_PATHTYPE_MOVE) { + draw.moveTo(&draw,&pos); + } else if(outline->type == T1_PATHTYPE_LINE) { + draw.lineTo(&draw,&pos); + } else if(outline->type == T1_PATHTYPE_BEZIER) { + T1_BEZIERSEGMENT*o2 = (T1_BEZIERSEGMENT*)outline; + FPOINT b,c; + b.x = o2->B.x/(float)0xffff+last.x; + b.y = o2->B.y/(float)0xffff+last.y; + c.x = o2->C.x/(float)0xffff+last.x; + c.y = o2->C.y/(float)0xffff+last.y; + draw_cubicTo(&draw,&b,&c,&pos); + } else { + fprintf(stderr, "loadT1Font: unknown outline type:%d\n", outline->type); + } + last = pos; + outline = outline->link; + } + + draw.finish(&draw); + + font->glyph[c].shape = swf_ShapeDrawerToShape(&draw); + bbox = swf_ShapeDrawerGetBBox(&draw); + draw.dealloc(&draw); + + font->layout->bounds[c] = bbox; + font->glyph[c].advance = bbox.xmax/20; + if(!font->glyph[c].advance) { + font->glyph[c].advance = firstx; } + charname++; } return font; } @@ -363,3 +411,39 @@ SWFFONT* swf_LoadT1Font(char*filename) #endif +static int isSWF(const char*filename) +{ + FILE*fi = fopen(filename, "rb"); + char a[8]; + if(!fi) { + perror(filename); + return -1; + } + memset(a, 0, sizeof(a)); + fread(a, 4, 1, fi); + fclose(fi); + + if(!strncmp(a, "FWS", 3) || !strncmp(a, "CWS", 3)) { + return 1; + } + return 0; +} + +SWFFONT* swf_LoadFont(char*filename) +{ + int is_swf = isSWF(filename); + if(is_swf<0) + return 0; + if(is_swf) { + return swf_ReadFont(filename); + } +#if defined(HAVE_FREETYPE) + return swf_LoadTrueTypeFont(filename); +#elif defined(HAVE_T1LIB) + return swf_LoadT1Font(filename); +#else + fprintf(stderr, "Error: Neither T1lib nor FreeType support compiled in. Could not load %s\n", filename); + return 0; +#endif +} +