moved clockwise checker to gfxfillToSVP()
[swftools.git] / lib / gfxfont.c
index 8fba3de..3aa2a8d 100644 (file)
@@ -136,7 +136,7 @@ static void glyph_clear(gfxglyph_t*g)
 
 static int errorno = 0;
 
-gfxfont_t* gfxfont_load(char*filename, double quality)
+gfxfont_t* gfxfont_load(char*id, char*filename, double quality)
 {
     FT_Face face;
     FT_Error error;
@@ -164,7 +164,7 @@ gfxfont_t* gfxfont_load(char*filename, double quality)
     FT_Set_Pixel_Sizes (face, 16*loadfont_scale, 16*loadfont_scale);
 
     if(error) {
-       fprintf(stderr, "Couldn't load file %s- not a TTF file?\n", filename);
+       fprintf(stderr, "Couldn't load file %s- not a TTF file? (error=%02x)\n", filename, error);
        return 0;
     }
     if(face->num_glyphs <= 0) {
@@ -179,6 +179,7 @@ gfxfont_t* gfxfont_load(char*filename, double quality)
     //font->leading = font->layout->ascent + font->layout->descent;
     //font->encoding = FONT_ENCODING_UNICODE;
     font->max_unicode = 0;
+    font->id = strdup(id);
     
     font->glyphs = rfx_calloc(face->num_glyphs*sizeof(gfxglyph_t));
     glyph2unicode = rfx_calloc(face->num_glyphs*sizeof(int));
@@ -211,12 +212,13 @@ gfxfont_t* gfxfont_load(char*filename, double quality)
           the encoding is no longer unicode. 
           TODO: find a way to convert the encoding to unicode
         */
-       if(font->max_unicode == 0 && charmap < face->num_charmaps - 1) {
+       if(font->max_unicode == 0 && charmap < face->num_charmaps-1 && 
+               face->charmaps[charmap+1]->encoding != 0x41444243 /* custom */)
+               {
            charmap++;
            FT_Set_Charmap(face, face->charmaps[charmap]);
-           //font->encoding = 0;//anything but unicode FIXME
            isunicode = 0;
-       } else 
+       } else
            break;
     }
 
@@ -281,12 +283,17 @@ gfxfont_t* gfxfont_load(char*filename, double quality)
                hasname = 1;
            }
        }
-       if(has_had_errors && (isunicode && !glyph2unicode[t]) && !hasname) {
+
+#if 0 // some cantonese pdfs fail to work if this is activated
+
+       if(has_had_errors && (isunicode && !glyph2unicode[t]) && !hasname && t>=256) {
            /* some freetype versions crash or corrupt memory if we try to load
               characters (without unicode index or name) above 256 for some fonts.
               So skip those characters once the first error occured */
            omit = 1;
        }
+#endif
+
        if(!omit) {
            error = FT_Load_Glyph(face, t, FT_LOAD_NO_BITMAP);
            if(error) {
@@ -294,7 +301,7 @@ gfxfont_t* gfxfont_load(char*filename, double quality)
                    fprintf(stderr, "Warning: glyph %d/%d (unicode %d, name %s) has return code %d\n", t, face->num_glyphs, glyph2unicode[t], name, error);
                else
                    fprintf(stderr, "Warning: glyph %d/%d (unicode %d) has return code %d\n", t, face->num_glyphs, glyph2unicode[t], error);
-               omit = 1;
+               omit = 2;
 
 #if 0
                if(!has_had_errors) {
@@ -317,7 +324,7 @@ gfxfont_t* gfxfont_load(char*filename, double quality)
            error = FT_Get_Glyph(face->glyph, &glyph);
            if(error) {
                fprintf(stderr, "Couldn't get glyph %d/%d, error:%d\n", t, face->num_glyphs, error);
-               omit = 1;
+               omit = 3;
            }
        }
 
@@ -335,9 +342,9 @@ gfxfont_t* gfxfont_load(char*filename, double quality)
                fprintf(stderr, "Couldn't decompose glyph %d\n", t);
                gfxline_free((gfxline_t*)draw.result(&draw));
                FT_Done_Glyph(glyph);
-               omit = 1;
+               omit = 4;
            } else {
-               font->glyphs[font->num_glyphs].advance = glyph->advance.x*20/65536;
+               font->glyphs[font->num_glyphs].advance = (glyph->advance.x*20)/65536;
                font->glyphs[font->num_glyphs].line = (gfxline_t*)draw.result(&draw);
            }
            l = font->glyphs[font->num_glyphs].line;
@@ -347,7 +354,7 @@ gfxfont_t* gfxfont_load(char*filename, double quality)
                }
                l = l->next;
            }
-           if(!ok) {
+           if(!ok && !name) {
                gfxline_free(font->glyphs[font->num_glyphs].line);
                font->glyphs[font->num_glyphs].line = 0;
                font->glyphs[font->num_glyphs].advance = 0;
@@ -357,15 +364,14 @@ gfxfont_t* gfxfont_load(char*filename, double quality)
                   have unicode indices attached to them.
                   Remove that information, in order to not confuse
                   any converter applications.
-
-                   TODO: what about space characters? */
+                   */
                font->glyphs[font->num_glyphs].unicode = 0;
                if(font->glyphs[font->num_glyphs].name) {
                    free(font->glyphs[font->num_glyphs].name);
                    font->glyphs[font->num_glyphs].name = 0;
                }
                FT_Done_Glyph(glyph);
-               omit = 1;
+               omit = 5;
            }
        }
 
@@ -392,8 +398,8 @@ gfxfont_t* gfxfont_load(char*filename, double quality)
 
     FT_Done_Face(face);
     FT_Done_FreeType(ftlibrary);ftlibrary=0;
-  
-    if(!isunicode && font->num_glyphs>0) {
+    if(!isunicode && font->num_glyphs>0 && font->max_unicode) {
        /* if the encoding isn't unicode, remap the font
           so that the encoding equals the char position, and
           remove the unicode table */