polygon intersector: added horizontal line reconstruction
[swftools.git] / lib / modules / swftext.c
index d9e4115..d2b8989 100644 (file)
@@ -22,6 +22,8 @@
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 
+#include "../rfxswf.h"
+
 U32 readUTF8char(U8 ** text)
 {
     U32 c = 0;
@@ -118,7 +120,6 @@ int swf_FontEnumerate(SWF * swf, void (*FontCallback) (void*, U16, U8 *), void*s
                int l;
                U8 s[257];
                s[0] = 0;
-               swf_SaveTagPos(t);
                swf_SetTagPos(t, 0);
 
                id = swf_GetU16(t);
@@ -130,8 +131,6 @@ int swf_FontEnumerate(SWF * swf, void (*FontCallback) (void*, U16, U8 *), void*s
                }
 
                (FontCallback) (self, id, s);
-
-               swf_RestoreTagPos(t);
            }
        }
        t = swf_NextTag(t);
@@ -142,7 +141,6 @@ int swf_FontEnumerate(SWF * swf, void (*FontCallback) (void*, U16, U8 *), void*s
 int swf_FontExtract_DefineFont(int id, SWFFONT * f, TAG * t)
 {
     U16 fid;
-    swf_SaveTagPos(t);
     swf_SetTagPos(t, 0);
 
     fid = swf_GetU16(t);
@@ -157,15 +155,13 @@ int swf_FontExtract_DefineFont(int id, SWFFONT * f, TAG * t)
        of = swf_GetU16(t);
        n = of / 2;
        f->numchars = n;
-       f->glyph = rfx_calloc(sizeof(SWFGLYPH) * n);
+       f->glyph = (SWFGLYPH*)rfx_calloc(sizeof(SWFGLYPH) * n);
 
        for (i = 1; i < n; i++)
            swf_GetU16(t);
        for (i = 0; i < n; i++)
            swf_GetSimpleShape(t, &f->glyph[i].shape);
     }
-
-    swf_RestoreTagPos(t);
     return id;
 }
 
@@ -174,7 +170,6 @@ int swf_FontExtract_DefineFontInfo(int id, SWFFONT * f, TAG * t)
     U16 fid;
     U16 maxcode;
     U8 flags;
-    swf_SaveTagPos(t);
     swf_SetTagPos(t, 0);
 
     fid = swf_GetU16(t);
@@ -229,17 +224,12 @@ int swf_FontExtract_DefineFontInfo(int id, SWFFONT * f, TAG * t)
        for (i = 0; i < f->numchars; i++)
            f->ascii2glyph[f->glyph2ascii[i]] = i;
     }
-
-    swf_RestoreTagPos(t);
     return id;
 }
 
 int swf_FontExtract_GlyphNames(int id, SWFFONT * f, TAG * tag)
 {
     U16 fid;
-    U16 maxcode;
-    U8 flags;
-    swf_SaveTagPos(tag);
     swf_SetTagPos(tag, 0);
 
     fid = swf_GetU16(tag);
@@ -247,13 +237,11 @@ int swf_FontExtract_GlyphNames(int id, SWFFONT * f, TAG * tag)
     if (fid == id) {
        int num = swf_GetU16(tag);
        int t;
-       f->glyphnames = rfx_alloc(sizeof(char *) * num);
+       f->glyphnames = (char**)rfx_alloc(sizeof(char *) * num);
        for (t = 0; t < num; t++) {
            f->glyphnames[t] = strdup(swf_GetString(tag));
        }
     }
-
-    swf_RestoreTagPos(tag);
     return id;
 }
 
@@ -266,7 +254,6 @@ int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag)
     U32 offset_start;
     U32 *offset;
     U8 flags1, flags2, namelen;
-    swf_SaveTagPos(tag);
     swf_SetTagPos(tag, 0);
     font->version = 2;
     fid = swf_GetU16(tag);
@@ -298,7 +285,7 @@ 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 = (U32*)rfx_calloc(sizeof(U32)*(glyphcount+1));
     offset_start = tag->pos;
 
     if (flags1 & 8) {          // wide offsets
@@ -323,7 +310,8 @@ int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag)
        swf_GetSimpleShape(tag, &(font->glyph[t].shape));
     }
 
-    swf_SetTagPos(tag, offset[glyphcount]+offset_start);
+    if(glyphcount)
+        swf_SetTagPos(tag, offset[glyphcount]+offset_start);
 
     free(offset);
 
@@ -358,7 +346,7 @@ int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag)
            S16 advance = swf_GetS16(tag);
            font->glyph[t].advance = advance;
        }
