X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fdevices%2Fswf.c;h=7740ca124871c1ba47d97fbeeb89483ef9ee7127;hb=f18c3f2c7b8f9a7c403d26e39e645d3b3ccac789;hp=b8aedcb041a594b306464fec8e235a82ceb3f1ae;hpb=a9e315788f366e44b1e14dad849e24329859d62b;p=swftools.git diff --git a/lib/devices/swf.c b/lib/devices/swf.c index b8aedcb..7740ca1 100644 --- a/lib/devices/swf.c +++ b/lib/devices/swf.c @@ -40,7 +40,6 @@ #include "../rfxswf.h" #include "../gfxdevice.h" #include "../gfxtools.h" -#include "../art/libart.h" #include "swf.h" #include "../gfxpoly.h" #include "../png.h" @@ -1101,7 +1100,7 @@ void gfxdevice_swf_init(gfxdevice_t* dev) i->tag = i->swf->firstTag; RGBA rgb; rgb.a = rgb.r = rgb.g = rgb.b = 0xff; - rgb.r = 0; + //rgb.r = 0; swf_SetRGB(i->tag,&rgb); i->startdepth = i->depth = 0; @@ -1195,7 +1194,7 @@ void cancelshape(gfxdevice_t*dev) /* delete old shape tag */ TAG*todel = i->tag; i->tag = i->tag->prev; - swf_DeleteTag(todel); + swf_DeleteTag(0, todel); if(i->shape) {swf_ShapeFree(i->shape);i->shape=0;} i->shapeid = -1; i->bboxrectpos = -1; @@ -1320,7 +1319,7 @@ void wipeSWF(SWF*swf) tag->id != ST_END && tag->id != ST_DOACTION && tag->id != ST_SHOWFRAME) { - swf_DeleteTag(tag); + swf_DeleteTag(swf, tag); } tag = next; } @@ -1392,7 +1391,7 @@ void swfoutput_finalize(gfxdevice_t*dev) and the ST_END- they confuse the flash player */ while(tag->id == ST_REMOVEOBJECT2) { TAG* prev = tag->prev; - swf_DeleteTag(tag); + swf_DeleteTag(i->swf, tag); tag = prev; } @@ -1953,7 +1952,7 @@ int swf_setparameter(gfxdevice_t*dev, const char*name, const char*value) i->swf->fileVersion = i->config_flashversion; } } else if(!strcmp(name, "framerate")) { - i->config_framerate = atoi(value); + i->config_framerate = atof(value); if(i->swf) { i->swf->frameRate = i->config_framerate*0x100; } @@ -2654,10 +2653,11 @@ static SWFFONT* gfxfont_to_swffont(gfxfont_t*font, const char* id) for(t=0;tmax_unicode;t++) { swffont->ascii2glyph[t] = font->unicode2glyph[t]; } + SRECT max = {0,0,0,0}; for(t=0;tnum_glyphs;t++) { drawer_t draw; gfxline_t*line; - int advance = 0; + double advance = 0; swffont->glyph2ascii[t] = font->glyphs[t].unicode; if(swffont->glyph2ascii[t] == 0xffff || swffont->glyph2ascii[t] == 0x0000) { /* flash 8 flashtype requires unique unicode IDs for each character. @@ -2671,7 +2671,7 @@ static SWFFONT* gfxfont_to_swffont(gfxfont_t*font, const char* id) } else { swffont->glyphnames[t] = 0; } - advance = (int)(font->glyphs[t].advance); + advance = font->glyphs[t].advance; swf_Shape01DrawerInit(&draw, 0); line = font->glyphs[t].line; @@ -2690,17 +2690,16 @@ static SWFFONT* gfxfont_to_swffont(gfxfont_t*font, const char* id) } draw.finish(&draw); swffont->glyph[t].shape = swf_ShapeDrawerToShape(&draw); - swffont->layout->bounds[t] = swf_ShapeDrawerGetBBox(&draw); - int xmax = swffont->layout->bounds[t].xmax / 20; - if(xmax>0 && xmax*2 < advance) { - printf("fix bad advance value: bbox=%d, advance=%d (%f)\n", xmax, advance, font->glyphs[t].advance); - advance = xmax; - } + SRECT bbox = swf_ShapeDrawerGetBBox(&draw); + swf_ExpandRect2(&max, &bbox); + + swffont->layout->bounds[t] = bbox; - if(advance<32768/20) { - swffont->glyph[t].advance = advance*20; + if(advance<32768.0/20) { + swffont->glyph[t].advance = (int)(advance*20); } else { + //msg(" Advance value overflow in glyph %d", t); swffont->glyph[t].advance = 32767; } @@ -2708,6 +2707,24 @@ static SWFFONT* gfxfont_to_swffont(gfxfont_t*font, const char* id) swf_ExpandRect2(&bounds, &swffont->layout->bounds[t]); } + for(t=0;tnum_glyphs;t++) { + SRECT bbox = swffont->layout->bounds[t]; + + /* if the glyph doesn't have a bounding box, use the + combined bounding box (necessary e.g. for space characters) */ + if(!(bbox.xmin|bbox.ymin|bbox.xmax|bbox.ymax)) { + swffont->layout->bounds[t] = bbox = max; + } + + /* check that the advance value is reasonable, by comparing it + with the bounding box */ + if(bbox.xmax>0 && (bbox.xmax*10 < swffont->glyph[t].advance || !swffont->glyph[t].advance)) { + if(swffont->glyph[t].advance) + msg(" fix bad advance value for char %d: bbox=%.2f, advance=%.2f\n", t, bbox.xmax/20.0, swffont->glyph[t].advance/20.0); + swffont->glyph[t].advance = bbox.xmax; + } + //swffont->glyph[t].advance = bbox.xmax - bbox.xmin; + } /* Flash player will use the advance value from the char, and the ascent/descent values @@ -2725,6 +2742,14 @@ static SWFFONT* gfxfont_to_swffont(gfxfont_t*font, const char* id) swffont->layout->descent = 0; swffont->layout->leading = bounds.ymax - bounds.ymin; + /* if the font has proper ascent/descent values (>0) and those define + greater line spacing that what we estimated from the bounding boxes, + use the font's parameters */ + if(font->ascent*20 > swffont->layout->ascent) + swffont->layout->ascent = font->ascent*20; + if(font->descent*20 > swffont->layout->descent) + swffont->layout->descent = font->descent*20; + return swffont; }