amardaxini-ruby-gd 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }