new function FontExtract_DefineTextCallback.
[swftools.git] / lib / modules / swftext.c
index 62618f2..a5db863 100644 (file)
@@ -46,7 +46,8 @@ int swf_FontEnumerate(SWF * swf,void (*FontCallback) (U16,U8*))
   n = 0;
 
   while (t)
-  { if (swf_GetTagID(t)==ST_DEFINEFONTINFO)
+  { if (swf_GetTagID(t)==ST_DEFINEFONTINFO ||
+         swf_GetTagID(t)==ST_DEFINEFONT2)
     { n++;
       if (FontCallback)
       { U16 id;
@@ -54,8 +55,10 @@ int swf_FontEnumerate(SWF * swf,void (*FontCallback) (U16,U8*))
         U8 s[257];
         swf_SaveTagPos(t);
         swf_SetTagPos(t,0);
-
+       
         id  = swf_GetU16(t);
+       if(swf_GetTagID(t) == ST_DEFINEFONT2)
+           swf_GetU16(t);
         l   = swf_GetU8(t);
         swf_GetBlock(t,s,l);
         s[l] = 0;
@@ -155,9 +158,15 @@ int swf_FontExtract_DefineFont2(int id,SWFFONT * font,TAG * tag)
 {
     int t, glyphcount;
     int maxcode;
+    int fid;
     U8 flags1,flags2,namelen;
+    swf_SaveTagPos(tag);
+    swf_SetTagPos(tag,0);
     font->version=2;
-    font->id = swf_GetU16(tag);
+    fid = swf_GetU16(tag);
+    if(id && id!=fid)
+       return;
+    font->id = fid;
     flags1 = swf_GetU8(tag);
     flags2 = swf_GetU8(tag); //reserved flags
     namelen = swf_GetU8(tag);
@@ -235,21 +244,24 @@ int swf_FontExtract_DefineFont2(int id,SWFFONT * font,TAG * tag)
                    font->layout->kerning[t].char1 = swf_GetU16(tag);
                    font->layout->kerning[t].char2 = swf_GetU16(tag);
                } else {
-                   font->layout->kerning[t].char1 = swf_GetU16(tag);
-                   font->layout->kerning[t].char2 = swf_GetU16(tag);
+                   font->layout->kerning[t].char1 = swf_GetU8(tag);
+                   font->layout->kerning[t].char2 = swf_GetU8(tag);
                }
                font->layout->kerning[t].adjustment = swf_GetS16(tag);
            }
        }
     }
+    swf_RestoreTagPos(t);
     return font->id;
 }
 
 
 #define FEDTJ_PRINT  0x01
 #define FEDTJ_MODIFY 0x02
+#define FEDTJ_CALLBACK 0x04
 
-int swf_FontExtract_DefineText(int id,SWFFONT * f,TAG * t,int jobs)
+int swf_FontExtract_DefineTextCallback(int id,SWFFONT * f,TAG * t,int jobs, 
+       void(*callback)(int*chars, int nr, int fontid))
 { U16    cid;
   SRECT  r;
   MATRIX m;
@@ -284,6 +296,7 @@ int swf_FontExtract_DefineText(int id,SWFFONT * f,TAG * t,int jobs)
     }
     else
     { int i;
+      int buf[256];
       for (i=0;i<flags;i++)
       { int glyph;
         int adv;
@@ -293,10 +306,13 @@ int swf_FontExtract_DefineText(int id,SWFFONT * f,TAG * t,int jobs)
         { int code = f->glyph2ascii[glyph];
           if (jobs&FEDTJ_PRINT) printf("%c",code);
           if (jobs&FEDTJ_MODIFY)
-            /*if (!f->glyph[code].advance)*/ f->glyph[code].advance = adv;
+            /*if (!f->glyph[code].advance)*/ f->glyph[glyph].advance = adv;
         }
+       buf[i] = glyph;
       }
       if ((id==fid)&&(jobs&FEDTJ_PRINT)) printf("\n");
+      if (jobs&FEDTJ_CALLBACK)
+         callback(buf, flags, fid);
     }
     flags = swf_GetU8(t);
   }
@@ -305,6 +321,11 @@ int swf_FontExtract_DefineText(int id,SWFFONT * f,TAG * t,int jobs)
   return id;
 }  
 
+int swf_FontExtract_DefineText(int id,SWFFONT * f,TAG * t,int jobs)
+{
+    return swf_FontExtract_DefineTextCallback(id,f,t,jobs,0);
+}
+
 int swf_FontExtract(SWF * swf,int id,SWFFONT * * font)
 { TAG * t;
   SWFFONT * f;
@@ -362,9 +383,9 @@ int swf_FontReduce(SWFFONT * f,FONTUSAGE * use)
       }
       else
       { swf_ShapeFree(f->glyph[i].shape);
-       f->ascii2glyph[f->glyph2ascii[i]] = -1;
+        f->ascii2glyph[f->glyph2ascii[i]] = -1;
        f->glyph2ascii[i] = 0;
-        f->glyph[i].shape   = 0;
+        f->glyph[i].shape   = NULL;
         f->glyph[i].advance = 0;
       }
     } else f->ascii2glyph[f->glyph2ascii[i]] = -1;
