prettyfied dump_matrix() output
[swftools.git] / lib / modules / swftext.c
index 8690989..b1a1080 100644 (file)
@@ -263,6 +263,8 @@ int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag)
     int t, glyphcount;
     int maxcode;
     int fid;
+    U32 offset_start;
+    U32 *offset;
     U8 flags1, flags2, namelen;
     swf_SaveTagPos(tag);
     swf_SetTagPos(tag, 0);
@@ -296,23 +298,34 @@ int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag)
     font->glyph = (SWFGLYPH *) rfx_calloc(sizeof(SWFGLYPH) * glyphcount);
     font->glyph2ascii = (U16 *) rfx_calloc(sizeof(U16) * glyphcount);
 
+    offset = rfx_calloc(sizeof(U32)*(glyphcount+1));
+    offset_start = tag->pos;
+
     if (flags1 & 8) {          // wide offsets
        for (t = 0; t < glyphcount; t++)
-           swf_GetU32(tag);    //offset[t]
+           offset[t] = swf_GetU32(tag);        //offset[t]
 
        if (glyphcount)         /* this _if_ is not in the specs */
-           swf_GetU32(tag);    // fontcodeoffset
+           offset[glyphcount] = swf_GetU32(tag);       // fontcodeoffset
+       else
+           offset[glyphcount] = tag->pos;
     } else {
        for (t = 0; t < glyphcount; t++)
-           swf_GetU16(tag);    //offset[t]
+           offset[t] = swf_GetU16(tag);        //offset[t]
 
        if (glyphcount)         /* this _if_ is not in the specs */
-           swf_GetU16(tag);    // fontcodeoffset
+           offset[glyphcount] = swf_GetU16(tag);       // fontcodeoffset
+       else
+           offset[glyphcount] = tag->pos;
     }
-    /* TODO: we should use the offset positions, not just
-             blindly read in shapes */
-    for (t = 0; t < glyphcount; t++)
+    for (t = 0; t < glyphcount; t++) {
+       swf_SetTagPos(tag, offset[t]+offset_start);
        swf_GetSimpleShape(tag, &(font->glyph[t].shape));
+    }
+
+    swf_SetTagPos(tag, offset[glyphcount]+offset_start);
+
+    free(offset);
 
     maxcode = 0;
     for (t = 0; t < glyphcount; t++) {
@@ -418,6 +431,8 @@ swf_FontExtract_DefineTextCallback(int id, SWFFONT * f, TAG * t, int jobs,
                color.b = swf_GetU8(t);
                if (swf_GetTagID(t) == ST_DEFINETEXT2)
                    color.a = swf_GetU8(t);
+               else
+                   color.a = 255;
            }
            if (flags & TF_HASXOFFSET)
                x = swf_GetS16(t);
@@ -560,8 +575,10 @@ static void font_freeglyphnames(SWFFONT*f)
     if (f->glyphnames) {
        int t;
        for (t = 0; t < f->numchars; t++) {
-           if (f->glyphnames[t])
+           if (f->glyphnames[t]) {
                rfx_free(f->glyphnames[t]);
+               f->glyphnames[t] = 0;
+           }
        }
        rfx_free(f->glyphnames);
        f->glyphnames = 0;
@@ -592,7 +609,7 @@ static void font_freename(SWFFONT*f)
     }
 }
 
-int swf_FontReduce(SWFFONT * f)
+int swf_FontReduce_old(SWFFONT * f)
 {
     int i, j;
     int max_unicode = 0;
@@ -635,6 +652,42 @@ int swf_FontReduce(SWFFONT * f)
     return j;
 }
 
+int swf_FontReduce(SWFFONT * f)
+{
+    int i;
+    int max_unicode = 0;
+    int max_glyph = 0;
+    if ((!f) || (!f->use) || f->use->is_reduced)
+       return -1;
+    
+    font_freelayout(f);
+    font_freeglyphnames(f);
+
+    for (i = 0; i < f->numchars; i++) {
+       if(!f->use->chars[i]) {
+           f->glyph2ascii[i] = 0;
+           if(f->glyph[i].shape) {
+               swf_ShapeFree(f->glyph[i].shape);
+               f->glyph[i].shape = 0;
+               f->glyph[i].advance = 0;
+           }
+       } else {
+           max_glyph = i+1;
+       }
+    }
+    for (i = 0; i < f->maxascii; i++) {
+       if(!f->use->chars[f->ascii2glyph[i]]) {
+           f->ascii2glyph[i] = -1;
+       } else {
+           max_unicode = i+1;
+       }
+    }
+    f->maxascii = max_unicode;
+    f->numchars = max_glyph;
+    font_freename(f);
+    return 0;
+}
+
 void swf_FontSort(SWFFONT * font)
 {
     int i, j, k;
@@ -741,7 +794,7 @@ int swf_FontUseGlyph(SWFFONT * f, int glyph)
 {
     if (!f->use) 
        swf_FontInitUsage(f);
-    if(glyph < 0 || glyph > f->numchars)
+    if(glyph < 0 || glyph >= f->numchars)
        return -1;
     f->use->chars[glyph] = 1;
     return 0;