rays 0.1.2 → 0.1.3
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/.doc/ext/rays/bitmap.cpp +318 -0
- data/.doc/ext/rays/font.cpp +124 -0
- data/.doc/ext/rays/image.cpp +163 -0
- data/.doc/ext/rays/native.cpp +28 -0
- data/.doc/ext/rays/painter.cpp +554 -0
- data/.doc/ext/rays/rays.cpp +52 -0
- data/.doc/ext/rays/texture.cpp +128 -0
- data/Rakefile +10 -34
- data/VERSION +1 -1
- data/ext/rays/bitmap.cpp +20 -16
- data/ext/rays/{rays.h → defs.h} +4 -13
- data/ext/rays/extconf.rb +28 -18
- data/ext/rays/font.cpp +15 -10
- data/ext/rays/image.cpp +19 -14
- data/ext/rays/native.cpp +5 -1
- data/ext/rays/painter.cpp +44 -39
- data/ext/rays/rays.cpp +8 -15
- data/ext/rays/texture.cpp +17 -12
- data/include/rays.h +2 -1
- data/include/rays/colorspace.h +1 -1
- data/include/rays/defs.h +4 -11
- data/include/rays/exception.h +41 -0
- data/include/rays/painter.h +3 -3
- data/lib/rays/module.rb +9 -1
- data/rays.gemspec +18 -8
- data/src/cocoa/bitmap.mm +3 -0
- data/src/colorspace.cpp +2 -2
- data/src/exception.cpp +49 -0
- data/src/painter.cpp +6 -6
- data/src/texture.cpp +5 -3
- metadata +35 -13
- data/support.rb +0 -54
- data/task/ext.rake +0 -41
- data/task/gem.rake +0 -33
- data/task/git.rake +0 -22
- data/task/lib.rake +0 -54
@@ -0,0 +1,318 @@
|
|
1
|
+
#include "rays/ruby/bitmap.h"
|
2
|
+
|
3
|
+
|
4
|
+
#include <rucy.h>
|
5
|
+
#include "defs.h"
|
6
|
+
|
7
|
+
|
8
|
+
using namespace Rucy;
|
9
|
+
|
10
|
+
using Rays::uchar;
|
11
|
+
using Rays::ushort;
|
12
|
+
using Rays::ulong;
|
13
|
+
using Rays::coord;
|
14
|
+
|
15
|
+
|
16
|
+
namespace Rays
|
17
|
+
{
|
18
|
+
|
19
|
+
|
20
|
+
static Class cBitmap;
|
21
|
+
|
22
|
+
Class
|
23
|
+
bitmap_class ()
|
24
|
+
{
|
25
|
+
return cBitmap;
|
26
|
+
}
|
27
|
+
|
28
|
+
|
29
|
+
}// Rays
|
30
|
+
|
31
|
+
|
32
|
+
namespace Rucy
|
33
|
+
{
|
34
|
+
|
35
|
+
|
36
|
+
Value
|
37
|
+
value (const Rays::Bitmap& bitmap)
|
38
|
+
{
|
39
|
+
return new_type<Rays::Bitmap>(
|
40
|
+
Rays::bitmap_class(), new Rays::Bitmap(bitmap));
|
41
|
+
}
|
42
|
+
|
43
|
+
|
44
|
+
}// Rucy
|
45
|
+
|
46
|
+
|
47
|
+
#define this to<Rays::Bitmap*>(self)
|
48
|
+
|
49
|
+
#define CHECK CHECK_OBJECT(self, Rays::Bitmap, Rays::bitmap_class())
|
50
|
+
|
51
|
+
|
52
|
+
static
|
53
|
+
VALUE alloc(VALUE klass)
|
54
|
+
{
|
55
|
+
return new_type<Rays::Bitmap>(klass, new Rays::Bitmap);
|
56
|
+
}
|
57
|
+
|
58
|
+
static
|
59
|
+
VALUE initialize(VALUE self)
|
60
|
+
{
|
61
|
+
CHECK_OBJ(self, Rays::Bitmap, Rays::bitmap_class());
|
62
|
+
if (argc != 0 && argc != 2 && argc != 3)
|
63
|
+
arg_count_error("Bitmap#initialize", argc, 0, 2, 3);
|
64
|
+
|
65
|
+
if (argc == 0) return self;
|
66
|
+
|
67
|
+
int width = to<int>(argv[0]);
|
68
|
+
int height = to<int>(argv[1]);
|
69
|
+
uint colorspace = (argc == 3) ? to<uint>(argv[2]) : (uint) Rays::RGBA;
|
70
|
+
|
71
|
+
*this = Rays::Bitmap(width, height, (Rays::ColorSpaceType) colorspace);
|
72
|
+
return self;
|
73
|
+
}
|
74
|
+
|
75
|
+
static
|
76
|
+
VALUE width(VALUE self)
|
77
|
+
{
|
78
|
+
CHECK;
|
79
|
+
|
80
|
+
return value(this->width());
|
81
|
+
}
|
82
|
+
|
83
|
+
static
|
84
|
+
VALUE height(VALUE self)
|
85
|
+
{
|
86
|
+
CHECK;
|
87
|
+
|
88
|
+
return value(this->height());
|
89
|
+
}
|
90
|
+
|
91
|
+
static
|
92
|
+
VALUE color_space(VALUE self)
|
93
|
+
{
|
94
|
+
CHECK;
|
95
|
+
|
96
|
+
return value(this->color_space().type());
|
97
|
+
}
|
98
|
+
|
99
|
+
static
|
100
|
+
VALUE at(VALUE self, VALUE x, VALUE y)
|
101
|
+
{
|
102
|
+
CHECK;
|
103
|
+
|
104
|
+
int xx = x.as_i(), yy = y.as_i();
|
105
|
+
void* pixel = this->at<void*>(xx, yy);
|
106
|
+
if (!pixel) error("Bitmap#at(%d, %d) failed.", xx, yy);
|
107
|
+
|
108
|
+
Value array(this->color_space().Bpp() / this->color_space().Bpc(), NULL);
|
109
|
+
if (this->color_space().is_float())
|
110
|
+
{
|
111
|
+
float* p = (float*) pixel;
|
112
|
+
switch (this->color_space().type())
|
113
|
+
{
|
114
|
+
case Rays::GRAY_float:
|
115
|
+
array.push(p[0]);
|
116
|
+
break;
|
117
|
+
case Rays::RGB_float:
|
118
|
+
array.push(p[0]).push(p[1]).push(p[2]);
|
119
|
+
break;
|
120
|
+
case Rays::RGBA_float:
|
121
|
+
array.push(p[0]).push(p[1]).push(p[2]).push(p[3]);
|
122
|
+
break;
|
123
|
+
case Rays::ARGB_float:
|
124
|
+
array.push(p[1]).push(p[2]).push(p[3]).push(p[0]);
|
125
|
+
break;
|
126
|
+
case Rays::BGR_float:
|
127
|
+
array.push(p[2]).push(p[1]).push(p[0]);
|
128
|
+
break;
|
129
|
+
case Rays::BGRA_float:
|
130
|
+
array.push(p[2]).push(p[1]).push(p[0]).push(p[3]);
|
131
|
+
break;
|
132
|
+
case Rays::ABGR_float:
|
133
|
+
array.push(p[3]).push(p[2]).push(p[1]).push(p[0]);
|
134
|
+
break;
|
135
|
+
default:
|
136
|
+
error("Bitmap#at: unknown color space");
|
137
|
+
}
|
138
|
+
}
|
139
|
+
else
|
140
|
+
{
|
141
|
+
uchar* p = (uchar*) pixel;
|
142
|
+
switch (this->color_space().type())
|
143
|
+
{
|
144
|
+
case Rays::GRAY_8:
|
145
|
+
array.push(*(uchar*) pixel);
|
146
|
+
break;
|
147
|
+
case Rays::GRAY_16:
|
148
|
+
array.push(*(ushort*) pixel);
|
149
|
+
break;
|
150
|
+
case Rays::GRAY_32:
|
151
|
+
array.push(*(ulong*) pixel);
|
152
|
+
break;
|
153
|
+
case Rays::RGB_888:
|
154
|
+
array.push(p[0]).push(p[1]).push(p[2]);
|
155
|
+
break;
|
156
|
+
case Rays::RGBA_8888:
|
157
|
+
array.push(p[0]).push(p[1]).push(p[2]).push(p[3]);
|
158
|
+
break;
|
159
|
+
case Rays::ARGB_8888:
|
160
|
+
array.push(p[1]).push(p[2]).push(p[3]).push(p[0]);
|
161
|
+
break;
|
162
|
+
case Rays::RGBX_8888:
|
163
|
+
array.push(p[0]).push(p[1]).push(p[2]);
|
164
|
+
break;
|
165
|
+
case Rays::XRGB_8888:
|
166
|
+
array.push(p[1]).push(p[2]).push(p[3]);
|
167
|
+
break;
|
168
|
+
case Rays::BGR_888:
|
169
|
+
array.push(p[2]).push(p[1]).push(p[0]);
|
170
|
+
break;
|
171
|
+
case Rays::BGRA_8888:
|
172
|
+
array.push(p[2]).push(p[1]).push(p[0]).push(p[3]);
|
173
|
+
break;
|
174
|
+
case Rays::ABGR_8888:
|
175
|
+
array.push(p[3]).push(p[2]).push(p[1]).push(p[0]);
|
176
|
+
break;
|
177
|
+
case Rays::BGRX_8888:
|
178
|
+
array.push(p[2]).push(p[1]).push(p[0]);
|
179
|
+
break;
|
180
|
+
case Rays::XBGR_8888:
|
181
|
+
array.push(p[3]).push(p[2]).push(p[1]);
|
182
|
+
break;
|
183
|
+
default:
|
184
|
+
error("Bitmap#at: unknown color space");
|
185
|
+
}
|
186
|
+
}
|
187
|
+
|
188
|
+
return array;
|
189
|
+
}
|
190
|
+
|
191
|
+
static
|
192
|
+
VALUE assign_at(VALUE self, VALUE x, VALUE y, VALUE color)
|
193
|
+
{
|
194
|
+
CHECK;
|
195
|
+
|
196
|
+
int xx = x.as_i(), yy = y.as_i();
|
197
|
+
void* pixel = this->at<void*>(xx, yy);
|
198
|
+
if (!pixel) error("Bitmap#assign_at(%d, %d) failed.", xx, yy);
|
199
|
+
|
200
|
+
Value array(this->color_space().Bpp() / this->color_space().Bpc(), NULL);
|
201
|
+
if (this->color_space().is_float())
|
202
|
+
{
|
203
|
+
float* p = (float*) pixel;
|
204
|
+
switch (this->color_space().type())
|
205
|
+
{
|
206
|
+
#define C(n) ((float) color[n].as_f())
|
207
|
+
case Rays::GRAY_float:
|
208
|
+
p[0] = C(0);
|
209
|
+
break;
|
210
|
+
case Rays::RGB_float:
|
211
|
+
p[0] = C(0); p[1] = C(1); p[2] = C(2);
|
212
|
+
break;
|
213
|
+
case Rays::RGBA_float:
|
214
|
+
p[0] = C(0); p[1] = C(1); p[2] = C(2); p[3] = C(3);
|
215
|
+
break;
|
216
|
+
case Rays::ARGB_float:
|
217
|
+
p[0] = C(1); p[1] = C(2); p[2] = C(3); p[3] = C(0);
|
218
|
+
break;
|
219
|
+
case Rays::BGR_float:
|
220
|
+
p[0] = C(2); p[1] = C(1); p[2] = C(0);
|
221
|
+
break;
|
222
|
+
case Rays::BGRA_float:
|
223
|
+
p[0] = C(2); p[1] = C(1); p[2] = C(0); p[3] = C(3);
|
224
|
+
break;
|
225
|
+
case Rays::ABGR_float:
|
226
|
+
p[0] = C(3); p[1] = C(2); p[2] = C(1); p[3] = C(0);
|
227
|
+
break;
|
228
|
+
#undef C
|
229
|
+
default:
|
230
|
+
error("Bitmap#at: unknown color space");
|
231
|
+
}
|
232
|
+
}
|
233
|
+
else
|
234
|
+
{
|
235
|
+
uchar* p = (uchar*) pixel;
|
236
|
+
switch (this->color_space().type())
|
237
|
+
{
|
238
|
+
#define C(n) ((uchar) color[n].as_i())
|
239
|
+
case Rays::GRAY_8:
|
240
|
+
*(uchar*) pixel = C(0);
|
241
|
+
break;
|
242
|
+
case Rays::GRAY_16:
|
243
|
+
*(ushort*) pixel = C(0);
|
244
|
+
break;
|
245
|
+
case Rays::GRAY_32:
|
246
|
+
*(ulong*) pixel = C(0);
|
247
|
+
break;
|
248
|
+
case Rays::RGB_888:
|
249
|
+
p[0] = C(0); p[1] = C(1); p[2] = C(2);
|
250
|
+
break;
|
251
|
+
case Rays::RGBA_8888:
|
252
|
+
p[0] = C(0); p[1] = C(1); p[2] = C(2); p[3] = C(3);
|
253
|
+
break;
|
254
|
+
case Rays::ARGB_8888:
|
255
|
+
p[0] = C(1); p[1] = C(2); p[2] = C(3); p[3] = C(0);
|
256
|
+
break;
|
257
|
+
case Rays::RGBX_8888:
|
258
|
+
p[0] = C(0); p[1] = C(1); p[2] = C(2);
|
259
|
+
break;
|
260
|
+
case Rays::XRGB_8888:
|
261
|
+
p[0] = C(1); p[1] = C(2); p[2] = C(3);
|
262
|
+
break;
|
263
|
+
case Rays::BGR_888:
|
264
|
+
p[0] = C(2); p[1] = C(1); p[2] = C(0);
|
265
|
+
break;
|
266
|
+
case Rays::BGRA_8888:
|
267
|
+
p[0] = C(2); p[1] = C(1); p[2] = C(0); p[3] = C(3);
|
268
|
+
break;
|
269
|
+
case Rays::ABGR_8888:
|
270
|
+
p[0] = C(3); p[1] = C(2); p[2] = C(1); p[3] = C(0);
|
271
|
+
break;
|
272
|
+
case Rays::BGRX_8888:
|
273
|
+
p[0] = C(2); p[1] = C(1); p[2] = C(0);
|
274
|
+
break;
|
275
|
+
case Rays::XBGR_8888:
|
276
|
+
p[0] = C(3); p[1] = C(2); p[2] = C(1);
|
277
|
+
break;
|
278
|
+
#undef C
|
279
|
+
default:
|
280
|
+
error("Bitmap#at: unknown color space");
|
281
|
+
}
|
282
|
+
}
|
283
|
+
|
284
|
+
return color;
|
285
|
+
}
|
286
|
+
|
287
|
+
|
288
|
+
static
|
289
|
+
VALUE load(VALUE self, VALUE path)
|
290
|
+
{
|
291
|
+
Rays::Bitmap bmp;
|
292
|
+
if (!Rays::load_bitmap(&bmp, path.c_str()))
|
293
|
+
error("Bitmap.load('%s') failed.", path.c_str());
|
294
|
+
|
295
|
+
return value(bmp);
|
296
|
+
}
|
297
|
+
|
298
|
+
|
299
|
+
void
|
300
|
+
Init_bitmap ()
|
301
|
+
{
|
302
|
+
Module m = rb_define_module("Rays");
|
303
|
+
|
304
|
+
m.define_const("RGB", Rays::RGB);
|
305
|
+
m.define_const("RGBA", Rays::RGBA);
|
306
|
+
|
307
|
+
Class c = rb_define_class_under(m, "Bitmap", rb_cObject);
|
308
|
+
Rays::cBitmap = c;
|
309
|
+
|
310
|
+
rb_define_alloc_func(c, alloc);
|
311
|
+
rb_define_method(c, "initialize", RUBY_METHOD_FUNC(initialize), -1);
|
312
|
+
rb_define_method(c, "width", RUBY_METHOD_FUNC(width), 0);
|
313
|
+
rb_define_method(c, "height", RUBY_METHOD_FUNC(height), 0);
|
314
|
+
rb_define_method(c, "color_space", RUBY_METHOD_FUNC(color_space), 0);
|
315
|
+
c.define_method("[]", at);
|
316
|
+
c.define_method("[]=", assign_at);
|
317
|
+
rb_define_function(c, "load", RUBY_METHOD_FUNC(load), 1);
|
318
|
+
}
|
@@ -0,0 +1,124 @@
|
|
1
|
+
#include "rays/ruby/font.h"
|
2
|
+
|
3
|
+
|
4
|
+
#include <rucy.h>
|
5
|
+
#include "defs.h"
|
6
|
+
|
7
|
+
|
8
|
+
using namespace Rucy;
|
9
|
+
|
10
|
+
using Rays::coord;
|
11
|
+
|
12
|
+
|
13
|
+
namespace Rays
|
14
|
+
{
|
15
|
+
|
16
|
+
|
17
|
+
static Class cFont;
|
18
|
+
|
19
|
+
Class
|
20
|
+
font_class ()
|
21
|
+
{
|
22
|
+
return cFont;
|
23
|
+
}
|
24
|
+
|
25
|
+
|
26
|
+
}// Rays
|
27
|
+
|
28
|
+
|
29
|
+
namespace Rucy
|
30
|
+
{
|
31
|
+
|
32
|
+
|
33
|
+
Value
|
34
|
+
value (const Rays::Font& font)
|
35
|
+
{
|
36
|
+
return new_type<Rays::Font>(
|
37
|
+
Rays::font_class(), new Rays::Font(font));
|
38
|
+
}
|
39
|
+
|
40
|
+
|
41
|
+
}// Rucy
|
42
|
+
|
43
|
+
|
44
|
+
#define this to<Rays::Font*>(self)
|
45
|
+
|
46
|
+
#define CHECK CHECK_OBJECT(self, Rays::Font, Rays::font_class())
|
47
|
+
|
48
|
+
|
49
|
+
static
|
50
|
+
VALUE alloc(VALUE klass)
|
51
|
+
{
|
52
|
+
return new_type<Rays::Font>(klass, new Rays::Font);
|
53
|
+
}
|
54
|
+
|
55
|
+
static
|
56
|
+
VALUE initialize(VALUE self)
|
57
|
+
{
|
58
|
+
CHECK_OBJ(self, Rays::Font, Rays::font_class());
|
59
|
+
if (argc < 0 || 2 < argc)
|
60
|
+
arg_count_error("Font#initialize", argc, 0, 1, 2);
|
61
|
+
|
62
|
+
const char* name = (argc >= 1) ? argv[0].c_str() : NULL;
|
63
|
+
float size = (argc >= 2) ? to<float>(argv[1]) : 0;
|
64
|
+
*this = Rays::Font(name, size);
|
65
|
+
|
66
|
+
return self;
|
67
|
+
}
|
68
|
+
|
69
|
+
static
|
70
|
+
VALUE name(VALUE self)
|
71
|
+
{
|
72
|
+
CHECK;
|
73
|
+
|
74
|
+
return value(this->name().c_str());
|
75
|
+
}
|
76
|
+
|
77
|
+
static
|
78
|
+
VALUE size(VALUE self)
|
79
|
+
{
|
80
|
+
CHECK;
|
81
|
+
|
82
|
+
return value(this->size());
|
83
|
+
}
|
84
|
+
|
85
|
+
static
|
86
|
+
VALUE width(VALUE self, VALUE str)
|
87
|
+
{
|
88
|
+
CHECK;
|
89
|
+
|
90
|
+
coord width = 0;
|
91
|
+
if (!this->get_extent(&width, NULL, str.c_str()))
|
92
|
+
error("Font#width(%s) failed.", str.inspect().c_str());
|
93
|
+
|
94
|
+
return value(width);
|
95
|
+
}
|
96
|
+
|
97
|
+
static
|
98
|
+
VALUE height(VALUE self)
|
99
|
+
{
|
100
|
+
CHECK;
|
101
|
+
|
102
|
+
coord height = 0;
|
103
|
+
if (!this->get_extent(NULL, &height, NULL))
|
104
|
+
error("Font#height() failed.");
|
105
|
+
|
106
|
+
return value(height);
|
107
|
+
}
|
108
|
+
|
109
|
+
|
110
|
+
void
|
111
|
+
Init_font ()
|
112
|
+
{
|
113
|
+
Module m = rb_define_module("Rays");
|
114
|
+
|
115
|
+
Class c = rb_define_class_under(m, "Font", rb_cObject);
|
116
|
+
Rays::cFont = c;
|
117
|
+
|
118
|
+
rb_define_alloc_func(c, alloc);
|
119
|
+
rb_define_method(c, "initialize", RUBY_METHOD_FUNC(initialize), -1);
|
120
|
+
rb_define_method(c, "name", RUBY_METHOD_FUNC(name), 0);
|
121
|
+
rb_define_method(c, "size", RUBY_METHOD_FUNC(size), 0);
|
122
|
+
rb_define_method(c, "width", RUBY_METHOD_FUNC(width), 1);
|
123
|
+
rb_define_method(c, "height", RUBY_METHOD_FUNC(height), 0);
|
124
|
+
}
|
@@ -0,0 +1,163 @@
|
|
1
|
+
#include "rays/ruby/image.h"
|
2
|
+
|
3
|
+
|
4
|
+
#include <rucy.h>
|
5
|
+
#include <rays/ruby/bitmap.h>
|
6
|
+
#include <rays/ruby/texture.h>
|
7
|
+
#include "defs.h"
|
8
|
+
|
9
|
+
|
10
|
+
using namespace Rucy;
|
11
|
+
|
12
|
+
using Rays::coord;
|
13
|
+
|
14
|
+
|
15
|
+
namespace Rays
|
16
|
+
{
|
17
|
+
|
18
|
+
|
19
|
+
static Class cImage;
|
20
|
+
|
21
|
+
Class
|
22
|
+
image_class ()
|
23
|
+
{
|
24
|
+
return cImage;
|
25
|
+
}
|
26
|
+
|
27
|
+
|
28
|
+
}// Rays
|
29
|
+
|
30
|
+
|
31
|
+
namespace Rucy
|
32
|
+
{
|
33
|
+
|
34
|
+
|
35
|
+
Value
|
36
|
+
value (const Rays::Image& image)
|
37
|
+
{
|
38
|
+
return new_type<Rays::Image>(
|
39
|
+
Rays::image_class(), new Rays::Image(image));
|
40
|
+
}
|
41
|
+
|
42
|
+
|
43
|
+
}// Rucy
|
44
|
+
|
45
|
+
|
46
|
+
#define this to<Rays::Image*>(self)
|
47
|
+
|
48
|
+
#define CHECK CHECK_OBJECT(self, Rays::Image, Rays::image_class())
|
49
|
+
|
50
|
+
|
51
|
+
static
|
52
|
+
VALUE alloc(VALUE klass)
|
53
|
+
{
|
54
|
+
return new_type<Rays::Image>(klass, new Rays::Image);
|
55
|
+
}
|
56
|
+
|
57
|
+
static
|
58
|
+
VALUE initialize(VALUE self)
|
59
|
+
{
|
60
|
+
CHECK_OBJ(self, Rays::Image, Rays::image_class());
|
61
|
+
if (argc != 0 && argc != 1 && argc != 2 && argc != 3)
|
62
|
+
arg_count_error("Image#initialize", argc, 0, 1, 2, 3);
|
63
|
+
|
64
|
+
if (argc == 0) return self;
|
65
|
+
|
66
|
+
if (argv[1].is_kind_of(Rays::bitmap_class()))
|
67
|
+
{
|
68
|
+
if (argc != 1 && argc != 2)
|
69
|
+
arg_count_error("Image#initialize", argc, 0, 1, 2, 3);
|
70
|
+
|
71
|
+
const Rays::Bitmap& bitmap = *to<Rays::Bitmap*>(argv[1]);
|
72
|
+
bool alphaonly = (argc == 2) ? to<bool>(argv[2]) : false;
|
73
|
+
*this = Rays::Image(bitmap, alphaonly);
|
74
|
+
}
|
75
|
+
else
|
76
|
+
{
|
77
|
+
int width = to<int>(argv[0]);
|
78
|
+
int height = to<int>(argv[1]);
|
79
|
+
uint colorspace = (argc == 3) ? to<uint>(argv[2]) : (uint) Rays::RGBA;
|
80
|
+
*this = Rays::Image(width, height, (Rays::ColorSpaceType) colorspace);
|
81
|
+
}
|
82
|
+
|
83
|
+
return self;
|
84
|
+
}
|
85
|
+
|
86
|
+
static
|
87
|
+
VALUE width(VALUE self)
|
88
|
+
{
|
89
|
+
CHECK;
|
90
|
+
|
91
|
+
return value(this->width());
|
92
|
+
}
|
93
|
+
|
94
|
+
static
|
95
|
+
VALUE height(VALUE self)
|
96
|
+
{
|
97
|
+
CHECK;
|
98
|
+
|
99
|
+
return value(this->height());
|
100
|
+
}
|
101
|
+
|
102
|
+
static
|
103
|
+
VALUE color_space(VALUE self)
|
104
|
+
{
|
105
|
+
CHECK;
|
106
|
+
|
107
|
+
return value(this->color_space().type());
|
108
|
+
}
|
109
|
+
|
110
|
+
static
|
111
|
+
VALUE bitmap(VALUE self)
|
112
|
+
{
|
113
|
+
CHECK;
|
114
|
+
|
115
|
+
return value(this->bitmap());
|
116
|
+
}
|
117
|
+
|
118
|
+
static
|
119
|
+
VALUE texture(VALUE self)
|
120
|
+
{
|
121
|
+
CHECK;
|
122
|
+
|
123
|
+
return value(this->texture());
|
124
|
+
}
|
125
|
+
|
126
|
+
|
127
|
+
static
|
128
|
+
VALUE load(VALUE self)
|
129
|
+
{
|
130
|
+
if (argc != 1 && argc != 2) arg_count_error("Image.load", argc, 1, 2);
|
131
|
+
|
132
|
+
Rays::String path = argv[0].c_str();
|
133
|
+
bool alphaonly = (argc == 2) ? to<bool>(argv[1]) : false;
|
134
|
+
|
135
|
+
Rays::Image img;
|
136
|
+
if (!Rays::load_image(&img, path.c_str(), alphaonly))
|
137
|
+
{
|
138
|
+
error(
|
139
|
+
"Image.load('%s', %s) failed.",
|
140
|
+
path.c_str(), alphaonly ? "true" : "false");
|
141
|
+
}
|
142
|
+
|
143
|
+
return value(img);
|
144
|
+
}
|
145
|
+
|
146
|
+
|
147
|
+
void
|
148
|
+
Init_image ()
|
149
|
+
{
|
150
|
+
Module m = rb_define_module("Rays");
|
151
|
+
|
152
|
+
Class c = rb_define_class_under(m, "Image", rb_cObject);
|
153
|
+
Rays::cImage = c;
|
154
|
+
|
155
|
+
rb_define_alloc_func(c, alloc);
|
156
|
+
rb_define_method(c, "initialize", RUBY_METHOD_FUNC(initialize), -1);
|
157
|
+
rb_define_method(c, "width", RUBY_METHOD_FUNC(width), 0);
|
158
|
+
rb_define_method(c, "height", RUBY_METHOD_FUNC(height), 0);
|
159
|
+
rb_define_method(c, "color_space", RUBY_METHOD_FUNC(color_space), 0);
|
160
|
+
rb_define_method(c, "bitmap", RUBY_METHOD_FUNC(bitmap), 0);
|
161
|
+
rb_define_method(c, "texture", RUBY_METHOD_FUNC(texture), 0);
|
162
|
+
rb_define_function(c, "load", RUBY_METHOD_FUNC(load), -1);
|
163
|
+
}
|