rays 0.1.6 → 0.1.7

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.
Files changed (113) hide show
  1. checksums.yaml +7 -0
  2. data/.doc/ext/rays/bitmap.cpp +70 -233
  3. data/.doc/ext/rays/bounds.cpp +339 -57
  4. data/.doc/ext/rays/color.cpp +58 -48
  5. data/.doc/ext/rays/color_space.cpp +174 -0
  6. data/.doc/ext/rays/font.cpp +31 -53
  7. data/.doc/ext/rays/image.cpp +64 -67
  8. data/.doc/ext/rays/matrix.cpp +22 -50
  9. data/.doc/ext/rays/native.cpp +9 -2
  10. data/.doc/ext/rays/painter.cpp +276 -259
  11. data/.doc/ext/rays/point.cpp +186 -52
  12. data/.doc/ext/rays/rays.cpp +25 -20
  13. data/.doc/ext/rays/shader.cpp +61 -0
  14. data/.doc/ext/rays/texture.cpp +47 -59
  15. data/{README → README.md} +0 -0
  16. data/Rakefile +6 -5
  17. data/VERSION +1 -1
  18. data/ext/rays/bitmap.cpp +88 -248
  19. data/ext/rays/bounds.cpp +437 -141
  20. data/ext/rays/color.cpp +79 -69
  21. data/ext/rays/color_space.cpp +185 -0
  22. data/ext/rays/extconf.rb +14 -63
  23. data/ext/rays/font.cpp +44 -65
  24. data/ext/rays/image.cpp +82 -81
  25. data/ext/rays/matrix.cpp +32 -60
  26. data/ext/rays/native.cpp +9 -2
  27. data/ext/rays/painter.cpp +345 -321
  28. data/ext/rays/point.cpp +212 -69
  29. data/ext/rays/rays.cpp +29 -23
  30. data/ext/rays/shader.cpp +63 -0
  31. data/ext/rays/texture.cpp +64 -74
  32. data/include/rays/bitmap.h +21 -12
  33. data/include/rays/bounds.h +67 -9
  34. data/include/rays/color.h +23 -7
  35. data/include/rays/{colorspace.h → color_space.h} +6 -3
  36. data/include/rays/exception.h +17 -11
  37. data/include/rays/font.h +4 -3
  38. data/include/rays/image.h +11 -6
  39. data/include/rays/matrix.h +15 -12
  40. data/include/rays/opengl.h +54 -1
  41. data/include/rays/painter.h +98 -108
  42. data/include/rays/point.h +45 -5
  43. data/include/rays/rays.h +2 -2
  44. data/include/rays/ruby/bitmap.h +2 -16
  45. data/include/rays/ruby/bounds.h +4 -16
  46. data/include/rays/ruby/color.h +3 -16
  47. data/include/rays/ruby/color_space.h +27 -0
  48. data/include/rays/ruby/font.h +2 -16
  49. data/include/rays/ruby/image.h +2 -16
  50. data/include/rays/ruby/matrix.h +2 -16
  51. data/include/rays/ruby/painter.h +2 -16
  52. data/include/rays/ruby/point.h +3 -16
  53. data/include/rays/ruby/shader.h +27 -0
  54. data/include/rays/ruby/texture.h +2 -16
  55. data/include/rays/ruby.h +1 -0
  56. data/include/rays/shader.h +48 -0
  57. data/include/rays/texture.h +13 -2
  58. data/include/rays.h +2 -1
  59. data/lib/rays/bitmap.rb +20 -11
  60. data/lib/rays/bounds.rb +29 -68
  61. data/lib/rays/color.rb +39 -0
  62. data/lib/rays/color_space.rb +33 -0
  63. data/lib/rays/font.rb +29 -0
  64. data/lib/rays/image.rb +22 -0
  65. data/lib/rays/module.rb +11 -7
  66. data/lib/rays/painter.rb +103 -40
  67. data/lib/rays/point.rb +19 -36
  68. data/lib/rays/shader.rb +13 -0
  69. data/lib/rays/texture.rb +9 -0
  70. data/lib/rays.rb +4 -0
  71. data/rays.gemspec +3 -4
  72. data/src/bounds.cpp +272 -63
  73. data/src/color.cpp +168 -21
  74. data/src/{colorspace.cpp → color_space.cpp} +38 -1
  75. data/src/exception.cpp +24 -15
  76. data/src/frame_buffer.cpp +275 -0
  77. data/src/frame_buffer.h +79 -0
  78. data/src/image.cpp +80 -36
  79. data/src/ios/bitmap.mm +340 -0
  80. data/src/ios/font.mm +206 -0
  81. data/src/{cocoa → ios}/helper.h +2 -2
  82. data/src/{cocoa → ios}/helper.mm +0 -0
  83. data/src/ios/opengl.mm +21 -0
  84. data/src/ios/program.cpp +122 -0
  85. data/src/{cocoa → ios}/rays.mm +8 -7
  86. data/src/matrix.cpp +10 -22
  87. data/src/opengl.cpp +64 -0
  88. data/src/{cocoa → osx}/bitmap.mm +121 -70
  89. data/src/{cocoa → osx}/font.mm +32 -24
  90. data/src/osx/helper.h +26 -0
  91. data/src/osx/helper.mm +25 -0
  92. data/src/osx/opengl.mm +103 -0
  93. data/src/osx/rays.mm +43 -0
  94. data/src/painter.cpp +596 -422
  95. data/src/point.cpp +154 -11
  96. data/src/program.cpp +513 -0
  97. data/src/program.h +73 -0
  98. data/src/render_buffer.cpp +120 -0
  99. data/src/render_buffer.h +47 -0
  100. data/src/shader.cpp +117 -0
  101. data/src/texture.cpp +104 -134
  102. data/test/helper.rb +10 -3
  103. data/test/test_bitmap.rb +18 -0
  104. data/test/test_bounds.rb +81 -35
  105. data/test/test_color.rb +29 -2
  106. data/test/test_image.rb +63 -0
  107. data/test/test_painter.rb +120 -0
  108. data/test/test_point.rb +30 -9
  109. data/test/test_shader.rb +37 -0
  110. data/test/test_texture.rb +18 -0
  111. metadata +75 -58
  112. data/.gitignore +0 -14
  113. data/ChangeLog +0 -8
