X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswffont.c;h=75069e3d2c9b54d2774914fe9bfb5e6ff4d2aead;hb=0784a8a882e7b98299fb6a90f0f9a7ebb322562b;hp=4a951a9387cedfab8c91e79cd87192ebcc8c3b33;hpb=e9326601b473727247ee7e4914aa5220ec739161;p=swftools.git diff --git a/lib/modules/swffont.c b/lib/modules/swffont.c index 4a951a9..75069e3 100644 --- a/lib/modules/swffont.c +++ b/lib/modules/swffont.c @@ -59,7 +59,7 @@ void swf_SetLoadFontParameters(int _scale, int _skip_unused, int _full_unicode) #define FT_SCALE 1 #define FT_SUBPIXELS 64 -static int ft_move_to(FT_Vector* _to, void* user) +static int ft_move_to(const FT_Vector* _to, void* user) { drawer_t* draw = (drawer_t*)user; FPOINT to; @@ -68,7 +68,7 @@ static int ft_move_to(FT_Vector* _to, void* user) draw->moveTo(draw, &to); return 0; } -static int ft_line_to(FT_Vector* _to, void* user) +static int ft_line_to(const FT_Vector* _to, void* user) { drawer_t* draw = (drawer_t*)user; FPOINT to; @@ -77,28 +77,28 @@ static int ft_line_to(FT_Vector* _to, void* user) draw->lineTo(draw, &to); return 0; } -static int ft_cubic_to(FT_Vector* _c1, FT_Vector* _c2, FT_Vector* _to, void* user) +static int ft_conic_to(const FT_Vector* _c, const FT_Vector* _to, void* user) { drawer_t* draw = (drawer_t*)user; - FPOINT c1,c2,to; + FPOINT c,to; to.x = _to->x*FT_SCALE/(float)FT_SUBPIXELS; to.y = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; - c1.x = _c1->x*FT_SCALE/(float)FT_SUBPIXELS; - c1.y = -_c1->y*FT_SCALE/(float)FT_SUBPIXELS; - c2.x = _c2->x*FT_SCALE/(float)FT_SUBPIXELS; - c2.y = -_c2->y*FT_SCALE/(float)FT_SUBPIXELS; - draw_cubicTo(draw, &c1, &c2, &to); + c.x = _c->x*FT_SCALE/(float)FT_SUBPIXELS; + c.y = -_c->y*FT_SCALE/(float)FT_SUBPIXELS; + draw_conicTo(draw, &c, &to); return 0; } -static int ft_conic_to(FT_Vector* _c, FT_Vector* _to, void* user) +static int ft_cubic_to(const FT_Vector* _c1, const FT_Vector* _c2, const FT_Vector* _to, void* user) { drawer_t* draw = (drawer_t*)user; - FPOINT c,to; + FPOINT c1,c2,to; to.x = _to->x*FT_SCALE/(float)FT_SUBPIXELS; to.y = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; - c.x = _c->x*FT_SCALE/(float)FT_SUBPIXELS; - c.y = -_c->y*FT_SCALE/(float)FT_SUBPIXELS; - draw_conicTo(draw, &c, &to); + c1.x = _c1->x*FT_SCALE/(float)FT_SUBPIXELS; + c1.y = -_c1->y*FT_SCALE/(float)FT_SUBPIXELS; + c2.x = _c2->x*FT_SCALE/(float)FT_SUBPIXELS; + c2.y = -_c2->y*FT_SCALE/(float)FT_SUBPIXELS; + draw_cubicTo(draw, &c1, &c2, &to); return 0; } static FT_Outline_Funcs outline_functions = @@ -122,10 +122,9 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) SWFFONT* font; int t; int*glyph2glyph; - FT_Size size; int max_unicode = 0; int charmap = -1; - + if(ftlibrary == 0) { if(FT_Init_FreeType(&ftlibrary)) { fprintf(stderr, "Couldn't init freetype library!\n"); @@ -133,30 +132,32 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) } } error = FT_New_Face(ftlibrary, filename, 0, &face); - FT_Set_Pixel_Sizes (face, 16*loadfont_scale, 16*loadfont_scale); - if(error) { + if(error || !face) { fprintf(stderr, "Couldn't load file %s- not a TTF file?\n", filename); return 0; } + + FT_Set_Pixel_Sizes (face, 16*loadfont_scale, 16*loadfont_scale); + if(face->num_glyphs <= 0) { fprintf(stderr, "File %s contains %d glyphs\n", face->num_glyphs); return 0; } - font = rfx_calloc(sizeof(SWFFONT)); + font = (SWFFONT*)rfx_calloc(sizeof(SWFFONT)); font->id = -1; font->version = 2; - font->layout = rfx_calloc(sizeof(SWFLAYOUT)); - font->layout->bounds = rfx_calloc(face->num_glyphs*sizeof(SRECT)); + font->layout = (SWFLAYOUT*)rfx_calloc(sizeof(SWFLAYOUT)); + font->layout->bounds = (SRECT*)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 = rfx_calloc(face->num_glyphs*sizeof(U16)); + font->glyph2ascii = (U16*)rfx_calloc(face->num_glyphs*sizeof(U16)); font->maxascii = 0; - font->glyph = rfx_calloc(face->num_glyphs*sizeof(SWFGLYPH)); + font->glyph = (SWFGLYPH*)rfx_calloc(face->num_glyphs*sizeof(SWFGLYPH)); if(FT_HAS_GLYPH_NAMES(face)) { - font->glyphnames = rfx_calloc(face->num_glyphs*sizeof(char*)); + font->glyphnames = (char**)rfx_calloc(face->num_glyphs*sizeof(char*)); } font->layout->ascent = abs(face->ascender)*FT_SCALE*loadfont_scale*20/FT_SUBPIXELS/2; //face->bbox.xMin; @@ -214,7 +215,7 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) if(full_unicode) font->maxascii = 65535; - font->ascii2glyph = rfx_calloc(font->maxascii*sizeof(int)); + font->ascii2glyph = (int*)rfx_calloc(font->maxascii*sizeof(int)); for(t=0;tmaxascii;t++) { int g = FT_Get_Char_Index(face, t); @@ -237,10 +238,8 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) for(t=0; t < face->num_glyphs; t++) { FT_Glyph glyph; FT_BBox bbox; - FT_Matrix matrix; char name[128]; drawer_t draw; - int ret; char hasname = 0; name[0]=0; if(FT_HAS_GLYPH_NAMES(face)) { @@ -255,16 +254,26 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) } error = FT_Load_Glyph(face, t, FT_LOAD_NO_BITMAP); if(error) { - fprintf(stderr, "Couldn't load glyph %d, error:%d\n", t, error); - continue; - } - error = FT_Get_Glyph(face->glyph, &glyph); - if(error) { - fprintf(stderr, "Couldn't get glyph %d, error:%d\n", t, error); - continue; + //tends to happen with some pdfs + fprintf(stderr, "Warning: Glyph %d has return code %d\n", t, error); + glyph=0; + if(skip_unused) + continue; + } else { + error = FT_Get_Glyph(face->glyph, &glyph); + if(error) { + fprintf(stderr, "Couldn't get glyph %d, error:%d\n", t, error); + glyph=0; + if(skip_unused) + continue; + } } - FT_Glyph_Get_CBox(glyph, ft_glyph_bbox_unscaled, &bbox); + if(glyph) + FT_Glyph_Get_CBox(glyph, ft_glyph_bbox_unscaled, &bbox); + else + memset(&bbox, 0, sizeof(bbox)); + bbox.yMin = -bbox.yMin; bbox.yMax = -bbox.yMax; if(bbox.xMax < bbox.xMin) { @@ -283,7 +292,10 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) swf_Shape01DrawerInit(&draw, 0); //error = FT_Outline_Decompose(&face->glyph->outline, &outline_functions, &draw); - error = FT_Outline_Decompose(&face->glyph->outline, &outline_functions, &draw); + if(glyph) + error = FT_Outline_Decompose(&face->glyph->outline, &outline_functions, &draw); + else + error = 0; draw.finish(&draw); if(error) { @@ -299,7 +311,10 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) font->glyph[font->numchars].advance = ((bbox.xMax - bbox.xMin)*20*FT_SCALE)/FT_SUBPIXELS; } #else - font->glyph[font->numchars].advance = glyph->advance.x*20/65536; + if(glyph) + font->glyph[font->numchars].advance = glyph->advance.x*20/65536; + else + font->glyph[font->numchars].advance = 0; #endif font->glyph[font->numchars].shape = swf_ShapeDrawerToShape(&draw); @@ -311,7 +326,8 @@ SWFFONT* swf_LoadTrueTypeFont(char*filename) draw.dealloc(&draw); - FT_Done_Glyph(glyph); + if(glyph) + FT_Done_Glyph(glyph); font->glyph2ascii[font->numchars] = font->glyph2ascii[t]; glyph2glyph[t] = font->numchars; font->numchars++; @@ -476,9 +492,7 @@ SWFFONT* swf_LoadT1Font(char*filename) } last = pos; outline = outline->link; - printf("(%f,%f) ", pos.x, pos.y); } - printf("\n"); draw.finish(&draw);