-       font->layout->bounds = rfx_alloc(glyphcount * sizeof(SRECT));
+       font->layout->bounds = (SRECT*)rfx_alloc(glyphcount * sizeof(SRECT));
        for (t = 0; t < glyphcount; t++) {
            swf_ResetReadBits(tag);
            swf_GetRect(tag, &font->layout->bounds[t]);
@@ -369,7 +357,7 @@ int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag)
 
        font->layout->kerning = (SWFKERNING *) rfx_alloc(sizeof(SWFKERNING) * kerningcount);
        if (kerningcount) {
-           font->layout->kerning = rfx_alloc(sizeof(*font->layout->kerning) * kerningcount);
+           font->layout->kerning = (SWFKERNING*)rfx_alloc(sizeof(*font->layout->kerning) * kerningcount);
            for (t = 0; t < kerningcount; t++) {
                if (flags1 & 4) {       // wide codes
                    font->layout->kerning[t].char1 = swf_GetU16(tag);
@@ -382,7 +370,6 @@ int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag)
            }
        }
     }
-    swf_RestoreTagPos(t);
     return font->id;
 }
 
@@ -400,14 +387,13 @@ swf_FontExtract_DefineTextCallback(int id, SWFFONT * f, TAG * t, int jobs,
     SRECT r;
     MATRIX m;
     U8 gbits, abits;
-    int fid = 0;
+    int fid = -1;
     RGBA color;
     int x = 0, y = 0;
     int fontsize = 0;
 
     memset(&color, 0, sizeof(color));
 
-    swf_SaveTagPos(t);
     swf_SetTagPos(t, 0);
 
     cid = swf_GetU16(t);
@@ -459,7 +445,6 @@ swf_FontExtract_DefineTextCallback(int id, SWFFONT * f, TAG * t, int jobs,
                adv = swf_GetBits(t, abits);
                xpos += adv;
 
-               // <deprecated>
                if (id == fid) {
                    if (jobs & FEDTJ_PRINT) {
                        int code = f->glyph2ascii[glyph];
@@ -467,12 +452,7 @@ swf_FontExtract_DefineTextCallback(int id, SWFFONT * f, TAG * t, int jobs,
                    }
                    if (jobs & FEDTJ_MODIFY)
                        f->glyph[glyph].advance = adv * 20;     //?
-               } else {
-                   if (jobs & FEDTJ_PRINT) {
-                       printf("?");
-                   }
                }
-               // </deprecated>
 
                buf[i] = glyph;
            }
@@ -484,7 +464,6 @@ swf_FontExtract_DefineTextCallback(int id, SWFFONT * f, TAG * t, int jobs,
        }
     }
 
-    swf_RestoreTagPos(t);
     return id;
 }
 
@@ -684,7 +663,7 @@ int swf_FontReduce_swfc(SWFFONT * f)
     }
     f->use->used_glyphs = j;
     for (i = 0; i < f->maxascii; i++) {
-       if(f->ascii2glyph[i] > -1)
+       if(f->ascii2glyph[i] > -1) {
            if (f->use->chars[f->ascii2glyph[i]]<0) {
                f->use->chars[f->ascii2glyph[i]] = 0;
                f->ascii2glyph[i] = -1;
@@ -694,6 +673,7 @@ int swf_FontReduce_swfc(SWFFONT * f)
                max_unicode = i + 1;
            }
        }
+    }
     f->maxascii = max_unicode;
     f->use->is_reduced = 1;
     f->numchars = j;
@@ -746,13 +726,13 @@ int swf_FontReduce(SWFFONT * f)
 
 void swf_FontSort(SWFFONT * font)
 {
-    int i, j, k;
+    int i, j;
     int *newplace;
     int *newpos;
     if (!font)
        return;
 
-    newplace = rfx_alloc(sizeof(int) * font->numchars);
+    newplace = (int*)rfx_alloc(sizeof(int) * font->numchars);
 
     for (i = 0; i < font->numchars; i++) {
        newplace[i] = i;
@@ -790,7 +770,7 @@ void swf_FontSort(SWFFONT * font)
                }
            }
        }
-    newpos = rfx_alloc(sizeof(int) * font->numchars);
+    newpos = (int*)rfx_alloc(sizeof(int) * font->numchars);
     for (i = 0; i < font->numchars; i++) {
        newpos[newplace[i]] = i;
     }
@@ -818,9 +798,11 @@ int swf_FontInitUsage(SWFFONT * f)
        fprintf(stderr, "Usage initialized twice");
        return -1;
     }
