X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswftext.c;h=9297be9e1468a59096bb3f8f132f2a98c3398b0d;hb=f908dd0674bc6cd66e73cd73f9d8073a992f0528;hp=e5901cb146997579e0da21f13aee042137655c82;hpb=8ff8aea6d9d76a443ab2391671af79e91f780bbc;p=swftools.git diff --git a/lib/modules/swftext.c b/lib/modules/swftext.c index e5901cb..9297be9 100644 --- a/lib/modules/swftext.c +++ b/lib/modules/swftext.c @@ -46,7 +46,7 @@ int swf_FontEnumerate(SWF * swf,void (*FontCallback) (U16,U8*)) 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) @@ -80,7 +80,7 @@ int swf_FontExtract_DefineFont(int id,SWFFONT * f,TAG * t) fid = swf_GetU16(t); if ((!id)||(id==fid)) - { U16 of,*ofs; + { U16 of; int n,i; id = fid; @@ -114,9 +114,10 @@ int swf_FontExtract_DefineFontInfo(int id,SWFFONT * f,TAG * t) 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) @@ -143,6 +144,10 @@ int swf_FontExtract_DefineFontInfo(int id,SWFFONT * f,TAG * t) 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++) { @@ -208,11 +213,15 @@ int swf_FontExtract_DefineFont2(int id,SWFFONT * font,TAG * tag) if(flags1&8) { // wide offsets for(t=0;tglyph[t].shape)); @@ -252,10 +261,12 @@ int swf_FontExtract_DefineFont2(int id,SWFFONT * font,TAG * tag) font->layout->bounds = malloc(glyphcount*sizeof(SRECT)); for(t=0;tlayout->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 = @@ -392,7 +403,7 @@ int swf_FontExtract(SWF * swf,int id,SWFFONT * * font) int swf_FontSetID(SWFFONT * f,U16 id) { if (!f) return -1; f->id = id; return 0; } int swf_FontReduce(SWFFONT * f,FONTUSAGE * use) -{ int i,j,num; +{ int i,j; if ((!f)||(!use)) return -1; j = 0; @@ -593,104 +604,6 @@ int swf_FontSetInfo(TAG * t,SWFFONT * f) 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;inumchars;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;inumchars;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 (;iglyph[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); @@ -896,8 +809,8 @@ void swf_WriteFont(SWFFONT*font, char* filename) 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; @@ -927,7 +840,8 @@ void swf_WriteFont(SWFFONT*font, char* filename) rgb.b = 0x00; for(y=0;y<=((font->maxascii-1)/16);y++) { - int c=0,lastx=-1, firstx=0; + int c=0,lastx=-1; + /* TODO: firstx?? */ for(x=0;x<16;x++) { int g = (y*16+xmaxascii)?font->ascii2glyph[y*16+x]:-1; if(g>=0 && font->glyph[g].shape) { @@ -1011,3 +925,21 @@ void swf_SetEditText(TAG*tag, U16 flags, SRECT r, char*text, RGBA*color, 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); +} +