X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fdevices%2Fswf.c;h=4bf636eb3c9e662729e4cb18dfba941ea812f21b;hp=20cb71bf0368d1153408d7884a784e1c5c6d7332;hb=e0a27e1bd83ff2d60745dd6030e0f5ef7ef97b82;hpb=95d485fb6a0e26b89822eb47d58840b4c1671f48 diff --git a/lib/devices/swf.c b/lib/devices/swf.c index 20cb71b..4bf636e 100644 --- a/lib/devices/swf.c +++ b/lib/devices/swf.c @@ -89,6 +89,7 @@ typedef struct _swfoutput_internal int config_enablezlib; int config_insertstoptag; int config_watermark; + int config_noclips; int config_flashversion; int config_reordertags; int config_showclipshapes; @@ -313,12 +314,38 @@ typedef struct _plotxy double x,y; } plotxy_t; +static inline int twipsnap(double f) +{ + /* if(f < -0x40000000/20.0) { + fprintf(stderr, "Warning: Coordinate underflow (%f)\n", f); + f = -0x40000000/20.0; + } else if(f>0x3fffffff/20.0) { + fprintf(stderr, "Warning: Coordinate overflow (%f)\n", f); + f = 0x3fffffff/20.0; + }*/ + + /* clamp coordinates to a rectangle with the property that we + can represent a line from the upper left corner to the upper + right corner using no more than 64 strokes */ + const double min = -(1<<(18+4))/20.0; + const double max = ((1<<(18+4))-1)/20.0; + if(f < min) { + fprintf(stderr, "Warning: Coordinate underflow (%f)\n", f); + f = min; + } else if(f>max) { + fprintf(stderr, "Warning: Coordinate overflow (%f)\n", f); + f = max; + } + + return (int)(f*20); +} + // write a move-to command into the swf static int movetoxy(gfxdevice_t*dev, TAG*tag, plotxy_t p0) { swfoutput_internal*i = (swfoutput_internal*)dev->internal; - int rx = (int)(p0.x*20); - int ry = (int)(p0.y*20); + int rx = twipsnap(p0.x); + int ry = twipsnap(p0.y); if(rx!=i->swflastx || ry!=i->swflasty || i->fillstylechanged) { swf_ShapeSetMove (tag, i->shape, rx,ry); i->fillstylechanged = 0; @@ -380,8 +407,8 @@ static void addPointToBBox(gfxdevice_t*dev, int px, int py) static void linetoxy(gfxdevice_t*dev, TAG*tag, plotxy_t p0) { swfoutput_internal*i = (swfoutput_internal*)dev->internal; - int px = (int)(p0.x*20); - int py = (int)(p0.y*20); + int px = twipsnap(p0.x); + int py = twipsnap(p0.y); int rx = (px-i->swflastx); int ry = (py-i->swflasty); if(rx|ry) { @@ -419,12 +446,12 @@ static void splineto(gfxdevice_t*dev, TAG*tag, plotxy_t control,plotxy_t end) int lastlastx = i->swflastx; int lastlasty = i->swflasty; - int cx = ((int)(control.x*20)-i->swflastx); - int cy = ((int)(control.y*20)-i->swflasty); + int cx = (twipsnap(control.x)-i->swflastx); + int cy = (twipsnap(control.y)-i->swflasty); i->swflastx += cx; i->swflasty += cy; - int ex = ((int)(end.x*20)-i->swflastx); - int ey = ((int)(end.y*20)-i->swflasty); + int ex = (twipsnap(end.x)-i->swflastx); + int ey = (twipsnap(end.y)-i->swflasty); i->swflastx += ex; i->swflasty += ey; @@ -1451,17 +1478,17 @@ void* swfresult_get(gfxresult_t*gfx, const char*name) if(!strcmp(name, "swf")) { return (void*)swf_CopySWF(swf); } else if(!strcmp(name, "xmin")) { - return (void*)(swf->movieSize.xmin/20); + return (void*)(ptroff_t)(swf->movieSize.xmin/20); } else if(!strcmp(name, "ymin")) { - return (void*)(swf->movieSize.ymin/20); + return (void*)(ptroff_t)(swf->movieSize.ymin/20); } else if(!strcmp(name, "xmax")) { - return (void*)(swf->movieSize.xmax/20); + return (void*)(ptroff_t)(swf->movieSize.xmax/20); } else if(!strcmp(name, "ymax")) { - return (void*)(swf->movieSize.ymax/20); + return (void*)(ptroff_t)(swf->movieSize.ymax/20); } else if(!strcmp(name, "width")) { - return (void*)((swf->movieSize.xmax - swf->movieSize.xmin)/20); + return (void*)(ptroff_t)((swf->movieSize.xmax - swf->movieSize.xmin)/20); } else if(!strcmp(name, "height")) { - return (void*)((swf->movieSize.ymax - swf->movieSize.ymin)/20); + return (void*)(ptroff_t)((swf->movieSize.ymax - swf->movieSize.ymin)/20); } return 0; } @@ -1866,9 +1893,9 @@ static void drawlink(gfxdevice_t*dev, ActionTAG*actions1, ActionTAG*actions2, gf m = i->page_matrix; m.tx = p.x; m.ty = p.y; - swf_ObjectPlace(i->tag, buttonid, getNewDepth(dev),&m,0,name); + swf_ObjectPlace(i->tag, buttonid, getNewDepth(dev),&m,0,(U8*)name); } else { - swf_ObjectPlace(i->tag, buttonid, getNewDepth(dev),&i->page_matrix,0,name); + swf_ObjectPlace(i->tag, buttonid, getNewDepth(dev),&i->page_matrix,0,(U8*)name); } } @@ -1995,6 +2022,8 @@ int swf_setparameter(gfxdevice_t*dev, const char*name, const char*value) i->config_caplinewidth = atof(value); } else if(!strcmp(name, "linktarget")) { i->config_linktarget = strdup(value); + } else if(!strcmp(name, "noclips")) { + i->config_noclips = atoi(value); } else if(!strcmp(name, "dumpfonts")) { i->config_dumpfonts = atoi(value); } else if(!strcmp(name, "animate")) { @@ -2287,6 +2316,8 @@ static void drawoutline(gfxdevice_t*dev, gfxline_t*line) static void swf_startclip(gfxdevice_t*dev, gfxline_t*line) { swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->config_noclips) + return; endtext(dev); endshape(dev); @@ -2353,6 +2384,8 @@ static void swf_startclip(gfxdevice_t*dev, gfxline_t*line) static void swf_endclip(gfxdevice_t*dev) { swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->config_noclips) + return; if(i->textid>=0) endtext(dev); if(i->shapeid>=0) @@ -2514,11 +2547,11 @@ static void swf_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcol if(has_dots) gfxline_fix_short_edges(line); /* we need to convert the line into a polygon */ - gfxpoly_t* poly = gfxpoly_strokeToPoly(line, width, cap_style, joint_style, miterLimit); - gfxline_t*gfxline = gfxpoly_to_gfxline(poly); + gfxpoly_t* poly = gfxpoly_from_stroke(line, width, cap_style, joint_style, miterLimit, DEFAULT_GRID); + gfxline_t*gfxline = gfxline_from_gfxpoly(poly); dev->fill(dev, gfxline, color); gfxline_free(gfxline); - gfxpoly_free(poly); + gfxpoly_destroy(poly); return; }