-    f->use = rfx_alloc(sizeof(FONTUSAGE));
+    f->use = (FONTUSAGE*)rfx_alloc(sizeof(FONTUSAGE));
     f->use->is_reduced = 0;
-    f->use->chars = rfx_calloc(sizeof(f->use->chars[0]) * f->numchars);
+    f->use->used_glyphs = 0;
+    f->use->chars = (int*)rfx_calloc(sizeof(f->use->chars[0]) * f->numchars);
+    f->use->glyphs_specified = 0;
     return 0;
 }
 
@@ -936,7 +918,6 @@ int swf_FontSetDefine2(TAG * tag, SWFFONT * f)
     U8 flags = 0;
     int t;
     int pos;
-    int pos2;
     swf_SetU16(tag, f->id);
 
     if (f->layout) flags |= 128;               // haslayout
@@ -963,10 +944,11 @@ int swf_FontSetDefine2(TAG * tag, SWFFONT * f)
     swf_SetU8(tag, 0);         //reserved flags
     if (f->name) {
        /* font name */
-       swf_SetU8(tag, strlen(f->name));
-       swf_SetBlock(tag, f->name, strlen(f->name));
+       swf_SetU8(tag, strlen((const char*)f->name)+1);
+       swf_SetBlock(tag, f->name, strlen((const char*)f->name)+1);
     } else {
        /* font name (="") */
+       swf_SetU8(tag, 1);
        swf_SetU8(tag, 0);
     }
     /* number of glyphs */
@@ -1066,7 +1048,7 @@ int swf_FontSetInfo(TAG * t, SWFFONT * f)
        return -1;
     swf_ResetWriteBits(t);
     swf_SetU16(t, f->id);
-    l = f->name ? strlen(f->name) : 0;
+    l = f->name ? strlen((const char *)f->name) : 0;
     if (l > 255)
        l = 255;
     swf_SetU8(t, l);
@@ -1143,14 +1125,14 @@ void swf_FontFree(SWFFONT * f)
     rfx_free(f);
 }
 
