n = 0;
while (t)
- { if (swf_GetTagID(t)==ST_DEFINEFONTINFO ||
+ { if (swf_GetTagID(t)==ST_DEFINEFONTINFO || swf_GetTagID(t)==ST_DEFINEFONTINFO2 ||
swf_GetTagID(t)==ST_DEFINEFONT2)
{ n++;
if (FontCallback)
int i;
if(f->version>1) {
- // DefineFont2 doesn't have FontInfo fields
- fprintf(stderr, "fixme: FontInfo field for DefineFont2 encountered\n");
- return -1;
+ /* Especially with Flash MX, DefineFont2 may have FontInfo fields,
+ too. However, they only add little information to what's already
+ inside the DefineFont2 tag */
+ return id;
}
if (l)
if(flags & 32)
f->encoding |= FONT_ENCODING_UNICODE;
+ if(t->id == ST_DEFINEFONTINFO2) {
+ f->language = swf_GetU8(t);
+ }
+
f->glyph2ascii = (U16*)malloc(sizeof(U16)*f->numchars);
maxcode = 0;
for(i=0; i < f->numchars; i++) {
if(flags1&8) { // wide offsets
for(t=0;t<glyphcount;t++)
swf_GetU32(tag); //offset[t]
- swf_GetU32(tag); // fontcodeoffset
+
+ if(glyphcount) /* this _if_ is not in the specs */
+ swf_GetU32(tag); // fontcodeoffset
} else {
for(t=0;t<glyphcount;t++)
swf_GetU16(tag); //offset[t]
- swf_GetU16(tag); // fontcodeoffset
+
+ if(glyphcount) /* this _if_ is not in the specs */
+ swf_GetU16(tag); // fontcodeoffset
}
for(t=0;t<glyphcount;t++)
swf_GetSimpleShape(tag,&(font->glyph[t].shape));
font->layout->bounds = malloc(glyphcount*sizeof(SRECT));
for(t=0;t<glyphcount;t++) {
swf_ResetReadBits(tag);
- swf_GetRect(tag, font->layout->bounds);
+ swf_GetRect(tag, &font->layout->bounds[t]);
}
+
kerningcount = swf_GetU16(tag);
font->layout->kerningcount = kerningcount;
+
font->layout->kerning = (SWFKERNING*)malloc(sizeof(SWFKERNING)*kerningcount);
if(kerningcount) {
font->layout->kerning =
return 0;
}
-int swf_FontExport(int handle,SWFFONT * f)
-{ int l;
- int i;
- if (!f) return 0;
-
- l = sizeof(SWFFONT);
- if (handle>=0)
- if (write(handle,f,sizeof(SWFFONT))!=sizeof(SWFFONT)) return -1;
-
- if (f->name)
- { U16 ln = strlen(f->name);
- l+=2+ln;
- if (handle>=0)
- { if (write(handle,&ln,2)!=2) return -1;
- if (write(handle,f->name,ln)!=ln) return -1;
- }
- }
-
- if (f->layout)
- { l+=sizeof(SWFLAYOUT);
- if (handle>=0)
- if (write(handle,f->layout,sizeof(SWFLAYOUT))!=sizeof(SWFLAYOUT)) return -1;
-/* new kerning struct. hope commenting this out doesn't break things
- if (f->layout->kerning.data)
- { l+=f->layout->kerning.count*4;
- if (handle>=0)
- if (write(handle,f->layout->kerning.data,f->layout->kerning.count*4)!=f->layout->kerning.count*4) return -1;
- }*/
- }
-
- for (i=0;i<f->numchars;i++)
- { if (f->glyph[i].shape)
- { int ll = swf_ShapeExport(handle,f->glyph[i].shape);
- if (ll<0) return -1;
- l+=ll;
- }
- }
-
- return l;
-}
-
-int swf_FontImport(int handle,SWFFONT * * font)
-{ SWFFONT * f;
- int layout;
- int i = 0;
-
- if ((!font)||(handle<0)) return -1;
-
- f = (SWFFONT *)malloc(sizeof(SWFFONT)); font[0] = f;
- if (!f) return -1;
-
- memset(f,0x00,sizeof(SWFFONT));
-
- if (read(handle,f,sizeof(SWFFONT))!=sizeof(SWFFONT)) goto fehler;
-
- layout = (f->layout)?1:0; // avoid illegal free()
- f->layout = NULL;
-
- if (f->name)
- { U16 ln;
- f->name = NULL;
- if (read(handle,&ln,2)!=2) goto fehler;
- f->name = (U8*)malloc(ln+1);
- if (!f->name) goto fehler;
- if (read(handle,f->name,ln)!=ln) goto fehler;
- f->name[ln] = 0;
- }
-
- if (f->layout)
- { f->layout = (SWFLAYOUT *)malloc(sizeof(SWFLAYOUT));
- if (!f->layout) goto fehler;
- if (read(handle,f->layout,sizeof(SWFLAYOUT))!=sizeof(SWFLAYOUT)) goto fehler;
- /* new kerning struct. hope commenting this out doesn't break things
- if (f->layout->kerning.data)
- { int l = f->layout->kerning.count*4;
- f->layout->kerning.data = (U8*)malloc(l);
- if (!f->layout->kerning.data) goto fehler;
- if (read(handle,f->layout->kerning.data,l)!=l) goto fehler;
- } */
- }
-
- for (i=0;i<f->numchars;i++)
- { if (f->glyph[i].shape)
- { if (swf_ShapeImport(handle,&f->glyph[i].shape)<0) goto fehler;
- }
- }
-
- f->id = 0;
-
- return 0;
-
-fehler:
- if (f) for (;i<MAX_CHAR_PER_FONT;i++) f->glyph[i].shape = NULL;
- swf_FontFree(f);
- font[0] = NULL;
- return -1;
-}
-
int swf_TextPrintDefineText(TAG * t,SWFFONT * f)
{ int id = swf_GetTagID(t);
if ((id==ST_DEFINETEXT)||(id==ST_DEFINETEXT2)) swf_FontExtract_DefineText(f->id,f,t,FEDTJ_PRINT);
int g = font->ascii2glyph[s];
text[s] = s;
if(g>=0) {
- if(font->glyph[g].advance*textscale/200 > xmax)
- xmax = font->glyph[g].advance*textscale/200;
+ if(font->glyph[g].advance*textscale/64 > xmax)
+ xmax = font->glyph[g].advance*textscale/64;
}
}
swf.movieSize.xmax = xmax*20;
swf_SetString(tag,text);
}
+void swf_SetDefineText(TAG*tag, SWFFONT*font, RGBA*rgb, char*text, int scale)
+{
+ SRECT r;
+ U8 gbits, abits;
+
+ r.xmin = r.ymin = 0; /*FIXME*/
+ r.xmax = r.ymax = 1024*20;
+
+ swf_SetRect(tag,&r);
+ swf_SetMatrix(tag,NULL);
+ swf_TextCountBits(font,text,scale,&gbits,&abits);
+ swf_SetU8(tag,gbits);
+ swf_SetU8(tag,abits);
+ swf_TextSetInfoRecord(tag,font,scale,rgb,0,scale);
+ swf_TextSetCharRecord(tag,font,text,scale,gbits,abits);
+ swf_SetU8(tag,0);
+}
+