X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswftext.c;h=24bde3c36019250f2930186ae41c48713403c42c;hb=f52e48e2f55dd3a724da00a47552b7edba5f4dfa;hp=47ba5b988d1d3a6c702ee366126e6ee51a81c449;hpb=68c030bfb760590c72d65dd94da6b704287dcda2;p=swftools.git diff --git a/lib/modules/swftext.c b/lib/modules/swftext.c index 47ba5b9..24bde3c 100644 --- a/lib/modules/swftext.c +++ b/lib/modules/swftext.c @@ -1,13 +1,13 @@ /* swftext.c Text and font routines - + Extension module for the rfxswf library. Part of the swftools package. Copyright (c) 2001 Rainer Böhme Copyright (c) 2003,2004 Matthias Kramm - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or @@ -22,7 +22,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -static U32 readUTF8char(U8 ** text) +U32 readUTF8char(U8 ** text) { U32 c = 0; if (!(*(*text) & 0x80)) @@ -400,7 +400,7 @@ 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; @@ -459,20 +459,14 @@ 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]; - printf("%c", code); + printf("%lc", code); } if (jobs & FEDTJ_MODIFY) f->glyph[glyph].advance = adv * 20; //? - } else { - if (jobs & FEDTJ_PRINT) { - printf("?"); - } } - // buf[i] = glyph; } @@ -572,18 +566,20 @@ void swf_LayoutFree(SWFLAYOUT * l) static void font_freeglyphnames(SWFFONT*f) { - if (f->glyphnames) { - int t; - for (t = 0; t < f->numchars; t++) { - if (f->glyphnames[t]) { - rfx_free(f->glyphnames[t]); - f->glyphnames[t] = 0; - } + if (f->glyphnames) + { + int t; + for (t = 0; t < f->numchars; t++) + { + if (f->glyphnames[t]) + { + rfx_free(f->glyphnames[t]); + f->glyphnames[t] = 0; + } + } + rfx_free(f->glyphnames); + f->glyphnames = 0; } - rfx_free(f->glyphnames); - f->glyphnames = 0; - } - } static void font_freeusage(SWFFONT*f) { @@ -652,6 +648,54 @@ int swf_FontReduce_old(SWFFONT * f) return j; } +int swf_FontReduce_swfc(SWFFONT * f) +{ + int i, j; + int max_unicode = 0; + if ((!f) || (!f->use) || f->use->is_reduced) + return -1; + + font_freeglyphnames(f); + + j = 0; + for (i = 0; i < f->numchars; i++) { + if (f->glyph[i].shape && f->use->chars[i]) { + f->glyph2ascii[j] = f->glyph2ascii[i]; + if (f->layout) + f->layout->bounds[j] = f->layout->bounds[i]; + f->glyph[j] = f->glyph[i]; + f->use->chars[i] = j; + j++; + } else { + f->glyph2ascii[i] = 0; + if(f->glyph[i].shape) { + swf_ShapeFree(f->glyph[i].shape); + f->glyph[i].shape = 0; + f->glyph[i].advance = 0; + } + f->use->chars[i] = -1; + } + } + f->use->used_glyphs = j; + for (i = 0; i < f->maxascii; i++) { + if(f->ascii2glyph[i] > -1) { + if (f->use->chars[f->ascii2glyph[i]]<0) { + f->use->chars[f->ascii2glyph[i]] = 0; + f->ascii2glyph[i] = -1; + } else { + f->ascii2glyph[i] = f->use->chars[f->ascii2glyph[i]]; + f->use->chars[f->ascii2glyph[i]] = 1; + max_unicode = i + 1; + } + } + } + f->maxascii = max_unicode; + f->use->is_reduced = 1; + f->numchars = j; + font_freename(f); + return j; +} + int swf_FontReduce(SWFFONT * f) { int i; @@ -659,7 +703,7 @@ int swf_FontReduce(SWFFONT * f) int max_glyph = 0; if ((!f) || (!f->use) || f->use->is_reduced) return -1; - + font_freelayout(f); font_freeglyphnames(f); @@ -674,13 +718,14 @@ int swf_FontReduce(SWFFONT * f) f->glyph[i].shape = 0; f->glyph[i].advance = 0; } - f->use->used_glyphs++; +// f->use->used_glyphs++; } else { + f->use->used_glyphs++; max_glyph = i+1; } } for (i = 0; i < f->maxascii; i++) { - if(!f->use->chars[f->ascii2glyph[i]]) { + if(f->ascii2glyph[i] > -1 && !f->use->chars[f->ascii2glyph[i]]) { if(f->ascii2glyph) { f->ascii2glyph[i] = -1; } @@ -701,7 +746,7 @@ void swf_FontSort(SWFFONT * font) int *newpos; if (!font) return; - + newplace = rfx_alloc(sizeof(int) * font->numchars); for (i = 0; i < font->numchars; i++) { @@ -770,6 +815,7 @@ int swf_FontInitUsage(SWFFONT * f) } f->use = rfx_alloc(sizeof(FONTUSAGE)); f->use->is_reduced = 0; + f->use->used_glyphs = 0; f->use->chars = rfx_calloc(sizeof(f->use->chars[0]) * f->numchars); return 0; } @@ -794,9 +840,35 @@ int swf_FontUse(SWFFONT * f, U8 * s) return 0; } +int swf_FontUseUTF8(SWFFONT * f, U8 * s) +{ + if( (!s)) + return -1; + int ascii; + while (*s) + { + ascii = readUTF8char(&s); + if(ascii < f->maxascii && f->ascii2glyph[ascii]>=0) + swf_FontUseGlyph(f, f->ascii2glyph[ascii]); + } + return 0; +} + +int swf_FontUseAll(SWFFONT* f) +{ + int i; + + if (!f->use) + swf_FontInitUsage(f); + for (i = 0; i < f->numchars; i++) + f->use->chars[i] = 1; + f->use->used_glyphs = f->numchars; + return 0; +} + int swf_FontUseGlyph(SWFFONT * f, int glyph) { - if (!f->use) + if (!f->use) swf_FontInitUsage(f); if(glyph < 0 || glyph >= f->numchars) return -1; @@ -846,7 +918,7 @@ static inline int fontSize(SWFFONT * font) int size = 0; for (t = 0; t < font->numchars; t++) { int l = 0; - if(font->glyph[t].shape) + if(font->glyph[t].shape) l = (font->glyph[t].shape->bitlen + 7) / 8; else l = 8; @@ -1036,24 +1108,28 @@ void swf_FontFree(SWFFONT * f) { int i; if (!f) - return; + return; - if (f->glyph) { - for (i = 0; i < f->numchars; i++) - if (f->glyph[i].shape) { - swf_ShapeFree(f->glyph[i].shape); - f->glyph[i].shape = NULL; - } - rfx_free(f->glyph); - f->glyph = NULL; + if (f->glyph) + { + for (i = 0; i < f->numchars; i++) + if (f->glyph[i].shape) + { + swf_ShapeFree(f->glyph[i].shape); + f->glyph[i].shape = NULL; + } + rfx_free(f->glyph); + f->glyph = NULL; } - if (f->ascii2glyph) { - rfx_free(f->ascii2glyph); - f->ascii2glyph = NULL; + if (f->ascii2glyph) + { + rfx_free(f->ascii2glyph); + f->ascii2glyph = NULL; } - if (f->glyph2ascii) { - rfx_free(f->glyph2ascii); - f->glyph2ascii = NULL; + if (f->glyph2ascii) + { + rfx_free(f->glyph2ascii); + f->glyph2ascii = NULL; } font_freename(f); font_freelayout(f); @@ -1296,7 +1372,7 @@ void swf_WriteFont(SWFFONT * font, char *filename) int storeGlyphNames = 1; if (font->layout) - useDefineFont2 = 1; /* the only thing new in definefont2 + useDefineFont2 = 1; /* the only thing new in definefont2 is layout information. */ font->id = WRITEFONTID; //"FN" @@ -1533,7 +1609,7 @@ SRECT swf_SetDefineText(TAG * tag, SWFFONT * font, RGBA * rgb, char *text, int s while(*upos) { U8*next = upos; int count = 0; - + swf_TextSetInfoRecord(tag, font, (scale * 1024) / 100, rgb, x, y); //scale x = 0; @@ -1548,7 +1624,7 @@ SRECT swf_SetDefineText(TAG * tag, SWFFONT * font, RGBA * rgb, char *text, int s if(next[0] == 13 && next[1] == 10) next++; - + if(next[0] == 13 || next[0] == 10) { *next = 0; next++; @@ -1560,13 +1636,11 @@ SRECT swf_SetDefineText(TAG * tag, SWFFONT * font, RGBA * rgb, char *text, int s *that* in the flash specs) */ /* set the actual text- notice that we just pass our scale - parameter over, as TextSetCharRecord calculates with + parameter over, as TextSetCharRecord calculates with percent, too */ swf_TextSetCharRecordUTF8(tag, font, upos, scale * 20, gbits, abits); upos= next; - - printf("%s\n", upos); } free(utext);