definefontinfo2
[swftools.git] / lib / modules / swftext.c
index ab0193c..10b04fc 100644 (file)
@@ -378,6 +378,7 @@ int swf_FontExtract(SWF * swf,int id,SWFFONT * * font)
         break;
         
       case ST_DEFINEFONTINFO:
+      case ST_DEFINEFONTINFO2:
         nid = swf_FontExtract_DefineFontInfo(id,f,t);
         break;
         
@@ -680,7 +681,9 @@ int swf_TextCountBits(SWFFONT * font,U8 * s,int scale,U8 * gbits,U8 * abits)
 
   while(s[0])
   { 
-    int glyph = font->ascii2glyph[s[0]];
+    int glyph = -1;
+    if(s[0] < font->maxascii)
+       glyph = font->ascii2glyph[s[0]];
     if(glyph>=0) {
        g = swf_CountBits(glyph,g);
        a = swf_CountBits((((U32)font->glyph[glyph].advance)*scale)/100,a);
@@ -695,23 +698,29 @@ int swf_TextCountBits(SWFFONT * font,U8 * s,int scale,U8 * gbits,U8 * abits)
 }
 
 int swf_TextSetCharRecord(TAG * t,SWFFONT * font,U8 * s,int scale,U8 gbits,U8 abits)
-{ int l,i;
+{ int l=0,i,pos;
     
   if ((!t)||(!font)||(!s)||(!font->ascii2glyph)) return -1;
 
-  l = strlen(s);
-  if (l>0x7f) l = 0x7f;
-  swf_SetU8(t,l);
+  pos = t->len;
+  swf_SetU8(t, l); //placeholder
 
-  for (i=0;i<l;i++)
+  for (i=0;s[i];i++)
   { 
-    int g = font->ascii2glyph[s[i]];
+    int g = -1;
+    if(s[i] < font->maxascii) 
+       g = font->ascii2glyph[s[i]];
     if(g>=0) {
       swf_SetBits(t,g,gbits);
       swf_SetBits(t,(((U32)font->glyph[g].advance)*scale)/100,abits);
+      l++;
+      if(l==0x7f)
+         break;
     }
   }
 
+  PUT8(&t->data[pos], l);
+
   swf_ResetWriteBits(t);
   return 0;
 }
@@ -722,7 +731,9 @@ U32 swf_TextGetWidth(SWFFONT * font,U8 * s,int scale)
   if (font&&s)
   { while (s[0])
     { 
-      int g = font->ascii2glyph[*s];
+      int g = -1;
+      if(*s < font->maxascii) 
+         g = font->ascii2glyph[*s];
       if(g>=0)
         res += font->glyph[g].advance;
       s++;
@@ -803,7 +814,7 @@ void swf_WriteFont(SWFFONT*font, char* filename)
        int xmax = 0;
        int ymax = textscale * 2 * (font->maxascii/16+1);
        U8 gbits,abits;
-       char text[MAX_CHAR_PER_FONT+1];
+       U8 text[MAX_CHAR_PER_FONT+1];
        int x,y;
        text[MAX_CHAR_PER_FONT]=0;
        for(s=0;s<font->maxascii;s++)
@@ -938,13 +949,15 @@ SRECT swf_SetDefineText(TAG*tag, SWFFONT*font, RGBA*rgb, char*text, int scale)
        while(*c) {
            if(*c < font->maxascii) {
                int g = font->ascii2glyph[*c];
-               SRECT rn = font->layout->bounds[g];
-               rn.xmin = (rn.xmin * scale)/2000 + pos;
-               rn.xmax = (rn.xmax * scale)/2000 + pos;
-               rn.ymin = (rn.ymin * scale)/2000;
-               rn.ymax = (rn.ymax * scale)/2000;
-               swf_ExpandRect2(&r, &rn);
-               pos += (font->glyph[g].advance*scale)/100;
+               if(g>=0) {
+                   SRECT rn = font->layout->bounds[g];
+                   rn.xmin = (rn.xmin * scale)/100 + pos;
+                   rn.xmax = (rn.xmax * scale)/100 + pos;
+                   rn.ymin = (rn.ymin * scale)/100;
+                   rn.ymax = (rn.ymax * scale)/100;
+                   swf_ExpandRect2(&r, &rn);
+                   pos += (font->glyph[g].advance*scale*20)/100;
+               }
            }
            c++;
        }
@@ -960,11 +973,22 @@ SRECT swf_SetDefineText(TAG*tag, SWFFONT*font, RGBA*rgb, char*text, int scale)
 
     swf_SetRect(tag,&r);
     swf_SetMatrix(tag,NULL);
-    swf_TextCountBits(font,text,scale,&gbits,&abits);
+    swf_TextCountBits(font,text,scale*20,&gbits,&abits);
     swf_SetU8(tag,gbits);
     swf_SetU8(tag,abits);
-    swf_TextSetInfoRecord(tag,font,scale/2 /*?? why /2? */,rgb,0,0); //scale
-    swf_TextSetCharRecord(tag,font,text,scale,gbits,abits);
+
+    /* now set the text params- notice that a font size of
+       1024 means that the glyphs will be displayed exactly
+       as they would be in/with a defineshape. (Try to find
+       *that* in the flash specs)
+     */
+    swf_TextSetInfoRecord(tag,font,(scale*1024)/100,rgb,0,0); //scale
+
+    /* set the actual text- notice that we just pass our scale
+       parameter over, as TextSetCharRecord calculates with 
+       percent, too */
+    swf_TextSetCharRecord(tag,font,text,scale*20,gbits,abits);
+
     swf_SetU8(tag,0);
     return r;
 }