X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fruby%2Fgfx.c;h=d392ed022b896950f67f38cf7586ab2ee208204d;hb=63cdecc2a38c4970370b16c826f478f7f6083091;hp=ae4b6d8f087e9bf9b1a5e046f918fa205bc8f532;hpb=69715349931b6feffe90ec4ef905656bc02beaab;p=swftools.git diff --git a/lib/ruby/gfx.c b/lib/ruby/gfx.c index ae4b6d8..d392ed0 100644 --- a/lib/ruby/gfx.c +++ b/lib/ruby/gfx.c @@ -2,12 +2,15 @@ #include "../gfxdevice.h" #include "../gfxsource.h" #include "../gfxtools.h" +#include "../gfximage.h" +#include "../gfxfont.h" #include "../devices/pdf.h" #include "../readers/swf.h" #include "../readers/image.h" #include "../pdf/pdf.h" #include "../mem.h" #include "../types.h" +#include "../log.h" #define RUBY_GFX_VERSION "0.9.0" @@ -62,6 +65,9 @@ static VALUE doc_initialize(VALUE cls, VALUE _filename) const char*filename = StringValuePtr(_filename); doc->fontlist = gfxfontlist_create(); doc->doc = pdfdriver->open(pdfdriver, filename); + if(!doc->doc) { + rb_raise(rb_eIOError, "couldn't open %s", filename); + } return cls; } @@ -83,7 +89,7 @@ static VALUE doc_get_page(VALUE cls, VALUE _nr) page->doc = doc; if(!page->page) { rb_raise(rb_eArgError, "No page %d in document", nr); - return; + return Qnil; } return v; } @@ -200,18 +206,49 @@ static VALUE image_height(VALUE cls) Get_Image(image,cls) return INT2FIX(image->image->height); } +static VALUE image_rescale(VALUE cls, VALUE _width, VALUE _height) +{ + Get_Image(image,cls) + Check_Type(_width, T_FIXNUM); + Check_Type(_height, T_FIXNUM); + int width = FIX2INT(_width); + int height = FIX2INT(_height); + volatile VALUE v_image2 = image_allocate(Bitmap); + Get_Image(image2,v_image2) + image2->doc = image->doc; + image2->image = gfximage_rescale(image->image, width, height); + if(!image2->image) { + rb_raise(rb_eArgError, "Can't rescale to size %dx%d", width, height); + } + return v_image2; +} +static VALUE image_has_alpha(VALUE cls) +{ + Get_Image(image,cls) + int size = image->image->width * image->image->height; + gfxcolor_t*data = image->image->data; + int t; + for(t=0;ta!=255) + return Qtrue; + } + return Qfalse; +} static VALUE image_save_jpeg(VALUE cls, VALUE _filename, VALUE quality) { Get_Image(image,cls) Check_Type(_filename, T_STRING); Check_Type(quality, T_FIXNUM); const char*filename = StringValuePtr(_filename); - int l = strlen(filename); - char jpeg = 0; - if(l>=4 && !strcmp(&filename[l-4], ".jpg")) jpeg = 1; - if(l>=5 && !strcmp(&filename[l-5], ".jpeg")) jpeg = 1; - if(l>=4 && !strcmp(&filename[l-4], ".JPG")) jpeg = 1; - jpeg_save(image->image->data, image->image->width, image->image->height, FIX2INT(quality), filename); + gfximage_save_jpeg(image->image, filename, FIX2INT(quality)); + return cls; +} +static VALUE image_save_png(VALUE cls, VALUE _filename) +{ + Get_Image(image,cls) + Check_Type(_filename, T_STRING); + const char*filename = StringValuePtr(_filename); + gfximage_save_png(image->image, filename); return cls; } VALUE convert_image(doc_internal_t*doc,gfximage_t*_image) @@ -264,6 +301,16 @@ static VALUE glyph_advance(VALUE cls) return rb_float_new(glyph->font->font->glyphs[glyph->nr].advance); } +static VALUE glyph_bbox(VALUE cls) +{ + Get_Glyph(glyph,cls); + gfxbbox_t bbox = gfxline_getbbox(glyph->font->font->glyphs[glyph->nr].line); + return rb_ary_new3(4, rb_float_new(bbox.xmin), + rb_float_new(bbox.ymin), + rb_float_new(bbox.xmax), + rb_float_new(bbox.ymax)); +} + static VALUE glyph_unicode(VALUE cls) { Get_Glyph(glyph,cls); @@ -293,6 +340,18 @@ static VALUE font_allocate(VALUE cls) return v; } +static VALUE font_ascent(VALUE cls) +{ + Get_Font(font,cls); + return rb_float_new(font->font->ascent); +} + +static VALUE font_descent(VALUE cls) +{ + Get_Font(font,cls); + return rb_float_new(font->font->descent); +} + static VALUE font_name(VALUE cls) { Get_Font(font,cls); @@ -305,6 +364,32 @@ static VALUE font_glyphs(VALUE cls) return font->glyph_array; } +static VALUE font_save_ttf(VALUE cls, VALUE _filename) +{ + Get_Font(font,cls); + Check_Type(_filename, T_STRING); + const char*filename = StringValuePtr(_filename); + gfxfont_save(font->font, filename); + return Qnil; +} + +static VALUE font_kerning(VALUE cls) +{ + Get_Font(font,cls); + gfxkerning_t*kerning = font->font->kerning; + int kerning_size = font->font->kerning_size; + volatile VALUE a = rb_ary_new2(kerning_size); + int t; + for(t=0;tinternal; \ VALUE v = i->v; @@ -501,7 +590,7 @@ void rb_addfont(gfxdevice_t*dev, gfxfont_t*font) HEAD volatile VALUE f = font_is_cached(i, font); - if(!f) {f=convert_font(font);cache_font(i,font,v);} + if(!f) {f=convert_font(font);cache_font(i,font,f);} forward(v, id_addfont, 1, f); } @@ -509,7 +598,7 @@ void rb_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, { HEAD volatile VALUE f = font_is_cached(i, font); - if(!f) {f=convert_font(font);cache_font(i,font,v);} + if(!f) {f=convert_font(font);cache_font(i,font,f);} volatile VALUE v_color = convert_color(color); volatile VALUE v_matrix = convert_matrix(matrix); @@ -561,12 +650,56 @@ static VALUE page_render(VALUE cls, VALUE device) dev.endpage = rb_endpage; dev.finish = rb_finish; + dev.startpage(&dev, page->page->width, page->page->height); page->page->render(page->page, &dev); + dev.endpage(&dev); + + return cls; +} + +static VALUE doc_prepare(VALUE cls, VALUE device) +{ + Get_Doc(doc,cls); + + 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; + doc->doc->prepare(doc->doc, &dev); return cls; } +// ---------------------- global functions ---------------------------------- + +VALUE gfx_setparameter(VALUE module, VALUE _key, VALUE _value) +{ + Check_Type(_key, T_STRING); + Check_Type(_value, T_STRING); + const char*key = StringValuePtr(_key); + const char*value = StringValuePtr(_value); + pdfdriver->setparameter(pdfdriver, key, value); + swfdriver->setparameter(swfdriver, key, value); + imagedriver->setparameter(imagedriver, key, value); + return GFX; +} + // -------------------------------------------------------------------------- void Init_gfx() @@ -578,6 +711,8 @@ void Init_gfx() GFX = rb_define_module("GFX"); + rb_define_module_function(GFX, "setparameter", gfx_setparameter, 2); + DocumentPage = rb_define_class_under(GFX, "DocumentPage", rb_cObject); rb_define_method(DocumentPage, "width", page_width, 0); rb_define_method(DocumentPage, "height", page_height, 0); @@ -588,18 +723,30 @@ void Init_gfx() rb_define_method(Document, "initialize", doc_initialize, 1); rb_define_method(Document, "page", doc_get_page, 1); rb_define_method(Document, "each_page", doc_each_page, 0); + rb_define_method(Document, "prepare", doc_prepare, 1); Bitmap = rb_define_class_under(GFX, "Bitmap", rb_cObject); rb_define_method(Bitmap, "save_jpeg", image_save_jpeg, 2); + rb_define_method(Bitmap, "save_png", image_save_png, 1); + rb_define_method(Bitmap, "width", image_width, 0); + rb_define_method(Bitmap, "height", image_height, 0); + rb_define_method(Bitmap, "rescale", image_rescale, 2); + rb_define_method(Bitmap, "has_alpha", image_has_alpha, 0); Glyph = rb_define_class_under(GFX, "Glyph", rb_cObject); rb_define_method(Glyph, "polygon", glyph_polygon, 0); rb_define_method(Glyph, "unicode", glyph_unicode, 0); rb_define_method(Glyph, "advance", glyph_advance, 0); + rb_define_method(Glyph, "bbox", glyph_bbox, 0); Font = rb_define_class_under(GFX, "Font", rb_cObject); rb_define_method(Font, "name", font_name, 0); + rb_define_method(Font, "ascent", font_ascent, 0); + rb_define_method(Font, "descent", font_descent, 0); rb_define_method(Font, "glyphs", font_glyphs, 0); + rb_define_method(Font, "kerning", font_kerning, 0); + rb_define_method(Font, "get_kerning_table", font_kerning, 0); + rb_define_method(Font, "save_ttf", font_save_ttf, 1); Device = rb_define_class_under(GFX, "Device", rb_cObject); rb_define_method(Device, "startpage", noop, -1);