[DRE-commits] [ruby-gd] 02/04: add 4 patches to port to newer rubies

Cédric Boutillier boutil at moszumanska.debian.org
Wed Dec 18 15:53:16 UTC 2013


This is an automated email from the git hooks/post-receive script.

boutil pushed a commit to branch master
in repository ruby-gd.

commit 552c06b6e7e1221ecf901bf5665025b461111098
Author: Cédric Boutillier <boutil at debian.org>
Date:   Wed Dec 18 16:24:25 2013 +0100

    add 4 patches to port to newer rubies
---
 debian/patches/compatibility-with-ruby192.patch  |  79 ++
 debian/patches/fix-compilation-with-ruby19.patch | 916 +++++++++++++++++++++++
 debian/patches/fix-memory-leak.patch             |  24 +
 debian/patches/restore-ruby18-support.patch      | 474 ++++++++++++
 debian/patches/series                            |   4 +
 5 files changed, 1497 insertions(+)

diff --git a/debian/patches/compatibility-with-ruby192.patch b/debian/patches/compatibility-with-ruby192.patch
new file mode 100644
index 0000000..72dd2fa
--- /dev/null
+++ b/debian/patches/compatibility-with-ruby192.patch
@@ -0,0 +1,79 @@
+Description: Ruby 1.9.2 compatibility: STR2CSTR becomes StringValuePtr.
+From: Mark Somerville <mark at scottishclimbs.com>
+Origin: https://github.com/Spakman/ruby-gd/commit/eea4275372a53790d74d07d9c2dafc8e7565a0d4
+Last-Update: 2010-03-03
+
+--- a/GD.c
++++ b/GD.c
+@@ -86,7 +86,7 @@
+     
+     Check_Type(fname, T_STRING);
+ 
+-    f = rb_file_open(STR2CSTR(fname), "r");
++    f = rb_file_open(StringValuePtr(fname), "r");
+     rb_io_binmode(f);
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+@@ -129,7 +129,7 @@
+     
+     Check_Type(fname, T_STRING);
+ 
+-    f = rb_file_open(STR2CSTR(fname), "r");
++    f = rb_file_open(StringValuePtr(fname), "r");
+     rb_io_binmode(f);
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+@@ -171,7 +171,7 @@
+     
+     Check_Type(fname, T_STRING);
+ 
+-    f = rb_file_open(STR2CSTR(fname), "r");
++    f = rb_file_open(StringValuePtr(fname), "r");
+     rb_io_binmode(f);
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+@@ -211,7 +211,7 @@
+     
+     Check_Type(fname, T_STRING);
+ 
+-    f = rb_file_open(STR2CSTR(fname), "r");
++    f = rb_file_open(StringValuePtr(fname), "r");
+     rb_io_binmode(f);
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+@@ -252,7 +252,7 @@
+     
+     Check_Type(fname, T_STRING);
+ 
+-    f = rb_file_open(STR2CSTR(fname), "r");
++    f = rb_file_open(StringValuePtr(fname), "r");
+     rb_io_binmode(f);
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+@@ -315,7 +315,7 @@
+     
+     Check_Type(fname, T_STRING);
+ 
+-    f = rb_file_open(STR2CSTR(fname), "r");
++    f = rb_file_open(StringValuePtr(fname), "r");
+     rb_io_binmode(f);
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+@@ -358,7 +358,7 @@
+     
+     Check_Type(fname, T_STRING);
+ 
+-    f = rb_file_open(STR2CSTR(fname), "r");
++    f = rb_file_open(StringValuePtr(fname), "r");
+     rb_io_binmode(f);
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+@@ -403,7 +403,7 @@
+     
+     Check_Type(fname, T_STRING);
+ 
+-    f = rb_file_open(STR2CSTR(fname), "r");
++    f = rb_file_open(StringValuePtr(fname), "r");
+     rb_io_binmode(f);
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
diff --git a/debian/patches/fix-compilation-with-ruby19.patch b/debian/patches/fix-compilation-with-ruby19.patch
new file mode 100644
index 0000000..50fdfc1
--- /dev/null
+++ b/debian/patches/fix-compilation-with-ruby19.patch
@@ -0,0 +1,916 @@
+Description: Made the extension compile and run under Ruby 1.9.1.
+ This will currently break under 1.8.
+ I needed to re-fdopen the files for the various gdCreateFrom* functions
+ to avoid segfaults. I'm not sure why I had to do this.
+ Line 1422 gives a warning that I can't solve just now too. The function
+ that throws it hasn't been tested.
+From: Mark Somerville <mark at scottishclimbs.com>
+Origin: https://github.com/Spakman/ruby-gd/commit/92a42d1d4be4f13a87b7325e20d7d5f2841c7f90
+Last-Update: 2009-09-09
+
+--- a/GD.c
++++ b/GD.c
+@@ -10,8 +10,7 @@
+   $Revision: 1.6.2.3 $
+ **************************************************************/
+ #include "ruby.h"
+-#include "rubyio.h"
+-#include "version.h"
++#include "ruby/io.h"
+ 
+ #include "gd.h"
+ #include "gdfontg.h"		/* giant */
+@@ -62,7 +61,7 @@
+     VALUE klass, fname;
+ {
+     VALUE f;
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -72,9 +71,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromPng(fptr->f);
++    iptr = gdImageCreateFromPng(fdopen(fptr->fd, "r"));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid PNG File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid PNG File", (char*)fptr->pathv);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -84,7 +83,7 @@
+ img_from_png(klass, f)
+     VALUE klass, f;
+ {
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE); 
+@@ -92,9 +91,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromPng(fptr->f);
++    iptr = gdImageCreateFromPng(fdopen(fptr->fd, "r"));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid PNG File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid PNG File", (char*)fptr->pathv);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -105,7 +104,7 @@
+     VALUE klass, fname;
+ {
+     VALUE f;
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -115,9 +114,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGif(fptr->f);
++    iptr = gdImageCreateFromGif(fdopen(fptr->fd, "r"));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid GIF File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid GIF File", (char*)fptr->pathv);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -126,7 +125,7 @@
+ img_from_gif(klass, f)
+     VALUE klass, f;
+ {
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE); 
+@@ -134,9 +133,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGif(fptr->f);
++    iptr = gdImageCreateFromGif(fdopen(fptr->fd, "r"));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid GIF File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid GIF File", (char*)fptr->pathv);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -147,7 +146,7 @@
+     VALUE klass, fname;
+ {
+     VALUE f;
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -157,9 +156,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGd(fptr->f);
++    iptr = gdImageCreateFromGd(fdopen(fptr->fd, "r"));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Gd File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid Gd File", (char*)fptr->pathv);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -168,7 +167,7 @@
+ img_from_gd(klass, f)
+     VALUE klass, f;
+ {
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE); 
+@@ -176,9 +175,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGd(fptr->f);
++    iptr = gdImageCreateFromGd(fdopen(fptr->fd, "r"));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Gd File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid Gd File", (char*)fptr->pathv);
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+ 
+@@ -187,7 +186,7 @@
+     VALUE klass, fname;
+ {
+     VALUE f;
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -197,9 +196,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGd2(fptr->f);
++    iptr = gdImageCreateFromGd2(fdopen(fptr->fd, "r"));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", (char*)fptr->pathv);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -208,7 +207,7 @@
+ img_from_gd2(klass, f)
+     VALUE klass, f;
+ {
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE);
+@@ -216,9 +215,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGd2(fptr->f);
++    iptr = gdImageCreateFromGd2(fdopen(fptr->fd, "r"));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", (char*)fptr->pathv);
+     
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -228,7 +227,7 @@
+     VALUE klass, fname, srcx, srcy, w, h;
+ {
+     VALUE f;
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -238,10 +237,10 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGd2Part(fptr->f, NUM2INT(srcx),
++    iptr = gdImageCreateFromGd2Part(fdopen(fptr->fd, "r"), NUM2INT(srcx),
+                                     NUM2INT(srcy), NUM2INT(w), NUM2INT(h));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", (char*)fptr->pathv);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -250,7 +249,7 @@
+ img_from_gd2_part(klass, f, srcx, srcy, w, h)
+     VALUE klass, f, srcx, srcy, w, h;
+ {
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE);
+@@ -258,10 +257,10 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGd2Part(fptr->f, NUM2INT(srcx),
++    iptr = gdImageCreateFromGd2Part(fdopen(fptr->fd, "r"), NUM2INT(srcx),
+                                    NUM2INT(srcy), NUM2INT(w), NUM2INT(h));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", (char*)fptr->pathv);
+     
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -271,7 +270,7 @@
+ img_from_xbm(klass, f)
+     VALUE klass, f;
+ {
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE); 
+@@ -279,9 +278,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromXbm(fptr->f);
++    iptr = gdImageCreateFromXbm(fdopen(fptr->fd, "r"));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Xbm File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid Xbm File", (char*)fptr->pathv);
+ 
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -291,7 +290,7 @@
+     VALUE klass, fname;
+ {
+     VALUE f;
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -301,9 +300,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromXbm(fptr->f);
++    iptr = gdImageCreateFromXbm(fdopen(fptr->fd, "r"));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Xbm File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid Xbm File", (char*)fptr->pathv);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -313,7 +312,7 @@
+ img_from_xpm(klass, f)
+     VALUE klass, f;
+ {
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE);
+@@ -324,7 +323,7 @@
+     /* need cast, and the argument is char* type */
+     iptr = (gdImagePtr)gdImageCreateFromXpm(fptr->path);
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid XPM File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid XPM File", (char*)fptr->path);
+ 
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -334,7 +333,7 @@
+     VALUE klass, fname;
+ {
+     VALUE f;
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -347,7 +346,7 @@
+     /* need cast, and the argument is char* type */
+     iptr = (gdImagePtr)gdImageCreateFromXpm(fptr->path);
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid XPM File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid XPM File", (char*)fptr->path);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -359,7 +358,7 @@
+ img_from_jpeg(klass, f)
+     VALUE klass, f;
+ {
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE);
+@@ -367,9 +366,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+     
+-    iptr = gdImageCreateFromJpeg(fptr->f);
++    iptr = gdImageCreateFromJpeg(fdopen(fptr->fd, "r"));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Jpeg File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid Jpeg File", (char*)fptr->pathv);
+ 
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -379,7 +378,7 @@
+     VALUE klass, fname;
+ {
+     VALUE f;
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -389,9 +388,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromJpeg(fptr->f);
++    iptr = gdImageCreateFromJpeg(fdopen(fptr->fd, "r"));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Jpeg File", fptr->path);
++        rb_raise(rb_eArgError, "%s is not a valid Jpeg File", (char*)fptr->pathv);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -418,12 +417,12 @@
+ 
+     Check_Type(hex, T_STRING);
+     
+-    if (RSTRING(hex)->len != 7)
+-        rb_raise(rb_eArgError, "Invalid format: %s", RSTRING(hex)->ptr);
++    if (RSTRING_LEN(hex) != 7)
++        rb_raise(rb_eArgError, "Invalid format: %s", RSTRING_PTR(hex));
+ 
+-    rstr = rb_str_new(RSTRING(hex)->ptr + 1, 2);
+-    gstr = rb_str_new(RSTRING(hex)->ptr + 3, 2);
+-    bstr = rb_str_new(RSTRING(hex)->ptr + 5, 2);
++    rstr = rb_str_new(RSTRING_PTR(hex) + 1, 2);
++    gstr = rb_str_new(RSTRING_PTR(hex) + 3, 2);
++    bstr = rb_str_new(RSTRING_PTR(hex) + 5, 2);
+ 
+     ret_ary = rb_ary_new();
+ 	
+@@ -459,9 +458,9 @@
+     
+     ary = hex2triplet(rgbstr);
+     c = gdImageColorAllocate(im,
+-                             NUM2INT(*(RARRAY(ary)->ptr)),
+-                             NUM2INT(*(RARRAY(ary)->ptr+1)),
+-                             NUM2INT(*(RARRAY(ary)->ptr+2)));
++                             NUM2INT(*(RARRAY_PTR(ary))),
++                             NUM2INT(*(RARRAY_PTR(ary)+1)),
++                             NUM2INT(*(RARRAY_PTR(ary)+2)));
+     return INT2FIX(c);
+ }
+ 
+@@ -532,9 +531,9 @@
+ 
+     ary = hex2triplet(rgbstr);
+     c = gdImageColorResolve(im,
+-                            NUM2INT(*(RARRAY(ary)->ptr)),
+-                            NUM2INT(*(RARRAY(ary)->ptr+1)),
+-                            NUM2INT(*(RARRAY(ary)->ptr+2)));
++                            NUM2INT(*(RARRAY_PTR(ary))),
++                            NUM2INT(*(RARRAY_PTR(ary)+1)),
++                            NUM2INT(*(RARRAY_PTR(ary)+2)));
+ 
+     return INT2FIX(c);
+ }
+@@ -595,9 +594,9 @@
+ 
+     ary = hex2triplet(rgbstr);
+     c = gdImageColorClosest(im,
+-                            NUM2INT(*(RARRAY(ary)->ptr)),
+-                            NUM2INT(*(RARRAY(ary)->ptr+1)),
+-                            NUM2INT(*(RARRAY(ary)->ptr+2)));
++                            NUM2INT(*(RARRAY_PTR(ary))),
++                            NUM2INT(*(RARRAY_PTR(ary)+1)),
++                            NUM2INT(*(RARRAY_PTR(ary)+2)));
+     return INT2FIX(c);
+ }
+ 
+@@ -657,9 +656,9 @@
+ 
+     ary = hex2triplet(rgbstr);
+     c = gdImageColorClosestHWB(im,
+-                               NUM2INT(*(RARRAY(ary)->ptr)),
+-                               NUM2INT(*(RARRAY(ary)->ptr+1)),
+-                               NUM2INT(*(RARRAY(ary)->ptr+2)));
++                               NUM2INT(*(RARRAY_PTR(ary))),
++                               NUM2INT(*(RARRAY_PTR(ary)+1)),
++                               NUM2INT(*(RARRAY_PTR(ary)+2)));
+     return INT2FIX(c);
+ }
+ 
+@@ -717,9 +716,9 @@
+ 
+     ary = hex2triplet(rgbstr);
+     c = gdImageColorExact(im,
+-                          NUM2INT(*(RARRAY(ary)->ptr)),
+-                          NUM2INT(*(RARRAY(ary)->ptr+1)),
+-                          NUM2INT(*(RARRAY(ary)->ptr+2)));
++                          NUM2INT(*(RARRAY_PTR(ary))),
++                          NUM2INT(*(RARRAY_PTR(ary)+1)),
++                          NUM2INT(*(RARRAY_PTR(ary)+2)));
+     return INT2FIX(c);
+ }
+ 
+@@ -999,11 +998,11 @@
+     Data_Get_Struct(img, gdImage, im);
+ 
+     poly_req(ply);
+-    len = ply->len/2;
++    len = RARRAY_LEN(ply)/2;
+     pnt = ALLOCA_N(gdPoint, len);
+     for (i=0; i<len; i++) {
+-	pnt[i].x = NUM2INT(ply->ptr[i*2]);
+-	pnt[i].y = NUM2INT(ply->ptr[i*2+1]);
++	pnt[i].x = NUM2INT(RARRAY_PTR(ply)[i*2]);
++	pnt[i].y = NUM2INT(RARRAY_PTR(ply)[i*2+1]);
+     }
+ 
+     gdImagePolygon(im, pnt, len, NUM2INT(c));
+@@ -1024,11 +1023,11 @@
+     Data_Get_Struct(img, gdImage, im);
+ 
+     poly_req(ply);
+-    len = ply->len/2;
++    len = RARRAY_LEN(ply)/2;
+     pnt = ALLOCA_N(gdPoint, len);
+     for (i=0; i<len; i++) {
+-	pnt[i].x = NUM2INT(ply->ptr[i*2]);
+-	pnt[i].y = NUM2INT(ply->ptr[i*2+1]);
++	pnt[i].x = NUM2INT(RARRAY_PTR(ply)[i*2]);
++	pnt[i].y = NUM2INT(RARRAY_PTR(ply)[i*2+1]);
+     }
+ 
+     gdImageFilledPolygon(im, pnt, len, NUM2INT(c));
+@@ -1199,7 +1198,7 @@
+     font_req(fnt);
+     Data_Get_Struct(fnt, gdFont, f);
+ 
+-    gdImageString(im,f,NUM2INT(x),NUM2INT(y),RSTRING(str)->ptr,NUM2INT(c));
++    gdImageString(im,f,NUM2INT(x),NUM2INT(y),(unsigned char*)RSTRING_PTR(str),NUM2INT(c));
+ 
+     return img;
+ }
+@@ -1216,7 +1215,7 @@
+     font_req(fnt);
+     Data_Get_Struct(fnt, gdFont, f);
+ 
+-    gdImageStringUp(im,f,NUM2INT(x),NUM2INT(y),RSTRING(str)->ptr,NUM2INT(c));
++    gdImageStringUp(im,f,NUM2INT(x),NUM2INT(y),(unsigned char*)RSTRING_PTR(str),NUM2INT(c));
+ 
+     return img;
+ }
+@@ -1237,12 +1236,12 @@
+     msg = gdImageStringTTF(NULL,
+                            &brect[0],
+                            NUM2INT(fgcolor),
+-                           RSTRING(fontname)->ptr,
++                           RSTRING_PTR(fontname),
+                            NUM2DBL(ptsize),
+                            NUM2DBL(angle),
+                            NUM2INT(x),
+                            NUM2INT(y),
+-                           RSTRING(string)->ptr);
++                           RSTRING_PTR(string));
+     for (i=0; i<8; i++) {
+         rb_ary_push(ary, INT2FIX(brect[i]));
+     }
+@@ -1269,12 +1268,12 @@
+     msg = gdImageStringTTF(im,
+                            &brect[0],
+                            NUM2INT(fgcolor),
+-                           RSTRING(fontname)->ptr,
++                           RSTRING_PTR(fontname),
+                            NUM2DBL(ptsize),
+                            NUM2DBL(angle),
+                            NUM2INT(x),
+                            NUM2INT(y),
+-                           RSTRING(string)->ptr);
++                           RSTRING_PTR(string));
+     for (i=0; i<8; i++) {
+         rb_ary_push(ary, INT2FIX(brect[i]));
+     }
+@@ -1301,12 +1300,12 @@
+     msg = gdImageStringFT(NULL,
+                            &brect[0],
+                            NUM2INT(fgcolor),
+-                           RSTRING(fontname)->ptr,
++                           RSTRING_PTR(fontname),
+                            NUM2DBL(ptsize),
+                            NUM2DBL(angle),
+                            NUM2INT(x),
+                            NUM2INT(y),
+-                           RSTRING(string)->ptr);
++                           RSTRING_PTR(string));
+     for (i=0; i<8; i++) {
+         rb_ary_push(ary, INT2FIX(brect[i]));
+     }
+@@ -1333,12 +1332,12 @@
+     msg = gdImageStringFT(im,
+                            &brect[0],
+                            NUM2INT(fgcolor),
+-                           RSTRING(fontname)->ptr,
++                           RSTRING_PTR(fontname),
+                            NUM2DBL(ptsize),
+                            NUM2DBL(angle),
+                            NUM2INT(x),
+                            NUM2INT(y),
+-                           RSTRING(string)->ptr);
++                           RSTRING_PTR(string));
+     for (i=0; i<8; i++) {
+         rb_ary_push(ary, INT2FIX(brect[i]));
+     }
+@@ -1363,10 +1362,10 @@
+     Data_Get_Struct(fnt, gdFont, f);
+     
+     if (TYPE(ch) == T_STRING) {
+-	if (RSTRING(ch)->len != 1) {
+-	    rb_raise(rb_eArgError, "string must be 1 byte(%d bytes)", RSTRING(ch)->len);
++	if (RSTRING_LEN(ch) != 1) {
++	    rb_raise(rb_eArgError, "string must be 1 byte(%ld bytes)", RSTRING_LEN(ch));
+ 	}
+-	ci = RSTRING(ch)->ptr[0];
++	ci = RSTRING_PTR(ch)[0];
+     }
+     else {
+ 	ci = NUM2INT(ch);
+@@ -1389,10 +1388,10 @@
+     Data_Get_Struct(fnt, gdFont, f);
+ 
+     if (TYPE(ch) == T_STRING) {
+-	if (RSTRING(ch)->len != 1) {
+-	    rb_raise(rb_eArgError, "string must be 1 byte(%d bytes)", RSTRING(ch)->len);
++	if (RSTRING_LEN(ch) != 1) {
++	    rb_raise(rb_eArgError, "string must be 1 byte(%ld bytes)", RSTRING_LEN(ch));
+ 	}
+-	ci = RSTRING(ch)->ptr[0];
++	ci = RSTRING_PTR(ch)[0];
+     }
+     else {
+ 	ci = NUM2INT(ch);
+@@ -1499,7 +1498,7 @@
+     VALUE img, out;
+ {
+     gdImagePtr im;
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     FILE *f;
+ 
+     Data_Get_Struct(img, gdImage, im);
+@@ -1507,8 +1506,8 @@
+     rb_io_binmode(out);
+     GetOpenFile(out, fptr);
+     rb_io_check_writable(fptr);
+-    f = (fptr->f2) ? fptr->f2 : fptr->f;
+ 
++    f = rb_io_stdio_file(fptr);
+     gdImagePng(im, f);
+ 
+     return img;
+@@ -1543,7 +1542,7 @@
+     VALUE img, out;
+ {
+     gdImagePtr im;
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     FILE *f;
+ 
+     Data_Get_Struct(img, gdImage, im);
+@@ -1551,7 +1550,7 @@
+     rb_io_binmode(out);
+     GetOpenFile(out, fptr);
+     rb_io_check_writable(fptr);
+-    f = (fptr->f2) ? fptr->f2 : fptr->f;
++    f = rb_io_stdio_file(fptr);
+ 
+     gdImageGif(im, f);
+ 
+@@ -1582,7 +1581,7 @@
+     VALUE img, out;
+ {
+     gdImagePtr im;
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     FILE *f;
+ 
+     Data_Get_Struct(img, gdImage, im);
+@@ -1590,7 +1589,7 @@
+     rb_io_binmode(out);
+     GetOpenFile(out, fptr);
+     rb_io_check_writable(fptr);
+-    f = (fptr->f2) ? fptr->f2 : fptr->f;
++    f = rb_io_stdio_file(fptr);
+ 
+     gdImageGd(im, f);
+ 
+@@ -1601,7 +1600,7 @@
+ img_gd2(img, out, cs, fmt)
+     VALUE img, out, cs, fmt;
+ {
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     gdImagePtr im;
+     FILE *f;
+ 
+@@ -1609,7 +1608,7 @@
+     rb_io_binmode(out);
+     GetOpenFile(out, fptr);
+     rb_io_check_writable(fptr);
+-    f = (fptr->f2) ? fptr->f2 : fptr->f;
++    f = rb_io_stdio_file(fptr);
+ 
+     Data_Get_Struct(img, gdImage, im);
+     gdImageGd2(im, f, NUM2INT(cs), NUM2INT(fmt));
+@@ -1624,7 +1623,7 @@
+     VALUE img, out, quality;
+ {
+     gdImagePtr im;
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     FILE *f;
+ 
+     Data_Get_Struct(img, gdImage, im);
+@@ -1634,7 +1633,7 @@
+     rb_io_binmode(out);
+     GetOpenFile(out, fptr);
+     rb_io_check_writable(fptr);
+-    f = (fptr->f2) ? fptr->f2 : fptr->f;
++    f = rb_io_stdio_file(fptr);
+ 
+     gdImageJpeg(im, f, FIX2INT(quality));
+ 
+@@ -1669,7 +1668,7 @@
+     VALUE img, out, fg;
+ {
+     gdImagePtr im;
+-    OpenFile *fptr;
++    rb_io_t *fptr;
+     FILE *f;
+ 
+     Data_Get_Struct(img, gdImage, im);
+@@ -1679,7 +1678,7 @@
+     rb_io_binmode(out);
+     GetOpenFile(out, fptr);
+     rb_io_check_writable(fptr);
+-    f = (fptr->f2) ? fptr->f2 : fptr->f;
++    f = rb_io_stdio_file(fptr);
+ 
+     gdImageWBMP(im, FIX2INT(fg), f);
+ 
+@@ -1725,9 +1724,9 @@
+     NUM2INT(dx);
+     NUM2INT(dy);
+ 
+-    if (RARRAY(ply)->len > 0) {
+-        x = rb_ary_entry(ply, RARRAY(ply)->len - 2);
+-        y = rb_ary_entry(ply, RARRAY(ply)->len - 1);
++    if (RARRAY_LEN(ply) > 0) {
++        x = rb_ary_entry(ply, RARRAY_LEN(ply) - 2);
++        y = rb_ary_entry(ply, RARRAY_LEN(ply) - 1);
+         rb_ary_push(ply, INT2NUM(NUM2INT(x) + NUM2INT(dx)));
+         rb_ary_push(ply, INT2NUM(NUM2INT(y) + NUM2INT(dy)));
+     } else {
+@@ -1742,7 +1741,7 @@
+ {
+     int i = NUM2INT(idx);
+ 
+-    if (RARRAY(ply)->len < idx) return Qnil;
++    if (RARRAY_LEN(ply) < idx) return Qnil;
+     i *= 2;
+ 
+     return rb_assoc_new(rb_ary_entry(ply, i), rb_ary_entry(ply, i+1));
+@@ -1780,7 +1779,7 @@
+ ply_length(ply)
+     VALUE ply;
+ {
+-    return INT2FIX(RARRAY(ply)->len / 2);
++    return INT2FIX(RARRAY_LEN(ply) / 2);
+ }
+ 
+ static VALUE
+@@ -1788,10 +1787,10 @@
+     struct RArray *ply;
+ {
+     int i;
+-    VALUE ary = rb_ary_new2(ply->len/2);
++    VALUE ary = rb_ary_new2(RARRAY_LEN(ply)/2);
+ 
+-    for (i = 0; i<ply->len; i+=2) {
+-	rb_ary_push(ary, rb_assoc_new(ply->ptr[i], ply->ptr[i+1]));
++    for (i = 0; i<RARRAY_LEN(ply); i+=2) {
++	rb_ary_push(ary, rb_assoc_new(RARRAY_PTR(ply)[i], RARRAY_PTR(ply)[i+1]));
+     }
+     return ary;
+ }
+@@ -1803,18 +1802,18 @@
+     int i, l, t, r, b;
+     int nx, ny;
+ 
+-    if (ply->len == 0) {
++    if (RARRAY_LEN(ply) == 0) {
+ 	l = t = r = b = 0;
+     }
+     else {
+-	l = r = NUM2INT(ply->ptr[0]);
+-	t = b = NUM2INT(ply->ptr[1]);
++	l = r = NUM2INT(RARRAY_PTR(ply)[0]);
++	t = b = NUM2INT(RARRAY_PTR(ply)[1]);
+     }
+-    for (i = 2; i<ply->len; i+=2) {
+-	nx = NUM2INT(ply->ptr[i]);
++    for (i = 2; i<RARRAY_LEN(ply); i+=2) {
++	nx = NUM2INT(RARRAY_PTR(ply)[i]);
+ 	if (nx < l) l = nx;
+ 	if (nx > r) r = nx;
+-	ny = NUM2INT(ply->ptr[i+1]);
++	ny = NUM2INT(RARRAY_PTR(ply)[i+1]);
+ 	if (ny < t) t = ny;
+ 	if (ny > b) b = ny;
+     }
+@@ -1831,11 +1830,11 @@
+     x = NUM2INT(vx);
+     y = NUM2INT(vy);
+ 
+-    for (i = 0; i<ply->len; i+=2) {
+-	c = NUM2INT(ply->ptr[i]) + x;
+-	ply->ptr[i] = INT2FIX(c);
+-	c = NUM2INT(ply->ptr[i+1]) + y;
+-	ply->ptr[i+1] = INT2FIX(c);
++    for (i = 0; i<RARRAY_LEN(ply); i+=2) {
++	c = NUM2INT(RARRAY_PTR(ply)[i]) + x;
++	RARRAY_PTR(ply)[i] = INT2FIX(c);
++	c = NUM2INT(RARRAY_PTR(ply)[i+1]) + y;
++	RARRAY_PTR(ply)[i+1] = INT2FIX(c);
+     }
+ 
+     return (VALUE)ply;
+@@ -1858,18 +1857,18 @@
+ 	int i, l, t, r, b;
+ 	int nx, ny;
+ 
+-	if (ply->len == 0) {
++	if (RARRAY_LEN(ply) == 0) {
+ 	    l = t = r = b = 0;
+ 	}
+ 	else {
+-	    l = r = NUM2INT(ply->ptr[0]);
+-	    t = b = NUM2INT(ply->ptr[1]);
++	    l = r = NUM2INT(RARRAY_PTR(ply)[0]);
++	    t = b = NUM2INT(RARRAY_PTR(ply)[1]);
+ 	}
+-	for (i = 2; i<ply->len; i+=2) {
+-	    nx = NUM2INT(ply->ptr[i]);
++	for (i = 2; i<RARRAY_LEN(ply); i+=2) {
++	    nx = NUM2INT(RARRAY_PTR(ply)[i]);
+ 	    if (nx < l) l = nx;
+ 	    if (nx > r) r = nx;
+-	    ny = NUM2INT(ply->ptr[i+1]);
++	    ny = NUM2INT(RARRAY_PTR(ply)[i+1]);
+ 	    if (ny < t) t = ny;
+ 	    if (ny > b) b = ny;
+ 	}
+@@ -1894,14 +1893,14 @@
+ 	rb_raise(rb_eArgError, "wrong # of arguments (%d for 4 or 8)", argc);
+     }
+ 
+-    for (i = 0; i<ply->len; i+=2) {
+-	c = NUM2INT(ply->ptr[i]);
++    for (i = 0; i<RARRAY_LEN(ply); i+=2) {
++	c = NUM2INT(RARRAY_PTR(ply)[i]);
+ 	c = (c-sx)*xmag+dx;
+-	ply->ptr[i] = INT2FIX(c);
++	RARRAY_PTR(ply)[i] = INT2FIX(c);
+ 
+-	c = NUM2INT(ply->ptr[i+1]);
++	c = NUM2INT(RARRAY_PTR(ply)[i+1]);
+ 	c = (c-sy)*ymag+dy;
+-	ply->ptr[i+1] = INT2FIX(c);
++	RARRAY_PTR(ply)[i+1] = INT2FIX(c);
+     }
+ 
+     return (VALUE)ply;
+@@ -1914,11 +1913,11 @@
+     int i;
+     VALUE x, y;
+ 
+-    for (i = 0; i < RARRAY(ply)->len / 2; i++) {
++    for (i = 0; i < RARRAY_LEN(ply) / 2; i++) {
+ /*      x = rb_ary_entry(ply, i * 2);
+         y = rb_ary_entry(ply, i * 2 + 1);*/
+-        x = RARRAY(ply)->ptr[i * 2];
+-        y = RARRAY(ply)->ptr[i * 2 + 1];
++        x = RARRAY_PTR(ply)[i * 2];
++        y = RARRAY_PTR(ply)[i * 2 + 1];
+         ply_set_pt(ply, INT2NUM(i),
+                 INT2NUM(NUM2DBL(a) * NUM2INT(x) + NUM2DBL(c) * NUM2INT(y) + NUM2INT(tx)),
+                 INT2NUM(NUM2DBL(b) * NUM2INT(x) + NUM2DBL(d) * NUM2INT(y) + NUM2INT(ty)));
+@@ -1968,7 +1967,7 @@
+     struct RString *name;
+ {
+     Check_Type(name, T_STRING);
+-    return fnt_new(name->ptr);
++    return fnt_new(RSTRING_PTR(name));
+ }
+ 
+ static VALUE
+@@ -2060,9 +2059,9 @@
+     
+     ary = hex2triplet(rgbstr);
+     c = gdImageColorAllocateAlpha(im,
+-                                  NUM2INT(*(RARRAY(ary)->ptr)),
+-                                  NUM2INT(*(RARRAY(ary)->ptr+1)),
+-                                  NUM2INT(*(RARRAY(ary)->ptr+2)),
++                                  NUM2INT(*(RARRAY_PTR(ary))),
++                                  NUM2INT(*(RARRAY_PTR(ary)+1)),
++                                  NUM2INT(*(RARRAY_PTR(ary)+2)),
+                                   NUM2INT(a));
+     return INT2NUM(c);
+ }
+@@ -2122,9 +2121,9 @@
+     
+     ary = hex2triplet(rgbstr);
+     c = gdImageColorResolveAlpha(im,
+-                                 NUM2INT(*(RARRAY(ary)->ptr)),
+-                                 NUM2INT(*(RARRAY(ary)->ptr+1)),
+-                                 NUM2INT(*(RARRAY(ary)->ptr+2)),
++                                 NUM2INT(*(RARRAY_PTR(ary))),
++                                 NUM2INT(*(RARRAY_PTR(ary)+1)),
++                                 NUM2INT(*(RARRAY_PTR(ary)+2)),
+                                  NUM2INT(a));
+     return INT2NUM(c);
+ }
+@@ -2183,9 +2182,9 @@
+     
+     ary = hex2triplet(rgbstr);
+     c = gdImageColorClosestAlpha(im,
+-                                 NUM2INT(*(RARRAY(ary)->ptr)),
+-                                 NUM2INT(*(RARRAY(ary)->ptr+1)),
+-                                 NUM2INT(*(RARRAY(ary)->ptr+2)),
++                                 NUM2INT(*(RARRAY_PTR(ary))),
++                                 NUM2INT(*(RARRAY_PTR(ary)+1)),
++                                 NUM2INT(*(RARRAY_PTR(ary)+2)),
+                                  NUM2INT(a));
+     return INT2NUM(c);
+ }
+@@ -2245,9 +2244,9 @@
+     
+     ary = hex2triplet(rgbstr);
+     c = gdImageColorExactAlpha(im,
+-                                 NUM2INT(*(RARRAY(ary)->ptr)),
+-                                 NUM2INT(*(RARRAY(ary)->ptr+1)),
+-                                 NUM2INT(*(RARRAY(ary)->ptr+2)),
++                                 NUM2INT(*(RARRAY_PTR(ary))),
++                                 NUM2INT(*(RARRAY_PTR(ary)+1)),
++                                 NUM2INT(*(RARRAY_PTR(ary)+2)),
+                                  NUM2INT(a));
+     return INT2NUM(c);
+ }
+@@ -2311,9 +2310,9 @@
+     int c;
+     VALUE ary;
+     ary = hex2triplet(rgbstr);
+-    c = gdTrueColor(NUM2INT(*(RARRAY(ary)->ptr)),
+-                    NUM2INT(*(RARRAY(ary)->ptr+1)),
+-                    NUM2INT(*(RARRAY(ary)->ptr+2)));
++    c = gdTrueColor(NUM2INT(*(RARRAY_PTR(ary))),
++                    NUM2INT(*(RARRAY_PTR(ary)+1)),
++                    NUM2INT(*(RARRAY_PTR(ary)+2)));
+     
+     return INT2NUM(c);
+ }
+@@ -2365,9 +2364,9 @@
+     int c;
+     VALUE ary;
+     ary = hex2triplet(rgbstr);
+-    c = gdTrueColorAlpha(NUM2INT(*(RARRAY(ary)->ptr)),
+-                         NUM2INT(*(RARRAY(ary)->ptr+1)),
+-                         NUM2INT(*(RARRAY(ary)->ptr+2)),
++    c = gdTrueColorAlpha(NUM2INT(*(RARRAY_PTR(ary))),
++                         NUM2INT(*(RARRAY_PTR(ary)+1)),
++                         NUM2INT(*(RARRAY_PTR(ary)+2)),
+                          NUM2INT(a));
+     return INT2NUM(c);
+ }
diff --git a/debian/patches/fix-memory-leak.patch b/debian/patches/fix-memory-leak.patch
new file mode 100644
index 0000000..4eee6b3
--- /dev/null
+++ b/debian/patches/fix-memory-leak.patch
@@ -0,0 +1,24 @@
+Description: Fixed a memory leak when creating a GD image from a file.
+ The macro was incorrectly reopening the file, leaving it unreferenced
+ and open after the GD image was created. Altered to use the Ruby
+ function to reference the FILE pointer.
+From: Mark Somerville <mark at scottishclimbs.com>
+Origin: https://github.com/Spakman/ruby-gd/commit/0c57d637d42e659815ab8d970b8635cc01b7aac0
+Last-Update: 2010-02-18
+
+diff --git a/GD.c b/GD.c
+index 16ad506..44bed15 100644
+--- a/GD.c
++++ b/GD.c
+@@ -29,7 +29,7 @@
+ 
+ #if defined(HAVE_RUBY_IO_H) /* seems like Ruby > 1.8 */
+         #define FPTR_TYPE rb_io_t
+-        #define FILE_POINTER_FOR_CREATE_FROM fdopen(fptr->fd, "r")
++        #define FILE_POINTER_FOR_CREATE_FROM rb_io_stdio_file(fptr)
+         #define FPTR_PATH (char*)fptr->pathv
+         #define SECOND_FILE_POINTER rb_io_stdio_file(fptr)
+ #else
+-- 
+1.8.5.1
+
diff --git a/debian/patches/restore-ruby18-support.patch b/debian/patches/restore-ruby18-support.patch
new file mode 100644
index 0000000..5f042be
--- /dev/null
+++ b/debian/patches/restore-ruby18-support.patch
@@ -0,0 +1,474 @@
+Subject: Added back in Ruby 1.8 support. Tested under 1.8.6 and 1.9.1.
+ The 1.8/1.9 compile time switching is done using a few macros. I'm not
+ sure if this is the best way to achieve this or not, since I'm not too
+ familiar with the (Ruby)C way. Any comments on the style will be
+ appreciated!
+From: Mark Somerville <mark at scottishclimbs.com>
+Origin: https://github.com/Spakman/ruby-gd/commit/30eb7696a4fad4fc18cf11725da95226e79afd8e
+Last-Update: 2009-09-10
+
+--- a/GD.c
++++ b/GD.c
+@@ -10,7 +10,11 @@
+   $Revision: 1.6.2.3 $
+ **************************************************************/
+ #include "ruby.h"
+-#include "ruby/io.h"
++#if defined(HAVE_RUBY_IO_H)
++        #include "ruby/io.h"
++#else /* seems like Ruby < 1.9 */
++        #include "rubyio.h"
++#endif
+ 
+ #include "gd.h"
+ #include "gdfontg.h"		/* giant */
+@@ -19,6 +23,22 @@
+ #include "gdfonts.h"		/* small */
+ #include "gdfontt.h"		/* tiny */
+ 
++/* Is this the best way to do this sort of thing?
++ * It feels kind of wrong, but I'm not sure of the (Ruby)C way.
++ * Any opinions on the style will be gratefully received! */
++
++#if defined(HAVE_RUBY_IO_H) /* seems like Ruby > 1.8 */
++        #define FPTR_TYPE rb_io_t
++        #define FILE_POINTER_FOR_CREATE_FROM fdopen(fptr->fd, "r")
++        #define FPTR_PATH (char*)fptr->pathv
++        #define SECOND_FILE_POINTER rb_io_stdio_file(fptr)
++#else
++        #define FPTR_TYPE OpenFile
++        #define FILE_POINTER_FOR_CREATE_FROM fptr->f
++        #define FPTR_PATH fptr->path
++        #define SECOND_FILE_POINTER (fptr->f2) ? fptr->f2 : fptr->f
++#endif
++
+ extern VALUE rb_io_binmode(VALUE io);
+ extern gdImagePtr gdImageCreateFromXpm(char* );
+ 
+@@ -61,7 +81,7 @@
+     VALUE klass, fname;
+ {
+     VALUE f;
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -71,9 +91,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromPng(fdopen(fptr->fd, "r"));
++    iptr = gdImageCreateFromPng(FILE_POINTER_FOR_CREATE_FROM);
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid PNG File", (char*)fptr->pathv);
++        rb_raise(rb_eArgError, "%s is not a valid PNG File", FPTR_PATH);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -83,7 +103,7 @@
+ img_from_png(klass, f)
+     VALUE klass, f;
+ {
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE); 
+@@ -91,9 +111,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromPng(fdopen(fptr->fd, "r"));
++    iptr = gdImageCreateFromPng(FILE_POINTER_FOR_CREATE_FROM);
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid PNG File", (char*)fptr->pathv);
++        rb_raise(rb_eArgError, "%s is not a valid PNG File", FPTR_PATH);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -104,7 +124,7 @@
+     VALUE klass, fname;
+ {
+     VALUE f;
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -114,9 +134,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGif(fdopen(fptr->fd, "r"));
++    iptr = gdImageCreateFromGif(FILE_POINTER_FOR_CREATE_FROM);
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid GIF File", (char*)fptr->pathv);
++        rb_raise(rb_eArgError, "%s is not a valid GIF File", FPTR_PATH);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -125,7 +145,7 @@
+ img_from_gif(klass, f)
+     VALUE klass, f;
+ {
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE); 
+@@ -133,9 +153,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGif(fdopen(fptr->fd, "r"));
++    iptr = gdImageCreateFromGif(FILE_POINTER_FOR_CREATE_FROM);
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid GIF File", (char*)fptr->pathv);
++        rb_raise(rb_eArgError, "%s is not a valid GIF File", FPTR_PATH);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -146,7 +166,7 @@
+     VALUE klass, fname;
+ {
+     VALUE f;
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -156,9 +176,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGd(fdopen(fptr->fd, "r"));
++    iptr = gdImageCreateFromGd(FILE_POINTER_FOR_CREATE_FROM);
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Gd File", (char*)fptr->pathv);
++        rb_raise(rb_eArgError, "%s is not a valid Gd File", FPTR_PATH);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -167,7 +187,7 @@
+ img_from_gd(klass, f)
+     VALUE klass, f;
+ {
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE); 
+@@ -175,9 +195,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGd(fdopen(fptr->fd, "r"));
++    iptr = gdImageCreateFromGd(FILE_POINTER_FOR_CREATE_FROM);
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Gd File", (char*)fptr->pathv);
++        rb_raise(rb_eArgError, "%s is not a valid Gd File", FPTR_PATH);
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+ 
+@@ -186,7 +206,7 @@
+     VALUE klass, fname;
+ {
+     VALUE f;
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -196,9 +216,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGd2(fdopen(fptr->fd, "r"));
++    iptr = gdImageCreateFromGd2(FILE_POINTER_FOR_CREATE_FROM);
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", (char*)fptr->pathv);
++        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", FPTR_PATH);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -207,7 +227,7 @@
+ img_from_gd2(klass, f)
+     VALUE klass, f;
+ {
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE);
+@@ -215,9 +235,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGd2(fdopen(fptr->fd, "r"));
++    iptr = gdImageCreateFromGd2(FILE_POINTER_FOR_CREATE_FROM);
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", (char*)fptr->pathv);
++        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", FPTR_PATH);
+     
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -227,7 +247,7 @@
+     VALUE klass, fname, srcx, srcy, w, h;
+ {
+     VALUE f;
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -237,10 +257,10 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGd2Part(fdopen(fptr->fd, "r"), NUM2INT(srcx),
++    iptr = gdImageCreateFromGd2Part(FILE_POINTER_FOR_CREATE_FROM, NUM2INT(srcx),
+                                     NUM2INT(srcy), NUM2INT(w), NUM2INT(h));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", (char*)fptr->pathv);
++        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", FPTR_PATH);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -249,7 +269,7 @@
+ img_from_gd2_part(klass, f, srcx, srcy, w, h)
+     VALUE klass, f, srcx, srcy, w, h;
+ {
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE);
+@@ -257,10 +277,10 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromGd2Part(fdopen(fptr->fd, "r"), NUM2INT(srcx),
++    iptr = gdImageCreateFromGd2Part(FILE_POINTER_FOR_CREATE_FROM, NUM2INT(srcx),
+                                    NUM2INT(srcy), NUM2INT(w), NUM2INT(h));
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", (char*)fptr->pathv);
++        rb_raise(rb_eArgError, "%s is not a valid Gd2 File", FPTR_PATH);
+     
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -270,7 +290,7 @@
+ img_from_xbm(klass, f)
+     VALUE klass, f;
+ {
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE); 
+@@ -278,9 +298,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromXbm(fdopen(fptr->fd, "r"));
++    iptr = gdImageCreateFromXbm(FILE_POINTER_FOR_CREATE_FROM);
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Xbm File", (char*)fptr->pathv);
++        rb_raise(rb_eArgError, "%s is not a valid Xbm File", FPTR_PATH);
+ 
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -290,7 +310,7 @@
+     VALUE klass, fname;
+ {
+     VALUE f;
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -300,9 +320,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromXbm(fdopen(fptr->fd, "r"));
++    iptr = gdImageCreateFromXbm(FILE_POINTER_FOR_CREATE_FROM);
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Xbm File", (char*)fptr->pathv);
++        rb_raise(rb_eArgError, "%s is not a valid Xbm File", FPTR_PATH);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -312,7 +332,7 @@
+ img_from_xpm(klass, f)
+     VALUE klass, f;
+ {
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE);
+@@ -333,7 +353,7 @@
+     VALUE klass, fname;
+ {
+     VALUE f;
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -358,7 +378,7 @@
+ img_from_jpeg(klass, f)
+     VALUE klass, f;
+ {
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+ 
+     Check_Type(f, T_FILE);
+@@ -366,9 +386,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+     
+-    iptr = gdImageCreateFromJpeg(fdopen(fptr->fd, "r"));
++    iptr = gdImageCreateFromJpeg(FILE_POINTER_FOR_CREATE_FROM);
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Jpeg File", (char*)fptr->pathv);
++        rb_raise(rb_eArgError, "%s is not a valid Jpeg File", FPTR_PATH);
+ 
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -378,7 +398,7 @@
+     VALUE klass, fname;
+ {
+     VALUE f;
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr iptr;
+     
+     Check_Type(fname, T_STRING);
+@@ -388,9 +408,9 @@
+     GetOpenFile(f, fptr);
+     rb_io_check_readable(fptr);
+ 
+-    iptr = gdImageCreateFromJpeg(fdopen(fptr->fd, "r"));
++    iptr = gdImageCreateFromJpeg(FILE_POINTER_FOR_CREATE_FROM);
+     if (!iptr)
+-        rb_raise(rb_eArgError, "%s is not a valid Jpeg File", (char*)fptr->pathv);
++        rb_raise(rb_eArgError, "%s is not a valid Jpeg File", FPTR_PATH);
+                  
+     return Data_Wrap_Struct(klass,0,free_img,iptr);
+ }
+@@ -1498,7 +1518,7 @@
+     VALUE img, out;
+ {
+     gdImagePtr im;
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     FILE *f;
+ 
+     Data_Get_Struct(img, gdImage, im);
+@@ -1507,7 +1527,7 @@
+     GetOpenFile(out, fptr);
+     rb_io_check_writable(fptr);
+ 
+-    f = rb_io_stdio_file(fptr);
++    f = SECOND_FILE_POINTER;
+     gdImagePng(im, f);
+ 
+     return img;
+@@ -1542,7 +1562,7 @@
+     VALUE img, out;
+ {
+     gdImagePtr im;
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     FILE *f;
+ 
+     Data_Get_Struct(img, gdImage, im);
+@@ -1581,7 +1601,7 @@
+     VALUE img, out;
+ {
+     gdImagePtr im;
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     FILE *f;
+ 
+     Data_Get_Struct(img, gdImage, im);
+@@ -1589,7 +1609,7 @@
+     rb_io_binmode(out);
+     GetOpenFile(out, fptr);
+     rb_io_check_writable(fptr);
+-    f = rb_io_stdio_file(fptr);
++    f = SECOND_FILE_POINTER;
+ 
+     gdImageGd(im, f);
+ 
+@@ -1600,7 +1620,7 @@
+ img_gd2(img, out, cs, fmt)
+     VALUE img, out, cs, fmt;
+ {
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     gdImagePtr im;
+     FILE *f;
+ 
+@@ -1608,7 +1628,7 @@
+     rb_io_binmode(out);
+     GetOpenFile(out, fptr);
+     rb_io_check_writable(fptr);
+-    f = rb_io_stdio_file(fptr);
++    f = SECOND_FILE_POINTER;
+ 
+     Data_Get_Struct(img, gdImage, im);
+     gdImageGd2(im, f, NUM2INT(cs), NUM2INT(fmt));
+@@ -1623,7 +1643,7 @@
+     VALUE img, out, quality;
+ {
+     gdImagePtr im;
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     FILE *f;
+ 
+     Data_Get_Struct(img, gdImage, im);
+@@ -1633,7 +1653,7 @@
+     rb_io_binmode(out);
+     GetOpenFile(out, fptr);
+     rb_io_check_writable(fptr);
+-    f = rb_io_stdio_file(fptr);
++    f = SECOND_FILE_POINTER;
+ 
+     gdImageJpeg(im, f, FIX2INT(quality));
+ 
+@@ -1668,7 +1688,7 @@
+     VALUE img, out, fg;
+ {
+     gdImagePtr im;
+-    rb_io_t *fptr;
++    FPTR_TYPE *fptr;
+     FILE *f;
+ 
+     Data_Get_Struct(img, gdImage, im);
+@@ -1678,7 +1698,7 @@
+     rb_io_binmode(out);
+     GetOpenFile(out, fptr);
+     rb_io_check_writable(fptr);
+-    f = rb_io_stdio_file(fptr);
++    f = SECOND_FILE_POINTER;
+ 
+     gdImageWBMP(im, FIX2INT(fg), f);
+ 
+--- a/extconf.rb
++++ b/extconf.rb
+@@ -24,7 +24,11 @@
+ 
+ dir_config("gd", "/usr/local/include", "/usr/local/lib")
+ 
++have_header('ruby/io.h')
+ 
++if have_type("rb_io_t", ["ruby.h", "rubyio.h"])
++  have_struct_member("rb_io_t", "fd", ["ruby.h", "rubyio.h"])
++end
+ 
+ if with_config("xpm")
+   dir_config("X11", "/usr/X11R6/include", "/usr/X11R6/lib")
diff --git a/debian/patches/series b/debian/patches/series
index 9186933..221b0c4 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +1,5 @@
 fix-set-interlace-on-amd64.patch
+fix-compilation-with-ruby19.patch
+restore-ruby18-support.patch
+fix-memory-leak.patch
+compatibility-with-ruby192.patch

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/ruby-gd.git



More information about the Pkg-ruby-extras-commits mailing list