rays 0.1.6 → 0.1.7

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