amardaxini-ruby-gd 0.8.0

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