#include "../rfxswf.h"
#include "../gfxdevice.h"
#include "../gfxtools.h"
-#include "../art/libart.h"
#include "swf.h"
#include "../gfxpoly.h"
#include "../png.h"
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;
/* 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;
tag->id != ST_END &&
tag->id != ST_DOACTION &&
tag->id != ST_SHOWFRAME) {
- swf_DeleteTag(tag);
+ swf_DeleteTag(swf, tag);
}
tag = next;
}
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;
}
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;
}
for(t=0;t<font->max_unicode;t++) {
swffont->ascii2glyph[t] = font->unicode2glyph[t];
}
+ SRECT max = {0,0,0,0};
for(t=0;t<font->num_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.
} 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;
}
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("<warning> Advance value overflow in glyph %d", t);
swffont->glyph[t].advance = 32767;
}
swf_ExpandRect2(&bounds, &swffont->layout->bounds[t]);
}
+ for(t=0;t<font->num_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("<warning> 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
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;
}