[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