X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fdevices%2Fswf.c;h=ab6734fa0dd8253f8b53c98b579bc90e971dd436;hb=80cc20b7784cccc9d8baf9839f9781db6bb6f539;hp=0bd3160db75d8f855fd669228a91d187bc3543fe;hpb=d3fb559b6b8ca9c122b310cae1a3e8b0805f97ad;p=swftools.git diff --git a/lib/devices/swf.c b/lib/devices/swf.c index 0bd3160..ab6734f 100644 --- a/lib/devices/swf.c +++ b/lib/devices/swf.c @@ -85,6 +85,7 @@ typedef struct _swfoutput_internal int config_protect; int config_bboxvars; int config_disable_polygon_conversion; + int config_normalize_polygon_positions; RGBA config_linkcolor; float config_minlinewidth; double config_caplinewidth; @@ -92,6 +93,7 @@ typedef struct _swfoutput_internal char*config_internallinkfunction; char*config_externallinkfunction; char config_animate; + double config_framerate; SWF* swf; @@ -176,7 +178,7 @@ static void swf_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxm static void swf_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix); static void swf_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix); static void swf_addfont(gfxdevice_t*dev, gfxfont_t*font); -static void swf_drawlink(gfxdevice_t*dev, gfxline_t*line, char*action); +static void swf_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action); static void swf_startframe(gfxdevice_t*dev, int width, int height); static void swf_endframe(gfxdevice_t*dev); static gfxresult_t* swf_finish(gfxdevice_t*driver); @@ -227,6 +229,7 @@ static swfoutput_internal* init_internal_struct() i->config_generate_fake_tags=0; i->config_insertstoptag=0; i->config_flashversion=6; + i->config_framerate=0.25; i->config_splinemaxerror=1; i->config_fontsplinemaxerror=1; i->config_filloverlap=0; @@ -933,7 +936,7 @@ void gfxdevice_swf_init(gfxdevice_t* dev) i->swf = (SWF*)rfx_calloc(sizeof(SWF)); i->swf->fileVersion = i->config_flashversion; - i->swf->frameRate = 0x0040; // 1 frame per 4 seconds + i->swf->frameRate = i->config_framerate*0x100; i->swf->movieSize.xmin = 0; i->swf->movieSize.ymin = 0; i->swf->movieSize.xmax = 0; @@ -1247,11 +1250,11 @@ void swfoutput_finalize(gfxdevice_t*dev) i->swf->compressed = 1; } - if(i->config_reordertags) - swf_Optimize(i->swf); +// if(i->config_reordertags) +// swf_Optimize(i->swf); } -int swfresult_save(gfxresult_t*gfx, char*filename) +int swfresult_save(gfxresult_t*gfx, const char*filename) { SWF*swf = (SWF*)gfx->internal; int fi; @@ -1277,7 +1280,7 @@ int swfresult_save(gfxresult_t*gfx, char*filename) close(fi); return 0; } -void* swfresult_get(gfxresult_t*gfx, char*name) +void* swfresult_get(gfxresult_t*gfx, const char*name) { SWF*swf = (SWF*)gfx->internal; if(!strcmp(name, "swf")) { @@ -1406,15 +1409,15 @@ static void swfoutput_setlinewidth(gfxdevice_t*dev, double _linewidth) static void drawlink(gfxdevice_t*dev, ActionTAG*,ActionTAG*, gfxline_t*points, char mouseover); static void swfoutput_namedlink(gfxdevice_t*dev, char*name, gfxline_t*points); static void swfoutput_linktopage(gfxdevice_t*dev, int page, gfxline_t*points); -static void swfoutput_linktourl(gfxdevice_t*dev, char*url, gfxline_t*points); +static void swfoutput_linktourl(gfxdevice_t*dev, const char*url, gfxline_t*points); -void swfoutput_drawlink(gfxdevice_t*dev, char*url, gfxline_t*points) +/*void swfoutput_drawlink(gfxdevice_t*dev, char*url, gfxline_t*points) { swfoutput_internal*i = (swfoutput_internal*)dev->internal; dev->drawlink(dev, points, url); -} +}*/ -void swf_drawlink(gfxdevice_t*dev, gfxline_t*points, char*url) +void swf_drawlink(gfxdevice_t*dev, gfxline_t*points, const char*url) { swfoutput_internal*i = (swfoutput_internal*)dev->internal; @@ -1440,7 +1443,7 @@ void swf_drawlink(gfxdevice_t*dev, gfxline_t*points, char*url) swfoutput_linktourl(dev, url, points); } } -void swfoutput_linktourl(gfxdevice_t*dev, char*url, gfxline_t*points) +void swfoutput_linktourl(gfxdevice_t*dev, const char*url, gfxline_t*points) { ActionTAG* actions = 0; swfoutput_internal*i = (swfoutput_internal*)dev->internal; @@ -1778,8 +1781,13 @@ int swf_setparameter(gfxdevice_t*dev, const char*name, const char*value) i->config_internallinkfunction = strdup(value); } else if(!strcmp(name, "externallinkfunction")) { i->config_externallinkfunction = strdup(value); + } else if(!strcmp(name, "linkfunction")) { //sets both internallinkfunction and externallinkfunction + i->config_internallinkfunction = strdup(value); + i->config_externallinkfunction = strdup(value); } else if(!strcmp(name, "disable_polygon_conversion")) { i->config_disable_polygon_conversion = atoi(value); + } else if(!strcmp(name, "normalize_polygon_positions")) { + i->config_normalize_polygon_positions = atoi(value); } else if(!strcmp(name, "insertstop")) { i->config_insertstoptag = atoi(value); } else if(!strcmp(name, "protect")) { @@ -1794,6 +1802,11 @@ int swf_setparameter(gfxdevice_t*dev, const char*name, const char*value) if(i->swf) { i->swf->fileVersion = i->config_flashversion; } + } else if(!strcmp(name, "framerate")) { + i->config_framerate = atoi(value); + if(i->swf) { + i->swf->frameRate = i->config_framerate*0x100; + } } else if(!strcmp(name, "minlinewidth")) { i->config_minlinewidth = atof(value); } else if(!strcmp(name, "caplinewidth")) { @@ -1809,7 +1822,7 @@ int swf_setparameter(gfxdevice_t*dev, const char*name, const char*value) } else if(!strcmp(name, "jpegquality")) { int val = atoi(value); if(val<0) val=0; - if(val>100) val=100; + if(val>101) val=101; i->config_jpegquality = val; } else if(!strcmp(name, "splinequality")) { int v = atoi(value); @@ -2252,17 +2265,17 @@ static void swf_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcol msg(" draw as stroke, type=%d dots=%d", type, has_dots); endtext(dev); -#ifdef NORMALIZE_POLYGON_POSITIONS - endshape(dev); - double startx = 0, starty = 0; - if(line && line->type == gfx_moveTo) { - startx = line->x; - starty = line->y; - } - line = gfxline_move(line, -startx, -starty); - i->shapeposx = (int)(startx*20); - i->shapeposy = (int)(starty*20); -#endif + if(i->config_normalize_polygon_positions) { + endshape(dev); + double startx = 0, starty = 0; + if(line && line->type == gfx_moveTo) { + startx = line->x; + starty = line->y; + } + line = gfxline_move(line, -startx, -starty); + i->shapeposx = (int)(startx*20); + i->shapeposy = (int)(starty*20); + } swfoutput_setstrokecolor(dev, color->r, color->g, color->b, color->a); swfoutput_setlinewidth(dev, width); @@ -2270,9 +2283,9 @@ static void swf_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcol stopFill(dev); drawgfxline(dev, line); -#ifdef NORMALIZE_POLYGON_POSITIONS - free(line); //account for _move -#endif + if(i->config_normalize_polygon_positions) { + free(line); //account for _move + } } static void swf_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) @@ -2289,17 +2302,17 @@ static void swf_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) if(!i->config_ignoredraworder) endshape(dev); -#ifdef NORMALIZE_POLYGON_POSITIONS - endshape(dev); - double startx = 0, starty = 0; - if(line && line->type == gfx_moveTo) { - startx = line->x; - starty = line->y; - } - line = gfxline_move(line, -startx, -starty); - i->shapeposx = (int)(startx*20); - i->shapeposy = (int)(starty*20); -#endif + if(i->config_normalize_polygon_positions) { + endshape(dev); + double startx = 0, starty = 0; + if(line && line->type == gfx_moveTo) { + startx = line->x; + starty = line->y; + } + line = gfxline_move(line, -startx, -starty); + i->shapeposx = (int)(startx*20); + i->shapeposy = (int)(starty*20); + } swfoutput_setfillcolor(dev, color->r, color->g, color->b, color->a); startshape(dev); @@ -2308,9 +2321,9 @@ static void swf_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) drawgfxline(dev, line); msg(" end of swf_fill (shapeid=%d)", i->shapeid); -#ifdef NORMALIZE_POLYGON_POSITIONS - free(line); //account for _move -#endif + if(i->config_normalize_polygon_positions) { + free(line); //account for _move + } } static void swf_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) { @@ -2494,7 +2507,7 @@ static void swf_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t* swf_switchfont(dev, font->id); // set the current font } setfontscale(dev, matrix->m00, matrix->m01, matrix->m10, matrix->m11); - + /* printf("%f %f\n", m.m31, m.m32); { static int xpos = 40;