data/ext/rays/painter.cpp CHANGED
@@ -2,11 +2,13 @@
2
2
 
3
3
 
4
4
  #include <rucy.h>
5
- #include <rays/ruby/bounds.h>
6
- #include <rays/ruby/color.h>
7
- #include <rays/ruby/matrix.h>
8
- #include <rays/ruby/font.h>
9
- #include <rays/ruby/image.h>
5
+ #include "rays/ruby/point.h"
6
+ #include "rays/ruby/bounds.h"
7
+ #include "rays/ruby/color.h"
8
+ #include "rays/ruby/matrix.h"
9
+ #include "rays/ruby/font.h"
10
+ #include "rays/ruby/image.h"
11
+ #include "rays/ruby/shader.h"
10
12
  #include "defs.h"
11
13
 
12
14
 
@@ -17,55 +19,22 @@ using Rays::coord;
17
19
 
18
20
  static Class cPainter;
19
21
 
22
+ RUCY_DEFINE_VALUE_FROM_TO(Rays::Painter, cPainter)
20
23
 
21
- namespace Rays
22
- {
23
-
24
-
25
- Class
26
- painter_class ()
27
- {
28
- return cPainter;
29
- }
30
-
31
-
32
- }// Rays
33
-
34
-
35
- namespace Rucy
36
- {
37
-
38
-
39
- Value
40
- value (const Rays::Painter& obj)
41
- {
42
- return new_type(cPainter, new Rays::Painter(obj));
43
- }
44
-
45
- Value
46
- value (const Rays::Painter* obj)
47
- {
48
- return obj ? value(*obj) : nil();
49
- }
50
-
51
-
52
- }// Rucy
53
-
24
+ #define THIS to<Rays::Painter*>(self)
54
25
 
55
- #define THIS to<Rays::Painter*>(self)
56
-
57
- #define CHECK RUCY_CHECK_OBJECT(self, Rays::Painter, cPainter)
26
+ #define CHECK RUCY_CHECK_OBJECT(Rays::Painter, cPainter, self)
58
27
 
59
28
 
60
29
  static
61
- RUBY_DEF_ALLOC(alloc, klass)
30
+ RUCY_DEF_ALLOC(alloc, klass)
62
31
  {
63
32
  return new_type<Rays::Painter>(klass);
64
33
  }
65
- RUBY_END
34
+ RUCY_END
66
35
 
67
36
  static
68
- RUBY_DEF4(canvas, x, y, width, height)
37
+ RUCY_DEF4(canvas, x, y, width, height)
69
38
  {
70
39
  CHECK;
71
40
 
@@ -73,156 +42,155 @@ RUBY_DEF4(canvas, x, y, width, height)
73
42
  coord yy = to<coord>(y);
74
43
  coord ww = to<coord>(width);
75
44
  coord hh = to<coord>(height);
76
- if (!THIS->canvas(xx, yy, ww, hh))
77
- rays_error("Painter#canvas(%f, %f, %f, %f) failed.", xx, yy, ww, hh);
45
+ THIS->canvas(xx, yy, ww, hh);
78
46
 
79
47
  return self;
80
48
  }
81
- RUBY_END
49
+ RUCY_END
82
50
 
83
51
  static
84
- RUBY_DEF0(begin_paint)
52
+ RUCY_DEF0(begin_paint)
85
53
  {
86
54
  CHECK;
87
-
88
- if (!THIS->begin())
89
- rays_error("Painter#begin_paint() failed.");
90
-
55
+ THIS->begin();
91
56
  return self;
92
57
  }
93
- RUBY_END
58
+ RUCY_END
94
59
 
95
60
  static
96
- RUBY_DEF0(end_paint)
61
+ RUCY_DEF0(end_paint)
97
62
  {
98
63
  CHECK;
99
-
100
- if (!THIS->end())
101
- rays_error("Painter#end_paint() failed.");
102
-
64
+ THIS->end();
103
65
  return self;
104
66
  }
105
- RUBY_END
67
+ RUCY_END
106
68
 
107
69
 
108
70
  static
109
- RUBY_DEF4(line, x1_, y1_, x2_, y2_)
71
+ RUCY_DEFN(line)
110
72
  {
111
73
  CHECK;
74
+ check_arg_count(__FILE__, __LINE__, "Painter#line", argc, 2, 4);
112
75
 
113
- coord x1 = to<coord>(x1_);
114
- coord y1 = to<coord>(y1_);
115
- coord x2 = to<coord>(x2_);
116
- coord y2 = to<coord>(y2_);
117
- if (!THIS->line(x1, y1, x2, y2))
118
- rays_error("Painter#line(%f, %f, %f, %f) failed.", x1, y1, x2, y2);
76
+ if (argc == 2)
77
+ THIS->line(to<Rays::Point&>(argv[0]), to<Rays::Point&>(argv[1]));
78
+ else
79
+ {
80
+ coord x1 = to<coord>(argv[0]);
81
+ coord y1 = to<coord>(argv[1]);
82
+ coord x2 = to<coord>(argv[2]);
83
+ coord y2 = to<coord>(argv[3]);
84
+ THIS->line(x1, y1, x2, y2);
85
+ }
119
86
 
120
87
  return self;
121
88
  }
122
- RUBY_END
89
+ RUCY_END
123
90
 
124
91
  static
