+static VALUE doc_render(VALUE cls, VALUE device, VALUE _range, VALUE filters)
+{
+ const char*range = 0;
+ if(!NIL_P(_range)) {
+ Check_Type(_range, T_STRING);
+ range = StringValuePtr(_range);
+ }
+ Get_Doc(doc,cls);
+
+ 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);
+
+ return Qnil;
+}
+
+static VALUE doc_prepare(VALUE cls, VALUE device)
+{
+ Get_Doc(doc,cls);
+ make_device(dev, doc, device);
+ doc->doc->prepare(doc->doc, &dev);
+ return cls;
+}
+
+