X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fruby%2Fgfx.c;h=9c3af378f5aa8c6a616024b357de21a440215f76;hb=1500155bf5c3f465d865aeec6ede12f33dcdb8a5;hp=11addd21e04658489517bdb63c61ce918e3a7836;hpb=1503f016b8d04b374c0e2290d37a4f2f91e63688;p=swftools.git diff --git a/lib/ruby/gfx.c b/lib/ruby/gfx.c index 11addd2..9c3af37 100644 --- a/lib/ruby/gfx.c +++ b/lib/ruby/gfx.c @@ -63,6 +63,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; } @@ -212,8 +215,23 @@ static VALUE image_rescale(VALUE cls, VALUE _width, VALUE _height) 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) @@ -281,6 +299,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); @@ -334,6 +362,23 @@ static VALUE font_glyphs(VALUE cls) return font->glyph_array; } +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;tdoc->prepare(doc->doc, &dev); + return cls; +} + + // ---------------------- global functions ---------------------------------- VALUE gfx_setparameter(VALUE module, VALUE _key, VALUE _value) @@ -634,6 +708,7 @@ 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); @@ -641,17 +716,21 @@ void Init_gfx() 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); Device = rb_define_class_under(GFX, "Device", rb_cObject); rb_define_method(Device, "startpage", noop, -1);