swf_WriteFont: write characters > 256
[swftools.git] / lib / modules / swftext.c
index 0a7c886..8ea5dd1 100644 (file)
@@ -258,8 +258,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,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;
@@ -305,8 +308,11 @@ int swf_FontExtract_DefineText(int id,SWFFONT * f,TAG * t,int jobs)
           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 +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;
@@ -713,8 +724,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 +754,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/50 > xmax)
+                  xmax = font->glyph[g].advance*textscale/50;
            }
        }
        swf.movieSize.xmax = xmax*20;
@@ -784,11 +793,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 +808,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);