@@ -661,15 +682,39 @@ U32 swf_TextGetWidth(SWFFONT * font,U8 * s,int scale)
   return res;
 }
 
-void swf_WriteFont(SWFFONT*font, char* filename, int useDefineFont2)
+SWFFONT* swf_ReadFont(char* filename)
+{
+  int f;
+  SWF swf;
+  if(!filename)
+      return 0;
+  f = open(filename,O_RDONLY);
+  
+  if (f<0 || swf_ReadSWF(f,&swf)<0)
+  { fprintf(stderr,"%s is not a valid SWF font file or contains errors.\n",filename);
+    close(f);
+    return 0;
+  }
+  else
+  { SWFFONT*font;
+    close(f);
+    if(swf_FontExtract(&swf, WRITEFONTID, &font) < 0)
+       return 0;
+    swf_FreeTags(&swf);
+    return font;
+  }
+}
+
+void swf_WriteFont(SWFFONT*font, char* filename)
 { SWF swf;
   TAG * t;
   SRECT r;
   RGBA rgb;
   int f;
+  int useDefineFont2 = 1;
 
   if(useDefineFont2) {
-      fprintf(stderr, "DefineFont2 is not yet supported!\n");
+      //fprintf(stderr, "DefineFont2 is not yet supported!\n");
       useDefineFont2 = 0;
   }
 
@@ -690,10 +735,10 @@ void swf_WriteFont(SWFFONT*font, char* filename, int useDefineFont2)
   {
       t = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR);
       swf.firstTag = t;
-           rgb.r = 0xff;
-           rgb.g = 0xff;
-           rgb.b = 0xff;
-           swf_SetRGB(t,&rgb);
+            rgb.r = 0xff;
+            rgb.g = 0xff;
+            rgb.b = 0xff;
+            swf_SetRGB(t,&rgb);
       t = swf_InsertTag(t,ST_DEFINEFONT);
   }
   else
@@ -708,11 +753,10 @@ void swf_WriteFont(SWFFONT*font, char* filename, int useDefineFont2)
         swf_FontSetInfo(t,font);
 
   if(!useDefineFont2)
-  {
-       int textscale = 400;
+  {     int textscale = 400;
        int s;
        int xmax = 0;
-       int ymax = textscale * 20;
+       int ymax = textscale * 2 * 20;
        U8 gbits,abits;
        char text[257];
        int x,y;
@@ -763,7 +807,7 @@ void swf_WriteFont(SWFFONT*font, char* filename, int useDefineFont2)
                    }
                }
                if(c) {
-                 swf_TextSetInfoRecord(t,font,textscale,&rgb,lastx+1,textscale*y);
+                 swf_TextSetInfoRecord(t,font,textscale,&rgb,lastx+1,textscale*y*2);
                  for(x=0;x<16;x++)
                  {
                      int g = font->ascii2glyph[y*16+x];
@@ -781,12 +825,13 @@ void swf_WriteFont(SWFFONT*font, char* filename, int useDefineFont2)
                } 
            }
            swf_SetU8(t,0);
+
         
-       t = swf_InsertTag(t,ST_PLACEOBJECT2);
+        t = swf_InsertTag(t,ST_PLACEOBJECT2);
 
-           swf_ObjectPlace(t,font->id+1,1,NULL,NULL,NULL);
+            swf_ObjectPlace(t,font->id+1,1,NULL,NULL,NULL);
      
-       t = swf_InsertTag(t,ST_SHOWFRAME);
+        t = swf_InsertTag(t,ST_SHOWFRAME);
   }
   
   t = swf_InsertTag(t,ST_END);
@@ -798,26 +843,4 @@ void swf_WriteFont(SWFFONT*font, char* filename, int useDefineFont2)
   swf_FreeTags(&swf);
 }
 
-SWFFONT* swf_ReadFont(char* filename)
-{
-  int f;
-  SWF swf;
-  if(!filename)
-      return 0;
-  f = open(filename,O_RDONLY);
-  
-  if (f<0 || swf_ReadSWF(f,&swf)<0)
-  { fprintf(stderr,"%s is not a valid SWF font file or contains errors.\n",filename);
-    close(f);
-    return 0;
-  }
-  else
-  { SWFFONT*font;
-    close(f);
-    if(swf_FontExtract(&swf, WRITEFONTID, &font) < 0)
-       return 0;
-    swf_FreeTags(&swf);
-    return font;
-  }
-}