2 #include "../gfxdevice.h"
3 #include "../gfxsource.h"
4 #include "../devices/pdf.h"
5 #include "../readers/swf.h"
6 #include "../readers/image.h"
7 #include "../pdf/pdf.h"
10 #define RUBY_GFX_VERSION "0.9.0"
13 static VALUE Document, DocumentPage, PDFClass, SWFClass, ImageClass, Device;
16 typedef struct doc_internal {
17 gfxsource_t*driver; // filled by alloc
21 typedef struct page_internal {
25 static gfxsource_t* pdfdriver = 0;
26 static gfxsource_t* imagedriver = 0;
27 static gfxsource_t* swfdriver = 0;
29 #define Get_Doc(doc,cls) doc_internal_t*doc=0;Data_Get_Struct(cls, doc_internal_t, doc);
30 #define Get_Page(page,cls) page_internal_t*page=0;Data_Get_Struct(cls, page_internal_t, page);
32 static VALUE doc_allocate(VALUE cls, gfxsource_t*driver);
33 static VALUE page_allocate(VALUE cls);
35 // ------------------------ documents ---------------------------------------
37 static VALUE doc_initialize(VALUE cls, VALUE _filename)
39 Check_Type(_filename, T_STRING);
41 const char*filename = StringValuePtr(_filename);
42 doc->doc = pdfdriver->open(pdfdriver, filename);
46 static VALUE doc_num_pages(VALUE cls)
49 return INT2FIX(doc->doc->num_pages);
53 static VALUE doc_get_page(VALUE cls, VALUE _nr)
55 Check_Type(_nr, T_FIXNUM);
56 int nr = FIX2INT(_nr);
59 VALUE v = page_allocate(DocumentPage);
61 page->page = doc->doc->getpage(doc->doc, nr);
65 static VALUE doc_each_page(VALUE cls)
69 for(t=1;t<=doc->doc->num_pages;t++) {
70 VALUE v = page_allocate(DocumentPage);
72 page->page = doc->doc->getpage(doc->doc, t);
78 static void doc_mark(doc_internal_t*doc)
80 // e.g. rb_gc_mark(z->page);
83 static void doc_free(doc_internal_t*doc)
85 doc->doc->destroy(doc->doc);
89 static VALUE doc_allocate(VALUE cls, gfxsource_t*driver)
91 doc_internal_t*doc = 0;
92 VALUE v = Data_Make_Struct(cls, doc_internal_t, 0, doc_free, doc);
93 memset(doc, 0, sizeof(doc_internal_t));
98 static VALUE pdf_allocate(VALUE cls) {return doc_allocate(cls, pdfdriver);}
99 static VALUE swf_allocate(VALUE cls) {return doc_allocate(cls, swfdriver);}
100 static VALUE image_allocate(VALUE cls) {return doc_allocate(cls, imagedriver);}
102 // ------------------------ doc pages ---------------------------------------
104 static VALUE page_free(VALUE cls)
107 page->page->destroy(page->page);
112 static VALUE page_allocate(VALUE cls)
114 page_internal_t*page = 0;
115 VALUE v = Data_Make_Struct(cls, page_internal_t, 0, page_free, page);
116 memset(page, 0, sizeof(page_internal_t));
120 static VALUE page_render(VALUE cls, VALUE device)
122 Check_Type(device, T_CLASS);
126 dev.internal = (void*)(ptroff_t)device;
128 page->page->render(page->page, 0);//device);
132 static VALUE page_nr(VALUE cls)
135 return INT2FIX(page->page->nr);
138 static VALUE page_width(VALUE cls)
141 return INT2FIX(page->page->width);
144 static VALUE page_height(VALUE cls)
147 return INT2FIX(page->page->height);
150 // ------------------------ gfx device --------------------------------------
152 static VALUE noop(int argc, VALUE *argv, VALUE obj) {return obj;}
154 // --------------------------------------------------------------------------
158 initLog(0,0,0,0,0,2);
159 pdfdriver = gfxsource_pdf_create();
160 swfdriver = gfxsource_swf_create();
161 imagedriver = gfxsource_image_create();
163 GFX = rb_define_module("GFX");
165 DocumentPage = rb_define_class_under(GFX, "DocumentPage", rb_cObject);
166 rb_define_alloc_func(DocumentPage, page_allocate);
167 rb_define_method(DocumentPage, "width", page_width, 0);
168 rb_define_method(DocumentPage, "height", page_height, 0);
169 rb_define_method(DocumentPage, "nr", page_nr, 0);
170 rb_define_method(DocumentPage, "render", page_render, 0);
172 Document = rb_define_class_under(GFX, "Document", rb_cObject);
173 rb_define_method(Document, "initialize", doc_initialize, 1);
174 rb_define_method(Document, "page", doc_get_page, 1);
175 rb_define_method(Document, "each_page", doc_each_page, 0);
177 Device = rb_define_class_under(GFX, "Device", rb_cObject);
178 rb_define_method(Device, "startpage", noop, -1);
179 rb_define_method(Device, "endpage", noop, -1);
180 rb_define_method(Device, "startclip", noop, -1);
181 rb_define_method(Device, "endclip", noop, -1);
182 rb_define_method(Device, "stroke", noop, -1);
183 rb_define_method(Device, "fill", noop, -1);
184 rb_define_method(Device, "fillbitmap", noop, -1);
185 rb_define_method(Device, "fillgradient", noop, -1);
186 rb_define_method(Device, "addfont", noop, -1);
187 rb_define_method(Device, "drawchar", noop, -1);
188 rb_define_method(Device, "drawlink", noop, -1);
189 rb_define_method(Device, "endpage", noop, -1);
191 PDFClass = rb_define_class_under(GFX, "PDF", Document);
192 rb_define_alloc_func(PDFClass, pdf_allocate);
194 SWFClass = rb_define_class_under(GFX, "SWF", Document);
195 rb_define_alloc_func(SWFClass, swf_allocate);
197 ImageClass = rb_define_class_under(GFX, "Image", Document);
198 rb_define_alloc_func(ImageClass, image_allocate);
200 //id_doc = rb_intern("doc");