X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswftext.c;h=59a8dd978c2f6f10a1e6b1cd6399dab8f680faa8;hb=2fc61b512b22b9e155195bb25eed1d706a33a179;hp=06dc3ff77912532ea4fb479bcac76d4fa8254eee;hpb=27a2ee6e915f44184e530dbc70a8406bfb80f3b6;p=swftools.git diff --git a/lib/modules/swftext.c b/lib/modules/swftext.c index 06dc3ff..59a8dd9 100644 --- a/lib/modules/swftext.c +++ b/lib/modules/swftext.c @@ -7,9 +7,19 @@ Copyright (c) 2001 Rainer Böhme - This file is distributed under the GPL, see file COPYING for details + 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 + (at your option) any later version. -*/ + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define TF_TEXTCONTROL 0x80 #define TF_HASFONT 0x08 @@ -378,6 +388,7 @@ int swf_FontExtract(SWF * swf,int id,SWFFONT * * font) break; case ST_DEFINEFONTINFO: + case ST_DEFINEFONTINFO2: nid = swf_FontExtract_DefineFontInfo(id,f,t); break; @@ -654,7 +665,7 @@ void swf_FontFree(SWFFONT * f) free(f); } -int swf_TextSetInfoRecord(TAG * t,SWFFONT * font,U16 size,RGBA * color,S16 dx,S16 dy) +int swf_TextSetInfoRecord(TAG * t,SWFFONT * font,U16 size,RGBA * color,int dx,int dy) { U8 flags; if (!t) return -1; @@ -680,9 +691,11 @@ int swf_TextCountBits(SWFFONT * font,U8 * s,int scale,U8 * gbits,U8 * abits) while(s[0]) { - int glyph = font->ascii2glyph[s[0]]; + int glyph = -1; + if(s[0] < font->maxascii) + glyph = font->ascii2glyph[s[0]]; if(glyph>=0) { - g = swf_CountBits(glyph,g); + g = swf_CountUBits(glyph,g); a = swf_CountBits((((U32)font->glyph[glyph].advance)*scale)/100,a); } s++; @@ -695,23 +708,29 @@ int swf_TextCountBits(SWFFONT * font,U8 * s,int scale,U8 * gbits,U8 * abits) } int swf_TextSetCharRecord(TAG * t,SWFFONT * font,U8 * s,int scale,U8 gbits,U8 abits) -{ int l,i; +{ int l=0,i,pos; if ((!t)||(!font)||(!s)||(!font->ascii2glyph)) return -1; - l = strlen(s); - if (l>0x7f) l = 0x7f; - swf_SetU8(t,l); + pos = t->len; + swf_SetU8(t, l); //placeholder - for (i=0;iascii2glyph[s[i]]; + int g = -1; + if(s[i] < font->maxascii) + g = font->ascii2glyph[s[i]]; if(g>=0) { swf_SetBits(t,g,gbits); swf_SetBits(t,(((U32)font->glyph[g].advance)*scale)/100,abits); + l++; + if(l==0x7f) + break; } } + PUT8(&t->data[pos], l); + swf_ResetWriteBits(t); return 0; } @@ -722,7 +741,9 @@ U32 swf_TextGetWidth(SWFFONT * font,U8 * s,int scale) if (font&&s) { while (s[0]) { - int g = font->ascii2glyph[*s]; + int g = -1; + if(*s < font->maxascii) + g = font->ascii2glyph[*s]; if(g>=0) res += font->glyph[g].advance; s++; @@ -803,7 +824,7 @@ void swf_WriteFont(SWFFONT*font, char* filename) int xmax = 0; int ymax = textscale * 2 * (font->maxascii/16+1); U8 gbits,abits; - char text[MAX_CHAR_PER_FONT+1]; + U8 text[MAX_CHAR_PER_FONT+1]; int x,y; text[MAX_CHAR_PER_FONT]=0; for(s=0;smaxascii;s++) @@ -938,13 +959,15 @@ SRECT swf_SetDefineText(TAG*tag, SWFFONT*font, RGBA*rgb, char*text, int scale) while(*c) { if(*c < font->maxascii) { int g = font->ascii2glyph[*c]; - SRECT rn = font->layout->bounds[g]; - rn.xmin = (rn.xmin * scale)/100 + pos; - rn.xmax = (rn.xmax * scale)/100 + pos; - rn.ymin = (rn.ymin * scale)/100; - rn.ymax = (rn.ymax * scale)/100; - swf_ExpandRect2(&r, &rn); - pos += (font->glyph[g].advance*scale*20)/100; + if(g>=0) { + SRECT rn = font->layout->bounds[g]; + rn.xmin = (rn.xmin * scale)/100 + pos; + rn.xmax = (rn.xmax * scale)/100 + pos; + rn.ymin = (rn.ymin * scale)/100; + rn.ymax = (rn.ymax * scale)/100; + swf_ExpandRect2(&r, &rn); + pos += (font->glyph[g].advance*scale*20)/100; + } } c++; } @@ -1003,7 +1026,7 @@ void swf_FontCreateLayout(SWFFONT*f) if(!shape2) { fprintf(stderr, "Shape parse error\n");exit(1); } - bbox = swf_GetShapeBoundingBox(shape2->lines); + bbox = swf_GetShapeBoundingBox(shape2); swf_Shape2Free(shape2); f->layout->bounds[t] = bbox; /* FIXME */