X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswftext.c;h=d05b84f75276e23befe96a5bd773588ea046417a;hb=5bb773e10a99dea6e224030bda4b58aba1679869;hp=fb708fa84b7677c9b64dc932f11009c109689de8;hpb=51c19ac56edb61ae987df0488bb8cd0f8884b37e;p=swftools.git diff --git a/lib/modules/swftext.c b/lib/modules/swftext.c index fb708fa..d05b84f 100644 --- a/lib/modules/swftext.c +++ b/lib/modules/swftext.c @@ -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;iglyph[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; @@ -671,15 +682,39 @@ U32 swf_TextGetWidth(SWFFONT * font,U8 * s,int scale) return res; } -void swf_WriteFont(SWFFONT*font, char* filename, int useDefineFont2) +SWFFONT* swf_ReadFont(char* filename) +{ + int f; + SWF swf; + if(!filename) + return 0; + f = open(filename,O_RDONLY); + + if (f<0 || swf_ReadSWF(f,&swf)<0) + { fprintf(stderr,"%s is not a valid SWF font file or contains errors.\n",filename); + close(f); + return 0; + } + else + { SWFFONT*font; + close(f); + if(swf_FontExtract(&swf, WRITEFONTID, &font) < 0) + return 0; + swf_FreeTags(&swf); + return font; + } +} + +void swf_WriteFont(SWFFONT*font, char* filename) { SWF swf; TAG * t; SRECT r; RGBA rgb; int f; + int useDefineFont2 = 1; if(useDefineFont2) { - fprintf(stderr, "DefineFont2 is not yet supported!\n"); + //fprintf(stderr, "DefineFont2 is not yet supported!\n"); useDefineFont2 = 0; } @@ -689,8 +724,6 @@ void swf_WriteFont(SWFFONT*font, char* filename, int useDefineFont2) 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, @@ -721,18 +754,18 @@ void swf_WriteFont(SWFFONT*font, char* filename, int useDefineFont2) { int textscale = 400; int s; int xmax = 0; - int ymax = textscale * 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;smaxascii;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/200 > xmax) + xmax = font->glyph[g].advance*textscale/200; } } swf.movieSize.xmax = xmax*20; @@ -760,11 +793,11 @@ void swf_WriteFont(SWFFONT*font, char* filename, int useDefineFont2) 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+xmaxascii)?font->ascii2glyph[y*16+x]:-1; if(g>=0 && font->glyph[g].shape) { c++; if(lastx<0) @@ -772,10 +805,10 @@ void swf_WriteFont(SWFFONT*font, char* filename, int useDefineFont2) } } if(c) { - swf_TextSetInfoRecord(t,font,textscale,&rgb,lastx+1,textscale*y); + 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+xmaxascii)?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); @@ -808,26 +841,41 @@ void swf_WriteFont(SWFFONT*font, char* filename, int useDefineFont2) swf_FreeTags(&swf); } -SWFFONT* swf_ReadFont(char* filename) + +void swf_SetEditText(TAG*tag, U16 flags, SRECT r, char*text, RGBA*color, + int maxlength, U16 font, U16 height, EditTextLayout*layout, char*variable) { - int f; - SWF swf; - if(!filename) - return 0; - f = open(filename,O_RDONLY); - - if (f<0 || swf_ReadSWF(f,&swf)<0) - { fprintf(stderr,"%s is not a valid SWF font file or contains errors.\n",filename); - close(f); - return 0; - } - else - { SWFFONT*font; - close(f); - if(swf_FontExtract(&swf, WRITEFONTID, &font) < 0) - return 0; - swf_FreeTags(&swf); - return font; - } + swf_SetRect(tag,&r); + swf_ResetWriteBits(tag); + + flags &= ~(ET_HASTEXT|ET_HASTEXTCOLOR|ET_HASMAXLENGTH|ET_HASFONT|ET_HASLAYOUT); + if(text) flags |= ET_HASTEXT; + if(color) flags |= ET_HASTEXTCOLOR; + if(maxlength) flags |= ET_HASMAXLENGTH; + if(font) flags |= ET_HASFONT; + if(layout) flags |= ET_HASLAYOUT; + + swf_SetBits(tag, flags, 16); + + if(flags & ET_HASFONT) { + swf_SetU16(tag, font); //font + swf_SetU16(tag, height); //fontheight + } + if(flags & ET_HASTEXTCOLOR) { + swf_SetRGBA(tag, color); + } + if(flags & ET_HASMAXLENGTH) { + swf_SetU16(tag, maxlength); //maxlength + } + if(flags & ET_HASLAYOUT) { + swf_SetU8(tag,layout->align); //align + swf_SetU16(tag,layout->leftmargin); //left margin + swf_SetU16(tag,layout->rightmargin); //right margin + swf_SetU16(tag,layout->indent); //indent + swf_SetU16(tag,layout->leading); //leading + } + swf_SetString(tag, variable); + if(flags & ET_HASTEXT) + swf_SetString(tag,text); }