125
- RUBY_DEF4(rect, x, y, width, height)
92
+ RUCY_DEFN(rect)
126
93
  {
127
94
  CHECK;
95
+ check_arg_count(__FILE__, __LINE__, "Painter#rect", argc, 1, 4);
128
96
 
129
- coord xx = to<coord>(x);
130
- coord yy = to<coord>(y);
131
- coord ww = to<coord>(width);
132
- coord hh = to<coord>(height);
133
- if (!THIS->rect(xx, yy, ww, hh))
134
- rays_error("Painter#rect(%f, %f, %f, %f) failed.", xx, yy, ww, hh);
97
+ if (argc == 1)
98
+ THIS->rect(to<Rays::Bounds&>(argv[0]));
99
+ else
100
+ {
101
+ coord x = to<coord>(argv[0]);
102
+ coord y = to<coord>(argv[1]);
103
+ coord w = to<coord>(argv[2]);
104
+ coord h = to<coord>(argv[3]);
105
+ THIS->rect(x, y, w, h);
106
+ }
135
107
 
136
108
  return self;
137
109
  }
138
- RUBY_END
110
+ RUCY_END
139
111
 
140
112
  static
141
- RUBY_DEFN(ellipse)
113
+ RUCY_DEFN(ellipse)
142
114
  {
143
115
  CHECK;
144
- if (argc < 3 || 6 < argc)
145
- arg_count_error("Painter#ellipse", argc, 4, 5, 6);
116
+ check_arg_count(__FILE__, __LINE__, "Painter#ellipse", argc, 1, 2, 3, 4, 5, 6);
146
117
 
147
- coord xx = to<coord>(argv[0]);
148
- coord yy = to<coord>(argv[1]);
149
- coord ww = to<coord>(argv[2]);
150
- coord hh = (argc >= 4) ? to<coord>(argv[3]) : 0;
151
- coord min_ = (argc >= 5) ? to<coord>(argv[4]) : 0;
152
- uint nseg = (argc >= 6) ? to<uint>(argv[5]) : 0;
153
- if (!THIS->ellipse(xx, yy, ww, hh, min_, nseg))
118
+ if (argv[0].is_kind_of(Rays::bounds_class()))
154
119
  {
155
- rays_error(
156
- "Painter#ellipse(%f, %f, %f, %f, %f, %d) failed.",
157
- xx, yy, ww, hh, min_, nseg);
120
+ const Rays::Bounds& b = to<Rays::Bounds&>(argv[0]);
121
+ coord min_ = (argc >= 2) ? to<coord>(argv[1]) : 0;
122
+ uint nseg = (argc >= 3) ? to<uint> (argv[2]) : 0;
123
+ THIS->ellipse(b, min_, nseg);
124
+ }
125
+ else
126
+ {
127
+ coord x = to<coord>(argv[0]);
128
+ coord y = to<coord>(argv[1]);
129
+ coord w = to<coord>(argv[2]);
130
+ coord h = (argc >= 4) ? to<coord>(argv[3]) : 0;
131
+ coord min_ = (argc >= 5) ? to<coord>(argv[4]) : 0;
132
+ uint nseg = (argc >= 6) ? to<uint> (argv[5]) : 0;
133
+ THIS->ellipse(x, y, w, h, min_, nseg);
158
134
  }
159
135
 
160
136
  return self;
161
137
  }
162
- RUBY_END
138
+ RUCY_END
163
139
 
164
140
  static
165
- RUBY_DEFN(arc)
141
+ RUCY_DEFN(arc)
166
142
  {
167
143
  CHECK;
168
- if (argc < 3 || 8 < argc)
169
- arg_count_error("Painter#ellipse", argc, 4, 5, 6, 7, 8);
144
+ check_arg_count(__FILE__, __LINE__, "Painter#ellipse", argc, 1, 2, 3, 4, 5, 6, 7, 8);
170
145
 
171
- coord xx = to<coord>(argv[0]);
172
- coord yy = to<coord>(argv[1]);
173
- coord ww = to<coord>(argv[2]);
174
- coord hh = (argc >= 4) ? to<coord>(argv[3]) : 0;
175
- float from = (argc >= 5) ? to<float>(argv[4]) : 0;
176
- float to_ = (argc >= 6) ? to<float>(argv[5]) : 360;
177
- coord min_ = (argc >= 7) ? to<coord>(argv[6]) : 0;
178
- uint nseg = (argc >= 8) ? to<uint>(argv[7]) : 0;
179
- if (!THIS->arc(xx, yy, ww, hh, from, to_, min_, nseg))
146
+ if (argv[0].is_kind_of(Rays::bounds_class()))
147
+ {
148
+ const Rays::Bounds& b = to<Rays::Bounds&>(argv[0]);
149
+ float from = (argc >= 2) ? to<float>(argv[1]) : 0;
150
+ float to_ = (argc >= 3) ? to<float>(argv[2]) : 360;
151
+ coord min_ = (argc >= 4) ? to<coord>(argv[3]) : 0;
152
+ uint nseg = (argc >= 5) ? to<uint> (argv[4]) : 0;
153
+ THIS->arc(b, from, to_, min_, nseg);
154
+ }
155
+ else
180
156
  {
181
- rays_error(
182
- "Painter#arc(%f, %f, %f, %f, %f, %f, %f, %d) failed.",
183
- xx, yy, ww, hh, from, to_, min_, nseg);
157
+ coord x = to<coord>(argv[0]);
158
+ coord y = to<coord>(argv[1]);
159
+ coord w = to<coord>(argv[2]);
160
+ coord h = (argc >= 4) ? to<coord>(argv[3]) : 0;
161
+ float from = (argc >= 5) ? to<float>(argv[4]) : 0;
162
+ float to_ = (argc >= 6) ? to<float>(argv[5]) : 360;
163
+ coord min_ = (argc >= 7) ? to<coord>(argv[6]) : 0;
164
+ uint nseg = (argc >= 8) ? to<uint> (argv[7]) : 0;
165
+ THIS->arc(x, y, w, h, from, to_, min_, nseg);
184
166
  }
185
167
 
186
168
  return self;
187
169
  }
188
- RUBY_END
170
+ RUCY_END
189
171
 
190
172
  static
