X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswftext.c;h=30e877fddc7b166ecf514b81b1f9f65c3a760ab8;hb=a96acf64e3570fd1ef0c91d9883d1238398b1b38;hp=ab0193c5291a39d16a2c082b22067bae5d01d7dc;hpb=d193d733dfa41679452284e4e60e7237ac721cba;p=swftools.git diff --git a/lib/modules/swftext.c b/lib/modules/swftext.c index ab0193c..30e877f 100644 --- a/lib/modules/swftext.c +++ b/lib/modules/swftext.c @@ -680,7 +680,9 @@ 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); a = swf_CountBits((((U32)font->glyph[glyph].advance)*scale)/100,a); @@ -695,23 +697,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 +730,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 +813,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 +948,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)/2000 + pos; - rn.xmax = (rn.xmax * scale)/2000 + pos; - rn.ymin = (rn.ymin * scale)/2000; - rn.ymax = (rn.ymax * scale)/2000; - swf_ExpandRect2(&r, &rn); - pos += (font->glyph[g].advance*scale)/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++; } @@ -960,11 +972,22 @@ SRECT swf_SetDefineText(TAG*tag, SWFFONT*font, RGBA*rgb, char*text, int scale) swf_SetRect(tag,&r); swf_SetMatrix(tag,NULL); - swf_TextCountBits(font,text,scale,&gbits,&abits); + swf_TextCountBits(font,text,scale*20,&gbits,&abits); swf_SetU8(tag,gbits); swf_SetU8(tag,abits); - swf_TextSetInfoRecord(tag,font,scale/2 /*?? why /2? */,rgb,0,0); //scale - swf_TextSetCharRecord(tag,font,text,scale,gbits,abits); + + /* now set the text params- notice that a font size of + 1024 means that the glyphs will be displayed exactly + as they would be in/with a defineshape. (Try to find + *that* in the flash specs) + */ + swf_TextSetInfoRecord(tag,font,(scale*1024)/100,rgb,0,0); //scale + + /* set the actual text- notice that we just pass our scale + parameter over, as TextSetCharRecord calculates with + percent, too */ + swf_TextSetCharRecord(tag,font,text,scale*20,gbits,abits); + swf_SetU8(tag,0); return r; }