int splinemaxerror=1;
int fontsplinemaxerror=1;
int filloverlap=0;
-float minlinewidth=0.1;
+float minlinewidth=0.05;
static char storefont = 0;
static int flag_protected = 0;
static void startshape(struct swfoutput* obj);
static void starttext(struct swfoutput* obj);
-static void endshape(int clip);
+static void endshape(struct swfoutput* obj,int clip);
static void endtext(struct swfoutput* obj);
// matrix multiplication. changes p0
On SWF side, we need to start a new shape for each
closed polygon, because SWF only knows EOFILL.
*/
- endshape(0);
+ endshape(output,0);
startshape(output);
startFill();
}
int back = 0;
if(line_cap == LINE_CAP_BUTT || line_cap == LINE_CAP_SQUARE) {
- endshape(0);
+ endshape(output,0);
startshape(output);
SWF_OUTLINE *last, *tmp=outline;
plotxy s,e,p0,p1,p2,p3,m0,m1,m2,m3;
if(line_cap == LINE_CAP_BUTT) {
lineto(tag, q0);
- endshape(depth+2-nr);
+ endshape(output, depth+2-nr);
startshape(output);
}
p0 = m0;
drawShortPath(output,x,y,m,outline);
if(line_cap == LINE_CAP_BUTT) {
- endshape(0);
+ endshape(output,0);
startshape(output);
}
}
need to draw) are very likely to overlap. To avoid that
they cancel each other out at the end points, start a new
shape for the second one */
- endshape(0);startshape(output);
+ endshape(output,0);startshape(output);
startFill();
}
}
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
if(textid<0)
starttext(obj);
so we better start a new shape here if the polygon is filled
*/
if(shapeid>=0 && fill && !ignoredraworder) {
- endshape(0);
+ endshape(output,0);
}
if(shapeid<0)
if(textid>=0)
endtext(output);
if(shapeid>=0)
- endshape(0);
+ endshape(output,0);
assert(shapeid<0);
startshape(output);
stopFill();
static void starttext(struct swfoutput*obj)
{
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
textid = ++currentswfid;
tag->pos = tag->readBit = 0;
}
-void fixAreas()
+void cancelshape(swfoutput*obj)
+{
+ /* delete old shape tag */
+ TAG*todel = tag;
+ tag = tag->prev;
+ swf_DeleteTag(todel);
+ shapeid = -1;
+ bboxrectpos = -1;
+}
+
+void fixAreas(swfoutput*obj)
{
if(!shapeisempty && fill &&
(bboxrect.xmin == bboxrect.xmax ||
bboxrect.ymin == bboxrect.ymax) &&
minlinewidth >= 0.001
) {
- SRECT r = bboxrect;
- msg("<debug> Shape has size 0");
+ msg("<debug> Shape has size 0: width=%.2f height=%.2f",
+ (bboxrect.xmax-bboxrect.xmin)/20.0,
+ (bboxrect.ymax-bboxrect.ymin)/20.0
+ );
+ SRECT r = bboxrect;
+
if(r.xmin == r.xmax && r.ymin == r.ymax) {
/* this thing comes down to a single dot- nothing to fix here */
return;
}
- double x=0,y=0;
- if(r.xmin == r.xmax) {
- x = minlinewidth;
- } else {
- y = minlinewidth;
- }
- /* warning: doing this inside endshape() is dangerous */
- moveto(tag, r.xmin/20.0 , r.ymin/20.0);
- lineto(tag, r.xmax/20.0 + x, r.ymin/20.0);
- lineto(tag, r.xmax/20.0 + x, r.ymax/20.0 + y);
- lineto(tag, r.xmin/20.0 , r.ymax/20.0 + y);
- lineto(tag, r.xmin/20.0 , r.ymin/20.0);
+ cancelshape(obj);
+
+ RGBA save_col = obj->strokergb;
+ int save_width = linewidth;
+
+ obj->strokergb = obj->fillrgb;
+ linewidth = (int)(minlinewidth*20);
+ if(linewidth==0) linewidth = 1;
+
+ startshape(obj);
+
+ moveto(tag, r.xmin/20.0,r.ymin/20.0);
+ lineto(tag, r.xmax/20.0,r.ymax/20.0);
+
+ obj->strokergb = save_col;
+ linewidth = save_width;
}
}
-static void endshape(int clipdepth)
+static void endshape(swfoutput*obj, int clipdepth)
{
if(shapeid<0)
return;
if(!clipdepth)
- fixAreas();
+ fixAreas(obj);
if(shapeisempty ||
(bboxrect.xmin == bboxrect.xmax && bboxrect.ymin == bboxrect.ymax))
{
- // delete the tag again, we didn't do anything
- TAG*todel = tag;
- tag = tag->prev;
- swf_DeleteTag(todel);
- shapeid = -1;
- bboxrectpos = -1;
+ // delete the shape again, we didn't do anything
+ cancelshape(obj);
return;
}
static void endpage(struct swfoutput*obj)
{
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
if(textid>=0)
endtext(obj);
while(clippos)
obj->fillrgb.b == b &&
obj->fillrgb.a == a) return;
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
obj->fillrgb.r = r;
obj->fillrgb.g = g;
obj->strokergb.a == a) return;
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
obj->strokergb.r = r;
obj->strokergb.g = g;
obj->strokergb.b = b;
return;
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
linewidth = (u16)(_linewidth*20);
}
if(textid>=0)
endtext(obj);
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
if(clippos >= 127)
{
if(textid>=0)
endtext(obj);
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
if(!clippos) {
msg("<error> Invalid end of clipping region");
}
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
if(textid>=0)
endtext(obj);
ActionTAG* actions;
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
if(textid>=0)
endtext(obj);
char mouseover = 1;
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
if(textid>=0)
endtext(obj);
{
TAG*oldtag;
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
if(textid>=0)
endtext(obj);
JPEGBITS*jpeg;
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
if(textid>=0)
endtext(obj);
{
TAG*oldtag;
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
if(textid>=0)
endtext(obj);
TAG*oldtag;
U8*mem2 = 0;
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
if(textid>=0)
endtext(obj);
{
if(id<0) return;
if(shapeid>=0)
- endshape(0);
+ endshape(obj,0);
if(textid>=0)
endtext(obj);