191
- RUBY_DEFN(image)
173
+ RUCY_DEFN(image)
192
174
  {
193
175
  CHECK;
194
- if (argc != 1 && argc != 3 && argc != 5 && argc != 7 && argc != 9)
195
- arg_count_error("Painter#image", argc, 1, 3, 5, 7, 9);
176
+ check_arg_count(__FILE__, __LINE__, "Painter#image", argc, 1, 3, 5, 7, 9);
196
177
 
197
178
  const Rays::Image* image = to<Rays::Image*>(argv[0]);
198
179
  if (!image)
199
- argument_error("%s is not an image.", argv[0].inspect().c_str());
180
+ argument_error(__FILE__, __LINE__, "%s is not an image.", argv[0].inspect().c_str());
200
181
 
201
182
  if (argc == 1)
202
- {
203
- if (!THIS->image(*image))
204
- rays_error("Painter#image(%s) failed.", argv[0].inspect().c_str());
205
- }
183
+ THIS->image(*image);
206
184
  else if (argc == 3)
207
185
  {
208
186
  coord x = to<coord>(argv[1]), y = to<coord>(argv[2]);
209
- if (!THIS->image(*image, x, y))
210
- {
211
- rays_error(
212
- "Painter#image(%s, %f, %f) failed.",
213
- argv[0].inspect().c_str(), x, y);
214
- }
187
+ THIS->image(*image, x, y);
215
188
  }
216
189
  else if (argc == 5)
217
190
  {
218
191
  coord x = to<coord>(argv[1]), w = to<coord>(argv[3]);
219
192
  coord y = to<coord>(argv[2]), h = to<coord>(argv[4]);
220
- if (!THIS->image(*image, x, y, w, h))
221
- {
222
- rays_error(
223
- "Painter#image(%s, %f, %f, %f, %f) failed.",
224
- argv[0].inspect().c_str(), x, y, w, h);
225
- }
193
+ THIS->image(*image, x, y, w, h);
226
194
  }
227
195
  else if (argc == 7)
228
196
  {
@@ -230,12 +198,7 @@ RUBY_DEFN(image)
230
198
  coord sy = to<coord>(argv[2]), dy = to<coord>(argv[6]);
231
199
  coord sw = to<coord>(argv[3]);
232
200
  coord sh = to<coord>(argv[4]);
233
- if (!THIS->image(*image, sx, sy, sw, sh, dx, dy))
234
- {
235
- rays_error(
236
- "Painter#image(%s, %f, %f, %f, %f, %f, %f) failed.",
237
- argv[0].inspect().c_str(), sx, sy, sw, sh, dx, dy);
238
- }
201
+ THIS->image(*image, sx, sy, sw, sh, dx, dy);
239
202
  }
240
203
  else if (argc == 9)
241
204
  {
@@ -243,98 +206,85 @@ RUBY_DEFN(image)
243
206
  coord sy = to<coord>(argv[2]), dy = to<coord>(argv[6]);
244
207
  coord sw = to<coord>(argv[3]), dw = to<coord>(argv[7]);
245
208
  coord sh = to<coord>(argv[4]), dh = to<coord>(argv[8]);
246
- if (!THIS->image(*image, sx, sy, sw, sh, dx, dy, dw, dh))
247
- {
248
- rays_error(
249
- "Painter#image(%s, %f, %f, %f, %f, %f, %f, %f, %f) failed.",
250
- argv[0].inspect().c_str(), sx, sy, sw, sh, dx, dy, dw, dh);
251
- }
209
+ THIS->image(*image, sx, sy, sw, sh, dx, dy, dw, dh);
252
210
  }
253
211
 
254
212
  return self;
255
213
  }
256
- RUBY_END
214
+ RUCY_END
257
215
 
258
216
  static
259
- RUBY_DEFN(text)
217
+ RUCY_DEFN(text)
260
218
  {
261
219
  CHECK;
262
- if (argc != 1 && argc != 3 && argc != 4 && argc != 5 && argc != 7)
263
- arg_count_error("Painter#text", argc, 1, 3, 4, 5, 7);
220
+ check_arg_count(__FILE__, __LINE__, "Painter#text", argc, 1, 3, 4, 5, 7);
264
221
 
265
222
  if (argc == 1)
266
- {
267
- if (!THIS->text(argv[0].c_str()))
268
- rays_error("Painter#text(%s) failed.", argv[0].inspect().c_str());
269
- }
223
+ THIS->text(argv[0].c_str());
270
224
  else if (argc == 3)
271
225
  {
272
226
  coord x = to<coord>(argv[1]), y = to<coord>(argv[2]);
273
- if (!THIS->text(argv[0].c_str(), x, y))
274
- {
275
- rays_error(
276
- "Painter#text(%s, %f, %f) failed.",
277
- argv[0].inspect().c_str(), x, y);
278
- }
227
+ THIS->text(argv[0].c_str(), x, y);
279
228
  }
280
229
  else if (argc == 4)
281
230
  {
282
231
  const Rays::Font* font = to<Rays::Font*>(argv[3]);
283
232
  if (!font || !*font)
284
- rays_error("Painter#text: invalid font.");
233
+ rays_error(__FILE__, __LINE__, "Painter#text: invalid font.");
285
234
 
286
235
  coord x = to<coord>(argv[1]), y = to<coord>(argv[2]);
287
- if (!THIS->text(argv[0].c_str(), x, y, font))
288
- {
289
- rays_error(
290
- "Painter#image(%s, %f, %f, %s) failed.",
291
- argv[0].inspect().c_str(), x, y, argv[3].inspect().c_str());
292
- }
236
+ THIS->text(argv[0].c_str(), x, y, font);
293
237
  }
294
238
  else if (argc == 5)
295
239
  {
296
240
  coord x = to<coord>(argv[1]), w = to<coord>(argv[3]);
297
241
  coord y = to<coord>(argv[2]), h = to<coord>(argv[4]);
298
- if (!THIS->text(argv[0].c_str(), x, y, w, h))
299
- {
300
- rays_error(
301
- "Painter#text(%s, %f, %f, %f, %f) failed.",
302
- argv[0].inspect().c_str(), x, y, w, h);
303
- }
242
+ THIS->text(argv[0].c_str(), x, y, w, h);
304
243
  }
305
244
  else if (argc == 7)
306
245
  {
307
246
  const Rays::Font* font = to<Rays::Font*>(argv[3]);
308
247
  if (!font || !*font)
309
- rays_error("Painter#text: invalid font.");
248
+ rays_error(__FILE__, __LINE__, "Painter#text: invalid font.");
310
249
 
311
250
  coord x = to<coord>(argv[1]), w = to<coord>(argv[3]);
312
251
  coord y = to<coord>(argv[2]), h = to<coord>(argv[4]);
313
- if (!THIS->text(argv[0].c_str(), x, y, w, h, font))
314
- {
315
- rays_error(
316
- "Painter#image(%s, %f, %f, %f, %f, %s) failed.",
317
- argv[0].inspect().c_str(), x, y, w, h, argv[3].inspect().c_str());
318
- }
252
+ THIS->text(argv[0].c_str(), x, y, w, h, font);
319
253
  }
320
254
 
321
255
  return self;
322
256
  }
