added swf_FontPrepareForEditText().
authorkramm <kramm>
Sun, 8 Aug 2004 08:50:41 +0000 (08:50 +0000)
committerkramm <kramm>
Sun, 8 Aug 2004 08:50:41 +0000 (08:50 +0000)
lib/modules/swftext.c
lib/rfxswf.h

index 2138275..ad17f1c 100644 (file)
@@ -519,6 +519,7 @@ int swf_FontReduce(SWFFONT * f,FONTUSAGE * use)
 { int i,j;
   if ((!f)||(!use)) return -1;
 
+  /* TODO: layout, glyphnames */
   j = 0;
   for (i=0;i<f->numchars;i++)
     if (f->glyph[i].shape)
@@ -542,6 +543,68 @@ int swf_FontReduce(SWFFONT * f,FONTUSAGE * use)
     
   return j;
 }
+void swf_FontSort(SWFFONT * font)
+{
+    if(!font) return;
+    int i,j,k;
+    int* newplace = malloc(sizeof(int)*font->numchars);
+    int* newpos;
+    
+    for(i=0;i<font->numchars;i++) {
+       newplace[i] = i;
+    }
+    for(i=0;i<font->numchars;i++)
+    for(j=0;j<i;j++) {
+       if(font->glyph2ascii[i] < font->glyph2ascii[j]) {
+           int n1,n2;
+           char* c1,*c2;
+           SWFGLYPH g1,g2;
+           SRECT r1,r2;
+           n1=newplace[i];
+           n2=newplace[j];
+           newplace[j] = n1;
+           newplace[i] = n2;
+           n1=font->glyph2ascii[i];
+           n2=font->glyph2ascii[j];
+           font->glyph2ascii[j] = n1;
+           font->glyph2ascii[i] = n2;
+           g1=font->glyph[i];
+           g2=font->glyph[j];
+           font->glyph[j] = g1;
+           font->glyph[i] = g2;
+           if(font->glyphnames) {
+               c1 = font->glyphnames[i];
+               c2 = font->glyphnames[j];
+               font->glyphnames[j] = c1;
+               font->glyphnames[i] = c2;
+           }
+           if(font->layout) {
+               r1 = font->layout->bounds[i];
+               r2 = font->layout->bounds[j];
+               font->layout->bounds[j] = r1;
+               font->layout->bounds[i] = r2;
+           }
+       }
+    }
+    newpos = malloc(sizeof(int)*font->numchars);
+    for(i=0;i<font->numchars;i++) {
+       newpos[newplace[i]] = i;
+    }
+    for(i=0;i<font->maxascii;i++) {
+       if(font->ascii2glyph[i]>=0)
+           font->ascii2glyph[i] = newpos[font->ascii2glyph[i]];
+    }
+
+    free(newpos);
+    free(newplace);
+}
+
+void swf_FontPrepareForEditText(SWFFONT * font)
+{
+    if(!font->layout)
+       swf_FontCreateLayout(font);
+    swf_FontSort(font);
+}
 
 int swf_FontInitUsage(SWFFONT* f, FONTUSAGE * use)
 { if (!use) return -1;
@@ -677,7 +740,7 @@ int swf_FontSetDefine2(TAG *tag, SWFFONT * f)
     
     /* font code table */
     if(flags & 4) /* wide codes */ {
-       for(t=0;t<f->numchars;t++) {
+       for(t=0;t<f->numchars;t++) { 
            swf_SetU16(tag,f->glyph2ascii[t]);
        }
     } else {
@@ -750,9 +813,10 @@ int swf_FontSetInfo(TAG * t,SWFFONT * f)
   swf_SetU8(t,(flags&0xfe)|wide);
 
   for (i=0;i<f->numchars;i++) {
-    if (f->glyph[i].shape)
-      wide?swf_SetU16(t,f->glyph2ascii[i]):
-          swf_SetU8(t,f->glyph2ascii[i]);
+    if (f->glyph[i].shape) {
+      int g2a = f->glyph2ascii[i];
+      wide?swf_SetU16(t,g2a):swf_SetU8(t,g2a);
+    }
   }
   
   return 0;
@@ -1267,7 +1331,7 @@ void swf_FontCreateLayout(SWFFONT*f)
           they are used)- we now have to guess whether that width might be possible,
           which is the case if it isn't either much too big or much too small */
        if(width > f->glyph[t].advance*3/2 ||
-          width*2 < f->glyph[t].advance)
+          width < f->glyph[t].advance/2)
            f->glyph[t].advance = width;
 
        if(-bbox.ymin > f->layout->ascent)
index 60edecb..85b0c98 100644 (file)
@@ -586,7 +586,9 @@ int swf_TextSetCharRecord(TAG * t,SWFFONT * font,U8 * s,int scale,U8 gbits,U8 ab
 int swf_TextPrintDefineText(TAG * t,SWFFONT * f);
 // Prints text defined in tag t with font f to stdout
 
-/* notice: if you set the fontid, make sure the corresponding font has layout information */
+void swf_FontPrepareForEditText(SWFFONT * f);
+
+/* notice: if you set the fontid, make sure you call swf_FontPrepareForEditText() for the font first */
 void swf_SetEditText(TAG*tag, U16 flags, SRECT r, char*text, RGBA*color, 
        int maxlength, U16 font, U16 height, EditTextLayout*layout, char*variable);