-int swf_TextSetInfoRecord(TAG * t, SWFFONT * font, U16 size, RGBA * color, int dx, int dy)
+int swf_TextSetInfoRecord(TAG * t, SWFFONT * font, U16 size, RGBA * color, int x, int y)
 {
     U8 flags;
     if (!t)
        return -1;
 
-    flags = TF_TEXTCONTROL | (font ? TF_HASFONT : 0) | (color ? TF_HASCOLOR : 0) | (dx ? TF_HASXOFFSET : 0)
-       | (dy ? TF_HASYOFFSET : 0);
+    flags = TF_TEXTCONTROL | (font ? TF_HASFONT : 0) | (color ? TF_HASCOLOR : 0) | (x ? TF_HASXOFFSET : 0)
+       | (y ? TF_HASYOFFSET : 0);
 
     swf_SetU8(t, flags);
     if (font)
@@ -1161,20 +1143,20 @@ int swf_TextSetInfoRecord(TAG * t, SWFFONT * font, U16 size, RGBA * color, int d
        else
            swf_SetRGB(t, color);
     }
-    if (dx) {
-       if(dx != SET_TO_ZERO) {
-           if(dx>32767 || dx<-32768)
-               fprintf(stderr, "Warning: Horizontal char position overflow: %d\n", dx);
-           swf_SetS16(t, dx);
+    if (x) {
+       if(x != SET_TO_ZERO) {
+           if(x>32767 || x<-32768)
+               fprintf(stderr, "Warning: Horizontal char position overflow: %d\n", x);
+           swf_SetS16(t, x);
        } else {
            swf_SetS16(t, 0);
        }
     }
-    if (dy) {
-       if(dy != SET_TO_ZERO) {
-           if(dy>32767 || dy<-32768)
-               fprintf(stderr, "Warning: Vertical char position overflow: %d\n", dy);
-           swf_SetS16(t, dy);
+    if (y) {
+       if(y != SET_TO_ZERO) {
+           if(y>32767 || y<-32768)
+               fprintf(stderr, "Warning: Vertical char position overflow: %d\n", y);
+           swf_SetS16(t, y);
        } else {
            swf_SetS16(t, 0);
        }
@@ -1343,7 +1325,7 @@ SRECT swf_TextCalculateBBoxUTF8(SWFFONT * font, U8 * s, int scale)
 }
 
 
-SWFFONT *swf_ReadFont(char *filename)
+SWFFONT *swf_ReadFont(const char *filename)
 {
     int f;
     SWF swf;
@@ -1383,7 +1365,7 @@ void swf_WriteFont(SWFFONT * font, char *filename)
 
     memset(&swf, 0x00, sizeof(SWF));
 
-    swf.fileVersion = 4;
+    swf.fileVersion = 9;
     swf.frameRate = 0x4000;
 
     /* if we use DefineFont1 to store the characters,
@@ -1408,6 +1390,17 @@ void swf_WriteFont(SWFFONT * font, char *filename)
        t = swf_InsertTag(t, ST_DEFINEFONT2);
        swf_FontSetDefine2(t, font);
     }
+    if(font->name) {
+       t = swf_InsertTag(t, ST_NAMECHARACTER);
+        swf_SetU16(t, WRITEFONTID);
+        swf_SetString(t, font->name);
+       t = swf_InsertTag(t, ST_EXPORTASSETS);
+        swf_SetU16(t, 1);
+        swf_SetU16(t, WRITEFONTID);
+        swf_SetString(t, font->name);
+
+        t = swf_AddAS3FontDefine(t, WRITEFONTID, font->name);
+    }
 
     if (storeGlyphNames && font->glyphnames) {
        int c;
@@ -1416,9 +1409,9 @@ void swf_WriteFont(SWFFONT * font, char *filename)
        swf_SetU16(t, font->numchars);
        for (c = 0; c < font->numchars; c++) {
            if (font->glyphnames[c])
-               swf_SetString(t, font->glyphnames[c]);
+               swf_SetString(t, (U8*)font->glyphnames[c]);
            else
-               swf_SetString(t, "");
+               swf_SetString(t, (U8*)"");
        }
     }
 
@@ -1531,7 +1524,7 @@ void swf_WriteFont(SWFFONT * font, char *filename)
 }
 
 
-void swf_SetEditText(TAG * tag, U16 flags, SRECT r, char *text, RGBA * color, int maxlength, U16 font, U16 height, EditTextLayout * layout, char *variable)
+void swf_SetEditText(TAG * tag, U16 flags, SRECT r, const char *text, RGBA * color, int maxlength, U16 font, U16 height, EditTextLayout * layout, const char *variable)
 {
     swf_SetRect(tag, &r);
     swf_ResetWriteBits(tag);
@@ -1567,12 +1560,12 @@ void swf_SetEditText(TAG * tag, U16 flags, SRECT r, char *text, RGBA * color, in
        swf_SetU16(tag, layout->indent);        //indent
        swf_SetU16(tag, layout->leading);       //leading
     }
-    swf_SetString(tag, variable);
+    swf_SetString(tag, (U8*)variable);
     if (flags & ET_HASTEXT)
-       swf_SetString(tag, text);
+       swf_SetString(tag, (U8*)text);
 }
 
-SRECT swf_SetDefineText(TAG * tag, SWFFONT * font, RGBA * rgb, char *text, int scale)
+SRECT swf_SetDefineText(TAG * tag, SWFFONT * font, RGBA * rgb, const char *text, int scale)
 {
     SRECT r;
     U8 gbits, abits;
@@ -1582,7 +1575,7 @@ SRECT swf_SetDefineText(TAG * tag, SWFFONT * font, RGBA * rgb, char *text, int s
     int pos = 0;
     int ystep = 0;
     if (font->layout) {
-       r = swf_TextCalculateBBoxUTF8(font, text, scale * 20);
+       r = swf_TextCalculateBBoxUTF8(font, (U8*)text, scale * 20);
        ystep = font->layout->leading;
     } else {
        fprintf(stderr, "No layout information- can't compute text bbox accurately");
@@ -1606,7 +1599,7 @@ SRECT swf_SetDefineText(TAG * tag, SWFFONT * font, RGBA * rgb, char *text, int s
      */
     swf_SetMatrix(tag, 0);
 
-    swf_TextCountBitsUTF8(font, text, scale * 20, &gbits, &abits);
+    swf_TextCountBitsUTF8(font, (U8*)text, scale * 20, &gbits, &abits);
     swf_SetU8(tag, gbits);
     swf_SetU8(tag, abits);
 
@@ -1695,7 +1688,7 @@ void swf_FontCreateLayout(SWFFONT * f)
     }
 }
 
-void swf_DrawText(drawer_t * draw, SWFFONT * font, int size, char *text)
+void swf_DrawText(drawer_t * draw, SWFFONT * font, int size, const char *text)
 {
     U8 *s = (U8 *) text;
     int advance = 0;