323
- RUBY_END
257
+ RUCY_END
258
+
259
+ static
260
+ RUCY_DEF0(clear)
261
+ {
262
+ CHECK;
263
+ THIS->clear();
264
+ }
265
+ RUCY_END
266
+
267
+ static
268
+ RUCY_DEF0(bounds)
269
+ {
270
+ CHECK;
271
+ return value(THIS->bounds());
272
+ }
273
+ RUCY_END
324
274
 
325
275
  static
326
- RUBY_DEFN(set_background)
276
+ RUCY_DEFN(set_background)
327
277
  {
328
278
  CHECK;
329
- if (argc < 1 || 4 < argc)
330
- arg_count_error("Painter#set_background", argc, 1, 2, 3, 4);
279
+ check_arg_count(__FILE__, __LINE__, "Painter#set_background", argc, 1, 2, 3, 4);
331
280
 
332
- if (argc == 1 || argc == 2)
281
+ if (argc == 1 && argv[0].is_kind_of(Rays::color_class()))
282
+ THIS->set_background(to<Rays::Color&>(argv[0]));
283
+ else if (argc == 1 || argc == 2)
333
284
  {
334
285
  float v = to<float>(argv[0]);
335
286
  float a = (argc >= 2) ? to<float>(argv[1]) : 1;
336
- if (!THIS->set_background(v, v, v, a))
337
- rays_error("Painter#set_background(%f, %f) failed.", v, a);
287
+ THIS->set_background(v, v, v, a);
338
288
  }
339
289
  else
340
290
  {
@@ -342,48 +292,43 @@ RUBY_DEFN(set_background)
342
292
  float g = to<float>(argv[1]);
343
293
  float b = to<float>(argv[2]);
344
294
  float a = (argc == 4) ? to<float>(argv[3]) : 1;
345
- if (!THIS->set_background(r, g, b, a))
346
- rays_error("Painter#set_background(%f, %f, %f, %f) failed.", r, g, b, a);
295
+ THIS->set_background(r, g, b, a);
347
296
  }
348
297
 
349
298
  return self;
350
299
  }
351
- RUBY_END
300
+ RUCY_END
352
301
 
353
302
  static
354
- RUBY_DEF0(no_background)
303
+ RUCY_DEF0(no_background)
355
304
  {
356
305
  CHECK;
357
-
358
- if (!THIS->no_background())
359
- rays_error("Painter#no_clear() failed.");
360
-
306
+ THIS->no_background();
361
307
  return self;
362
308
  }
363
- RUBY_END
309
+ RUCY_END
364
310
 
365
311
  static
366
- RUBY_DEF0(get_background)
312
+ RUCY_DEF0(get_background)
367
313
  {
368
314
  CHECK;
369
-
370
315
  return value(THIS->background());
371
316
  }
372
- RUBY_END
317
+ RUCY_END
373
318
 
374
319
  static
375
- RUBY_DEFN(set_fill)
320
+ RUCY_DEFN(set_fill)
376
321
  {
377
322
  CHECK;
378
- if (argc < 1 || 4 < argc)
379
- arg_count_error("Painter#set_fill", argc, 1, 2, 3, 4);
323
+ check_arg_count(__FILE__, __LINE__, "Painter#set_fill", argc, 1, 2, 3, 4);
380
324
 
381
- if (argc == 1 || argc == 2)
325
+ if (argc == 1 && argv[0].is_kind_of(Rays::color_class()))
326
+ THIS->set_fill(to<Rays::Color&>(argv[0]));
327
+ else if (argc == 1 || argc == 2)
382
328
  {
383
329
  float v = to<float>(argv[0]);
384
330
  float a = (argc >= 2) ? to<float>(argv[1]) : 1;
385
- if (!THIS->set_fill(v, v, v, a))
386
- rays_error("Painter#set_fill(%f, %f) failed.", v, a);
331
+ THIS->set_fill(v, v, v, a);
387
332
  }
388
333
  else
389
334
  {
@@ -391,48 +336,43 @@ RUBY_DEFN(set_fill)
391
336
  float g = to<float>(argv[1]);
392
337
  float b = to<float>(argv[2]);
393
338
  float a = (argc == 4) ? to<float>(argv[3]) : 1;
394
- if (!THIS->set_fill(r, g, b, a))
395
- rays_error("Painter#set_fill(%f, %f, %f, %f) failed.", r, g, b, a);
339
+ THIS->set_fill(r, g, b, a);
396
340
  }
397
341
 
398
342
  return self;
399
343
  }
400
- RUBY_END
344
+ RUCY_END
401
345
 
402
346
  static
403
- RUBY_DEF0(no_fill)
347
+ RUCY_DEF0(no_fill)
404
348
  {
405
349
  CHECK;
406
-
407
- if (!THIS->no_fill())
408
- rays_error("Painter#no_fill() failed.");
409
-
350
+ THIS->no_fill();
410
351
  return self;
411
352
  }
412
- RUBY_END
353
+ RUCY_END
413
354
 
414
355
  static
415
- RUBY_DEF0(get_fill)
356
+ RUCY_DEF0(get_fill)
416
357
  {
417
358
  CHECK;
418
-
419
359
  return value(THIS->fill());
420
360
  }
