- gfxdevice_t dev;
- device_internal_t i;
- i.v = device;
- i.doc = doc;
-
- dev.internal = &i;
- dev.setparameter = rb_setparameter;
- dev.startpage = rb_startpage;
- dev.startclip = rb_startclip;
- dev.endclip = rb_endclip;
- dev.stroke = rb_stroke;
- dev.fill = rb_fill;
- dev.fillbitmap = rb_fillbitmap;
- dev.fillgradient = rb_fillgradient;
- dev.addfont = rb_addfont;
- dev.drawchar = rb_drawchar;
- dev.drawlink = rb_drawlink;
- dev.endpage = rb_endpage;
- dev.finish = rb_finish;
+ make_device(_dev, doc, device);
+ gfxdevice_t*dev = &_dev;
+
+ if(!NIL_P(filters)) {
+ if(TYPE(filters) != T_ARRAY)
+ rb_raise(rb_eArgError, "third argument of doc->render must be an array of symbols");
+
+ int len = RARRAY(filters)->len;
+ int t=0;
+ while(t<len) {
+ VALUE filter = RARRAY(filters)->ptr[t++];
+ Check_Type(filter, T_SYMBOL);
+ ID id = SYM2ID(filter);
+# define PARAM(x) VALUE x;if(t==len) rb_raise(rb_eArgError, "End of array while parsing arguments for filter %s", rb_id2name(id)); \
+ else x = RARRAY(filters)->ptr[t++];
+ if(id == id_remove_font_transforms) {
+ wrap_filter2(dev, remove_font_transforms);
+ } else if(id == id_vectors_to_glyphs) {
+ wrap_filter2(dev, vectors_to_glyphs);
+ } else if(id == id_maketransparent) {
+ PARAM(alpha);
+ wrap_filter(dev, maketransparent, FIX2INT(alpha));
+ } else {
+ rb_raise(rb_eArgError, "unknown filter %s", rb_id2name(id));
+ }
+ }
+ }
+
+ int pagenr;
+ for(pagenr=1;pagenr<=doc->doc->num_pages;pagenr++) {
+ if(is_in_range(pagenr, (char*)range)) {
+ gfxpage_t*page = doc->doc->getpage(doc->doc, pagenr);
+ dev->startpage(dev, page->width, page->height);
+ page->render(page, dev);
+ dev->endpage(dev);
+ page->destroy(page);
+ }
+ }
+
+
+ gfxresult_t*r = dev->finish(dev);
+ r->destroy(r);