several bugfixes
[swftools.git] / lib / modules / swftext.c
index 0a7c886..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;
@@ -713,8 +727,6 @@ void swf_WriteFont(SWFFONT*font, char* filename)
 
   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,
@@ -745,18 +757,18 @@ void swf_WriteFont(SWFFONT*font, char* filename)
   {     int textscale = 400;
        int s;
        int xmax = 0;
-       int ymax = textscale * 2 * 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;
@@ -784,11 +796,11 @@ void swf_WriteFont(SWFFONT*font, char* filename)
            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) 
@@ -799,7 +811,7 @@ void swf_WriteFont(SWFFONT*font, char* filename)
                  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);
@@ -833,3 +845,40 @@ 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)
+{
+    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);
+}
+