421
- RUBY_END
361
+ RUCY_END
422
362
 
423
363
  static
424
- RUBY_DEFN(set_stroke)
364
+ RUCY_DEFN(set_stroke)
425
365
  {
426
366
  CHECK;
427
- if (argc < 1 || 4 < argc)
428
- arg_count_error("Painter#set_stroke", argc, 1, 2, 3, 4);
367
+ check_arg_count(__FILE__, __LINE__, "Painter#set_stroke", argc, 1, 2, 3, 4);
429
368
 
430
- if (argc == 1 || argc == 2)
369
+ if (argc == 1 && argv[0].is_kind_of(Rays::color_class()))
370
+ THIS->set_stroke(to<Rays::Color&>(argv[0]));
371
+ else if (argc == 1 || argc == 2)
431
372
  {
432
373
  float v = to<float>(argv[0]);
433
374
  float a = (argc >= 2) ? to<float>(argv[1]) : 1;
434
- if (!THIS->set_stroke(v, v, v, a))
435
- rays_error("Painter#set_stroke(%f, %f) failed.", v, a);
375
+ THIS->set_stroke(v, v, v, a);
436
376
  }
437
377
  else
438
378
  {
@@ -440,161 +380,234 @@ RUBY_DEFN(set_stroke)
440
380
  float g = to<float>(argv[1]);
441
381
  float b = to<float>(argv[2]);
442
382
  float a = (argc == 4) ? to<float>(argv[3]) : 1;
443
- if (!THIS->set_stroke(r, g, b, a))
444
- rays_error("Painter#set_stroke(%f, %f, %f, %f) failed.", r, g, b, a);
383
+ THIS->set_stroke(r, g, b, a);
445
384
  }
446
385
 
447
386
  return self;
448
387
  }
449
- RUBY_END
388
+ RUCY_END
450
389
 
451
390
  static
452
- RUBY_DEF0(no_stroke)
391
+ RUCY_DEF0(no_stroke)
453
392
  {
454
393
  CHECK;
455
-
456
- if (!THIS->no_stroke())
457
- rays_error("Painter#no_stroke() failed.");
458
-
394
+ THIS->no_stroke();
459
395
  return self;
460
396
  }
461
- RUBY_END
397
+ RUCY_END
462
398
 
463
399
  static
464
- RUBY_DEF0(get_stroke)
400
+ RUCY_DEF0(get_stroke)
465
401
  {
466
402
  CHECK;
467
-
468
403
  return value(THIS->stroke());
469
404
  }
470
- RUBY_END
405
+ RUCY_END
471
406
 
472
407
  static
473
- RUBY_DEF4(set_clip, x, y, width, height)
408
+ RUCY_DEFN(set_clip)
474
409
  {
475
410
  CHECK;
411
+ check_arg_count(__FILE__, __LINE__, "Painter#set_clip", argc, 1, 4);
476
412
 
477
- coord xx = to<coord>(x), ww = to<coord>(width);
478
- coord yy = to<coord>(y), hh = to<coord>(height);
479
- if (!THIS->set_clip(xx, yy, ww, hh))
480
- rays_error("Painter#set_clip(%f, %f, %f, %f) failed.", xx, yy, ww, hh);
413
+ if (argc == 1)
414
+ THIS->set_clip(to<Rays::Bounds&>(argv[0]));
415
+ else
416
+ {
417
+ coord x = to<coord>(argv[0]);
418
+ coord y = to<coord>(argv[1]);
419
+ coord w = to<coord>(argv[2]);
420
+ coord h = to<coord>(argv[3]);
421
+ THIS->set_clip(x, y, w, h);
422
+ }
481
423
 
482
424
  return self;
483
425
  }
484
- RUBY_END
426
+ RUCY_END
485
427
 
486
428
  static
487
- RUBY_DEF0(no_clip)
429
+ RUCY_DEF0(no_clip)
488
430
  {
489
431
  CHECK;
490
-
491
- if (!THIS->no_clip())
492
- rays_error("Painter#no_clip() failed.");
493
-
432
+ THIS->no_clip();
494
433
  return self;
495
434
  }
496
- RUBY_END
435
+ RUCY_END
497
436
 
498
437
  static
499
- RUBY_DEF0(get_clip)
438
+ RUCY_DEF0(get_clip)
500
439
  {
501
440
  CHECK;
502
-
503
441
  return value(THIS->clip());
504
442
  }
505
- RUBY_END
443
+ RUCY_END
506
444
 
507
445
  static
508
- RUBY_DEF1(set_font, font)
446
+ RUCY_DEFN(set_font)
509
447
  {
510
448
  CHECK;
449
+ check_arg_count(__FILE__, __LINE__, "Painter#set_font", argc, 0, 1, 2);
511
450
 
512
- const Rays::Font* f = font.is_nil()
513
- ? &Rays::default_font()
514
- : to<Rays::Font*>(font);
515
- if (!f || !*f) argument_error();
451
+ if (argc == 0 || argv[0].is_kind_of(Rays::font_class()))
452
+ {
453
+ const Rays::Font* f = argc == 0
454
+ ? &Rays::default_font()
455
+ : to<Rays::Font*>(argv[0]);
456
+ if (!f || !*f)
457
+ argument_error(__FILE__, __LINE__);
516
458
 
517
- if (!THIS->set_font(*f))
518
- rays_error("Painter#set_font(%s) failed.", font.inspect().c_str());
459
+ THIS->set_font(*f);
460
+ }
461
+ else
462
+ {
463
+ const char* name = argv[0].c_str();
464
+ coord size = argc >= 2 ? to<coord>(argv[1]) : 0;
465
+ THIS->set_font(name, size);
466
+ }
519
467
 
520
468
  return self;
521
469
  }
522
- RUBY_END
470
+ RUCY_END
523
471
 
524
472
  static
525
- RUBY_DEF0(get_font)
473
+ RUCY_DEF0(get_font)
526
474
  {
527
475
  CHECK;
528
-
529
476
  return value(THIS->font());
530
477
  }
