several bugfixes
[swftools.git] / lib / modules / swftext.c
index 270447d..411ab9d 100644 (file)
@@ -107,16 +107,17 @@ int swf_FontExtract_DefineFontInfo(int id,SWFFONT * f,TAG * t)
   swf_SaveTagPos(t);
   swf_SetTagPos(t,0);
 
-  if(f->version>1) {
-      // DefineFont2 doesn't have FontInfo fields
-      fprintf(stderr, "fixme: FontInfo field for DefineFont2 encountered\n");
-      return -1;
-  }
 
   fid = swf_GetU16(t);
   if (fid==id)
   { U8 l = swf_GetU8(t);
     int i;
+  
+    if(f->version>1) {
+      // DefineFont2 doesn't have FontInfo fields
+      fprintf(stderr, "fixme: FontInfo field for DefineFont2 encountered\n");
+      return -1;
+    }
     
     if (l)
     { if (f->name) free(f->name);
@@ -165,7 +166,7 @@ int swf_FontExtract_DefineFont2(int id,SWFFONT * font,TAG * tag)
     font->version=2;
     fid = swf_GetU16(tag);
     if(id && id!=fid)
-       return;
+       return id;
     font->id = fid;
     flags1 = swf_GetU8(tag);
     flags2 = swf_GetU8(tag); //reserved flags
@@ -258,8 +259,10 @@ int swf_FontExtract_DefineFont2(int id,SWFFONT * font,TAG * tag)
 
 #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;
@@ -294,19 +297,25 @@ 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;
         glyph = swf_GetBits(t,gbits);
         adv = swf_GetBits(t,abits);
         if (id==fid)                    // mitlesen ?
-        { int code = f->glyph2ascii[glyph];
-          if (jobs&FEDTJ_PRINT) printf("%c",code);
+          if (jobs&FEDTJ_PRINT) {
+           { int code = f->glyph2ascii[glyph];
+             printf("%c",code);
+         }
           if (jobs&FEDTJ_MODIFY)
             /*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);
   }
@@ -315,6 +324,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;
@@ -372,9 +386,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;
@@ -671,15 +685,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;
   }
 
@@ -689,8 +727,6 @@ void swf_WriteFont(SWFFONT*font, char* filename, int useDefineFont2)
 
   swf.fileVersion    = 4;
   swf.frameRate      = 0x4000;
-  swf.movieSize.xmax = 20*640;
-  swf.movieSize.ymax = 20*480;
 
   if(!useDefineFont2)
   /* if we use DefineFont1 to store the characters,
@@ -700,10 +736,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
@@ -718,22 +754,21 @@ 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 * (font->maxascii/16+1);
        U8 gbits,abits;
-       char text[257];
+       char text[MAX_CHAR_PER_FONT+1];
        int x,y;
-       text[256]=0;
-       for(s=0;s<256;s++)
+       text[MAX_CHAR_PER_FONT]=0;
+       for(s=0;s<font->maxascii;s++)
        {
            int g = font->ascii2glyph[s];
            text[s] = s;
            if(g>=0) {
-              if(font->glyph[g].advance*textscale/100 > xmax)
-                  xmax = font->glyph[g].advance*textscale/100;
+              if(font->glyph[g].advance*textscale/200 > xmax)
+                  xmax = font->glyph[g].advance*textscale/200;
            }
        }
        swf.movieSize.xmax = xmax*20;
@@ -761,11 +796,11 @@ void swf_WriteFont(SWFFONT*font, char* filename, int useDefineFont2)
            rgb.r = 0x00;
            rgb.g = 0x00;
            rgb.b = 0x00;
-           for(y=0;y<16;y++)
+           for(y=0;y<=((font->maxascii-1)/16);y++)
            {
                int c=0,lastx=-1, firstx=0;
                for(x=0;x<16;x++) {
-                   int g = font->ascii2glyph[y*16+x];
+                   int g = (y*16+x<font->maxascii)?font->ascii2glyph[y*16+x]:-1;
                    if(g>=0 && font->glyph[g].shape) {
                        c++;
                        if(lastx<0) 
@@ -773,10 +808,10 @@ 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];
+                     int g = (y*16+x<font->maxascii)?font->ascii2glyph[y*16+x]:-1;
                      if(g>=0 && font->glyph[g].shape) {
                        if(lastx != x*xmax) {
                            swf_TextSetInfoRecord(t,0,0,0,x*xmax+1,0);
@@ -791,12 +826,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);
@@ -808,26 +844,41 @@ void swf_WriteFont(SWFFONT*font, char* filename, int useDefineFont2)
   swf_FreeTags(&swf);
 }
 
-SWFFONT* swf_ReadFont(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)
 {
-  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;
-  }
+    swf_SetRect(tag,&r);
+    swf_ResetWriteBits(tag);
+
+    flags &= ~(ET_HASTEXT|ET_HASTEXTCOLOR|ET_HASMAXLENGTH|ET_HASFONT|ET_HASLAYOUT);
+    if(text) flags |= ET_HASTEXT;
+    if(color) flags |= ET_HASTEXTCOLOR;
+    if(maxlength) flags |= ET_HASMAXLENGTH;
+    if(font) flags |= ET_HASFONT;
+    if(layout) flags |= ET_HASLAYOUT;
+
+    swf_SetBits(tag, flags, 16);
+
+    if(flags & ET_HASFONT) {
+       swf_SetU16(tag, font); //font
+       swf_SetU16(tag, height); //fontheight
+    }
+    if(flags & ET_HASTEXTCOLOR) {
+       swf_SetRGBA(tag, color);
+    }
+    if(flags & ET_HASMAXLENGTH) {
+       swf_SetU16(tag, maxlength); //maxlength
+    }
+    if(flags & ET_HASLAYOUT) {
+       swf_SetU8(tag,layout->align); //align
+       swf_SetU16(tag,layout->leftmargin); //left margin
+       swf_SetU16(tag,layout->rightmargin); //right margin
+       swf_SetU16(tag,layout->indent); //indent
+       swf_SetU16(tag,layout->leading); //leading
+    }
+    swf_SetString(tag, variable);
+    if(flags & ET_HASTEXT)
+       swf_SetString(tag,text);
 }