#include "../rfxswf.h"
#include "../gfxdevice.h"
#include "../gfxtools.h"
-#ifdef INTERNAL_LIBART
-#include "../art/libart.h"
-#else
-#include <libart_lgpl/libart.h>
-#endif
#include "swf.h"
#include "../gfxpoly.h"
#include "../png.h"
double config_dumpfonts;
double config_ppmsubpixels;
double config_jpegsubpixels;
+ char hasbuttons;
int config_simpleviewer;
int config_opennewwindow;
int config_ignoredraworder;
i->config_internallinkfunction=0;
i->config_externallinkfunction=0;
i->config_reordertags=1;
- i->config_linknameurl=1;
+ i->config_linknameurl=0;
i->config_linkcolor.r = i->config_linkcolor.g = i->config_linkcolor.b = 255;
i->config_linkcolor.a = 0x40;
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->compressed = 1;
}
- /* Initialize AVM2 if it is a Flash9 file */
- if(i->config_flashversion>=9 && i->config_insertstoptag) {
- AVM2_InsertStops(i->swf);
+ /* Add AVM2 actionscript */
+ if(i->config_flashversion>=9 &&
+ (i->config_insertstoptag || i->hasbuttons)) {
+ swf_AddButtonLinks(i->swf, i->config_insertstoptag);
}
// if(i->config_reordertags)
// swf_Optimize(i->swf);
double posy = 0;
int buttonid = getNewID(dev);
gfxbbox_t bbox = gfxline_getbbox(points);
+
+ i->hasbuttons = 1;
/* shape */
myshapeid = getNewID(dev);
swf_ButtonPostProcess(i->tag, 1);
}
}
+ char buf[80];
const char* name = 0;
if(i->config_linknameurl) {
name = url;
+ } else {
+ name = buf;
+ sprintf(buf, "button%d", buttonid);
}
msg("<trace> Placing link ID %d", buttonid);
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;
}