531
- RUBY_END
478
+ RUCY_END
479
+
480
+ static
481
+ RUCY_DEF0(push_attr)
482
+ {
483
+ CHECK;
484
+ THIS->push_attr();
485
+ return self;
486
+ }
487
+ RUCY_END
532
488
 
533
489
  static
534
- RUBY_DEF0(push_attrs)
490
+ RUCY_DEF0(pop_attr)
535
491
  {
536
492
  CHECK;
493
+ THIS->pop_attr();
494
+ return self;
495
+ }
496
+ RUCY_END
497
+
537
498
 
538
- if (!THIS->push_attrs())
539
- rays_error("Painter#push_attrs() failed.");
499
+ static
500
+ RUCY_DEF1(attach_shader, shader)
501
+ {
502
+ CHECK;
503
+ THIS->attach(to<Rays::Shader&>(shader));
504
+ return self;
505
+ }
506
+ RUCY_END
540
507
 
508
+ static
509
+ RUCY_DEF1(detach_shader, shader)
510
+ {
511
+ CHECK;
512
+ THIS->detach(to<Rays::Shader&>(shader));
541
513
  return self;
542
514
  }
543
- RUBY_END
515
+ RUCY_END
544
516
 
545
517
  static
546
- RUBY_DEF0(pop_attrs)
518
+ RUCY_DEFN(set_uniform)
547
519
  {
548
520
  CHECK;
521
+ check_arg_count(__FILE__, __LINE__, "Painter#set_uniform", argc, 2, 3, 4, 5);
522
+
523
+ #define Ai(n) (argv[n].as_i())
524
+ #define Af(n) ((float) argv[n].as_f())
525
+
526
+ const char* name = argv[0].c_str();
527
+ if (argv[1].is_i())
528
+ {
529
+ switch (argc)
530
+ {
531
+ case 2: THIS->set_uniform(name, Ai(1)); break;
532
+ case 3: THIS->set_uniform(name, Ai(1), Ai(2)); break;
533
+ case 4: THIS->set_uniform(name, Ai(1), Ai(2), Ai(3)); break;
534
+ case 5: THIS->set_uniform(name, Ai(1), Ai(2), Ai(3), Ai(4)); break;
535
+ }
536
+ }
537
+ else if (argv[1].is_f())
538
+ {
539
+ switch (argc)
540
+ {
541
+ case 2: THIS->set_uniform(name, Af(1)); break;
542
+ case 3: THIS->set_uniform(name, Af(1), Af(2)); break;
543
+ case 4: THIS->set_uniform(name, Af(1), Af(2), Af(3)); break;
544
+ case 5: THIS->set_uniform(name, Af(1), Af(2), Af(3), Af(4)); break;
545
+ }
546
+ }
547
+ else
548
+ argument_error(__FILE__, __LINE__);
549
+
550
+ #undef Ai
551
+ #undef Af
552
+
553
+ return self;
554
+ }
555
+ RUCY_END
549
556
 
550
- if (!THIS->pop_attrs())
551
- rays_error("Painter#pop_attrs() failed.");
557
+ static
558
+ RUCY_DEF0(push_shader)
559
+ {
560
+ CHECK;
561
+ THIS->push_shader();
562
+ return self;
563
+ }
564
+ RUCY_END
552
565
 
566
+ static
567
+ RUCY_DEF0(pop_shader)
568
+ {
569
+ CHECK;
570
+ THIS->pop_shader();
553
571
  return self;
554
572
  }
555
- RUBY_END
573
+ RUCY_END
556
574
 
557
575
 
558
576
  static
559
- RUBY_DEFN(translate)
577
+ RUCY_DEFN(translate)
560
578
  {
561
579
  CHECK;
562
- if (argc < 2 || 3 < argc)
563
- arg_count_error("Painter#translate", argc, 2, 3);
580
+ check_arg_count(__FILE__, __LINE__, "Painter#translate", argc, 2, 3);
564
581
 
565
582
  coord xx = to<coord>(argv[0]);
566
583
  coord yy = to<coord>(argv[1]);
567
584
  coord zz = (argc >= 3) ? to<coord>(argv[2]) : 0;
568
- if (!THIS->translate(xx, yy, zz))
569
- rays_error("Painter#translate(%f %f %f) failed.", xx, yy, zz);
585
+ THIS->translate(xx, yy, zz);
570
586
 
571
587
  return self;
572
588
  }
573
- RUBY_END
589
+ RUCY_END
574
590
 
575
591
  static
576
- RUBY_DEFN(scale)
592
+ RUCY_DEFN(scale)
577
593
  {
578
594
  CHECK;
579
- if (argc < 2 || 3 < argc)
580
- arg_count_error("Painter#scale", argc, 2, 3);
595
+ check_arg_count(__FILE__, __LINE__, "Painter#scale", argc, 2, 3);
581
596
 
582
597
  coord xx = to<coord>(argv[0]);
583
598
  coord yy = to<coord>(argv[1]);
584
599
  coord zz = (argc >= 3) ? to<coord>(argv[2]) : 1;
585
- if (!THIS->scale(xx, yy, zz))
586
- rays_error("Painter#scale(%f %f %f) failed.", xx, yy, zz);
600
+ THIS->scale(xx, yy, zz);
587
601
 
588
602
  return self;
589
603
  }
590
- RUBY_END
604
+ RUCY_END
591
605
 
592
606
  static
593
- RUBY_DEFN(rotate)
607
+ RUCY_DEFN(rotate)
594
608
  {
595
609
  CHECK;
596
- if (argc != 1 && argc != 3 && argc != 4)
597
- arg_count_error("Painter#rotate", argc, 1, 3, 4);
610
+ check_arg_count(__FILE__, __LINE__, "Painter#rotate", argc, 1, 3, 4);
598
611
 
599
612
  coord aa = to<coord>(argv[0]), xx = 0, yy = 0, zz = 1;
600
613
  if (argc >= 3)
@@ -604,57 +617,46 @@ RUBY_DEFN(rotate)
604
617
  zz = argc >= 4 ? to<coord>(argv[3]) : 0;
605
618
  }
606
619
 
