X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswftext.c;h=d2b8989a81b35edbf48f92e93970e09901b9b302;hb=bf04757cd94e94c1f67fa3d2a4e3e59fa5bce0c0;hp=d9e41150eb41a67ab0b52d98c53d8257503ab583;hpb=01d3feb7d0121737b3456a3cfbaf6a02b6362d8d;p=swftools.git diff --git a/lib/modules/swftext.c b/lib/modules/swftext.c index d9e4115..d2b8989 100644 --- a/lib/modules/swftext.c +++ b/lib/modules/swftext.c @@ -22,6 +22,8 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "../rfxswf.h" + U32 readUTF8char(U8 ** text) { U32 c = 0; @@ -118,7 +120,6 @@ int swf_FontEnumerate(SWF * swf, void (*FontCallback) (void*, U16, U8 *), void*s int l; U8 s[257]; s[0] = 0; - swf_SaveTagPos(t); swf_SetTagPos(t, 0); id = swf_GetU16(t); @@ -130,8 +131,6 @@ int swf_FontEnumerate(SWF * swf, void (*FontCallback) (void*, U16, U8 *), void*s } (FontCallback) (self, id, s); - - swf_RestoreTagPos(t); } } t = swf_NextTag(t); @@ -142,7 +141,6 @@ int swf_FontEnumerate(SWF * swf, void (*FontCallback) (void*, U16, U8 *), void*s int swf_FontExtract_DefineFont(int id, SWFFONT * f, TAG * t) { U16 fid; - swf_SaveTagPos(t); swf_SetTagPos(t, 0); fid = swf_GetU16(t); @@ -157,15 +155,13 @@ int swf_FontExtract_DefineFont(int id, SWFFONT * f, TAG * t) of = swf_GetU16(t); n = of / 2; f->numchars = n; - f->glyph = rfx_calloc(sizeof(SWFGLYPH) * n); + f->glyph = (SWFGLYPH*)rfx_calloc(sizeof(SWFGLYPH) * n); for (i = 1; i < n; i++) swf_GetU16(t); for (i = 0; i < n; i++) swf_GetSimpleShape(t, &f->glyph[i].shape); } - - swf_RestoreTagPos(t); return id; } @@ -174,7 +170,6 @@ int swf_FontExtract_DefineFontInfo(int id, SWFFONT * f, TAG * t) U16 fid; U16 maxcode; U8 flags; - swf_SaveTagPos(t); swf_SetTagPos(t, 0); fid = swf_GetU16(t); @@ -229,17 +224,12 @@ int swf_FontExtract_DefineFontInfo(int id, SWFFONT * f, TAG * t) for (i = 0; i < f->numchars; i++) f->ascii2glyph[f->glyph2ascii[i]] = i; } - - swf_RestoreTagPos(t); return id; } int swf_FontExtract_GlyphNames(int id, SWFFONT * f, TAG * tag) { U16 fid; - U16 maxcode; - U8 flags; - swf_SaveTagPos(tag); swf_SetTagPos(tag, 0); fid = swf_GetU16(tag); @@ -247,13 +237,11 @@ int swf_FontExtract_GlyphNames(int id, SWFFONT * f, TAG * tag) if (fid == id) { int num = swf_GetU16(tag); int t; - f->glyphnames = rfx_alloc(sizeof(char *) * num); + f->glyphnames = (char**)rfx_alloc(sizeof(char *) * num); for (t = 0; t < num; t++) { f->glyphnames[t] = strdup(swf_GetString(tag)); } } - - swf_RestoreTagPos(tag); return id; } @@ -266,7 +254,6 @@ int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag) U32 offset_start; U32 *offset; U8 flags1, flags2, namelen; - swf_SaveTagPos(tag); swf_SetTagPos(tag, 0); font->version = 2; fid = swf_GetU16(tag); @@ -298,7 +285,7 @@ int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag) font->glyph = (SWFGLYPH *) rfx_calloc(sizeof(SWFGLYPH) * glyphcount); font->glyph2ascii = (U16 *) rfx_calloc(sizeof(U16) * glyphcount); - offset = rfx_calloc(sizeof(U32)*(glyphcount+1)); + offset = (U32*)rfx_calloc(sizeof(U32)*(glyphcount+1)); offset_start = tag->pos; if (flags1 & 8) { // wide offsets @@ -323,7 +310,8 @@ int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag) swf_GetSimpleShape(tag, &(font->glyph[t].shape)); } - swf_SetTagPos(tag, offset[glyphcount]+offset_start); + if(glyphcount) + swf_SetTagPos(tag, offset[glyphcount]+offset_start); free(offset); @@ -358,7 +346,7 @@ int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag) S16 advance = swf_GetS16(tag); font->glyph[t].advance = advance; } - font->layout->bounds = rfx_alloc(glyphcount * sizeof(SRECT)); + font->layout->bounds = (SRECT*)rfx_alloc(glyphcount * sizeof(SRECT)); for (t = 0; t < glyphcount; t++) { swf_ResetReadBits(tag); swf_GetRect(tag, &font->layout->bounds[t]); @@ -369,7 +357,7 @@ int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag) font->layout->kerning = (SWFKERNING *) rfx_alloc(sizeof(SWFKERNING) * kerningcount); if (kerningcount) { - font->layout->kerning = rfx_alloc(sizeof(*font->layout->kerning) * kerningcount); + font->layout->kerning = (SWFKERNING*)rfx_alloc(sizeof(*font->layout->kerning) * kerningcount); for (t = 0; t < kerningcount; t++) { if (flags1 & 4) { // wide codes font->layout->kerning[t].char1 = swf_GetU16(tag); @@ -382,7 +370,6 @@ int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag) } } } - swf_RestoreTagPos(t); return font->id; } @@ -400,14 +387,13 @@ swf_FontExtract_DefineTextCallback(int id, SWFFONT * f, TAG * t, int jobs, SRECT r; MATRIX m; U8 gbits, abits; - int fid = 0; + int fid = -1; RGBA color; int x = 0, y = 0; int fontsize = 0; memset(&color, 0, sizeof(color)); - swf_SaveTagPos(t); swf_SetTagPos(t, 0); cid = swf_GetU16(t); @@ -459,7 +445,6 @@ swf_FontExtract_DefineTextCallback(int id, SWFFONT * f, TAG * t, int jobs, adv = swf_GetBits(t, abits); xpos += adv; - // if (id == fid) { if (jobs & FEDTJ_PRINT) { int code = f->glyph2ascii[glyph]; @@ -467,12 +452,7 @@ swf_FontExtract_DefineTextCallback(int id, SWFFONT * f, TAG * t, int jobs, } if (jobs & FEDTJ_MODIFY) f->glyph[glyph].advance = adv * 20; //? - } else { - if (jobs & FEDTJ_PRINT) { - printf("?"); - } } - // buf[i] = glyph; } @@ -484,7 +464,6 @@ swf_FontExtract_DefineTextCallback(int id, SWFFONT * f, TAG * t, int jobs, } } - swf_RestoreTagPos(t); return id; } @@ -684,7 +663,7 @@ int swf_FontReduce_swfc(SWFFONT * f) } f->use->used_glyphs = j; for (i = 0; i < f->maxascii; i++) { - if(f->ascii2glyph[i] > -1) + if(f->ascii2glyph[i] > -1) { if (f->use->chars[f->ascii2glyph[i]]<0) { f->use->chars[f->ascii2glyph[i]] = 0; f->ascii2glyph[i] = -1; @@ -694,6 +673,7 @@ int swf_FontReduce_swfc(SWFFONT * f) max_unicode = i + 1; } } + } f->maxascii = max_unicode; f->use->is_reduced = 1; f->numchars = j; @@ -746,13 +726,13 @@ int swf_FontReduce(SWFFONT * f) void swf_FontSort(SWFFONT * font) { - int i, j, k; + int i, j; int *newplace; int *newpos; if (!font) return; - newplace = rfx_alloc(sizeof(int) * font->numchars); + newplace = (int*)rfx_alloc(sizeof(int) * font->numchars); for (i = 0; i < font->numchars; i++) { newplace[i] = i; @@ -790,7 +770,7 @@ void swf_FontSort(SWFFONT * font) } } } - newpos = rfx_alloc(sizeof(int) * font->numchars); + newpos = (int*)rfx_alloc(sizeof(int) * font->numchars); for (i = 0; i < font->numchars; i++) { newpos[newplace[i]] = i; } @@ -818,9 +798,11 @@ int swf_FontInitUsage(SWFFONT * f) fprintf(stderr, "Usage initialized twice"); return -1; } - f->use = rfx_alloc(sizeof(FONTUSAGE)); + f->use = (FONTUSAGE*)rfx_alloc(sizeof(FONTUSAGE)); f->use->is_reduced = 0; - f->use->chars = rfx_calloc(sizeof(f->use->chars[0]) * f->numchars); + f->use->used_glyphs = 0; + f->use->chars = (int*)rfx_calloc(sizeof(f->use->chars[0]) * f->numchars); + f->use->glyphs_specified = 0; return 0; } @@ -936,7 +918,6 @@ int swf_FontSetDefine2(TAG * tag, SWFFONT * f) U8 flags = 0; int t; int pos; - int pos2; swf_SetU16(tag, f->id); if (f->layout) flags |= 128; // haslayout @@ -963,10 +944,11 @@ int swf_FontSetDefine2(TAG * tag, SWFFONT * f) swf_SetU8(tag, 0); //reserved flags if (f->name) { /* font name */ - swf_SetU8(tag, strlen(f->name)); - swf_SetBlock(tag, f->name, strlen(f->name)); + swf_SetU8(tag, strlen((const char*)f->name)+1); + swf_SetBlock(tag, f->name, strlen((const char*)f->name)+1); } else { /* font name (="") */ + swf_SetU8(tag, 1); swf_SetU8(tag, 0); } /* number of glyphs */ @@ -1066,7 +1048,7 @@ int swf_FontSetInfo(TAG * t, SWFFONT * f) return -1; swf_ResetWriteBits(t); swf_SetU16(t, f->id); - l = f->name ? strlen(f->name) : 0; + l = f->name ? strlen((const char *)f->name) : 0; if (l > 255) l = 255; swf_SetU8(t, l); @@ -1143,14 +1125,14 @@ void swf_FontFree(SWFFONT * f) rfx_free(f); } -int swf_TextSetInfoRecord(TAG * t, SWFFONT * font, U16 size, RGBA * color, int dx, int dy) +int swf_TextSetInfoRecord(TAG * t, SWFFONT * font, U16 size, RGBA * color, int x, int y) { U8 flags; if (!t) return -1; - flags = TF_TEXTCONTROL | (font ? TF_HASFONT : 0) | (color ? TF_HASCOLOR : 0) | (dx ? TF_HASXOFFSET : 0) - | (dy ? TF_HASYOFFSET : 0); + flags = TF_TEXTCONTROL | (font ? TF_HASFONT : 0) | (color ? TF_HASCOLOR : 0) | (x ? TF_HASXOFFSET : 0) + | (y ? TF_HASYOFFSET : 0); swf_SetU8(t, flags); if (font) @@ -1161,20 +1143,20 @@ int swf_TextSetInfoRecord(TAG * t, SWFFONT * font, U16 size, RGBA * color, int d else swf_SetRGB(t, color); } - if (dx) { - if(dx != SET_TO_ZERO) { - if(dx>32767 || dx<-32768) - fprintf(stderr, "Warning: Horizontal char position overflow: %d\n", dx); - swf_SetS16(t, dx); + if (x) { + if(x != SET_TO_ZERO) { + if(x>32767 || x<-32768) + fprintf(stderr, "Warning: Horizontal char position overflow: %d\n", x); + swf_SetS16(t, x); } else { swf_SetS16(t, 0); } } - if (dy) { - if(dy != SET_TO_ZERO) { - if(dy>32767 || dy<-32768) - fprintf(stderr, "Warning: Vertical char position overflow: %d\n", dy); - swf_SetS16(t, dy); + if (y) { + if(y != SET_TO_ZERO) { + if(y>32767 || y<-32768) + fprintf(stderr, "Warning: Vertical char position overflow: %d\n", y); + swf_SetS16(t, y); } else { swf_SetS16(t, 0); } @@ -1343,7 +1325,7 @@ SRECT swf_TextCalculateBBoxUTF8(SWFFONT * font, U8 * s, int scale) } -SWFFONT *swf_ReadFont(char *filename) +SWFFONT *swf_ReadFont(const char *filename) { int f; SWF swf; @@ -1383,7 +1365,7 @@ void swf_WriteFont(SWFFONT * font, char *filename) memset(&swf, 0x00, sizeof(SWF)); - swf.fileVersion = 4; + swf.fileVersion = 9; swf.frameRate = 0x4000; /* if we use DefineFont1 to store the characters, @@ -1408,6 +1390,17 @@ void swf_WriteFont(SWFFONT * font, char *filename) t = swf_InsertTag(t, ST_DEFINEFONT2); swf_FontSetDefine2(t, font); } + if(font->name) { + t = swf_InsertTag(t, ST_NAMECHARACTER); + swf_SetU16(t, WRITEFONTID); + swf_SetString(t, font->name); + t = swf_InsertTag(t, ST_EXPORTASSETS); + swf_SetU16(t, 1); + swf_SetU16(t, WRITEFONTID); + swf_SetString(t, font->name); + + t = swf_AddAS3FontDefine(t, WRITEFONTID, font->name); + } if (storeGlyphNames && font->glyphnames) { int c; @@ -1416,9 +1409,9 @@ void swf_WriteFont(SWFFONT * font, char *filename) swf_SetU16(t, font->numchars); for (c = 0; c < font->numchars; c++) { if (font->glyphnames[c]) - swf_SetString(t, font->glyphnames[c]); + swf_SetString(t, (U8*)font->glyphnames[c]); else - swf_SetString(t, ""); + swf_SetString(t, (U8*)""); } } @@ -1531,7 +1524,7 @@ void swf_WriteFont(SWFFONT * font, 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) +void swf_SetEditText(TAG * tag, U16 flags, SRECT r, const char *text, RGBA * color, int maxlength, U16 font, U16 height, EditTextLayout * layout, const char *variable) { swf_SetRect(tag, &r); swf_ResetWriteBits(tag); @@ -1567,12 +1560,12 @@ void swf_SetEditText(TAG * tag, U16 flags, SRECT r, char *text, RGBA * color, in swf_SetU16(tag, layout->indent); //indent swf_SetU16(tag, layout->leading); //leading } - swf_SetString(tag, variable); + swf_SetString(tag, (U8*)variable); if (flags & ET_HASTEXT) - swf_SetString(tag, text); + swf_SetString(tag, (U8*)text); } -SRECT swf_SetDefineText(TAG * tag, SWFFONT * font, RGBA * rgb, char *text, int scale) +SRECT swf_SetDefineText(TAG * tag, SWFFONT * font, RGBA * rgb, const char *text, int scale) { SRECT r; U8 gbits, abits; @@ -1582,7 +1575,7 @@ SRECT swf_SetDefineText(TAG * tag, SWFFONT * font, RGBA * rgb, char *text, int s int pos = 0; int ystep = 0; if (font->layout) { - r = swf_TextCalculateBBoxUTF8(font, text, scale * 20); + r = swf_TextCalculateBBoxUTF8(font, (U8*)text, scale * 20); ystep = font->layout->leading; } else { fprintf(stderr, "No layout information- can't compute text bbox accurately"); @@ -1606,7 +1599,7 @@ SRECT swf_SetDefineText(TAG * tag, SWFFONT * font, RGBA * rgb, char *text, int s */ swf_SetMatrix(tag, 0); - swf_TextCountBitsUTF8(font, text, scale * 20, &gbits, &abits); + swf_TextCountBitsUTF8(font, (U8*)text, scale * 20, &gbits, &abits); swf_SetU8(tag, gbits); swf_SetU8(tag, abits); @@ -1695,7 +1688,7 @@ void swf_FontCreateLayout(SWFFONT * f) } } -void swf_DrawText(drawer_t * draw, SWFFONT * font, int size, char *text) +void swf_DrawText(drawer_t * draw, SWFFONT * font, int size, const char *text) { U8 *s = (U8 *) text; int advance = 0;