ruby-gd 0.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Changes ADDED
@@ -0,0 +1,54 @@
1
+ = Changes from 0.7.3
2
+
3
+ * doc/gd-intro_ja.html, doc/imgs/* : removed.
4
+ * extconf.rb : new option '--enable-gd2_0' added to support for gd-2.0.1(beta).
5
+ * GD::Image#newTrueColor, GD::Image#colorAllocateAlpha,
6
+ GD::Image#colorResolveAlpha, GD::Image#colorClosestAlpha,
7
+ GD::Image#colorExactAlpha, GD::Image#alphaBlending,
8
+ GD::Image#alpha, GD::Image#trueColor, GD::Image#trueColorAlpha,
9
+ GD::Image#copyResampled, GD::Image#filledEllipse, GD::Image#filledArc
10
+ - new methods. They are for the new features of gd-2.0.1(beta).
11
+ Accordingly, GD#Image.newPalette is an alias for GD::Image#new.
12
+ * doc/manual.rd: documentation update.
13
+
14
+ = Changes from 0.7.2
15
+
16
+ * Fixed typos and grammer mistakes in English documents. I thank Neil Conway for
17
+ sending this patch.
18
+
19
+ * GD::Image.stringFT, GD::Image#stringFT: should call gdImageStringFT(), not
20
+ gdImageStringTTF()!!! I'm sorry. Thanks to YOKOKAWA Takehiro(tac@amris.co.jp).
21
+
22
+ * GD::Image#JpegStr, GD::Image#PngStr: new method.
23
+ Thanks to Colin Steele(colin@webg2.com).
24
+
25
+ = Changes from 0.7.1
26
+
27
+ * extconf.rb: updated for gd-1.8.4.
28
+
29
+ * GD.c: GD::Image.stringFT, GD::Image#stringFT: new methods. Note these methods
30
+ requires the newest feature of gd-1.8.4.
31
+
32
+ * extconf.rb, GD.c: should check GD::Image#colorResolve and GD::Image#stringTTF
33
+ separately. Thanks to Tosh.
34
+
35
+ * GD.c: added new constants GD::GD2_FMT_COMPRESSED, GD::GD2_FMT_RAW.
36
+ (GD::Image::GD2_FMT_COMPRESSED, etc. is more adequate???)
37
+
38
+ * GD.c: rb_str_hex():removed. rb_funcall() is utilized instead. Now works
39
+ correctly for Ruby-1.4.x.
40
+
41
+ * readme.rd: description for GD::Image#gd2 corrected. Thanks to nnakamura.
42
+
43
+ * gd-intro_ja.html: copyright notice for some images. updated.
44
+
45
+ = Changes from 0.7.0
46
+
47
+ * GD.c(GD::Image#colorAllocate, GD::Image#colorExact): the return values
48
+ conformable to those of the original gd library.
49
+
50
+ * GD::Image#colorAllocate, GD::Image#colorResolve, GD::Image#colorClosest,
51
+ GD::Image#colorClosestHWB, GD::Image#colorExact : allow for the string
52
+ like "#FF0000"(stands for "red") as an argument.
53
+
54
+ * doc/gd_intro-ja.html: corrected and updated. Thanks to Tosh.
data/GD.c ADDED
@@ -0,0 +1,2602 @@
1
+ /*************************************************************
2
+
3
+ GD.c - Ruby extension library to use Boutell's gd library.
4
+
5
+ Originally written: Yukihiro Matsumoto (matz@ruby-lang.org)
6
+
7
+ Current maintainer: Ryuichi Tamura (tam@kais.kyoto-u.ac.jp)
8
+
9
+ $Date: 2001/05/30 14:06:40 $
10
+ $Revision: 1.6.2.3 $
11
+ **************************************************************/
12
+ #include "ruby.h"
13
+ #include "rubyio.h"
14
+ #include "version.h"
15
+
16
+ #include "gd.h"
17
+ #include "gdfontg.h" /* giant */
18
+ #include "gdfontl.h" /* large */
19
+ #include "gdfontmb.h" /* medium bold */
20
+ #include "gdfonts.h" /* small */
21
+ #include "gdfontt.h" /* tiny */
22
+
23
+ extern VALUE rb_io_binmode(VALUE io);
24
+ extern gdImagePtr gdImageCreateFromXpm(char* );
25
+
26
+ static VALUE mGD, cImage, cFont, cPolygon;
27
+
28
+ #ifdef ENABLE_GD_2_0
29
+ static VALUE
30
+ is_truecolor(im)
31
+ gdImagePtr im;
32
+ {
33
+ return im->trueColor ? Qtrue : Qfalse;
34
+ }
35
+ #endif /* ENABLE_GD_2_0 */
36
+
37
+ static void
38
+ free_img(iptr)
39
+ gdImagePtr iptr;
40
+ {
41
+ if (iptr) {
42
+ gdImageDestroy(iptr);
43
+ }
44
+ }
45
+
46
+ static VALUE
47
+ img_s_new(klass, w, h)
48
+ VALUE klass, w, h;
49
+ {
50
+ gdImagePtr iptr;
51
+
52
+ if (NUM2INT(w)<0 || NUM2INT(h)<0)
53
+ rb_raise(rb_eArgError, "Negative width/height not allowed");
54
+
55
+ iptr = gdImageCreate(NUM2INT(w), NUM2INT(h));
56
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
57
+ }
58
+
59
+
60
+ static VALUE
61
+ img_from_pngfname(klass, fname)
62
+ VALUE klass, fname;
63
+ {
64
+ VALUE f;
65
+ OpenFile *fptr;
66
+ gdImagePtr iptr;
67
+
68
+ Check_Type(fname, T_STRING);
69
+
70
+ f = rb_file_open(STR2CSTR(fname), "r");
71
+ rb_io_binmode(f);
72
+ GetOpenFile(f, fptr);
73
+ rb_io_check_readable(fptr);
74
+
75
+ iptr = gdImageCreateFromPng(fptr->f);
76
+ if (!iptr)
77
+ rb_raise(rb_eArgError, "%s is not a valid PNG File", fptr->path);
78
+
79
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
80
+ }
81
+
82
+
83
+ static VALUE
84
+ img_from_png(klass, f)
85
+ VALUE klass, f;
86
+ {
87
+ OpenFile *fptr;
88
+ gdImagePtr iptr;
89
+
90
+ Check_Type(f, T_FILE);
91
+ rb_io_binmode(f);
92
+ GetOpenFile(f, fptr);
93
+ rb_io_check_readable(fptr);
94
+
95
+ iptr = gdImageCreateFromPng(fptr->f);
96
+ if (!iptr)
97
+ rb_raise(rb_eArgError, "%s is not a valid PNG File", fptr->path);
98
+
99
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
100
+ }
101
+
102
+ static VALUE
103
+ img_from_gdfname(klass, fname)
104
+ VALUE klass, fname;
105
+ {
106
+ VALUE f;
107
+ OpenFile *fptr;
108
+ gdImagePtr iptr;
109
+
110
+ Check_Type(fname, T_STRING);
111
+
112
+ f = rb_file_open(STR2CSTR(fname), "r");
113
+ rb_io_binmode(f);
114
+ GetOpenFile(f, fptr);
115
+ rb_io_check_readable(fptr);
116
+
117
+ iptr = gdImageCreateFromGd(fptr->f);
118
+ if (!iptr)
119
+ rb_raise(rb_eArgError, "%s is not a valid Gd File", fptr->path);
120
+
121
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
122
+ }
123
+
124
+ static VALUE
125
+ img_from_gd(klass, f)
126
+ VALUE klass, f;
127
+ {
128
+ OpenFile *fptr;
129
+ gdImagePtr iptr;
130
+
131
+ Check_Type(f, T_FILE);
132
+ rb_io_binmode(f);
133
+ GetOpenFile(f, fptr);
134
+ rb_io_check_readable(fptr);
135
+
136
+ iptr = gdImageCreateFromGd(fptr->f);
137
+ if (!iptr)
138
+ rb_raise(rb_eArgError, "%s is not a valid Gd File", fptr->path);
139
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
140
+ }
141
+
142
+ static VALUE
143
+ img_from_gd2fname(klass, fname)
144
+ VALUE klass, fname;
145
+ {
146
+ VALUE f;
147
+ OpenFile *fptr;
148
+ gdImagePtr iptr;
149
+
150
+ Check_Type(fname, T_STRING);
151
+
152
+ f = rb_file_open(STR2CSTR(fname), "r");
153
+ rb_io_binmode(f);
154
+ GetOpenFile(f, fptr);
155
+ rb_io_check_readable(fptr);
156
+
157
+ iptr = gdImageCreateFromGd2(fptr->f);
158
+ if (!iptr)
159
+ rb_raise(rb_eArgError, "%s is not a valid Gd2 File", fptr->path);
160
+
161
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
162
+ }
163
+
164
+ static VALUE
165
+ img_from_gd2(klass, f)
166
+ VALUE klass, f;
167
+ {
168
+ OpenFile *fptr;
169
+ gdImagePtr iptr;
170
+
171
+ Check_Type(f, T_FILE);
172
+ rb_io_binmode(f);
173
+ GetOpenFile(f, fptr);
174
+ rb_io_check_readable(fptr);
175
+
176
+ iptr = gdImageCreateFromGd2(fptr->f);
177
+ if (!iptr)
178
+ rb_raise(rb_eArgError, "%s is not a valid Gd2 File", fptr->path);
179
+
180
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
181
+ }
182
+
183
+ static VALUE
184
+ img_from_gd2_partfname(klass, fname, srcx, srcy, w, h)
185
+ VALUE klass, fname, srcx, srcy, w, h;
186
+ {
187
+ VALUE f;
188
+ OpenFile *fptr;
189
+ gdImagePtr iptr;
190
+
191
+ Check_Type(fname, T_STRING);
192
+
193
+ f = rb_file_open(STR2CSTR(fname), "r");
194
+ rb_io_binmode(f);
195
+ GetOpenFile(f, fptr);
196
+ rb_io_check_readable(fptr);
197
+
198
+ iptr = gdImageCreateFromGd2Part(fptr->f, NUM2INT(srcx),
199
+ NUM2INT(srcy), NUM2INT(w), NUM2INT(h));
200
+ if (!iptr)
201
+ rb_raise(rb_eArgError, "%s is not a valid Gd2 File", fptr->path);
202
+
203
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
204
+ }
205
+
206
+ static VALUE
207
+ img_from_gd2_part(klass, f, srcx, srcy, w, h)
208
+ VALUE klass, f, srcx, srcy, w, h;
209
+ {
210
+ OpenFile *fptr;
211
+ gdImagePtr iptr;
212
+
213
+ Check_Type(f, T_FILE);
214
+ rb_io_binmode(f);
215
+ GetOpenFile(f, fptr);
216
+ rb_io_check_readable(fptr);
217
+
218
+ iptr = gdImageCreateFromGd2Part(fptr->f, NUM2INT(srcx),
219
+ NUM2INT(srcy), NUM2INT(w), NUM2INT(h));
220
+ if (!iptr)
221
+ rb_raise(rb_eArgError, "%s is not a valid Gd2 File", fptr->path);
222
+
223
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
224
+ }
225
+
226
+
227
+ static VALUE
228
+ img_from_xbm(klass, f)
229
+ VALUE klass, f;
230
+ {
231
+ OpenFile *fptr;
232
+ gdImagePtr iptr;
233
+
234
+ Check_Type(f, T_FILE);
235
+ rb_io_binmode(f);
236
+ GetOpenFile(f, fptr);
237
+ rb_io_check_readable(fptr);
238
+
239
+ iptr = gdImageCreateFromXbm(fptr->f);
240
+ if (!iptr)
241
+ rb_raise(rb_eArgError, "%s is not a valid Xbm File", fptr->path);
242
+
243
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
244
+ }
245
+
246
+ static VALUE
247
+ img_from_xbmfname(klass, fname)
248
+ VALUE klass, fname;
249
+ {
250
+ VALUE f;
251
+ OpenFile *fptr;
252
+ gdImagePtr iptr;
253
+
254
+ Check_Type(fname, T_STRING);
255
+
256
+ f = rb_file_open(STR2CSTR(fname), "r");
257
+ rb_io_binmode(f);
258
+ GetOpenFile(f, fptr);
259
+ rb_io_check_readable(fptr);
260
+
261
+ iptr = gdImageCreateFromXbm(fptr->f);
262
+ if (!iptr)
263
+ rb_raise(rb_eArgError, "%s is not a valid Xbm File", fptr->path);
264
+
265
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
266
+ }
267
+
268
+ #ifdef HAVE_GDIMAGECREATEFROMXPM
269
+ static VALUE
270
+ img_from_xpm(klass, f)
271
+ VALUE klass, f;
272
+ {
273
+ OpenFile *fptr;
274
+ gdImagePtr iptr;
275
+
276
+ Check_Type(f, T_FILE);
277
+ rb_io_binmode(f);
278
+ GetOpenFile(f, fptr);
279
+ rb_io_check_readable(fptr);
280
+
281
+ /* need cast, and the argument is char* type */
282
+ iptr = (gdImagePtr)gdImageCreateFromXpm(fptr->path);
283
+ if (!iptr)
284
+ rb_raise(rb_eArgError, "%s is not a valid XPM File", fptr->path);
285
+
286
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
287
+ }
288
+
289
+ static VALUE
290
+ img_from_xpmfname(klass, fname)
291
+ VALUE klass, fname;
292
+ {
293
+ VALUE f;
294
+ OpenFile *fptr;
295
+ gdImagePtr iptr;
296
+
297
+ Check_Type(fname, T_STRING);
298
+
299
+ f = rb_file_open(STR2CSTR(fname), "r");
300
+ rb_io_binmode(f);
301
+ GetOpenFile(f, fptr);
302
+ rb_io_check_readable(fptr);
303
+
304
+ /* need cast, and the argument is char* type */
305
+ iptr = (gdImagePtr)gdImageCreateFromXpm(fptr->path);
306
+ if (!iptr)
307
+ rb_raise(rb_eArgError, "%s is not a valid XPM File", fptr->path);
308
+
309
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
310
+ }
311
+
312
+ #endif
313
+
314
+ #ifdef HAVE_GDIMAGECREATEFROMJPEG
315
+ static VALUE
316
+ img_from_jpeg(klass, f)
317
+ VALUE klass, f;
318
+ {
319
+ OpenFile *fptr;
320
+ gdImagePtr iptr;
321
+
322
+ Check_Type(f, T_FILE);
323
+ rb_io_binmode(f);
324
+ GetOpenFile(f, fptr);
325
+ rb_io_check_readable(fptr);
326
+
327
+ iptr = gdImageCreateFromJpeg(fptr->f);
328
+ if (!iptr)
329
+ rb_raise(rb_eArgError, "%s is not a valid Jpeg File", fptr->path);
330
+
331
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
332
+ }
333
+
334
+ static VALUE
335
+ img_from_jpegfname(klass, fname)
336
+ VALUE klass, fname;
337
+ {
338
+ VALUE f;
339
+ OpenFile *fptr;
340
+ gdImagePtr iptr;
341
+
342
+ Check_Type(fname, T_STRING);
343
+
344
+ f = rb_file_open(STR2CSTR(fname), "r");
345
+ rb_io_binmode(f);
346
+ GetOpenFile(f, fptr);
347
+ rb_io_check_readable(fptr);
348
+
349
+ iptr = gdImageCreateFromJpeg(fptr->f);
350
+ if (!iptr)
351
+ rb_raise(rb_eArgError, "%s is not a valid Jpeg File", fptr->path);
352
+
353
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
354
+ }
355
+ #endif
356
+
357
+
358
+ static VALUE
359
+ img_destroy(img)
360
+ struct RData *img;
361
+ {
362
+ if (img->data) {
363
+ gdImageDestroy((gdImagePtr)img->data);
364
+ img->data = 0;
365
+ }
366
+ return Qnil;
367
+ }
368
+
369
+ static VALUE
370
+ hex2triplet(hex)
371
+ VALUE hex;
372
+ {
373
+ VALUE rstr, gstr, bstr;
374
+ VALUE ret_ary;
375
+
376
+ Check_Type(hex, T_STRING);
377
+
378
+ if (RSTRING(hex)->len != 7)
379
+ rb_raise(rb_eArgError, "Invalid format: %s", RSTRING(hex)->ptr);
380
+
381
+ rstr = rb_str_new(RSTRING(hex)->ptr + 1, 2);
382
+ gstr = rb_str_new(RSTRING(hex)->ptr + 3, 2);
383
+ bstr = rb_str_new(RSTRING(hex)->ptr + 5, 2);
384
+
385
+ ret_ary = rb_ary_new();
386
+
387
+ rb_ary_push(ret_ary, rb_funcall(rstr, rb_intern("hex"), 0));
388
+ rb_ary_push(ret_ary, rb_funcall(gstr, rb_intern("hex"), 0));
389
+ rb_ary_push(ret_ary, rb_funcall(bstr, rb_intern("hex"), 0));
390
+
391
+ return ret_ary;
392
+ }
393
+
394
+ static VALUE
395
+ img_color_allocate_tri(img, r, g, b)
396
+ VALUE img, r, g, b;
397
+ {
398
+ gdImagePtr im;
399
+ int c;
400
+
401
+ Data_Get_Struct(img, gdImage, im);
402
+ c = gdImageColorAllocate(im, NUM2INT(r), NUM2INT(g), NUM2INT(b));
403
+
404
+ return INT2FIX(c);
405
+ }
406
+
407
+ static VALUE
408
+ img_color_allocate_str(img, rgbstr)
409
+ VALUE img, rgbstr;
410
+ {
411
+ gdImagePtr im;
412
+ int c;
413
+ VALUE ary;
414
+
415
+ Data_Get_Struct(img, gdImage, im);
416
+
417
+ ary = hex2triplet(rgbstr);
418
+ c = gdImageColorAllocate(im,
419
+ NUM2INT(*(RARRAY(ary)->ptr)),
420
+ NUM2INT(*(RARRAY(ary)->ptr+1)),
421
+ NUM2INT(*(RARRAY(ary)->ptr+2)));
422
+ return INT2FIX(c);
423
+ }
424
+
425
+ static VALUE
426
+ img_color_allocate(argc, argv, img)
427
+ int argc;
428
+ VALUE *argv;
429
+ VALUE img;
430
+ {
431
+ int i;
432
+ VALUE rgbstr, r, g, b, retval;
433
+
434
+ if (!(argc == 1 || argc == 3))
435
+ rb_raise(rb_eArgError, "Wrong # of arguments (1 or 3 for %d)", argc);
436
+
437
+ switch(TYPE(argv[0])) {
438
+ case T_STRING:
439
+ i = rb_scan_args(argc, argv, "10", &rgbstr);
440
+ retval = img_color_allocate_str(img, rgbstr);
441
+ break;
442
+ case T_FIXNUM:
443
+ i = rb_scan_args(argc, argv, "30", &r, &g, &b);
444
+ retval = img_color_allocate_tri(img, r, g, b);
445
+ break;
446
+ default:
447
+ rb_raise(rb_eTypeError, "String or Fixnum expected");
448
+ break;
449
+ }
450
+
451
+ return retval;
452
+ }
453
+
454
+ static VALUE
455
+ img_color_deallocate(img, color)
456
+ VALUE img, color;
457
+ {
458
+ gdImagePtr im;
459
+
460
+ Data_Get_Struct(img, gdImage, im);
461
+ gdImageColorDeallocate(im, NUM2INT(color));
462
+
463
+ return img;
464
+ }
465
+
466
+ #ifdef HAVE_GDIMAGECOLORRESOLVE
467
+ static VALUE
468
+ img_color_resolve_tri(img, r, g, b)
469
+ VALUE img, r, g, b;
470
+ {
471
+ gdImagePtr im;
472
+ int c;
473
+
474
+ Data_Get_Struct(img, gdImage, im);
475
+ c = gdImageColorResolve(im, NUM2INT(r), NUM2INT(g), NUM2INT(b));
476
+
477
+ return INT2FIX(c);
478
+ }
479
+
480
+ static VALUE
481
+ img_color_resolve_str(img, rgbstr)
482
+ VALUE img, rgbstr;
483
+ {
484
+ gdImagePtr im;
485
+ int c;
486
+ VALUE ary;
487
+
488
+ Data_Get_Struct(img, gdImage, im);
489
+
490
+ ary = hex2triplet(rgbstr);
491
+ c = gdImageColorResolve(im,
492
+ NUM2INT(*(RARRAY(ary)->ptr)),
493
+ NUM2INT(*(RARRAY(ary)->ptr+1)),
494
+ NUM2INT(*(RARRAY(ary)->ptr+2)));
495
+
496
+ return INT2FIX(c);
497
+ }
498
+
499
+ static VALUE
500
+ img_color_resolve(argc, argv, img)
501
+ int argc;
502
+ VALUE *argv;
503
+ VALUE img;
504
+ {
505
+ int i;
506
+ VALUE rgbstr, r, g, b, retval;
507
+
508
+ if (!(argc == 1 || argc == 3))
509
+ rb_raise(rb_eArgError, "Wrong # of arguments (1 or 3 for %d)", argc);
510
+
511
+ switch(TYPE(argv[0])) {
512
+ case T_STRING:
513
+ i = rb_scan_args(argc, argv, "10", &rgbstr);
514
+ retval = img_color_resolve_str(img, rgbstr);
515
+ break;
516
+ case T_FIXNUM:
517
+ i = rb_scan_args(argc, argv, "30", &r, &g, &b);
518
+ retval = img_color_resolve_tri(img, r, g, b);
519
+ break;
520
+ default:
521
+ rb_raise(rb_eTypeError, "String or Fixnum expected");
522
+ break;
523
+ }
524
+
525
+ return retval;
526
+ }
527
+
528
+ #endif /* HAVE_GDIMAGECOLORRESOLVE */
529
+
530
+ static VALUE
531
+ img_color_closest_tri(img, r, g, b)
532
+ VALUE img, r, g, b;
533
+ {
534
+ gdImagePtr im;
535
+ int c;
536
+
537
+ Data_Get_Struct(img, gdImage, im);
538
+ c = gdImageColorClosest(im, NUM2INT(r), NUM2INT(g), NUM2INT(b));
539
+
540
+ return INT2FIX(c);
541
+ }
542
+
543
+ static VALUE
544
+ img_color_closest_str(img, rgbstr)
545
+ VALUE img, rgbstr;
546
+ {
547
+ gdImagePtr im;
548
+ int c;
549
+ VALUE ary;
550
+
551
+ Data_Get_Struct(img, gdImage, im);
552
+
553
+ ary = hex2triplet(rgbstr);
554
+ c = gdImageColorClosest(im,
555
+ NUM2INT(*(RARRAY(ary)->ptr)),
556
+ NUM2INT(*(RARRAY(ary)->ptr+1)),
557
+ NUM2INT(*(RARRAY(ary)->ptr+2)));
558
+ return INT2FIX(c);
559
+ }
560
+
561
+ static VALUE
562
+ img_color_closest(argc, argv, img)
563
+ int argc;
564
+ VALUE *argv;
565
+ VALUE img;
566
+ {
567
+ int i;
568
+ VALUE rgbstr, r, g, b, retval;
569
+
570
+ if (!(argc == 1 || argc == 3))
571
+ rb_raise(rb_eArgError, "Wrong # of arguments (1 or 3 for %d)", argc);
572
+
573
+ switch(TYPE(argv[0])) {
574
+ case T_STRING:
575
+ i = rb_scan_args(argc, argv, "10", &rgbstr);
576
+ retval = img_color_closest_str(img, rgbstr);
577
+ break;
578
+ case T_FIXNUM:
579
+ i = rb_scan_args(argc, argv, "30", &r, &g, &b);
580
+ retval = img_color_closest_tri(img, r, g, b);
581
+ break;
582
+ default:
583
+ rb_raise(rb_eTypeError, "String or Fixnum expected");
584
+ break;
585
+ }
586
+
587
+ return retval;
588
+ }
589
+
590
+ extern int gdImageColorClosestHWB(gdImagePtr, int, int, int);
591
+
592
+ static VALUE
593
+ img_color_closestHWB_tri(img, r, g, b)
594
+ VALUE img, r, g, b;
595
+ {
596
+ gdImagePtr im;
597
+ int c;
598
+
599
+ Data_Get_Struct(img, gdImage, im);
600
+ c = gdImageColorClosestHWB(im, NUM2INT(r), NUM2INT(g), NUM2INT(b));
601
+
602
+ return INT2FIX(c);
603
+ }
604
+
605
+ static VALUE
606
+ img_color_closestHWB_str(img, rgbstr)
607
+ VALUE img, rgbstr;
608
+ {
609
+ gdImagePtr im;
610
+ int c;
611
+ VALUE ary;
612
+
613
+ Data_Get_Struct(img, gdImage, im);
614
+
615
+ ary = hex2triplet(rgbstr);
616
+ c = gdImageColorClosestHWB(im,
617
+ NUM2INT(*(RARRAY(ary)->ptr)),
618
+ NUM2INT(*(RARRAY(ary)->ptr+1)),
619
+ NUM2INT(*(RARRAY(ary)->ptr+2)));
620
+ return INT2FIX(c);
621
+ }
622
+
623
+ static VALUE
624
+ img_color_closestHWB(argc, argv, img)
625
+ int argc;
626
+ VALUE *argv;
627
+ VALUE img;
628
+ {
629
+ int i;
630
+ VALUE rgbstr, r, g, b, retval;
631
+
632
+ if (!(argc == 1 || argc == 3))
633
+ rb_raise(rb_eArgError, "Wrong # of arguments (1 or 3 for %d)", argc);
634
+
635
+ switch(TYPE(argv[0])) {
636
+ case T_STRING:
637
+ i = rb_scan_args(argc, argv, "10", &rgbstr);
638
+ retval = img_color_closestHWB_str(img, rgbstr);
639
+ break;
640
+ case T_FIXNUM:
641
+ i = rb_scan_args(argc, argv, "30", &r, &g, &b);
642
+ retval = img_color_closestHWB_tri(img, r, g, b);
643
+ break;
644
+ default:
645
+ rb_raise(rb_eTypeError, "String or Fixnum expected");
646
+ break;
647
+ }
648
+
649
+ return retval;
650
+ }
651
+
652
+ static VALUE
653
+ img_color_exact_tri(img, r, g, b)
654
+ VALUE img, r, g, b;
655
+ {
656
+ gdImagePtr im;
657
+ int c;
658
+
659
+ Data_Get_Struct(img, gdImage, im);
660
+ c = gdImageColorExact(im, NUM2INT(r), NUM2INT(g), NUM2INT(b));
661
+
662
+ return INT2FIX(c);
663
+ }
664
+
665
+ static VALUE
666
+ img_color_exact_str(img, rgbstr)
667
+ VALUE img, rgbstr;
668
+ {
669
+ gdImagePtr im;
670
+ int c;
671
+ VALUE ary;
672
+
673
+ Data_Get_Struct(img, gdImage, im);
674
+
675
+ ary = hex2triplet(rgbstr);
676
+ c = gdImageColorExact(im,
677
+ NUM2INT(*(RARRAY(ary)->ptr)),
678
+ NUM2INT(*(RARRAY(ary)->ptr+1)),
679
+ NUM2INT(*(RARRAY(ary)->ptr+2)));
680
+ return INT2FIX(c);
681
+ }
682
+
683
+ static VALUE
684
+ img_color_exact(argc, argv, img)
685
+ int argc;
686
+ VALUE *argv;
687
+ VALUE img;
688
+ {
689
+ int i;
690
+ VALUE rgbstr, r, g, b, retval;
691
+
692
+ if (!(argc == 1 || argc == 3))
693
+ rb_raise(rb_eArgError, "Wrong # of arguments (1 or 3 for %d)", argc);
694
+
695
+ switch(TYPE(argv[0])) {
696
+ case T_STRING:
697
+ i = rb_scan_args(argc, argv, "10", &rgbstr);
698
+ retval = img_color_exact_str(img, rgbstr);
699
+ break;
700
+ case T_FIXNUM:
701
+ i = rb_scan_args(argc, argv, "30", &r, &g, &b);
702
+ retval = img_color_exact_tri(img, r, g, b);
703
+ break;
704
+ default:
705
+ rb_raise(rb_eTypeError, "String or Fixnum expected");
706
+ break;
707
+ }
708
+
709
+ return retval;
710
+ }
711
+
712
+ static VALUE
713
+ img_colors_total(img)
714
+ VALUE img;
715
+ {
716
+ gdImagePtr im;
717
+ int c;
718
+
719
+ Data_Get_Struct(img, gdImage, im);
720
+ c = gdImageColorsTotal(im);
721
+
722
+ return INT2FIX(c);
723
+ }
724
+
725
+ static VALUE
726
+ img_get_pixel(img, x, y)
727
+ VALUE img, x, y;
728
+ {
729
+ gdImagePtr im;
730
+ int c;
731
+
732
+ Data_Get_Struct(img, gdImage, im);
733
+ c = gdImageGetPixel(im, NUM2INT(x), NUM2INT(y));
734
+
735
+ return INT2FIX(c);
736
+ }
737
+
738
+ static VALUE
739
+ img_set_pixel(img, x, y, color)
740
+ VALUE img, x, y, color;
741
+ {
742
+ gdImagePtr im;
743
+
744
+ Data_Get_Struct(img, gdImage, im);
745
+ gdImageSetPixel(im, NUM2INT(x), NUM2INT(y), NUM2INT(color));
746
+
747
+ return img;
748
+ }
749
+
750
+ static VALUE
751
+ img_red(img, idx)
752
+ VALUE img, idx;
753
+ {
754
+ gdImagePtr im;
755
+ int i,c;
756
+
757
+ Data_Get_Struct(img, gdImage, im);
758
+ i = NUM2INT(idx);
759
+
760
+ c = gdImageRed(im, i);
761
+
762
+ return INT2FIX(c);
763
+ }
764
+
765
+ static VALUE
766
+ img_green(img, idx)
767
+ VALUE img, idx;
768
+ {
769
+ gdImagePtr im;
770
+ int i,c;
771
+
772
+ Data_Get_Struct(img, gdImage, im);
773
+ i = NUM2INT(idx);
774
+
775
+ c = gdImageGreen(im, i);
776
+
777
+ return INT2FIX(c);
778
+ }
779
+
780
+ static VALUE
781
+ img_blue(img, idx)
782
+ VALUE img, idx;
783
+ {
784
+ gdImagePtr im;
785
+ int i,c;
786
+
787
+ Data_Get_Struct(img, gdImage, im);
788
+ i = NUM2INT(idx);
789
+
790
+ c = gdImageBlue(im, i);
791
+
792
+ return INT2FIX(c);
793
+ }
794
+
795
+ static VALUE
796
+ img_rgb(img, idx)
797
+ VALUE img, idx;
798
+ {
799
+ gdImagePtr im;
800
+ VALUE ary = rb_ary_new2(3);
801
+ int i, c;
802
+
803
+ Data_Get_Struct(img, gdImage, im);
804
+ i = NUM2INT(idx);
805
+
806
+ c = gdImageRed(im, i);
807
+ rb_ary_push(ary, INT2FIX(c));
808
+ c = gdImageGreen(im, i);
809
+ rb_ary_push(ary, INT2FIX(c));
810
+ c = gdImageBlue(im, i);
811
+ rb_ary_push(ary, INT2FIX(c));
812
+
813
+ return ary;
814
+ }
815
+
816
+ static VALUE
817
+ img_transparent(img, idx)
818
+ VALUE img, idx;
819
+ {
820
+ gdImagePtr im;
821
+
822
+ Data_Get_Struct(img, gdImage, im);
823
+
824
+ gdImageColorTransparent(im, NUM2INT(idx));
825
+
826
+ return img;
827
+ }
828
+
829
+ static void
830
+ image_req(img)
831
+ VALUE img;
832
+ {
833
+ if (!rb_obj_is_kind_of(img, cImage)) {
834
+ rb_raise(rb_eTypeError, "GD::Image required");
835
+ }
836
+ }
837
+
838
+ static VALUE
839
+ img_set_blush(img, brush)
840
+ VALUE img, brush;
841
+ {
842
+ gdImagePtr im, br;
843
+
844
+ Data_Get_Struct(img, gdImage, im);
845
+ image_req(brush);
846
+ Data_Get_Struct(brush, gdImage, br);
847
+ gdImageSetBrush(im, br);
848
+
849
+ return img;
850
+ }
851
+
852
+ static VALUE
853
+ img_set_style(argc, argv, img)
854
+ int argc;
855
+ VALUE *argv;
856
+ VALUE img;
857
+ {
858
+ gdImagePtr im;
859
+ int *style;
860
+ int i;
861
+
862
+ Data_Get_Struct(img, gdImage, im);
863
+ style = ALLOCA_N(int, argc);
864
+ for (i=0; i<argc; i++) {
865
+ style[i] = NUM2INT(argv[i]);
866
+ }
867
+
868
+ gdImageSetStyle(im, style, argc);
869
+
870
+ return img;
871
+ }
872
+
873
+ static VALUE
874
+ img_set_tile(img, tile)
875
+ VALUE img, tile;
876
+ {
877
+ gdImagePtr im, ti;
878
+
879
+ Data_Get_Struct(img, gdImage, im);
880
+ image_req(tile);
881
+ Data_Get_Struct(tile, gdImage, ti);
882
+ gdImageSetTile(im, ti);
883
+
884
+ return img;
885
+ }
886
+
887
+ static VALUE
888
+ img_line(img, x1, y1, x2, y2, c)
889
+ VALUE img, x1, y1, x2, y2, c;
890
+ {
891
+ gdImagePtr im;
892
+
893
+ Data_Get_Struct(img, gdImage, im);
894
+ gdImageLine(im,NUM2INT(x1),NUM2INT(y1),NUM2INT(x2),NUM2INT(y2),NUM2INT(c));
895
+
896
+ return img;
897
+ }
898
+
899
+ static VALUE
900
+ img_dashed_line(img, x1, y1, x2, y2, c)
901
+ VALUE img, x1, y1, x2, y2, c;
902
+ {
903
+ gdImagePtr im;
904
+
905
+ Data_Get_Struct(img, gdImage, im);
906
+ gdImageDashedLine(im,NUM2INT(x1),NUM2INT(y1),NUM2INT(x2),NUM2INT(y2),NUM2INT(c));
907
+
908
+ return img;
909
+ }
910
+
911
+
912
+ static VALUE
913
+ img_rectangle(img, x1, y1, x2, y2, c)
914
+ VALUE img, x1, y1, x2, y2, c;
915
+ {
916
+ gdImagePtr im;
917
+
918
+ Data_Get_Struct(img, gdImage, im);
919
+ gdImageRectangle(im,NUM2INT(x1),NUM2INT(y1),NUM2INT(x2),NUM2INT(y2),NUM2INT(c));
920
+
921
+ return img;
922
+ }
923
+
924
+
925
+ static VALUE
926
+ img_filled_rectangle(img, x1, y1, x2, y2, c)
927
+ VALUE img, x1, y1, x2, y2, c;
928
+ {
929
+ gdImagePtr im;
930
+
931
+ Data_Get_Struct(img, gdImage, im);
932
+ gdImageFilledRectangle(im,NUM2INT(x1),NUM2INT(y1),NUM2INT(x2),NUM2INT(y2),NUM2INT(c));
933
+
934
+ return img;
935
+ }
936
+
937
+ static void
938
+ poly_req(ply)
939
+ VALUE ply;
940
+ {
941
+ if (!rb_obj_is_kind_of(ply, cPolygon) || TYPE(ply) != T_ARRAY) {
942
+ rb_raise(rb_eTypeError, "GD::Polygon required");
943
+ }
944
+ }
945
+
946
+ static VALUE
947
+ img_polygon(img, ply, c)
948
+ VALUE img;
949
+ struct RArray *ply;
950
+ VALUE c;
951
+ {
952
+ gdImagePtr im;
953
+ gdPointPtr pnt;
954
+ int i, len;
955
+
956
+ Data_Get_Struct(img, gdImage, im);
957
+
958
+ poly_req(ply);
959
+ len = ply->len/2;
960
+ pnt = ALLOCA_N(gdPoint, len);
961
+ for (i=0; i<len; i++) {
962
+ pnt[i].x = NUM2INT(ply->ptr[i*2]);
963
+ pnt[i].y = NUM2INT(ply->ptr[i*2+1]);
964
+ }
965
+
966
+ gdImagePolygon(im, pnt, len, NUM2INT(c));
967
+
968
+ return img;
969
+ }
970
+
971
+ static VALUE
972
+ img_filled_polygon(img, ply, c)
973
+ VALUE img;
974
+ struct RArray *ply;
975
+ VALUE c;
976
+ {
977
+ gdImagePtr im;
978
+ gdPointPtr pnt;
979
+ int i, len;
980
+
981
+ Data_Get_Struct(img, gdImage, im);
982
+
983
+ poly_req(ply);
984
+ len = ply->len/2;
985
+ pnt = ALLOCA_N(gdPoint, len);
986
+ for (i=0; i<len; i++) {
987
+ pnt[i].x = NUM2INT(ply->ptr[i*2]);
988
+ pnt[i].y = NUM2INT(ply->ptr[i*2+1]);
989
+ }
990
+
991
+ gdImageFilledPolygon(im, pnt, len, NUM2INT(c));
992
+
993
+ return img;
994
+ }
995
+
996
+ static VALUE
997
+ img_arc(img, cx, cy, w, h, s, e, c)
998
+ VALUE img, cx, cy, w, h, s, e, c;
999
+ {
1000
+ gdImagePtr im;
1001
+
1002
+ Data_Get_Struct(img, gdImage, im);
1003
+ gdImageArc(im,NUM2INT(cx),NUM2INT(cy),NUM2INT(w),NUM2INT(h),NUM2INT(s),NUM2INT(e),NUM2INT(c));
1004
+
1005
+ return img;
1006
+ }
1007
+
1008
+ static VALUE
1009
+ img_fill(img, x, y, c)
1010
+ VALUE img, x, y, c;
1011
+ {
1012
+ gdImagePtr im;
1013
+
1014
+ Data_Get_Struct(img, gdImage, im);
1015
+ gdImageFill(im,NUM2INT(x),NUM2INT(y),NUM2INT(c));
1016
+
1017
+ return img;
1018
+ }
1019
+
1020
+ static VALUE
1021
+ img_fill_to_border(img, x, y, b, c)
1022
+ VALUE img, x, y, b, c;
1023
+ {
1024
+ gdImagePtr im;
1025
+
1026
+ Data_Get_Struct(img, gdImage, im);
1027
+ gdImageFillToBorder(im,NUM2INT(x),NUM2INT(y),NUM2INT(b),NUM2INT(c));
1028
+
1029
+ return img;
1030
+ }
1031
+
1032
+ static VALUE
1033
+ img_copy(img, img2, dx, dy, sx, sy, w, h)
1034
+ VALUE img, img2, dx, dy, sx, sy, w, h;
1035
+ {
1036
+ gdImagePtr im, im2;
1037
+
1038
+ Data_Get_Struct(img, gdImage, im);
1039
+ image_req(img2);
1040
+ Data_Get_Struct(img2, gdImage, im2);
1041
+
1042
+ #ifdef ENABLE_GD_2_0
1043
+ if (is_truecolor(im) && (!is_truecolor(im2))){
1044
+ rb_raise(rb_eRuntimeError,
1045
+ "Copying truecolor image to palette image is not permitted");
1046
+ }
1047
+ #endif
1048
+
1049
+ gdImageCopy(im2, im,
1050
+ NUM2INT(dx), NUM2INT(dy),
1051
+ NUM2INT(sx), NUM2INT(sy),
1052
+ NUM2INT(w),NUM2INT(h));
1053
+
1054
+ return img;
1055
+ }
1056
+
1057
+ static VALUE
1058
+ img_copy_resized(img, img2, dx, dy, sx, sy, dw, dh, sw, sh)
1059
+ VALUE img, img2, dx, dy, sx, sy, dw, dh, sw, sh;
1060
+ {
1061
+ gdImagePtr im, im2;
1062
+
1063
+ Data_Get_Struct(img, gdImage, im);
1064
+ image_req(img2);
1065
+ Data_Get_Struct(img2, gdImage, im2);
1066
+
1067
+ #ifdef ENABLE_GD_2_0
1068
+ if (is_truecolor(im) && (!is_truecolor(im2))){
1069
+ rb_raise(rb_eRuntimeError,
1070
+ "Copying truecolor image to palette image is not permitted");
1071
+ }
1072
+ #endif
1073
+
1074
+ gdImageCopyResized(im2,im,NUM2INT(dx),NUM2INT(dy),NUM2INT(sx),NUM2INT(sy),NUM2INT(dw),NUM2INT(dh),NUM2INT(sw),NUM2INT(sh));
1075
+
1076
+ return img;
1077
+ }
1078
+
1079
+ static VALUE
1080
+ img_copy_merge(img, img_dest, dx, dy, sx, sy, w, h, pct)
1081
+ VALUE img, img_dest, dx, dy, sx, sy, w, h, pct;
1082
+ {
1083
+ gdImagePtr im, im_dest;
1084
+
1085
+ Data_Get_Struct(img, gdImage, im);
1086
+ image_req(img_dest);
1087
+ Data_Get_Struct(img_dest, gdImage, im_dest);
1088
+
1089
+ #ifdef ENABLE_GD_2_0
1090
+ if (is_truecolor(im) && (!is_truecolor(im_dest))){
1091
+ rb_raise(rb_eRuntimeError,
1092
+ "Copying truecolor image to palette image is not permitted");
1093
+ }
1094
+ #endif
1095
+
1096
+ gdImageCopyMerge(im_dest,im,NUM2INT(dx),NUM2INT(dy),NUM2INT(sx),NUM2INT(sy),NUM2INT(w),NUM2INT(h), NUM2INT(pct));
1097
+
1098
+ return img;
1099
+ }
1100
+
1101
+ static VALUE
1102
+ img_copy_merge_gray(img, img_dest, dx, dy, sx, sy, w, h, pct)
1103
+ VALUE img, img_dest, dx, dy, sx, sy, w, h, pct;
1104
+ {
1105
+ gdImagePtr im, im_dest;
1106
+
1107
+ Data_Get_Struct(img, gdImage, im);
1108
+ image_req(img_dest);
1109
+ Data_Get_Struct(img_dest, gdImage, im_dest);
1110
+
1111
+ #ifdef ENABLE_GD_2_0
1112
+ if (is_truecolor(im) && (!is_truecolor(im_dest))){
1113
+ rb_raise(rb_eRuntimeError,
1114
+ "Copying truecolor image to palette image is not permitted");
1115
+ }
1116
+ #endif
1117
+
1118
+ gdImageCopyMergeGray(im_dest,im,NUM2INT(dx),NUM2INT(dy),NUM2INT(sx),NUM2INT(sy),NUM2INT(w),NUM2INT(h), NUM2INT(pct));
1119
+
1120
+ return img;
1121
+ }
1122
+
1123
+ static VALUE
1124
+ img_palette_copy(img, img2)
1125
+ VALUE img, img2;
1126
+ {
1127
+ gdImagePtr im, im2;
1128
+
1129
+ image_req(img2);
1130
+ Data_Get_Struct(img, gdImage, im);
1131
+ Data_Get_Struct(img2, gdImage, im2);
1132
+
1133
+ gdImagePaletteCopy(im, im2);
1134
+
1135
+ return img;
1136
+ }
1137
+
1138
+ static void
1139
+ font_req(fnt)
1140
+ VALUE fnt;
1141
+ {
1142
+ if (!rb_obj_is_kind_of(fnt, cFont)) {
1143
+ rb_raise(rb_eTypeError, "GD::Font required");
1144
+ }
1145
+ }
1146
+
1147
+ static VALUE
1148
+ img_string(img, fnt, x, y, str, c)
1149
+ VALUE img, fnt, x, y, str, c;
1150
+ {
1151
+ gdImagePtr im;
1152
+ gdFontPtr f;
1153
+
1154
+ Check_Type(str, T_STRING);
1155
+ Data_Get_Struct(img, gdImage, im);
1156
+ font_req(fnt);
1157
+ Data_Get_Struct(fnt, gdFont, f);
1158
+
1159
+ gdImageString(im,f,NUM2INT(x),NUM2INT(y),RSTRING(str)->ptr,NUM2INT(c));
1160
+
1161
+ return img;
1162
+ }
1163
+
1164
+ static VALUE
1165
+ img_string_up(img, fnt, x, y, str, c)
1166
+ VALUE img, fnt, x, y, str, c;
1167
+ {
1168
+ gdImagePtr im;
1169
+ gdFontPtr f;
1170
+
1171
+ Check_Type(str, T_STRING);
1172
+ Data_Get_Struct(img, gdImage, im);
1173
+ font_req(fnt);
1174
+ Data_Get_Struct(fnt, gdFont, f);
1175
+
1176
+ gdImageStringUp(im,f,NUM2INT(x),NUM2INT(y),RSTRING(str)->ptr,NUM2INT(c));
1177
+
1178
+ return img;
1179
+ }
1180
+
1181
+
1182
+ #ifdef HAVE_GDIMAGESTRINGTTF
1183
+ static VALUE
1184
+ img_s_string_ttf(klass, fgcolor, fontname, ptsize, angle, x, y, string)
1185
+ VALUE klass, fgcolor, fontname, ptsize, angle, x, y, string;
1186
+ {
1187
+ int brect[8], i;
1188
+ char *msg;
1189
+ VALUE ary = rb_ary_new2(8);
1190
+
1191
+ Check_Type(fontname, T_STRING);
1192
+ Check_Type(string, T_STRING);
1193
+
1194
+ msg = gdImageStringTTF(NULL,
1195
+ &brect[0],
1196
+ NUM2INT(fgcolor),
1197
+ RSTRING(fontname)->ptr,
1198
+ NUM2DBL(ptsize),
1199
+ NUM2DBL(angle),
1200
+ NUM2INT(x),
1201
+ NUM2INT(y),
1202
+ RSTRING(string)->ptr);
1203
+ for (i=0; i<8; i++) {
1204
+ rb_ary_push(ary, INT2FIX(brect[i]));
1205
+ }
1206
+ if (msg) {
1207
+ return rb_ary_new3(2, rb_str_new2(msg), ary);
1208
+ } else {
1209
+ return rb_ary_new3(2, Qnil, ary);
1210
+ }
1211
+ }
1212
+
1213
+ static VALUE
1214
+ img_string_ttf(img, fgcolor, fontname, ptsize, angle, x, y, string)
1215
+ VALUE img, fgcolor, fontname, ptsize, angle, x, y, string;
1216
+ {
1217
+ gdImagePtr im;
1218
+ int brect[8], i;
1219
+ char *msg;
1220
+ VALUE ary = rb_ary_new2(8);
1221
+
1222
+ Check_Type(fontname, T_STRING);
1223
+ Check_Type(string, T_STRING);
1224
+
1225
+ Data_Get_Struct(img, gdImage, im);
1226
+ msg = gdImageStringTTF(im,
1227
+ &brect[0],
1228
+ NUM2INT(fgcolor),
1229
+ RSTRING(fontname)->ptr,
1230
+ NUM2DBL(ptsize),
1231
+ NUM2DBL(angle),
1232
+ NUM2INT(x),
1233
+ NUM2INT(y),
1234
+ RSTRING(string)->ptr);
1235
+ for (i=0; i<8; i++) {
1236
+ rb_ary_push(ary, INT2FIX(brect[i]));
1237
+ }
1238
+ if (msg) {
1239
+ return rb_ary_new3(2, rb_str_new2(msg), ary);
1240
+ } else {
1241
+ return rb_ary_new3(2, Qnil, ary);
1242
+ }
1243
+ }
1244
+ #endif /* HAVE_GDIMAGESTRINGTTF */
1245
+
1246
+ #ifdef HAVE_GDIMAGESTRINGFT
1247
+ static VALUE
1248
+ img_s_string_ft(klass, fgcolor, fontname, ptsize, angle, x, y, string)
1249
+ VALUE klass, fgcolor, fontname, ptsize, angle, x, y, string;
1250
+ {
1251
+ int brect[8], i;
1252
+ char *msg;
1253
+ VALUE ary = rb_ary_new2(8);
1254
+
1255
+ Check_Type(fontname, T_STRING);
1256
+ Check_Type(string, T_STRING);
1257
+
1258
+ msg = gdImageStringFT(NULL,
1259
+ &brect[0],
1260
+ NUM2INT(fgcolor),
1261
+ RSTRING(fontname)->ptr,
1262
+ NUM2DBL(ptsize),
1263
+ NUM2DBL(angle),
1264
+ NUM2INT(x),
1265
+ NUM2INT(y),
1266
+ RSTRING(string)->ptr);
1267
+ for (i=0; i<8; i++) {
1268
+ rb_ary_push(ary, INT2FIX(brect[i]));
1269
+ }
1270
+ if (msg) {
1271
+ return rb_ary_new3(2, rb_str_new2(msg), ary);
1272
+ } else {
1273
+ return rb_ary_new3(2, Qnil, ary);
1274
+ }
1275
+ }
1276
+
1277
+ static VALUE
1278
+ img_string_ft(img, fgcolor, fontname, ptsize, angle, x, y, string)
1279
+ VALUE img, fgcolor, fontname, ptsize, angle, x, y, string;
1280
+ {
1281
+ gdImagePtr im;
1282
+ int brect[8], i;
1283
+ char *msg;
1284
+ VALUE ary = rb_ary_new2(8);
1285
+
1286
+ Check_Type(fontname, T_STRING);
1287
+ Check_Type(string, T_STRING);
1288
+
1289
+ Data_Get_Struct(img, gdImage, im);
1290
+ msg = gdImageStringFT(im,
1291
+ &brect[0],
1292
+ NUM2INT(fgcolor),
1293
+ RSTRING(fontname)->ptr,
1294
+ NUM2DBL(ptsize),
1295
+ NUM2DBL(angle),
1296
+ NUM2INT(x),
1297
+ NUM2INT(y),
1298
+ RSTRING(string)->ptr);
1299
+ for (i=0; i<8; i++) {
1300
+ rb_ary_push(ary, INT2FIX(brect[i]));
1301
+ }
1302
+ if (msg) {
1303
+ return rb_ary_new3(2, rb_str_new2(msg), ary);
1304
+ } else {
1305
+ return rb_ary_new3(2, Qnil, ary);
1306
+ }
1307
+ }
1308
+ #endif /* HAVE_GDIMAGESTRINGFT */
1309
+
1310
+ static VALUE
1311
+ img_char(img, fnt, x, y, ch, c)
1312
+ VALUE img, fnt, x, y, ch, c;
1313
+ {
1314
+ gdImagePtr im;
1315
+ gdFontPtr f;
1316
+ int ci;
1317
+
1318
+ Data_Get_Struct(img, gdImage, im);
1319
+ font_req(fnt);
1320
+ Data_Get_Struct(fnt, gdFont, f);
1321
+
1322
+ if (TYPE(ch) == T_STRING) {
1323
+ if (RSTRING(ch)->len != 1) {
1324
+ rb_raise(rb_eArgError, "string must be 1 byte(%d bytes)", RSTRING(ch)->len);
1325
+ }
1326
+ ci = RSTRING(ch)->ptr[0];
1327
+ }
1328
+ else {
1329
+ ci = NUM2INT(ch);
1330
+ }
1331
+ gdImageChar(im,f,NUM2INT(x),NUM2INT(y),ci,NUM2INT(c));
1332
+
1333
+ return img;
1334
+ }
1335
+
1336
+ static VALUE
1337
+ img_char_up(img, fnt, x, y, ch, c)
1338
+ VALUE img, fnt, x, y, ch, c;
1339
+ {
1340
+ gdImagePtr im;
1341
+ gdFontPtr f;
1342
+ int ci;
1343
+
1344
+ Data_Get_Struct(img, gdImage, im);
1345
+ font_req(fnt);
1346
+ Data_Get_Struct(fnt, gdFont, f);
1347
+
1348
+ if (TYPE(ch) == T_STRING) {
1349
+ if (RSTRING(ch)->len != 1) {
1350
+ rb_raise(rb_eArgError, "string must be 1 byte(%d bytes)", RSTRING(ch)->len);
1351
+ }
1352
+ ci = RSTRING(ch)->ptr[0];
1353
+ }
1354
+ else {
1355
+ ci = NUM2INT(ch);
1356
+ }
1357
+ gdImageCharUp(im,f,NUM2INT(x),NUM2INT(y),ci,NUM2INT(c));
1358
+
1359
+ return img;
1360
+ }
1361
+
1362
+ static VALUE
1363
+ img_get_interlace(img)
1364
+ VALUE img;
1365
+ {
1366
+ gdImagePtr im;
1367
+
1368
+ Data_Get_Struct(img, gdImage, im);
1369
+ if (gdImageGetInterlaced(im)) {
1370
+ return Qtrue;
1371
+ }
1372
+ return Qfalse;
1373
+ }
1374
+
1375
+ static VALUE
1376
+ img_set_interlace(img, val)
1377
+ {
1378
+ gdImagePtr im;
1379
+
1380
+ Data_Get_Struct(img, gdImage, im);
1381
+ gdImageInterlace(im, RTEST(val));
1382
+
1383
+ return img;
1384
+ }
1385
+
1386
+ static VALUE
1387
+ img_bounds(img)
1388
+ VALUE img;
1389
+ {
1390
+ gdImagePtr im;
1391
+ VALUE ary = rb_ary_new2(2);
1392
+ int i;
1393
+
1394
+ Data_Get_Struct(img, gdImage, im);
1395
+ i = gdImageSX(im);
1396
+ rb_ary_push(ary, INT2FIX(i));
1397
+ i = gdImageSY(im);
1398
+ rb_ary_push(ary, INT2FIX(i));
1399
+
1400
+ return ary;
1401
+ }
1402
+
1403
+
1404
+ static VALUE
1405
+ img_bounds_safe(img, x, y)
1406
+ VALUE img, x, y;
1407
+ {
1408
+ gdImagePtr im;
1409
+
1410
+ Data_Get_Struct(img, gdImage, im);
1411
+ if ( gdImageBoundsSafe(im, NUM2INT(x), NUM2INT(y)) ) {
1412
+ return Qtrue;
1413
+ } else {
1414
+ return Qfalse;
1415
+ }
1416
+ }
1417
+
1418
+ static VALUE
1419
+ img_get_transparent(img)
1420
+ VALUE img;
1421
+ {
1422
+ gdImagePtr im;
1423
+
1424
+ Data_Get_Struct(img, gdImage, im);
1425
+ return INT2NUM(gdImageGetTransparent(im));
1426
+ }
1427
+
1428
+
1429
+ static VALUE
1430
+ img_width(img)
1431
+ VALUE img;
1432
+ {
1433
+ gdImagePtr im;
1434
+ int i;
1435
+
1436
+ Data_Get_Struct(img, gdImage, im);
1437
+ i = gdImageSX(im);
1438
+ return INT2FIX(i);
1439
+ }
1440
+
1441
+ static VALUE
1442
+ img_height(img)
1443
+ VALUE img;
1444
+ {
1445
+ gdImagePtr im;
1446
+ int i;
1447
+
1448
+ Data_Get_Struct(img, gdImage, im);
1449
+ i = gdImageSY(im);
1450
+ return INT2FIX(i);
1451
+ }
1452
+
1453
+ static VALUE
1454
+ img_png(img, out)
1455
+ VALUE img, out;
1456
+ {
1457
+ gdImagePtr im;
1458
+ OpenFile *fptr;
1459
+ FILE *f;
1460
+
1461
+ Data_Get_Struct(img, gdImage, im);
1462
+ Check_Type(out, T_FILE);
1463
+ rb_io_binmode(out);
1464
+ GetOpenFile(out, fptr);
1465
+ rb_io_check_writable(fptr);
1466
+ f = (fptr->f2) ? fptr->f2 : fptr->f;
1467
+
1468
+ gdImagePng(im, f);
1469
+
1470
+ return img;
1471
+ }
1472
+
1473
+ static VALUE
1474
+ img_png_str(img)
1475
+ VALUE img;
1476
+ {
1477
+ int size;
1478
+ void *ptr;
1479
+ gdImagePtr im;
1480
+ VALUE imageString;
1481
+
1482
+ Data_Get_Struct(img, gdImage, im);
1483
+ ptr = gdImagePngPtr(im, &size);
1484
+ imageString = rb_str_new(ptr, size);
1485
+
1486
+ #ifdef ENABLE_GD_2_0
1487
+ gdFree(ptr);
1488
+ #else
1489
+ free(ptr);
1490
+ #endif
1491
+
1492
+ return imageString;
1493
+ }
1494
+
1495
+ static VALUE
1496
+ img_gd(img, out)
1497
+ VALUE img, out;
1498
+ {
1499
+ gdImagePtr im;
1500
+ OpenFile *fptr;
1501
+ FILE *f;
1502
+
1503
+ Data_Get_Struct(img, gdImage, im);
1504
+ Check_Type(out, T_FILE);
1505
+ rb_io_binmode(out);
1506
+ GetOpenFile(out, fptr);
1507
+ rb_io_check_writable(fptr);
1508
+ f = (fptr->f2) ? fptr->f2 : fptr->f;
1509
+
1510
+ gdImageGd(im, f);
1511
+
1512
+ return img;
1513
+ }
1514
+
1515
+ static VALUE
1516
+ img_gd2(img, out, cs, fmt)
1517
+ VALUE img, out, cs, fmt;
1518
+ {
1519
+ OpenFile *fptr;
1520
+ gdImagePtr im;
1521
+ FILE *f;
1522
+
1523
+ Check_Type(out, T_FILE);
1524
+ rb_io_binmode(out);
1525
+ GetOpenFile(out, fptr);
1526
+ rb_io_check_writable(fptr);
1527
+ f = (fptr->f2) ? fptr->f2 : fptr->f;
1528
+
1529
+ Data_Get_Struct(img, gdImage, im);
1530
+ gdImageGd2(im, f, NUM2INT(cs), NUM2INT(fmt));
1531
+
1532
+ return img;
1533
+ }
1534
+
1535
+
1536
+ #ifdef HAVE_GDIMAGECREATEFROMJPEG
1537
+ static VALUE
1538
+ img_jpeg(img, out, quality)
1539
+ VALUE img, out, quality;
1540
+ {
1541
+ gdImagePtr im;
1542
+ OpenFile *fptr;
1543
+ FILE *f;
1544
+
1545
+ Data_Get_Struct(img, gdImage, im);
1546
+
1547
+ Check_Type(out, T_FILE);
1548
+
1549
+ rb_io_binmode(out);
1550
+ GetOpenFile(out, fptr);
1551
+ rb_io_check_writable(fptr);
1552
+ f = (fptr->f2) ? fptr->f2 : fptr->f;
1553
+
1554
+ gdImageJpeg(im, f, FIX2INT(quality));
1555
+
1556
+ return img;
1557
+ }
1558
+
1559
+ static VALUE
1560
+ img_jpeg_str(img, quality)
1561
+ VALUE img, quality;
1562
+ {
1563
+ int size;
1564
+ void *ptr;
1565
+ gdImagePtr im;
1566
+ VALUE imageString;
1567
+
1568
+ Data_Get_Struct(img, gdImage, im);
1569
+ ptr = gdImageJpegPtr(im, &size, FIX2INT(quality));
1570
+ imageString = rb_str_new(ptr, size);
1571
+
1572
+ #ifdef ENABLE_GD_2_0
1573
+ gdFree(ptr);
1574
+ #else
1575
+ free(ptr);
1576
+ #endif
1577
+
1578
+ return imageString;
1579
+ }
1580
+ #endif
1581
+
1582
+ static VALUE
1583
+ img_wbmp(img, fg, out)
1584
+ VALUE img, out, fg;
1585
+ {
1586
+ gdImagePtr im;
1587
+ OpenFile *fptr;
1588
+ FILE *f;
1589
+
1590
+ Data_Get_Struct(img, gdImage, im);
1591
+
1592
+ Check_Type(out, T_FILE);
1593
+
1594
+ rb_io_binmode(out);
1595
+ GetOpenFile(out, fptr);
1596
+ rb_io_check_writable(fptr);
1597
+ f = (fptr->f2) ? fptr->f2 : fptr->f;
1598
+
1599
+ gdImageWBMP(im, FIX2INT(fg), f);
1600
+
1601
+ return img;
1602
+ }
1603
+
1604
+ /*
1605
+ *
1606
+ * Poligon
1607
+ *
1608
+ */
1609
+
1610
+ static VALUE
1611
+ ply_new(klass)
1612
+ VALUE klass;
1613
+ {
1614
+ VALUE self = rb_ary_new();
1615
+
1616
+ RBASIC(self)->klass = klass;
1617
+ return self;
1618
+ }
1619
+
1620
+ static VALUE
1621
+ ply_add_pt(ply, x, y)
1622
+ VALUE ply, x, y;
1623
+ {
1624
+ /* type check */
1625
+ NUM2INT(x);
1626
+ NUM2INT(y);
1627
+
1628
+ rb_ary_push(ply, x);
1629
+ rb_ary_push(ply, y);
1630
+ return ply;
1631
+ }
1632
+
1633
+ static VALUE
1634
+ ply_to_pt(ply, dx, dy)
1635
+ VALUE ply, dx, dy;
1636
+ {
1637
+ VALUE x, y;
1638
+
1639
+ /* type check */
1640
+ NUM2INT(dx);
1641
+ NUM2INT(dy);
1642
+
1643
+ if (RARRAY(ply)->len > 0) {
1644
+ x = rb_ary_entry(ply, RARRAY(ply)->len - 2);
1645
+ y = rb_ary_entry(ply, RARRAY(ply)->len - 1);
1646
+ rb_ary_push(ply, INT2NUM(NUM2INT(x) + NUM2INT(dx)));
1647
+ rb_ary_push(ply, INT2NUM(NUM2INT(y) + NUM2INT(dy)));
1648
+ } else {
1649
+ ply_add_pt(ply, dx, dy);
1650
+ }
1651
+ return ply;
1652
+ }
1653
+
1654
+ static VALUE
1655
+ ply_get_pt(ply, idx)
1656
+ VALUE ply, idx;
1657
+ {
1658
+ int i = NUM2INT(idx);
1659
+
1660
+ if (RARRAY(ply)->len < idx) return Qnil;
1661
+ i *= 2;
1662
+
1663
+ return rb_assoc_new(rb_ary_entry(ply, i), rb_ary_entry(ply, i+1));
1664
+ }
1665
+
1666
+ static VALUE
1667
+ ply_set_pt(ply, idx, x, y)
1668
+ VALUE ply, idx, x, y;
1669
+ {
1670
+ int i = NUM2INT(idx)*2;
1671
+
1672
+ /* type check */
1673
+ NUM2INT(x);
1674
+ NUM2INT(y);
1675
+
1676
+ rb_ary_store(ply, i, x);
1677
+ rb_ary_store(ply, i+1, y);
1678
+
1679
+ return ply;
1680
+ }
1681
+
1682
+ static VALUE
1683
+ ply_delete_pt(ply, idx)
1684
+ VALUE ply, idx;
1685
+ {
1686
+ int i = NUM2INT(idx)*2;
1687
+
1688
+ rb_ary_delete_at(ply, INT2FIX(i));
1689
+ rb_ary_delete_at(ply, INT2FIX(i+1));
1690
+
1691
+ return ply;
1692
+ }
1693
+
1694
+ static VALUE
1695
+ ply_length(ply)
1696
+ VALUE ply;
1697
+ {
1698
+ return INT2FIX(RARRAY(ply)->len / 2);
1699
+ }
1700
+
1701
+ static VALUE
1702
+ ply_vertices(ply)
1703
+ struct RArray *ply;
1704
+ {
1705
+ int i;
1706
+ VALUE ary = rb_ary_new2(ply->len/2);
1707
+
1708
+ for (i = 0; i<ply->len; i+=2) {
1709
+ rb_ary_push(ary, rb_assoc_new(ply->ptr[i], ply->ptr[i+1]));
1710
+ }
1711
+ return ary;
1712
+ }
1713
+
1714
+ static VALUE
1715
+ ply_bounds(ply)
1716
+ struct RArray *ply;
1717
+ {
1718
+ int i, l, t, r, b;
1719
+ int nx, ny;
1720
+
1721
+ if (ply->len == 0) {
1722
+ l = t = r = b = 0;
1723
+ }
1724
+ else {
1725
+ l = r = NUM2INT(ply->ptr[0]);
1726
+ t = b = NUM2INT(ply->ptr[1]);
1727
+ }
1728
+ for (i = 2; i<ply->len; i+=2) {
1729
+ nx = NUM2INT(ply->ptr[i]);
1730
+ if (nx < l) l = nx;
1731
+ if (nx > r) r = nx;
1732
+ ny = NUM2INT(ply->ptr[i+1]);
1733
+ if (ny < t) t = ny;
1734
+ if (ny > b) b = ny;
1735
+ }
1736
+ return rb_ary_new3(4, INT2FIX(l), INT2FIX(t), INT2FIX(r), INT2FIX(b));
1737
+ }
1738
+
1739
+ static VALUE
1740
+ ply_offset(ply, vx, vy)
1741
+ struct RArray *ply;
1742
+ VALUE vx, vy;
1743
+ {
1744
+ int i, x, y, c;
1745
+
1746
+ x = NUM2INT(vx);
1747
+ y = NUM2INT(vy);
1748
+
1749
+ for (i = 0; i<ply->len; i+=2) {
1750
+ c = NUM2INT(ply->ptr[i]) + x;
1751
+ ply->ptr[i] = INT2FIX(c);
1752
+ c = NUM2INT(ply->ptr[i+1]) + y;
1753
+ ply->ptr[i+1] = INT2FIX(c);
1754
+ }
1755
+
1756
+ return (VALUE)ply;
1757
+ }
1758
+
1759
+ static VALUE
1760
+ ply_map(argc, argv, ply)
1761
+ int argc;
1762
+ VALUE *argv;
1763
+ struct RArray *ply;
1764
+ {
1765
+ VALUE sl, st, sr, sb, dl, dt, dr, db;
1766
+ int sx, sy, dx, dy;
1767
+ double xmag, ymag;
1768
+ int i, c;
1769
+
1770
+ i = rb_scan_args(argc,argv,"44",&sl,&st,&sr,&sb, &dl,&dt,&dr,&db);
1771
+
1772
+ if (i == 4) {
1773
+ int i, l, t, r, b;
1774
+ int nx, ny;
1775
+
1776
+ if (ply->len == 0) {
1777
+ l = t = r = b = 0;
1778
+ }
1779
+ else {
1780
+ l = r = NUM2INT(ply->ptr[0]);
1781
+ t = b = NUM2INT(ply->ptr[1]);
1782
+ }
1783
+ for (i = 2; i<ply->len; i+=2) {
1784
+ nx = NUM2INT(ply->ptr[i]);
1785
+ if (nx < l) l = nx;
1786
+ if (nx > r) r = nx;
1787
+ ny = NUM2INT(ply->ptr[i+1]);
1788
+ if (ny < t) t = ny;
1789
+ if (ny > b) b = ny;
1790
+ }
1791
+ sx = l;
1792
+ sy = t;
1793
+ dx = NUM2INT(sl);
1794
+ dy = NUM2INT(st);
1795
+ xmag = (double)(NUM2INT(sr) - NUM2INT(sl))/(double)(r - l);
1796
+ ymag = (double)(NUM2INT(sb) - NUM2INT(st))/(double)(b - t);
1797
+ }
1798
+ else if (i == 8) {
1799
+ sx = NUM2INT(sl);
1800
+ sy = NUM2INT(st);
1801
+ dx = NUM2INT(dl);
1802
+ dy = NUM2INT(dt);
1803
+ xmag = (double)(NUM2INT(dr) - NUM2INT(dl))/
1804
+ (double)(NUM2INT(sr) - NUM2INT(sl));
1805
+ ymag = (double)(NUM2INT(db) - NUM2INT(dt))/
1806
+ (double)(NUM2INT(sb) - NUM2INT(st));
1807
+ }
1808
+ else {
1809
+ rb_raise(rb_eArgError, "wrong # of arguments (%d for 4 or 8)", argc);
1810
+ }
1811
+
1812
+ for (i = 0; i<ply->len; i+=2) {
1813
+ c = NUM2INT(ply->ptr[i]);
1814
+ c = (c-sx)*xmag+dx;
1815
+ ply->ptr[i] = INT2FIX(c);
1816
+
1817
+ c = NUM2INT(ply->ptr[i+1]);
1818
+ c = (c-sy)*ymag+dy;
1819
+ ply->ptr[i+1] = INT2FIX(c);
1820
+ }
1821
+
1822
+ return (VALUE)ply;
1823
+ }
1824
+
1825
+ static VALUE
1826
+ ply_transform(ply, a, b, c, d, tx, ty)
1827
+ VALUE ply, a, b, c, d, tx, ty;
1828
+ {
1829
+ int i;
1830
+ VALUE x, y;
1831
+
1832
+ for (i = 0; i < RARRAY(ply)->len / 2; i++) {
1833
+ /* x = rb_ary_entry(ply, i * 2);
1834
+ y = rb_ary_entry(ply, i * 2 + 1);*/
1835
+ x = RARRAY(ply)->ptr[i * 2];
1836
+ y = RARRAY(ply)->ptr[i * 2 + 1];
1837
+ ply_set_pt(ply, INT2NUM(i),
1838
+ INT2NUM(NUM2DBL(a) * NUM2INT(x) + NUM2DBL(c) * NUM2INT(y) + NUM2INT(tx)),
1839
+ INT2NUM(NUM2DBL(b) * NUM2INT(x) + NUM2DBL(d) * NUM2INT(y) + NUM2INT(ty)));
1840
+ }
1841
+ return ply;
1842
+ }
1843
+
1844
+ static VALUE
1845
+ ply_scale(ply, sx, sy)
1846
+ VALUE ply, sx, sy;
1847
+ {
1848
+ return ply_transform(ply, sx, INT2NUM(0), INT2NUM(0), sy, INT2NUM(0), INT2NUM(0));
1849
+ }
1850
+
1851
+ static VALUE
1852
+ fnt_create(fnt)
1853
+ gdFontPtr fnt;
1854
+ {
1855
+ return Data_Wrap_Struct(cFont, 0, 0, fnt);
1856
+ }
1857
+
1858
+ static VALUE
1859
+ fnt_new(name)
1860
+ char *name;
1861
+ {
1862
+ if (strcmp(name, "Giant") == 0) {
1863
+ return fnt_create(gdFontGiant);
1864
+ }
1865
+ if (strcmp(name, "Large") == 0) {
1866
+ return fnt_create(gdFontLarge);
1867
+ }
1868
+ if (strcmp(name, "Medium") == 0) {
1869
+ return fnt_create(gdFontMediumBold);
1870
+ }
1871
+ if (strcmp(name, "Small") == 0) {
1872
+ return fnt_create(gdFontSmall);
1873
+ }
1874
+ if (strcmp(name, "Tiny") == 0) {
1875
+ return fnt_create(gdFontTiny);
1876
+ }
1877
+ rb_raise(rb_eArgError, "undefined font name `%s'", name);
1878
+ }
1879
+
1880
+ static VALUE
1881
+ fnt_s_new(obj, name)
1882
+ VALUE obj;
1883
+ struct RString *name;
1884
+ {
1885
+ Check_Type(name, T_STRING);
1886
+ return fnt_new(name->ptr);
1887
+ }
1888
+
1889
+ static VALUE
1890
+ fnt_nchars(fnt)
1891
+ VALUE fnt;
1892
+ {
1893
+ gdFontPtr fp;
1894
+
1895
+ Data_Get_Struct(fnt,gdFont,fp);
1896
+ return INT2FIX(fp->nchars);
1897
+ }
1898
+
1899
+ static VALUE
1900
+ fnt_offset(fnt)
1901
+ VALUE fnt;
1902
+ {
1903
+ gdFontPtr fp;
1904
+
1905
+ Data_Get_Struct(fnt,gdFont,fp);
1906
+ return INT2FIX(fp->offset);
1907
+ }
1908
+
1909
+ static VALUE
1910
+ fnt_width(fnt)
1911
+ VALUE fnt;
1912
+ {
1913
+ gdFontPtr fp;
1914
+
1915
+ Data_Get_Struct(fnt,gdFont,fp);
1916
+ return INT2FIX(fp->w);
1917
+ }
1918
+
1919
+ static VALUE
1920
+ fnt_height(fnt)
1921
+ VALUE fnt;
1922
+ {
1923
+ gdFontPtr fp;
1924
+
1925
+ Data_Get_Struct(fnt,gdFont,fp);
1926
+ return INT2FIX(fp->h);
1927
+ }
1928
+
1929
+ /*
1930
+ *
1931
+ * gd-2.0.x features : experimental
1932
+ *
1933
+ */
1934
+
1935
+ #ifdef ENABLE_GD_2_0
1936
+
1937
+ static VALUE
1938
+ img_s_new_tc(klass, sx, sy)
1939
+ VALUE klass, sx, sy;
1940
+ {
1941
+ gdImagePtr iptr;
1942
+
1943
+ if (NUM2INT(sx)<0 || NUM2INT(sy)<0)
1944
+ rb_raise(rb_eArgError, "Negative width/height not allowed");
1945
+
1946
+ iptr = gdImageCreateTrueColor(NUM2INT(sx), NUM2INT(sy));
1947
+ if (!iptr)
1948
+ rb_raise(rb_eRuntimeError, "Unable to allocate the new image");
1949
+
1950
+ return Data_Wrap_Struct(klass,0,free_img,iptr);
1951
+ }
1952
+
1953
+ static VALUE
1954
+ img_color_allocate_alpha_tri(img, r, g, b, a)
1955
+ VALUE img, r, g, b, a;
1956
+ {
1957
+ gdImagePtr im;
1958
+ int c;
1959
+
1960
+ Data_Get_Struct(img, gdImage, im);
1961
+ c = gdImageColorAllocateAlpha(im, NUM2INT(r), NUM2INT(g), NUM2INT(b), NUM2INT(a));
1962
+
1963
+ return INT2NUM(c);
1964
+ }
1965
+
1966
+ static VALUE
1967
+ img_color_allocate_alpha_str(img, rgbstr, a)
1968
+ VALUE img, rgbstr, a;
1969
+ {
1970
+ gdImagePtr im;
1971
+ int c;
1972
+ VALUE ary;
1973
+
1974
+ Data_Get_Struct(img, gdImage, im);
1975
+
1976
+ ary = hex2triplet(rgbstr);
1977
+ c = gdImageColorAllocateAlpha(im,
1978
+ NUM2INT(*(RARRAY(ary)->ptr)),
1979
+ NUM2INT(*(RARRAY(ary)->ptr+1)),
1980
+ NUM2INT(*(RARRAY(ary)->ptr+2)),
1981
+ NUM2INT(a));
1982
+ return INT2NUM(c);
1983
+ }
1984
+
1985
+ static VALUE
1986
+ img_color_allocate_alpha(argc, argv, img)
1987
+ int argc;
1988
+ VALUE *argv;
1989
+ VALUE img;
1990
+ {
1991
+ int i;
1992
+ VALUE rgbstr, r, g, b, a, retval;
1993
+
1994
+ if (!(argc == 2 || argc == 4))
1995
+ rb_raise(rb_eArgError, "Wrong # of arguments (2 or 4 for %d)", argc);
1996
+
1997
+ switch(TYPE(argv[0])) {
1998
+ case T_STRING:
1999
+ i = rb_scan_args(argc, argv, "20", &rgbstr, &a);
2000
+ retval = img_color_allocate_alpha_str(img, rgbstr, a);
2001
+ break;
2002
+ case T_FIXNUM:
2003
+ i = rb_scan_args(argc, argv, "40", &r, &g, &b, &a);
2004
+ retval = img_color_allocate_alpha_tri(img, r, g, b, a);
2005
+ break;
2006
+ default:
2007
+ rb_raise(rb_eTypeError, "String or Fixnum expected");
2008
+ break;
2009
+ }
2010
+
2011
+ return retval;
2012
+ }
2013
+
2014
+
2015
+ static VALUE
2016
+ img_color_resolve_alpha_tri(img, r, g, b, a)
2017
+ VALUE img, r, g, b, a;
2018
+ {
2019
+ gdImagePtr im;
2020
+ int c;
2021
+
2022
+ Data_Get_Struct(img, gdImage, im);
2023
+ c = gdImageColorResolveAlpha(im, NUM2INT(r), NUM2INT(g), NUM2INT(b), NUM2INT(a));
2024
+
2025
+ return INT2NUM(c);
2026
+ }
2027
+
2028
+ static VALUE
2029
+ img_color_resolve_alpha_str(img, rgbstr, a)
2030
+ VALUE img, rgbstr, a;
2031
+ {
2032
+ gdImagePtr im;
2033
+ int c;
2034
+ VALUE ary;
2035
+
2036
+ Data_Get_Struct(img, gdImage, im);
2037
+
2038
+ ary = hex2triplet(rgbstr);
2039
+ c = gdImageColorResolveAlpha(im,
2040
+ NUM2INT(*(RARRAY(ary)->ptr)),
2041
+ NUM2INT(*(RARRAY(ary)->ptr+1)),
2042
+ NUM2INT(*(RARRAY(ary)->ptr+2)),
2043
+ NUM2INT(a));
2044
+ return INT2NUM(c);
2045
+ }
2046
+
2047
+ static VALUE
2048
+ img_color_resolve_alpha(argc, argv, img)
2049
+ int argc;
2050
+ VALUE *argv;
2051
+ VALUE img;
2052
+ {
2053
+ int i;
2054
+ VALUE rgbstr, r, g, b, a, retval;
2055
+
2056
+ if (!(argc == 2 || argc == 4))
2057
+ rb_raise(rb_eArgError, "Wrong # of arguments (2 or 4 for %d)", argc);
2058
+
2059
+ switch(TYPE(argv[0])) {
2060
+ case T_STRING:
2061
+ i = rb_scan_args(argc, argv, "20", &rgbstr, &a);
2062
+ retval = img_color_resolve_alpha_str(img, rgbstr, a);
2063
+ break;
2064
+ case T_FIXNUM:
2065
+ i = rb_scan_args(argc, argv, "40", &r, &g, &b, &a);
2066
+ retval = img_color_resolve_alpha_tri(img, r, g, b, a);
2067
+ break;
2068
+ default:
2069
+ rb_raise(rb_eTypeError, "String or Fixnum expected");
2070
+ break;
2071
+ }
2072
+
2073
+ return retval;
2074
+ }
2075
+
2076
+ static VALUE
2077
+ img_color_closest_alpha_tri(img, r, g, b, a)
2078
+ VALUE img, r, g, b, a;
2079
+ {
2080
+ gdImagePtr im;
2081
+ int c;
2082
+
2083
+ Data_Get_Struct(img, gdImage, im);
2084
+ c = gdImageColorClosestAlpha(im, NUM2INT(r), NUM2INT(g), NUM2INT(b), NUM2INT(a));
2085
+
2086
+ return INT2NUM(c);
2087
+ }
2088
+
2089
+ static VALUE
2090
+ img_color_closest_alpha_str(img, rgbstr, a)
2091
+ VALUE img, rgbstr, a;
2092
+ {
2093
+ gdImagePtr im;
2094
+ int c;
2095
+ VALUE ary;
2096
+
2097
+ Data_Get_Struct(img, gdImage, im);
2098
+
2099
+ ary = hex2triplet(rgbstr);
2100
+ c = gdImageColorClosestAlpha(im,
2101
+ NUM2INT(*(RARRAY(ary)->ptr)),
2102
+ NUM2INT(*(RARRAY(ary)->ptr+1)),
2103
+ NUM2INT(*(RARRAY(ary)->ptr+2)),
2104
+ NUM2INT(a));
2105
+ return INT2NUM(c);
2106
+ }
2107
+
2108
+ static VALUE
2109
+ img_color_closest_alpha(argc, argv, img)
2110
+ int argc;
2111
+ VALUE *argv;
2112
+ VALUE img;
2113
+ {
2114
+ int i;
2115
+ VALUE rgbstr, r, g, b, a, retval;
2116
+
2117
+ if (!(argc == 2 || argc == 4))
2118
+ rb_raise(rb_eArgError, "Wrong # of arguments (2 or 4 for %d)", argc);
2119
+
2120
+ switch(TYPE(argv[0])) {
2121
+ case T_STRING:
2122
+ i = rb_scan_args(argc, argv, "20", &rgbstr, &a);
2123
+ retval = img_color_closest_alpha_str(img, rgbstr, a);
2124
+ break;
2125
+ case T_FIXNUM:
2126
+ i = rb_scan_args(argc, argv, "40", &r, &g, &b, &a);
2127
+ retval = img_color_closest_alpha_tri(img, r, g, b, a);
2128
+ break;
2129
+ default:
2130
+ rb_raise(rb_eTypeError, "String or Fixnum expected");
2131
+ break;
2132
+ }
2133
+
2134
+ return retval;
2135
+ }
2136
+
2137
+
2138
+ static VALUE
2139
+ img_color_exact_alpha_tri(img, r, g, b, a)
2140
+ VALUE img, r, g, b, a;
2141
+ {
2142
+ gdImagePtr im;
2143
+ int c;
2144
+
2145
+ Data_Get_Struct(img, gdImage, im);
2146
+ c = gdImageColorExactAlpha(im, NUM2INT(r), NUM2INT(g), NUM2INT(b), NUM2INT(a));
2147
+
2148
+ return INT2NUM(c);
2149
+ }
2150
+
2151
+ static VALUE
2152
+ img_color_exact_alpha_str(img, rgbstr, a)
2153
+ VALUE img, rgbstr, a;
2154
+ {
2155
+ gdImagePtr im;
2156
+ int c;
2157
+ VALUE ary;
2158
+
2159
+ Data_Get_Struct(img, gdImage, im);
2160
+
2161
+ ary = hex2triplet(rgbstr);
2162
+ c = gdImageColorExactAlpha(im,
2163
+ NUM2INT(*(RARRAY(ary)->ptr)),
2164
+ NUM2INT(*(RARRAY(ary)->ptr+1)),
2165
+ NUM2INT(*(RARRAY(ary)->ptr+2)),
2166
+ NUM2INT(a));
2167
+ return INT2NUM(c);
2168
+ }
2169
+
2170
+ static VALUE
2171
+ img_color_exact_alpha(argc, argv, img)
2172
+ int argc;
2173
+ VALUE *argv;
2174
+ VALUE img;
2175
+ {
2176
+ int i;
2177
+ VALUE rgbstr, r, g, b, a, retval;
2178
+
2179
+ if (!(argc == 2 || argc == 4))
2180
+ rb_raise(rb_eArgError, "Wrong # of arguments (2 or 4 for %d)", argc);
2181
+
2182
+ switch(TYPE(argv[0])) {
2183
+ case T_STRING:
2184
+ i = rb_scan_args(argc, argv, "20", &rgbstr, &a);
2185
+ retval = img_color_exact_alpha_str(img, rgbstr, a);
2186
+ break;
2187
+ case T_FIXNUM:
2188
+ i = rb_scan_args(argc, argv, "40", &r, &g, &b, &a);
2189
+ retval = img_color_exact_alpha_tri(img, r, g, b, a);
2190
+ break;
2191
+ default:
2192
+ rb_raise(rb_eTypeError, "String or Fixnum expected");
2193
+ break;
2194
+ }
2195
+
2196
+ return retval;
2197
+ }
2198
+
2199
+ static VALUE
2200
+ img_alpha_blending(img, blending_mode)
2201
+ VALUE img, blending_mode;
2202
+ {
2203
+ gdImagePtr im;
2204
+
2205
+ Data_Get_Struct(img, gdImage, im);
2206
+ gdImageAlphaBlending(im, RTEST(blending_mode));
2207
+
2208
+ return img;
2209
+ }
2210
+
2211
+ static VALUE
2212
+ img_alpha(img, color)
2213
+ VALUE img, color;
2214
+ {
2215
+ gdImagePtr im;
2216
+
2217
+ Data_Get_Struct(img, gdImage, im);
2218
+ return INT2NUM(gdImageAlpha(im, NUM2INT(color)));
2219
+ }
2220
+
2221
+
2222
+ static VALUE
2223
+ img_s_truecolor_str(rgbstr)
2224
+ VALUE rgbstr;
2225
+ {
2226
+ int c;
2227
+ VALUE ary;
2228
+ ary = hex2triplet(rgbstr);
2229
+ c = gdTrueColor(NUM2INT(*(RARRAY(ary)->ptr)),
2230
+ NUM2INT(*(RARRAY(ary)->ptr+1)),
2231
+ NUM2INT(*(RARRAY(ary)->ptr+2)));
2232
+
2233
+ return INT2NUM(c);
2234
+ }
2235
+
2236
+ static VALUE
2237
+ img_s_truecolor_tri(r, g, b)
2238
+ VALUE r, g, b;
2239
+ {
2240
+ int c;
2241
+ c = gdTrueColor(NUM2INT(r), NUM2INT(g), NUM2INT(b));
2242
+
2243
+ return INT2NUM(c);
2244
+ }
2245
+
2246
+ static VALUE
2247
+ img_s_truecolor(argc, argv, img)
2248
+ int argc;
2249
+ VALUE *argv;
2250
+ VALUE img;
2251
+ {
2252
+ int i;
2253
+ VALUE rgbstr, r, g, b, retval;
2254
+
2255
+ if (!(argc == 1 || argc == 3))
2256
+ rb_raise(rb_eArgError, "Wrong # of arguments (1 or 3 for %d)", argc);
2257
+
2258
+ switch(TYPE(argv[0])) {
2259
+ case T_STRING:
2260
+ i = rb_scan_args(argc, argv, "10", &rgbstr);
2261
+ retval = img_s_truecolor_str(rgbstr);
2262
+ break;
2263
+ case T_FIXNUM:
2264
+ i = rb_scan_args(argc, argv, "30", &r, &g, &b);
2265
+ retval = img_s_truecolor_tri(r, g, b);
2266
+ break;
2267
+ default:
2268
+ rb_raise(rb_eTypeError, "String or Fixnum expected");
2269
+ break;
2270
+ }
2271
+
2272
+ return retval;
2273
+ }
2274
+
2275
+
2276
+ static VALUE
2277
+ img_s_truecolor_alpha_str(rgbstr, a)
2278
+ VALUE rgbstr, a;
2279
+ {
2280
+ int c;
2281
+ VALUE ary;
2282
+ ary = hex2triplet(rgbstr);
2283
+ c = gdTrueColorAlpha(NUM2INT(*(RARRAY(ary)->ptr)),
2284
+ NUM2INT(*(RARRAY(ary)->ptr+1)),
2285
+ NUM2INT(*(RARRAY(ary)->ptr+2)),
2286
+ NUM2INT(a));
2287
+ return INT2NUM(c);
2288
+ }
2289
+
2290
+ static VALUE
2291
+ img_s_truecolor_alpha_tri(r, g, b, a)
2292
+ VALUE r, g, b, a;
2293
+ {
2294
+ int c;
2295
+ c = gdTrueColorAlpha(NUM2INT(r), NUM2INT(g), NUM2INT(b), NUM2INT(a));
2296
+
2297
+ return INT2NUM(c);
2298
+ }
2299
+
2300
+ static VALUE
2301
+ img_s_truecolor_alpha(argc, argv, img)
2302
+ int argc;
2303
+ VALUE *argv;
2304
+ VALUE img;
2305
+ {
2306
+ int i;
2307
+ VALUE rgbstr, r, g, b, a, retval;
2308
+
2309
+ if (!(argc == 2 || argc == 4))
2310
+ rb_raise(rb_eArgError, "Wrong # of arguments (2 or 4 for %d)", argc);
2311
+
2312
+ switch(TYPE(argv[0])) {
2313
+ case T_STRING:
2314
+ i = rb_scan_args(argc, argv, "20", &rgbstr, &a);
2315
+ retval = img_s_truecolor_alpha_str(rgbstr, a);
2316
+ break;
2317
+ case T_FIXNUM:
2318
+ i = rb_scan_args(argc, argv, "40", &r, &g, &b, &a);
2319
+ retval = img_s_truecolor_alpha_tri(r, g, b, a);
2320
+ break;
2321
+ default:
2322
+ rb_raise(rb_eTypeError, "String or Fixnum expected");
2323
+ break;
2324
+ }
2325
+ return retval;
2326
+ }
2327
+
2328
+ static VALUE
2329
+ img_copy_resampled(img, img2, dx, dy, sx, sy, dw, dh, sw, sh)
2330
+ VALUE img, img2, dx, dy, sx, sy, dw, dh, sw, sh;
2331
+ {
2332
+ gdImagePtr im, im2;
2333
+
2334
+ Data_Get_Struct(img, gdImage, im);
2335
+ image_req(img2);
2336
+ Data_Get_Struct(img2, gdImage, im2);
2337
+
2338
+ if (is_truecolor(im) && (!is_truecolor(im2))){
2339
+ rb_raise(rb_eRuntimeError,
2340
+ "Copying truecolor image to palette image is not permitted");
2341
+ }
2342
+
2343
+ gdImageCopyResampled(im2, im,
2344
+ NUM2INT(dx), NUM2INT(dy),
2345
+ NUM2INT(sx), NUM2INT(sy),
2346
+ NUM2INT(dw), NUM2INT(dh),
2347
+ NUM2INT(sw), NUM2INT(sh));
2348
+ return img;
2349
+ }
2350
+
2351
+ static VALUE
2352
+ img_filled_ellipse(img, cx, cy, w, h, start, end, color)
2353
+ VALUE img, cx, cy, w, h, start, end, color;
2354
+ {
2355
+ gdImagePtr im;
2356
+ Data_Get_Struct(img, gdImage, im);
2357
+ gdImageFilledEllipse(im, NUM2INT(cx), NUM2INT(cy), NUM2INT(w), NUM2INT(h), NUM2INT(color));
2358
+ return img;
2359
+ }
2360
+
2361
+ static VALUE
2362
+ img_filled_arc(img, cx, cy, w, h, start, end, color, style)
2363
+ VALUE img, cx, cy, w, h, start, end, color, style;
2364
+ {
2365
+ gdImagePtr im;
2366
+ Data_Get_Struct(img, gdImage, im);
2367
+ gdImageFilledArc(im, NUM2INT(cx), NUM2INT(cy), NUM2INT(w), NUM2INT(h),
2368
+ NUM2INT(start), NUM2INT(end), NUM2INT(color), NUM2INT(style));
2369
+ return img;
2370
+ }
2371
+
2372
+ static VALUE
2373
+ img_is_truecolor_image(img)
2374
+ VALUE img;
2375
+ {
2376
+ gdImagePtr im;
2377
+ Data_Get_Struct(img, gdImage, im);
2378
+
2379
+ return is_truecolor(im);
2380
+ }
2381
+
2382
+ static VALUE
2383
+ img_is_palette_image(img)
2384
+ VALUE img;
2385
+ {
2386
+ gdImagePtr im;
2387
+ Data_Get_Struct(img, gdImage, im);
2388
+
2389
+ return is_truecolor(im) ? Qfalse : Qtrue;
2390
+ }
2391
+
2392
+ static VALUE
2393
+ img_to_palette_image(img, dither_flag, max_colors)
2394
+ VALUE img, dither_flag, max_colors;
2395
+ {
2396
+ gdImagePtr im;
2397
+ Data_Get_Struct(img, gdImage, im);
2398
+
2399
+ gdImageTrueColorToPalette(im, dither_flag, FIX2INT(max_colors));
2400
+
2401
+ return img;
2402
+ }
2403
+
2404
+ static VALUE
2405
+ img_set_thickness(img, thickness)
2406
+ VALUE img, thickness;
2407
+ {
2408
+ gdImagePtr im;
2409
+ Data_Get_Struct(img, gdImage, im);
2410
+
2411
+ gdImageSetThickness(im, FIX2INT(thickness));
2412
+
2413
+ return img;
2414
+ }
2415
+
2416
+
2417
+
2418
+ #endif /* ENABLE_GD_2_0 */
2419
+
2420
+ void
2421
+ Init_GD()
2422
+ {
2423
+ mGD = rb_define_module("GD");
2424
+ cImage = rb_define_class_under(mGD, "Image", rb_cObject);
2425
+ rb_define_singleton_method(cImage, "new", img_s_new, 2);
2426
+ rb_define_singleton_method(cImage, "newPalette", img_s_new, 2);
2427
+ rb_define_singleton_method(cImage, "newFromPng", img_from_png, 1);
2428
+ rb_define_singleton_method(cImage, "new_from_png", img_from_pngfname, 1);
2429
+
2430
+ rb_define_singleton_method(cImage, "newFromXbm", img_from_xbm, 1);
2431
+ rb_define_singleton_method(cImage, "new_from_xbm", img_from_xbmfname, 1);
2432
+
2433
+ rb_define_singleton_method(cImage, "newFromGd", img_from_gd, 1);
2434
+ rb_define_singleton_method(cImage, "new_from_gd", img_from_gdfname, 1);
2435
+
2436
+ #ifdef HAVE_GDIMAGECREATEFROMXPM
2437
+ rb_define_singleton_method(cImage, "newFromXpm", img_from_xpm, 1);
2438
+ rb_define_singleton_method(cImage, "new_from_xpm", img_from_xpmfname, 1);
2439
+ #endif /* HAVE_GDIMAGECREATEFROMXPM */
2440
+
2441
+ rb_define_singleton_method(cImage, "newFromGd2", img_from_gd2, 1);
2442
+ rb_define_singleton_method(cImage, "new_from_gd2", img_from_gd2fname, 1);
2443
+
2444
+ rb_define_singleton_method(cImage, "newFromGd2Part", img_from_gd2_part, 5);
2445
+ rb_define_singleton_method(cImage, "new_from_gd2_Part", img_from_gd2_partfname, 5);
2446
+
2447
+ #ifdef HAVE_GDIMAGECREATEFROMJPEG
2448
+ rb_define_singleton_method(cImage, "newFromJpeg", img_from_jpeg, 1);
2449
+ rb_define_singleton_method(cImage, "new_from_jpeg", img_from_jpegfname, 1);
2450
+ #endif /* HAVE_GDIMAGECREATEFROMJPEG */
2451
+
2452
+ rb_define_method(cImage, "destroy", img_destroy, 0);
2453
+
2454
+ rb_define_method(cImage, "colorAllocate", img_color_allocate, -1);
2455
+ rb_define_method(cImage, "colorDeallocate", img_color_deallocate, 1);
2456
+ rb_define_method(cImage, "colorClosest", img_color_closest, -1);
2457
+ rb_define_method(cImage, "colorClosestHWB", img_color_closestHWB, -1);
2458
+ rb_define_method(cImage, "colorExact", img_color_exact, -1);
2459
+
2460
+ #ifdef HAVE_GDIMAGECOLORRESOLVE
2461
+ rb_define_method(cImage, "colorResolve", img_color_resolve, -1);
2462
+ #endif /* HAVE_GDIMAGECOLORRESOLVE */
2463
+
2464
+ rb_define_method(cImage, "colorsTotal", img_colors_total, 0);
2465
+ rb_define_method(cImage, "getPixel", img_get_pixel, 2);
2466
+ rb_define_method(cImage, "red", img_red, 1);
2467
+ rb_define_method(cImage, "green", img_green, 1);
2468
+ rb_define_method(cImage, "blue", img_blue, 1);
2469
+ rb_define_method(cImage, "rgb", img_rgb, 1);
2470
+ rb_define_method(cImage, "transparent", img_transparent, 1);
2471
+
2472
+ rb_define_method(cImage, "setBrush", img_set_blush, 1);
2473
+ rb_define_const(mGD, "Brushed", INT2FIX(gdBrushed));
2474
+ rb_define_method(cImage, "setStyle", img_set_style, -1);
2475
+ rb_define_const(mGD, "Styled", INT2FIX(gdStyled));
2476
+ rb_define_const(mGD, "StyledBrushed", INT2FIX(gdStyledBrushed));
2477
+ rb_define_method(cImage, "setTile", img_set_tile, 1);
2478
+ rb_define_const(mGD, "Tiled", INT2FIX(gdTiled));
2479
+ rb_define_const(mGD, "Transparent", INT2FIX(gdTransparent));
2480
+
2481
+ rb_define_const(mGD, "GD2_FMT_COMPRESSED", INT2FIX(GD2_FMT_COMPRESSED));
2482
+ rb_define_const(mGD, "GD2_FMT_RAW", INT2FIX(GD2_FMT_RAW));
2483
+
2484
+ rb_define_method(cImage, "setPixel", img_set_pixel, 3);
2485
+ rb_define_method(cImage, "line", img_line, 5);
2486
+ rb_define_method(cImage, "dashedLine", img_dashed_line, 5);
2487
+ rb_define_method(cImage, "rectangle", img_rectangle, 5);
2488
+ rb_define_method(cImage, "filledRectangle", img_filled_rectangle, 5);
2489
+ rb_define_method(cImage, "polygon", img_polygon, 2);
2490
+ rb_define_method(cImage, "filledPolygon", img_filled_polygon, 2);
2491
+ rb_define_method(cImage, "arc", img_arc, 7);
2492
+ rb_define_method(cImage, "fill", img_fill, 3);
2493
+ rb_define_method(cImage, "fillToBorder", img_fill_to_border, 4);
2494
+ rb_define_method(cImage, "line", img_line, 5);
2495
+
2496
+ rb_define_method(cImage, "copy", img_copy, 7);
2497
+ rb_define_method(cImage, "copyResized", img_copy_resized, 9);
2498
+ rb_define_method(cImage, "copyMerge", img_copy_merge, 8);
2499
+ rb_define_method(cImage, "copyMergeGray", img_copy_merge_gray, 8);
2500
+ rb_define_method(cImage, "paletteCopy", img_palette_copy, 1);
2501
+
2502
+ rb_define_method(cImage, "string", img_string, 5);
2503
+ rb_define_method(cImage, "stringUp", img_string_up, 5);
2504
+
2505
+ #ifdef HAVE_GDIMAGESTRINGTTF
2506
+ rb_define_singleton_method(cImage, "stringTTF", img_s_string_ttf, 7);
2507
+ rb_define_method(cImage, "stringTTF", img_string_ttf, 7);
2508
+ #endif
2509
+
2510
+ #ifdef HAVE_GDIMAGESTRINGFT
2511
+ rb_define_singleton_method(cImage, "stringFT", img_s_string_ft, 7);
2512
+ rb_define_method(cImage, "stringFT", img_string_ft, 7);
2513
+ #endif
2514
+
2515
+ rb_define_method(cImage, "char", img_char, 5);
2516
+ rb_define_method(cImage, "charUp", img_char_up, 5);
2517
+
2518
+ rb_define_method(cImage, "interlace", img_get_interlace, 0);
2519
+ rb_define_method(cImage, "interlace=", img_set_interlace, 1);
2520
+ rb_define_method(cImage, "getTransparent", img_get_transparent, 0);
2521
+
2522
+ rb_define_method(cImage, "bounds", img_bounds, 0);
2523
+ rb_define_method(cImage, "boundsSafe", img_bounds_safe, 2);
2524
+ rb_define_method(cImage, "width", img_width, 0);
2525
+ rb_define_method(cImage, "height", img_height, 0);
2526
+
2527
+ rb_define_method(cImage, "png", img_png, 1);
2528
+ rb_define_method(cImage, "pngStr", img_png_str, 0);
2529
+ rb_define_method(cImage, "gd2", img_gd2, 3);
2530
+ rb_define_method(cImage, "gd", img_gd, 1);
2531
+
2532
+ #ifdef HAVE_GDIMAGECREATEFROMJPEG
2533
+ rb_define_method(cImage, "jpeg", img_jpeg, 2);
2534
+ rb_define_method(cImage, "jpegStr", img_jpeg_str, 1);
2535
+ #endif /* HAVE_GDIMAGECREATEFROMJPEG */
2536
+
2537
+ rb_define_method(cImage, "wbmp", img_wbmp, 2);
2538
+
2539
+ cPolygon = rb_define_class_under(mGD, "Polygon", rb_cObject);
2540
+ rb_define_singleton_method(cPolygon, "new", ply_new, 0);
2541
+
2542
+ rb_define_method(cPolygon, "addPt", ply_add_pt, 2);
2543
+ rb_define_method(cPolygon, "toPt", ply_to_pt, 2);
2544
+ rb_define_method(cPolygon, "getPt", ply_get_pt, 1);
2545
+ rb_define_method(cPolygon, "setPt", ply_set_pt, 3);
2546
+ rb_define_method(cPolygon, "deletePt", ply_delete_pt, 1);
2547
+ rb_define_method(cPolygon, "length", ply_length, 0);
2548
+ rb_define_method(cPolygon, "vertices", ply_vertices, 0);
2549
+ rb_define_method(cPolygon, "bounds", ply_bounds, 0);
2550
+ rb_define_method(cPolygon, "offset", ply_offset, 2);
2551
+ rb_define_method(cPolygon, "map", ply_map, -1);
2552
+ rb_define_method(cPolygon, "transform", ply_transform, 6);
2553
+ rb_define_method(cPolygon, "scale", ply_scale, 2);
2554
+
2555
+ cFont = rb_define_class_under(mGD, "Font", rb_cObject);
2556
+ rb_define_singleton_method(cFont, "new", fnt_s_new, 1);
2557
+
2558
+ rb_define_const(cFont, "GiantFont", fnt_new("Giant"));
2559
+ rb_define_const(cFont, "SmallFont", fnt_new("Small"));
2560
+ rb_define_const(cFont, "LargeFont", fnt_new("Large"));
2561
+ rb_define_const(cFont, "MediumFont", fnt_new("Medium"));
2562
+ rb_define_const(cFont, "MediumBoldFont", fnt_new("Medium"));
2563
+ rb_define_const(cFont, "TinyFont", fnt_new("Tiny"));
2564
+
2565
+ rb_define_method(cFont, "nchars", fnt_nchars, 0);
2566
+ rb_define_method(cFont, "offset", fnt_offset, 0);
2567
+ rb_define_method(cFont, "width", fnt_width, 0);
2568
+ rb_define_method(cFont, "height", fnt_height, 0);
2569
+
2570
+ #ifdef ENABLE_GD_2_0
2571
+
2572
+ rb_define_singleton_method(cImage, "newTrueColor", img_s_new_tc, 2);
2573
+ rb_define_method(cImage, "colorAllocateAlpha", img_color_allocate_alpha, -1);
2574
+ rb_define_method(cImage, "colorResolveAlpha", img_color_resolve_alpha, -1);
2575
+ rb_define_method(cImage, "colorClosestAlpha", img_color_closest_alpha, -1);
2576
+ rb_define_method(cImage, "colorExactAlpha", img_color_exact_alpha, -1);
2577
+ rb_define_method(cImage, "alphaBlending=", img_alpha_blending, 1);
2578
+ rb_define_method(cImage, "alpha", img_alpha, 1);
2579
+
2580
+ rb_define_singleton_method(cImage, "trueColor", img_s_truecolor, -1);
2581
+ rb_define_singleton_method(cImage, "trueColorAlpha", img_s_truecolor_alpha, -1);
2582
+
2583
+ rb_define_method(cImage, "copyResampled", img_copy_resampled, 9);
2584
+ rb_define_method(cImage, "filledEllipse", img_filled_ellipse, 7);
2585
+ rb_define_method(cImage, "filledArc", img_filled_arc, 8);
2586
+ rb_define_method(cImage, "is_trueColor?", img_is_truecolor_image, 0);
2587
+ rb_define_method(cImage, "is_palette?", img_is_palette_image, 0);
2588
+ rb_define_method(cImage, "to_paletteImage", img_to_palette_image, 2);
2589
+ rb_define_method(cImage, "thickness=", img_set_thickness, 1);
2590
+
2591
+ rb_define_const(mGD, "AlphaTransparent", INT2FIX(gdAlphaTransparent));
2592
+ rb_define_const(mGD, "AlphaOpaque", INT2FIX(gdAlphaOpaque));
2593
+
2594
+ rb_define_const(mGD, "Arc", INT2FIX(gdArc));
2595
+ rb_define_const(mGD, "Chord", INT2FIX(gdChord));
2596
+ rb_define_const(mGD, "Pie", INT2FIX(gdPie));
2597
+ rb_define_const(mGD, "NoFill", INT2FIX(gdNoFill));
2598
+ rb_define_const(mGD, "Edged", INT2FIX(gdEdged));
2599
+
2600
+ #endif /* ENABLE_GD_2_0 */
2601
+
2602
+ }