typedef struct _internal {
gfxdevice_t*out;
clip_t*clip;
+ ArtSVP*svpunion;
} internal_t;
static int verbose = 1;
{
dbg("arts_setparameter");
internal_t*i = (internal_t*)dev->internal;
- return i->out->setparameter(i->out,key,value);
+ if(i->out) return i->out->setparameter(i->out,key,value);
+ else return 0;
}
void arts_startpage(struct _gfxdevice*dev, int width, int height)
{
dbg("arts_startpage");
internal_t*i = (internal_t*)dev->internal;
- i->out->startpage(i->out,width,height);
+ if(i->out) i->out->startpage(i->out,width,height);
}
void arts_startclip(struct _gfxdevice*dev, gfxline_t*line)
}
}
+void addtounion(struct _gfxdevice*dev, ArtSVP*svp)
+{
+ internal_t*i = (internal_t*)dev->internal;
+ if(i->svpunion) {
+ ArtSVP*old = i->svpunion;
+ i->svpunion = art_svp_union(svp,i->svpunion);
+ art_svp_free(old);
+ }
+}
+
void arts_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit)
{
dbg("arts_stroke");
svp = art_svp_intersect(svp, i->clip->svp);
art_svp_free(old);
}
+ addtounion(dev,svp);
gfxline_t*gfxline = SVPtogfxline(svp);
- i->out->fill(i->out, gfxline, color);
+ if(i->out) i->out->fill(i->out, gfxline, color);
free(gfxline);
art_svp_free(svp);
}
svp = art_svp_intersect(svp, i->clip->svp);
art_svp_free(old);
}
+ addtounion(dev,svp);
gfxline_t*gfxline = SVPtogfxline(svp);
- i->out->fill(i->out, gfxline, color);
+ if(i->out) i->out->fill(i->out, gfxline, color);
free(gfxline);
art_svp_free(svp);
}
svp = art_svp_intersect(svp, i->clip->svp);
art_svp_free(old);
}
+ addtounion(dev,svp);
gfxline_t*gfxline = SVPtogfxline(svp);
- i->out->fillbitmap(i->out, gfxline, img, matrix, cxform);
+ if(i->out) i->out->fillbitmap(i->out, gfxline, img, matrix, cxform);
free(gfxline);
art_svp_free(svp);
}
svp = art_svp_intersect(svp, i->clip->svp);
art_svp_free(old);
}
+ addtounion(dev,svp);
gfxline_t*gfxline = SVPtogfxline(svp);
- i->out->fillgradient(i->out, gfxline, gradient, type, matrix);
+ if(i->out) i->out->fillgradient(i->out, gfxline, gradient, type, matrix);
free(gfxline);
art_svp_free(svp);
}
{
dbg("arts_addfont");
internal_t*i = (internal_t*)dev->internal;
- i->out->addfont(i->out, font);
+ if(i->out) i->out->addfont(i->out, font);
}
void arts_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix)
gfxbbox_t bbox2 = gfxline_getbbox(gfxline);
double w = bbox2.xmax - bbox2.xmin;
double h = bbox2.ymax - bbox2.ymin;
+
+ addtounion(dev, svp); // TODO: use the whole char, not just the bbox
+
if(w < 0.001 || h < 0.001) /* character was clipped completely */ {
} else if(fabs((bbox.xmax - bbox.xmin) - w) > 0.05 ||
fabs((bbox.ymax - bbox.ymin) - h) > 0.05) {
*/
arts_fill(dev, glyph, color);
} else {
- i->out->drawchar(i->out, font, glyphnr, color, matrix);
+ if(i->out) i->out->drawchar(i->out, font, glyphnr, color, matrix);
}
} else {
- i->out->drawchar(i->out, font, glyphnr, color, matrix);
+ if(i->out) i->out->drawchar(i->out, font, glyphnr, color, matrix);
}
gfxline_free(glyph);
{
dbg("arts_drawlink");
internal_t*i = (internal_t*)dev->internal;
- i->out->drawlink(i->out, line, action);
+ if(i->out) i->out->drawlink(i->out, line, action);
}
void arts_endpage(struct _gfxdevice*dev)
{
dbg("arts_endpage");
internal_t*i = (internal_t*)dev->internal;
- i->out->endpage(i->out);
+ if(i->out) i->out->endpage(i->out);
}
gfxresult_t* arts_finish(struct _gfxdevice*dev)
{
dbg("arts_finish");
internal_t*i = (internal_t*)dev->internal;
- return i->out->finish(i->out);
+ if(i->out) {
+ return i->out->finish(i->out);
+ } else {
+ return 0;
+ }
+}
+
+gfxline_t*gfxdevice_union_getunion(struct _gfxdevice*dev)
+{
+ internal_t*i = (internal_t*)dev->internal;
+ return SVPtogfxline(i->svpunion);
}
-void gfxdevice_arts_init(gfxdevice_t*dev, gfxdevice_t*out)
+void gfxdevice_removeclippings_init(gfxdevice_t*dev, gfxdevice_t*out)
{
- dbg("gfxdevice_arts_init");
+ dbg("gfxdevice_removeclippings_init");
internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t));
memset(dev, 0, sizeof(gfxdevice_t));
+
+ dev->name = "removeclippings";
+
+ dev->internal = i;
+
+ dev->setparameter = arts_setparameter;
+ dev->startpage = arts_startpage;
+ dev->startclip = arts_startclip;
+ dev->endclip = arts_endclip;
+ dev->stroke = arts_stroke;
+ dev->fill = arts_fill;
+ dev->fillbitmap = arts_fillbitmap;
+ dev->fillgradient = arts_fillgradient;
+ dev->addfont = arts_addfont;
+ dev->drawchar = arts_drawchar;
+ dev->drawlink = arts_drawlink;
+ dev->endpage = arts_endpage;
+ dev->finish = arts_finish;
+
+ i->out = out;
+ i->svpunion = 0;
+}
+
+void gfxdevice_union_init(gfxdevice_t*dev,gfxdevice_t*out)
+{
+ dbg("gfxdevice_getunion_init");
+ internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t));
+ memset(dev, 0, sizeof(gfxdevice_t));
+
+ dev->name = "union";
+
dev->internal = i;
dev->setparameter = arts_setparameter;
dev->finish = arts_finish;
i->out = out;
+ i->svpunion = gfxstrokeToSVP(0, 0, 0, 0, 0);
}