X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswffont.c;h=f2727a462571a9653efcb8aaba2ab59014ba4537;hb=e38d3a125e8bb4459e26cc4b42ee63f010c56ffb;hp=db4eab75ee56f413cc1c5c63510fd38e61da8c3d;hpb=5d8d800fc5ba13dadea83dd0ca63bfe1211d9372;p=swftools.git diff --git a/lib/modules/swffont.c b/lib/modules/swffont.c index db4eab7..f2727a4 100644 --- a/lib/modules/swffont.c +++ b/lib/modules/swffont.c @@ -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; @@ -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); @@ -298,13 +305,13 @@ SWFFONT* swf_LoadT1Font(char*filename) 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 +331,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 +408,36 @@ 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 0; + } + 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) +{ + if(isSWF(filename)) { + return swf_ReadFont(filename); + } +#if defined(USE_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", infile); + return 0; +#endif +} +