607
- if (!THIS->rotate(aa, xx, yy, zz))
608
- rays_error("Painter#rotate(%f %f %f %f) failed.", aa, xx, yy, zz);
620
+ THIS->rotate(aa, xx, yy, zz);
609
621
 
610
622
  return self;
611
623
  }
612
- RUBY_END
624
+ RUCY_END
613
625
 
614
626
  static
615
- RUBY_DEFN(set_matrix)
627
+ RUCY_DEFN(set_matrix)
616
628
  {
617
629
  CHECK;
618
-
619
- if (!THIS->set_matrix())
620
- rays_error("Painter#set_matrix() failed.");
621
-
630
+ THIS->set_matrix();
622
631
  return self;
623
632
  }
624
- RUBY_END
633
+ RUCY_END
625
634
 
626
635
  static
627
- RUBY_DEF0(get_matrix)
636
+ RUCY_DEF0(get_matrix)
628
637
  {
629
638
  CHECK;
630
-
631
639
  return value(THIS->matrix());
632
640
  }
633
- RUBY_END
641
+ RUCY_END
634
642
 
635
643
  static
636
- RUBY_DEF0(push_matrix)
644
+ RUCY_DEF0(push_matrix)
637
645
  {
638
646
  CHECK;
639
-
640
- if (!THIS->push_matrix())
641
- rays_error("Painter#push_matrix() failed.");
642
-
647
+ THIS->push_matrix();
643
648
  return self;
644
649
  }
645
- RUBY_END
650
+ RUCY_END
646
651
 
647
652
  static
648
- RUBY_DEF0(pop_matrix)
653
+ RUCY_DEF0(pop_matrix)
649
654
  {
650
655
  CHECK;
651
-
652
- if (!THIS->pop_matrix())
653
- rays_error("Painter#pop_matrix() failed.");
654
-
656
+ THIS->pop_matrix();
655
657
  return self;
656
658
  }
657
- RUBY_END
659
+ RUCY_END
658
660
 
659
661
 
660
662
  void
@@ -666,8 +668,8 @@ Init_painter ()
666
668
  cPainter.define_alloc_func(alloc);
667
669
 
668
670
  cPainter.define_method("canvas", canvas);
669
- cPainter.define_method("begin_paint", begin_paint);
670
- cPainter.define_method("end_paint", end_paint);
671
+ cPainter.define_private_method("begin_paint", begin_paint);
672
+ cPainter.define_private_method("end_paint", end_paint);
671
673
 
672
674
  cPainter.define_method("line", line);
673
675
  cPainter.define_method("rect", rect);
@@ -676,28 +678,50 @@ Init_painter ()
676
678
  cPainter.define_method("image", image);
677
679
  cPainter.define_method("text", text);
678
680
 
679
- cPainter.define_method("set_background", set_background);
680
- cPainter.define_method("no_background", no_background);
681
- cPainter.define_method("get_background", get_background);
682
- cPainter.define_method("set_fill", set_fill);
683
- cPainter.define_method("no_fill", no_fill);
684
- cPainter.define_method("get_fill", get_fill);
685
- cPainter.define_method("set_stroke", set_stroke);
686
- cPainter.define_method("no_stroke", no_stroke);
687
- cPainter.define_method("get_stroke", get_stroke);
688
- cPainter.define_method("set_clip", set_clip);
689
- cPainter.define_method("no_clip", no_clip);
690
- cPainter.define_method("get_clip", get_clip);
691
- cPainter.define_method("set_font", set_font);
692
- cPainter.define_method("get_font", get_font);
693
- cPainter.define_method("push_attrs", push_attrs);
694
- cPainter.define_method("pop_attrs", pop_attrs);
681
+ cPainter.define_method("clear", clear);
682
+ cPainter.define_method("bounds", bounds);
683
+ cPainter.define_private_method("set_background", set_background);
684
+ cPainter.define_private_method("get_background", get_background);
685
+ cPainter.define_method( "no_background", no_background);
686
+ cPainter.define_private_method("set_fill", set_fill);
687
+ cPainter.define_private_method("get_fill", get_fill);
688
+ cPainter.define_method( "no_fill", no_fill);
689
+ cPainter.define_private_method("set_stroke", set_stroke);
690
+ cPainter.define_private_method("get_stroke", get_stroke);
691
+ cPainter.define_method( "no_stroke", no_stroke);
692
+ cPainter.define_private_method("set_clip", set_clip);
693
+ cPainter.define_private_method("get_clip", get_clip);
694
+ cPainter.define_method( "no_clip", no_clip);
695
+ cPainter.define_private_method("set_font", set_font);
696
+ cPainter.define_private_method("get_font", get_font);
697
+ cPainter.define_method("push_attr", push_attr);
698
+ cPainter.define_method("pop_attr", pop_attr);
699
+
700
+ cPainter.define_private_method("attach_shader", attach_shader);
701
+ cPainter.define_private_method("detach_shader", detach_shader);
702
+ cPainter.define_private_method("set_uniform", set_uniform);
703
+ cPainter.define_method("push_shader", push_shader);
704
+ cPainter.define_method("pop_shader", pop_shader);
695
705
 
696
706
  cPainter.define_method("translate", translate);
697
- cPainter.define_method("scale", push_matrix);
698
- cPainter.define_method("rotate", push_matrix);
699
- cPainter.define_method("set_matrix", push_matrix);
700
- cPainter.define_method("get_matrix", push_matrix);
707
+ cPainter.define_method("scale", scale);
708
+ cPainter.define_method("rotate", rotate);
709
+ cPainter.define_private_method("set_matrix", set_matrix);
710
+ cPainter.define_private_method("get_matrix", get_matrix);
701
711
  cPainter.define_method("push_matrix", push_matrix);
702
712
  cPainter.define_method("pop_matrix", pop_matrix);
703
713
  }
714
+
715
+
716
+ namespace Rays
717
+ {
718
+
719
+
720
+ Class
721
+ painter_class ()
722
+ {
723
+ return cPainter;
724
+ }
725
+
726
+
727
+ }// Rays