rays 0.1.12 → 0.1.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (155) hide show
  1. checksums.yaml +5 -5
  2. data/.doc/ext/rays/bitmap.cpp +22 -76
  3. data/.doc/ext/rays/bounds.cpp +95 -125
  4. data/.doc/ext/rays/color.cpp +224 -45
  5. data/.doc/ext/rays/color_space.cpp +137 -45
  6. data/.doc/ext/rays/defs.cpp +183 -0
  7. data/.doc/ext/rays/font.cpp +39 -21
  8. data/.doc/ext/rays/image.cpp +26 -37
  9. data/.doc/ext/rays/matrix.cpp +186 -29
  10. data/.doc/ext/rays/native.cpp +12 -6
  11. data/.doc/ext/rays/noise.cpp +53 -0
  12. data/.doc/ext/rays/painter.cpp +120 -308
  13. data/.doc/ext/rays/point.cpp +82 -77
  14. data/.doc/ext/rays/polygon.cpp +287 -0
  15. data/.doc/ext/rays/polygon_line.cpp +96 -0
  16. data/.doc/ext/rays/polyline.cpp +161 -0
  17. data/.doc/ext/rays/rays.cpp +0 -13
  18. data/.doc/ext/rays/shader.cpp +83 -9
  19. data/README.md +1 -1
  20. data/Rakefile +21 -9
  21. data/VERSION +1 -1
  22. data/ext/rays/bitmap.cpp +22 -80
  23. data/ext/rays/bounds.cpp +100 -128
  24. data/ext/rays/color.cpp +232 -51
  25. data/ext/rays/color_space.cpp +140 -46
  26. data/ext/rays/defs.cpp +183 -0
  27. data/ext/rays/defs.h +26 -2
  28. data/ext/rays/extconf.rb +1 -2
  29. data/ext/rays/font.cpp +39 -22
  30. data/ext/rays/image.cpp +27 -39
  31. data/ext/rays/matrix.cpp +198 -30
  32. data/ext/rays/native.cpp +12 -6
  33. data/ext/rays/noise.cpp +55 -0
  34. data/ext/rays/painter.cpp +129 -315
  35. data/ext/rays/point.cpp +89 -81
  36. data/ext/rays/polygon.cpp +301 -0
  37. data/ext/rays/polygon_line.cpp +99 -0
  38. data/ext/rays/polyline.cpp +170 -0
  39. data/ext/rays/rays.cpp +0 -14
  40. data/ext/rays/shader.cpp +84 -9
  41. data/include/rays.h +10 -2
  42. data/include/rays/bitmap.h +14 -26
  43. data/include/rays/bounds.h +21 -4
  44. data/include/rays/color.h +25 -14
  45. data/include/rays/color_space.h +11 -8
  46. data/include/rays/coord.h +114 -0
  47. data/include/rays/debug.h +22 -0
  48. data/include/rays/defs.h +3 -0
  49. data/include/rays/font.h +4 -4
  50. data/include/rays/image.h +11 -17
  51. data/include/rays/matrix.h +50 -24
  52. data/include/rays/noise.h +42 -0
  53. data/include/rays/opengl.h +2 -50
  54. data/include/rays/painter.h +57 -99
  55. data/include/rays/point.h +44 -51
  56. data/include/rays/polygon.h +164 -0
  57. data/include/rays/polyline.h +65 -0
  58. data/include/rays/rays.h +3 -0
  59. data/include/rays/ruby.h +7 -1
  60. data/include/rays/ruby/bounds.h +1 -1
  61. data/include/rays/ruby/color.h +1 -1
  62. data/include/rays/ruby/color_space.h +1 -1
  63. data/include/rays/ruby/font.h +1 -1
  64. data/include/rays/ruby/matrix.h +1 -1
  65. data/include/rays/ruby/point.h +1 -1
  66. data/include/rays/ruby/polygon.h +52 -0
  67. data/include/rays/ruby/polyline.h +41 -0
  68. data/include/rays/ruby/shader.h +1 -1
  69. data/include/rays/shader.h +36 -8
  70. data/lib/rays.rb +6 -1
  71. data/lib/rays/bitmap.rb +0 -15
  72. data/lib/rays/bounds.rb +17 -23
  73. data/lib/rays/color.rb +20 -47
  74. data/lib/rays/color_space.rb +13 -13
  75. data/lib/rays/image.rb +2 -6
  76. data/lib/rays/matrix.rb +28 -0
  77. data/lib/rays/module.rb +4 -19
  78. data/lib/rays/painter.rb +60 -97
  79. data/lib/rays/point.rb +13 -21
  80. data/lib/rays/polygon.rb +50 -0
  81. data/lib/rays/polygon_line.rb +36 -0
  82. data/lib/rays/polyline.rb +32 -0
  83. data/lib/rays/shader.rb +20 -1
  84. data/rays.gemspec +5 -7
  85. data/src/bitmap.h +36 -0
  86. data/src/bounds.cpp +74 -11
  87. data/src/color.cpp +58 -23
  88. data/src/color_space.cpp +50 -32
  89. data/src/color_space.h +22 -0
  90. data/src/coord.cpp +170 -0
  91. data/src/coord.h +35 -0
  92. data/src/font.cpp +118 -0
  93. data/src/font.h +64 -0
  94. data/src/frame_buffer.cpp +37 -71
  95. data/src/frame_buffer.h +4 -4
  96. data/src/image.cpp +171 -97
  97. data/src/image.h +25 -0
  98. data/src/ios/bitmap.mm +107 -105
  99. data/src/ios/font.mm +48 -60
  100. data/src/ios/helper.h +2 -2
  101. data/src/ios/opengl.mm +19 -4
  102. data/src/ios/rays.mm +3 -0
  103. data/src/matrix.cpp +111 -26
  104. data/src/matrix.h +30 -0
  105. data/src/noise.cpp +74 -0
  106. data/src/opengl.cpp +9 -27
  107. data/src/opengl.h +37 -0
  108. data/src/osx/bitmap.mm +111 -106
  109. data/src/osx/font.mm +48 -61
  110. data/src/osx/helper.h +2 -2
  111. data/src/osx/opengl.mm +19 -83
  112. data/src/osx/rays.mm +3 -0
  113. data/src/painter.cpp +780 -696
  114. data/src/painter.h +24 -0
  115. data/src/point.cpp +140 -119
  116. data/src/polygon.cpp +1100 -0
  117. data/src/polygon.h +32 -0
  118. data/src/polyline.cpp +158 -0
  119. data/src/polyline.h +67 -0
  120. data/src/render_buffer.cpp +11 -4
  121. data/src/render_buffer.h +2 -2
  122. data/src/shader.cpp +163 -106
  123. data/src/shader.h +38 -0
  124. data/src/shader_program.cpp +533 -0
  125. data/src/{program.h → shader_program.h} +28 -16
  126. data/src/shader_source.cpp +140 -0
  127. data/src/shader_source.h +52 -0
  128. data/src/texture.cpp +136 -160
  129. data/src/texture.h +65 -0
  130. data/src/win32/bitmap.cpp +62 -52
  131. data/src/win32/font.cpp +11 -13
  132. data/src/win32/font.h +24 -0
  133. data/src/win32/gdi.h +6 -6
  134. data/test/helper.rb +0 -3
  135. data/test/test_bitmap.rb +31 -7
  136. data/test/test_bounds.rb +36 -0
  137. data/test/test_color.rb +59 -19
  138. data/test/test_color_space.rb +95 -0
  139. data/test/test_image.rb +24 -20
  140. data/test/test_matrix.rb +106 -0
  141. data/test/test_painter.rb +92 -46
  142. data/test/test_painter_shape.rb +57 -0
  143. data/test/test_point.rb +21 -0
  144. data/test/test_polygon.rb +234 -0
  145. data/test/test_polygon_line.rb +167 -0
  146. data/test/test_polyline.rb +145 -0
  147. data/test/test_shader.rb +9 -9
  148. metadata +88 -67
  149. data/.doc/ext/rays/texture.cpp +0 -138
  150. data/ext/rays/texture.cpp +0 -149
  151. data/include/rays/ruby/texture.h +0 -41
  152. data/include/rays/texture.h +0 -71
  153. data/lib/rays/texture.rb +0 -24
  154. data/src/program.cpp +0 -648
  155. data/test/test_texture.rb +0 -27
@@ -1,25 +1,26 @@
1
- #include <rucy.h>
2
1
  #include "defs.h"
3
2
 
4
3
 
5
- using namespace Rucy;
6
-
7
-
8
4
  void Init_rays ();
9
5
 
10
6
  void Init_point ();
11
7
  void Init_bounds ();
12
8
  void Init_color ();
13
9
  void Init_color_space ();
10
+ void Init_matrix ();
14
11
 
12
+ void Init_polyline ();
13
+ void Init_polygon_line ();
14
+ void Init_polygon ();
15
15
  void Init_bitmap ();
16
- void Init_texture ();
17
16
  void Init_image ();
18
17
  void Init_font ();
19
18
  void Init_shader ();
20
19
 
21
20
  void Init_painter ();
22
21
 
22
+ void Init_noise ();
23
+
23
24
 
24
25
  extern "C" void
25
26
  #ifdef COCOAPODS
@@ -38,14 +39,19 @@ extern "C" void
38
39
  Init_bounds();
39
40
  Init_color();
40
41
  Init_color_space();
42
+ Init_matrix();
41
43
 
44
+ Init_polyline();
45
+ Init_polygon_line();
46
+ Init_polygon();
42
47
  Init_bitmap();
43
- Init_texture();
44
48
  Init_image();
45
49
  Init_font();
46
50
  Init_shader();
47
51
 
48
52
  Init_painter();
49
53
 
54
+ Init_noise();
55
+
50
56
  RUCY_CATCH
51
57
  }
@@ -0,0 +1,53 @@
1
+ #include "rays/noise.h"
2
+ #include "rays/ruby/point.h"
3
+ #include "defs.h"
4
+
5
+
6
+ static
7
+ VALUE perlin(VALUE self)
8
+ {
9
+ check_arg_count(__FILE__, __LINE__, "Rays.perlin", argc, 1, 2, 3, 4);
10
+
11
+ coord noise = 0;
12
+ if (argc == 4)
13
+ {
14
+ noise = Rays::perlin(
15
+ to<coord>(argv[0]),
16
+ to<coord>(argv[1]),
17
+ to<coord>(argv[2]),
18
+ to<coord>(argv[3]));
19
+ }
20
+ else
21
+ noise = Rays::perlin(to<Rays::Point>(argc, argv));
22
+
23
+ return value(noise);
24
+ }
25
+
26
+ static
27
+ VALUE simplex(VALUE self)
28
+ {
29
+ check_arg_count(__FILE__, __LINE__, "Rays.simplex", argc, 1, 2, 3, 4);
30
+
31
+ coord noise = 0;
32
+ if (argc == 4)
33
+ {
34
+ noise = Rays::simplex(
35
+ to<coord>(argv[0]),
36
+ to<coord>(argv[1]),
37
+ to<coord>(argv[2]),
38
+ to<coord>(argv[3]));
39
+ }
40
+ else
41
+ noise = Rays::simplex(to<Rays::Point>(argc, argv));
42
+
43
+ return value(noise);
44
+ }
45
+
46
+
47
+ void
48
+ Init_noise ()
49
+ {
50
+ Module mRays = rb_define_module("Rays");
51
+ rb_define_singleton_method(mRays, "perlin", RUBY_METHOD_FUNC(perlin), -1);
52
+ rb_define_singleton_method(mRays, "simplex", RUBY_METHOD_FUNC(simplex), -1);
53
+ }
@@ -2,22 +2,16 @@
2
2
 
3
3
 
4
4
  #include <vector>
5
- #include <rucy.h>
6
5
  #include "rays/ruby/point.h"
7
6
  #include "rays/ruby/bounds.h"
8
7
  #include "rays/ruby/color.h"
9
8
  #include "rays/ruby/matrix.h"
10
- #include "rays/ruby/font.h"
11
9
  #include "rays/ruby/image.h"
10
+ #include "rays/ruby/font.h"
12
11
  #include "rays/ruby/shader.h"
13
12
  #include "defs.h"
14
13
 
15
14
 
16
- using namespace Rucy;
17
-
18
- using Rays::coord;
19
-
20
-
21
15
  RUCY_DEFINE_VALUE_FROM_TO(Rays::Painter)
22
16
 
23
17
  #define THIS to<Rays::Painter*>(self)
@@ -52,6 +46,13 @@ VALUE bounds(VALUE self)
52
46
  return value(THIS->bounds());
53
47
  }
54
48
 
49
+ static
50
+ VALUE pixel_density(VALUE self)
51
+ {
52
+ CHECK;
53
+ return value(THIS->pixel_density());
54
+ }
55
+
55
56
 
56
57
  static
57
58
  VALUE begin_paint(VALUE self)
@@ -77,139 +78,66 @@ VALUE clear(VALUE self)
77
78
  }
78
79
 
79
80
  static
80
- VALUE line(VALUE self)
81
+ VALUE polygon(VALUE self, VALUE poly)
81
82
  {
82
83
  CHECK;
83
- check_arg_count(__FILE__, __LINE__, "Painter#line", argc, 2, 4);
84
-
85
- if (argc == 2)
86
- THIS->line(to<Rays::Point&>(argv[0]), to<Rays::Point&>(argv[1]));
87
- else
88
- {
89
- coord x1 = to<coord>(argv[0]);
90
- coord y1 = to<coord>(argv[1]);
91
- coord x2 = to<coord>(argv[2]);
92
- coord y2 = to<coord>(argv[3]);
93
- THIS->line(x1, y1, x2, y2);
94
- }
95
84
 
85
+ THIS->polygon(to<Rays::Polygon&>(poly));
96
86
  return self;
97
87
  }
98
88
 
99
89
  static
100
- VALUE lines(VALUE self)
90
+ VALUE line(VALUE self, VALUE args, VALUE loop)
101
91
  {
102
92
  CHECK;
103
- if (argc <= 0)
104
- argument_error(__FILE__, __LINE__, "Painter#lines");
105
93
 
106
- std::vector<Rays::Coord3> points;
107
- points.reserve(argc);
108
- for (int i = 0; i < argc; ++i)
109
- points.push_back(to<Rays::Point&>(argv[i]));
94
+ std::vector<Rays::Point> points;
95
+ get_line_args(&points, args.size(), args.as_array());
110
96
 
111
- THIS->lines((Rays::Point*) &points[0], points.size());
97
+ THIS->line(&points[0], points.size(), loop);
112
98
  return self;
113
99
  }
114
100
 
115
101
  static
116
- VALUE polygon(VALUE self)
102
+ VALUE polyline(VALUE self, VALUE poly)
117
103
  {
118
104
  CHECK;
119
- if (argc <= 0)
120
- argument_error(__FILE__, __LINE__, "Painter#polygon");
121
-
122
- std::vector<Rays::Coord3> points;
123
- points.reserve(argc);
124
- for (int i = 0; i < argc; ++i)
125
- points.push_back(to<Rays::Point&>(argv[i]));
126
105
 
127
- THIS->polygon((Rays::Point*) &points[0], points.size());
106
+ THIS->line(to<Rays::Polyline&>(poly));
128
107
  return self;
129
108
  }
130
109
 
131
110
  static
132
- VALUE rect(VALUE self)
111
+ VALUE rect(VALUE self, VALUE args, VALUE round, VALUE lefttop, VALUE righttop, VALUE leftbottom, VALUE rightbottom)
133
112
  {
134
113
  CHECK;
135
- check_arg_count(__FILE__, __LINE__, "Painter#rect", argc, 1, 2, 3, 4, 5, 6);
136
114
 
137
- if (argc <= 3)
138
- {
139
- Rays::Bounds& b = to<Rays::Bounds&>(argv[0]);
140
- coord rw = argc >= 2 ? to<coord>(argv[1]) : 0;
141
- coord rh = argc >= 3 ? to<coord>(argv[2]) : rw;
142
- THIS->rect(b, rw, rh);
143
- }
144
- else
145
- {
146
- coord x = to<coord>(argv[0]);
147
- coord y = to<coord>(argv[1]);
148
- coord w = to<coord>(argv[2]);
149
- coord h = to<coord>(argv[3]);
150
- coord rw = argc >= 5 ? to<coord>(argv[4]) : 0;
151
- coord rh = argc >= 6 ? to<coord>(argv[5]) : rw;
152
- THIS->rect(x, y, w, h, rw, rh);
153
- }
115
+ coord x, y, w, h, lt, rt, lb, rb;
116
+ uint _;
117
+ get_rect_args(
118
+ &x, &y, &w, &h, &lt, &rt, &lb, &rb, &_,
119
+ args.size(), args.as_array(),
120
+ round, lefttop, righttop, leftbottom, rightbottom, nil());
154
121
 
122
+ THIS->rect(x, y, w, h, lt, rt, lb, rb);
155
123
  return self;
156
124
  }
157
125
 
158
126
  static
159
- VALUE ellipse(VALUE self)
127
+ VALUE ellipse(VALUE self, VALUE args, VALUE center, VALUE radius, VALUE hole, VALUE angle_from, VALUE angle_to)
160
128
  {
161
129
  CHECK;
162
- check_arg_count(__FILE__, __LINE__, "Painter#ellipse", argc, 1, 2, 3, 4, 5, 6);
163
130
 
164
- if (argv[0].is_kind_of(Rays::bounds_class()))
165
- {
166
- const Rays::Bounds& b = to<Rays::Bounds&>(argv[0]);
167
- coord min_ = (argc >= 2) ? to<coord>(argv[1]) : 0;
168
- uint nseg = (argc >= 3) ? to<uint> (argv[2]) : 0;
169
- THIS->ellipse(b, min_, nseg);
170
- }
171
- else
172
- {
173
- coord x = to<coord>(argv[0]);
174
- coord y = to<coord>(argv[1]);
175
- coord w = to<coord>(argv[2]);
176
- coord h = (argc >= 4) ? to<coord>(argv[3]) : 0;
177
- coord min_ = (argc >= 5) ? to<coord>(argv[4]) : 0;
178
- uint nseg = (argc >= 6) ? to<uint> (argv[5]) : 0;
179
- THIS->ellipse(x, y, w, h, min_, nseg);
180
- }
181
-
182
- return self;
183
- }
184
-
185
- static
186
- VALUE arc(VALUE self)
187
- {
188
- CHECK;
189
- check_arg_count(__FILE__, __LINE__, "Painter#ellipse", argc, 1, 2, 3, 4, 5, 6, 7, 8);
190
-
191
- if (argv[0].is_kind_of(Rays::bounds_class()))
192
- {
193
- const Rays::Bounds& b = to<Rays::Bounds&>(argv[0]);
194
- float begin = (argc >= 2) ? to<float>(argv[1]) : 0;
195
- float end = (argc >= 3) ? to<float>(argv[2]) : 360;
196
- coord min_ = (argc >= 4) ? to<coord>(argv[3]) : 0;
197
- uint nseg = (argc >= 5) ? to<uint> (argv[4]) : 0;
198
- THIS->arc(b, begin, end, min_, nseg);
199
- }
200
- else
201
- {
202
- coord x = to<coord>(argv[0]);
203
- coord y = to<coord>(argv[1]);
204
- coord w = to<coord>(argv[2]);
205
- coord h = (argc >= 4) ? to<coord>(argv[3]) : 0;
206
- float begin = (argc >= 5) ? to<float>(argv[4]) : 0;
207
- float end = (argc >= 6) ? to<float>(argv[5]) : 360;
208
- coord min_ = (argc >= 7) ? to<coord>(argv[6]) : 0;
209
- uint nseg = (argc >= 8) ? to<uint> (argv[7]) : 0;
210
- THIS->arc(x, y, w, h, begin, end, min_, nseg);
211
- }
131
+ coord x, y, w, h;
132
+ Rays::Point hole_size;
133
+ float from, to_;
134
+ uint _;
135
+ get_ellipse_args(
136
+ &x, &y, &w, &h, &hole_size, &from, &to_, &_,
137
+ args.size(), args.as_array(),
138
+ center, radius, hole, angle_from, angle_to, nil());
212
139
 
140
+ THIS->ellipse(x, y, w, h, hole_size, from, to_);
213
141
  return self;
214
142
  }
215
143
 
@@ -260,7 +188,7 @@ static
260
188
  VALUE text(VALUE self)
261
189
  {
262
190
  CHECK;
263
- check_arg_count(__FILE__, __LINE__, "Painter#text", argc, 1, 3, 4, 5, 7);
191
+ check_arg_count(__FILE__, __LINE__, "Painter#text", argc, 1, 3, 5);
264
192
 
265
193
  if (argc == 1)
266
194
  THIS->text(argv[0].c_str());
@@ -269,66 +197,22 @@ VALUE text(VALUE self)
269
197
  coord x = to<coord>(argv[1]), y = to<coord>(argv[2]);
270
198
  THIS->text(argv[0].c_str(), x, y);
271
199
  }
272
- else if (argc == 4)
273
- {
274
- const Rays::Font* font = to<Rays::Font*>(argv[3]);
275
- if (!font || !*font)
276
- rays_error(__FILE__, __LINE__, "Painter#text: invalid font.");
277
-
278
- coord x = to<coord>(argv[1]), y = to<coord>(argv[2]);
279
- THIS->text(argv[0].c_str(), x, y, font);
280
- }
281
200
  else if (argc == 5)
282
201
  {
283
202
  coord x = to<coord>(argv[1]), w = to<coord>(argv[3]);
284
203
  coord y = to<coord>(argv[2]), h = to<coord>(argv[4]);
285
204
  THIS->text(argv[0].c_str(), x, y, w, h);
286
205
  }
287
- else if (argc == 7)
288
- {
289
- const Rays::Font* font = to<Rays::Font*>(argv[3]);
290
- if (!font || !*font)
291
- rays_error(__FILE__, __LINE__, "Painter#text: invalid font.");
292
-
293
- coord x = to<coord>(argv[1]), w = to<coord>(argv[3]);
294
- coord y = to<coord>(argv[2]), h = to<coord>(argv[4]);
295
- THIS->text(argv[0].c_str(), x, y, w, h, font);
296
- }
297
206
 
298
207
  return self;
299
208
  }
300
209
 
301
- static
302
- VALUE set_background(VALUE self)
303
- {
304
- CHECK;
305
- check_arg_count(__FILE__, __LINE__, "Painter#set_background", argc, 1, 2, 3, 4);
306
-
307
- if (argc == 1 && argv[0].is_kind_of(Rays::color_class()))
308
- THIS->set_background(to<Rays::Color&>(argv[0]));
309
- else if (argc == 1 || argc == 2)
310
- {
311
- float v = to<float>(argv[0]);
312
- float a = (argc >= 2) ? to<float>(argv[1]) : 1;
313
- THIS->set_background(v, v, v, a);
314
- }
315
- else
316
- {
317
- float r = to<float>(argv[0]);
318
- float g = to<float>(argv[1]);
319
- float b = to<float>(argv[2]);
320
- float a = (argc == 4) ? to<float>(argv[3]) : 1;
321
- THIS->set_background(r, g, b, a);
322
- }
323
-
324
- return self;
325
- }
326
210
 
327
211
  static
328
- VALUE no_background(VALUE self)
212
+ VALUE set_background(VALUE self)
329
213
  {
330
214
  CHECK;
331
- THIS->no_background();
215
+ THIS->set_background(to<Rays::Color>(argc, argv));
332
216
  return self;
333
217
  }
334
218
 
@@ -340,36 +224,18 @@ VALUE get_background(VALUE self)
340
224
  }
341
225
 
342
226
  static
343
- VALUE set_fill(VALUE self)
227
+ VALUE no_background(VALUE self)
344
228
  {
345
229
  CHECK;
346
- check_arg_count(__FILE__, __LINE__, "Painter#set_fill", argc, 1, 2, 3, 4);
347
-
348
- if (argc == 1 && argv[0].is_kind_of(Rays::color_class()))
349
- THIS->set_fill(to<Rays::Color&>(argv[0]));
350
- else if (argc == 1 || argc == 2)
351
- {
352
- float v = to<float>(argv[0]);
353
- float a = (argc >= 2) ? to<float>(argv[1]) : 1;
354
- THIS->set_fill(v, v, v, a);
355
- }
356
- else
357
- {
358
- float r = to<float>(argv[0]);
359
- float g = to<float>(argv[1]);
360
- float b = to<float>(argv[2]);
361
- float a = (argc == 4) ? to<float>(argv[3]) : 1;
362
- THIS->set_fill(r, g, b, a);
363
- }
364
-
230
+ THIS->no_background();
365
231
  return self;
366
232
  }
367
233
 
368
234
  static
369
- VALUE no_fill(VALUE self)
235
+ VALUE set_fill(VALUE self)
370
236
  {
371
237
  CHECK;
372
- THIS->no_fill();
238
+ THIS->set_fill(to<Rays::Color>(argc, argv));
373
239
  return self;
374
240
  }
375
241
 
@@ -381,36 +247,18 @@ VALUE get_fill(VALUE self)
381
247
  }
382
248
 
383
249
  static
384
- VALUE set_stroke(VALUE self)
250
+ VALUE no_fill(VALUE self)
385
251
  {
386
252
  CHECK;
387
- check_arg_count(__FILE__, __LINE__, "Painter#set_stroke", argc, 1, 2, 3, 4);
388
-
389
- if (argc == 1 && argv[0].is_kind_of(Rays::color_class()))
390
- THIS->set_stroke(to<Rays::Color&>(argv[0]));
391
- else if (argc == 1 || argc == 2)
392
- {
393
- float v = to<float>(argv[0]);
394
- float a = (argc >= 2) ? to<float>(argv[1]) : 1;
395
- THIS->set_stroke(v, v, v, a);
396
- }
397
- else
398
- {
399
- float r = to<float>(argv[0]);
400
- float g = to<float>(argv[1]);
401
- float b = to<float>(argv[2]);
402
- float a = (argc == 4) ? to<float>(argv[3]) : 1;
403
- THIS->set_stroke(r, g, b, a);
404
- }
405
-
253
+ THIS->no_fill();
406
254
  return self;
407
255
  }
408
256
 
409
257
  static
410
- VALUE no_stroke(VALUE self)
258
+ VALUE set_stroke(VALUE self)
411
259
  {
412
260
  CHECK;
413
- THIS->no_stroke();
261
+ THIS->set_stroke(to<Rays::Color>(argc, argv));
414
262
  return self;
415
263
  }
416
264
 
@@ -422,158 +270,121 @@ VALUE get_stroke(VALUE self)
422
270
  }
423
271
 
424
272
  static
425
- VALUE set_clip(VALUE self)
273
+ VALUE no_stroke(VALUE self)
426
274
  {
427
275
  CHECK;
428
- check_arg_count(__FILE__, __LINE__, "Painter#set_clip", argc, 1, 4);
429
-
430
- if (argc == 1)
431
- THIS->set_clip(to<Rays::Bounds&>(argv[0]));
432
- else
433
- {
434
- coord x = to<coord>(argv[0]);
435
- coord y = to<coord>(argv[1]);
436
- coord w = to<coord>(argv[2]);
437
- coord h = to<coord>(argv[3]);
438
- THIS->set_clip(x, y, w, h);
439
- }
440
-
276
+ THIS->no_stroke();
441
277
  return self;
442
278
  }
443
279
 
444
280
  static
445
- VALUE no_clip(VALUE self)
281
+ VALUE set_stroke_width(VALUE self, VALUE width)
446
282
  {
447
283
  CHECK;
448
- THIS->no_clip();
284
+ THIS->set_stroke_width(to<coord>(width));
449
285
  return self;
450
286
  }
451
287
 
452
288
  static
453
- VALUE get_clip(VALUE self)
289
+ VALUE get_stroke_width(VALUE self)
454
290
  {
455
291
  CHECK;
456
- return value(THIS->clip());
292
+ return value(THIS->stroke_width());
457
293
  }
458
294
 
459
295
  static
460
- VALUE set_font(VALUE self)
296
+ VALUE set_nsegment(VALUE self, VALUE nsegment)
461
297
  {
462
298
  CHECK;
463
- check_arg_count(__FILE__, __LINE__, "Painter#set_font", argc, 0, 1, 2);
464
-
465
- if (argc == 0 || argv[0].is_kind_of(Rays::font_class()))
466
- {
467
- const Rays::Font* f = argc == 0
468
- ? &Rays::default_font()
469
- : to<Rays::Font*>(argv[0]);
470
- if (!f || !*f)
471
- argument_error(__FILE__, __LINE__);
472
-
473
- THIS->set_font(*f);
474
- }
475
- else
476
- {
477
- const char* name = argv[0].c_str();
478
- coord size = argc >= 2 ? to<coord>(argv[1]) : 0;
479
- THIS->set_font(name, size);
480
- }
481
-
299
+ THIS->set_nsegment(nsegment ? to<int>(nsegment) : 0);
482
300
  return self;
483
301
  }
484
302
 
485
303
  static
486
- VALUE get_font(VALUE self)
304
+ VALUE get_nsegment(VALUE self)
487
305
  {
488
306
  CHECK;
489
- return value(THIS->font());
307
+ return value(THIS->nsegment());
490
308
  }
491
309
 
492
310
  static
493
- VALUE push_attr(VALUE self)
311
+ VALUE set_clip(VALUE self)
494
312
  {
495
313
  CHECK;
496
- THIS->push_attr();
314
+ THIS->set_clip(to<Rays::Bounds>(argc, argv));
497
315
  return self;
498
316
  }
499
317
 
500
318
  static
501
- VALUE pop_attr(VALUE self)
319
+ VALUE get_clip(VALUE self)
502
320
  {
503
321
  CHECK;
504
- THIS->pop_attr();
505
- return self;
322
+ return value(THIS->clip());
506
323
  }
507
324
 
508
-
509
325
  static
510
- VALUE attach_shader(VALUE self, VALUE shader)
326
+ VALUE no_clip(VALUE self)
511
327
  {
512
328
  CHECK;
513
- THIS->attach(to<Rays::Shader&>(shader));
329
+ THIS->no_clip();
514
330
  return self;
515
331
  }
516
332
 
517
333
  static
518
- VALUE detach_shader(VALUE self, VALUE shader)
334
+ VALUE set_font(VALUE self)
519
335
  {
520
336
  CHECK;
521
- THIS->detach(to<Rays::Shader&>(shader));
337
+ check_arg_count(__FILE__, __LINE__, "Painter#set_font", argc, 0, 1, 2);
338
+
339
+ THIS->set_font(to<Rays::Font>(argc, argv));
522
340
  return self;
523
341
  }
524
342
 
525
343
  static
526
- VALUE set_uniform(VALUE self)
344
+ VALUE get_font(VALUE self)
527
345
  {
528
346
  CHECK;
529
- check_arg_count(__FILE__, __LINE__, "Painter#set_uniform", argc, 2, 3, 4, 5);
347
+ return value(THIS->font());
348
+ }
530
349
 
531
- #define Ai(n) (argv[n].as_i())
532
- #define Af(n) ((float) argv[n].as_f())
350
+ static
351
+ VALUE set_shader(VALUE self)
352
+ {
353
+ CHECK;
354
+ check_arg_count(__FILE__, __LINE__, "Painter#set_shader", argc, 1);
533
355
 
534
- const char* name = argv[0].c_str();
535
- if (argv[1].is_i())
536
- {
537
- switch (argc)
538
- {
539
- case 2: THIS->set_uniform(name, Ai(1)); break;
540
- case 3: THIS->set_uniform(name, Ai(1), Ai(2)); break;
541
- case 4: THIS->set_uniform(name, Ai(1), Ai(2), Ai(3)); break;
542
- case 5: THIS->set_uniform(name, Ai(1), Ai(2), Ai(3), Ai(4)); break;
543
- }
544
- }
545
- else if (argv[1].is_f())
546
- {
547
- switch (argc)
548
- {
549
- case 2: THIS->set_uniform(name, Af(1)); break;
550
- case 3: THIS->set_uniform(name, Af(1), Af(2)); break;
551
- case 4: THIS->set_uniform(name, Af(1), Af(2), Af(3)); break;
552
- case 5: THIS->set_uniform(name, Af(1), Af(2), Af(3), Af(4)); break;
553
- }
554
- }
555
- else
556
- argument_error(__FILE__, __LINE__);
356
+ THIS->set_shader(to<Rays::Shader>(argc, argv));
357
+ return self;
358
+ }
557
359
 
558
- #undef Ai
559
- #undef Af
360
+ static
361
+ VALUE get_shader(VALUE self)
362
+ {
363
+ CHECK;
364
+ return value(THIS->shader());
365
+ }
560
366
 
367
+ static
368
+ VALUE no_shader(VALUE self)
369
+ {
370
+ CHECK;
371
+ THIS->no_shader();
561
372
  return self;
562
373
  }
563
374
 
564
375
  static
565
- VALUE push_shader(VALUE self)
376
+ VALUE push_state(VALUE self)
566
377
  {
567
378
  CHECK;
568
- THIS->push_shader();
379
+ THIS->push_state();
569
380
  return self;
570
381
  }
571
382
 
572
383
  static
573
- VALUE pop_shader(VALUE self)
384
+ VALUE pop_state(VALUE self)
574
385
  {
575
386
  CHECK;
576
- THIS->pop_shader();
387
+ THIS->pop_state();
577
388
  return self;
578
389
  }
579
390
 
@@ -629,8 +440,8 @@ static
629
440
  VALUE set_matrix(VALUE self)
630
441
  {
631
442
  CHECK;
632
- THIS->set_matrix();
633
- return self;
443
+ THIS->set_matrix(to<Rays::Matrix>(argc, argv));
444
+ return value(THIS->matrix());
634
445
  }
635
446
 
636
447
  static
@@ -669,47 +480,48 @@ Init_painter ()
669
480
 
670
481
  rb_define_method(cPainter, "canvas", RUBY_METHOD_FUNC(canvas), 4);
671
482
  rb_define_method(cPainter, "bounds", RUBY_METHOD_FUNC(bounds), 0);
483
+ rb_define_method(cPainter, "pixel_density", RUBY_METHOD_FUNC(pixel_density), 0);
672
484
 
673
485
  rb_define_private_method(cPainter, "begin_paint", RUBY_METHOD_FUNC(begin_paint), 0);
674
486
  rb_define_private_method(cPainter, "end_paint", RUBY_METHOD_FUNC(end_paint), 0);
675
487
  rb_define_method(cPainter, "clear", RUBY_METHOD_FUNC(clear), 0);
676
- rb_define_method(cPainter, "line", RUBY_METHOD_FUNC(line), -1);
677
- rb_define_method(cPainter, "lines", RUBY_METHOD_FUNC(lines), -1);
678
- rb_define_method(cPainter, "polygon", RUBY_METHOD_FUNC(polygon), -1);
679
- rb_define_method(cPainter, "rect", RUBY_METHOD_FUNC(rect), -1);
680
- rb_define_method(cPainter, "ellipse", RUBY_METHOD_FUNC(ellipse), -1);
681
- rb_define_method(cPainter, "arc", RUBY_METHOD_FUNC(arc), -1);
488
+ rb_define_method(cPainter, "polygon", RUBY_METHOD_FUNC(polygon), 1);
489
+ rb_define_private_method(cPainter, "draw_line", RUBY_METHOD_FUNC(line), 2);
490
+ rb_define_private_method(cPainter, "draw_polyline", RUBY_METHOD_FUNC(polyline), 1);
491
+ rb_define_private_method(cPainter, "draw_rect", RUBY_METHOD_FUNC(rect), 6);
492
+ rb_define_private_method(cPainter, "draw_ellipse", RUBY_METHOD_FUNC(ellipse), 6);
682
493
  rb_define_method(cPainter, "image", RUBY_METHOD_FUNC(image), -1);
683
494
  rb_define_method(cPainter, "text", RUBY_METHOD_FUNC(text), -1);
684
495
 
685
- rb_define_private_method(cPainter, "set_background", RUBY_METHOD_FUNC(set_background), -1);
686
- rb_define_private_method(cPainter, "get_background", RUBY_METHOD_FUNC(get_background), 0);
496
+ rb_define_method(cPainter, "background=", RUBY_METHOD_FUNC(set_background), -1);
497
+ rb_define_method(cPainter, "background", RUBY_METHOD_FUNC(get_background), 0);
687
498
  rb_define_method(cPainter, "no_background", RUBY_METHOD_FUNC(no_background), 0);
688
- rb_define_private_method(cPainter, "set_fill", RUBY_METHOD_FUNC(set_fill), -1);
689
- rb_define_private_method(cPainter, "get_fill", RUBY_METHOD_FUNC(get_fill), 0);
499
+ rb_define_method(cPainter, "fill=", RUBY_METHOD_FUNC(set_fill), -1);
500
+ rb_define_method(cPainter, "fill", RUBY_METHOD_FUNC(get_fill), 0);
690
501
  rb_define_method(cPainter, "no_fill", RUBY_METHOD_FUNC(no_fill), 0);
691
- rb_define_private_method(cPainter, "set_stroke", RUBY_METHOD_FUNC(set_stroke), -1);
692
- rb_define_private_method(cPainter, "get_stroke", RUBY_METHOD_FUNC(get_stroke), 0);
502
+ rb_define_method(cPainter, "stroke=", RUBY_METHOD_FUNC(set_stroke), -1);
503
+ rb_define_method(cPainter, "stroke", RUBY_METHOD_FUNC(get_stroke), 0);
693
504
  rb_define_method(cPainter, "no_stroke", RUBY_METHOD_FUNC(no_stroke), 0);
694
- rb_define_private_method(cPainter, "set_clip", RUBY_METHOD_FUNC(set_clip), -1);
695
- rb_define_private_method(cPainter, "get_clip", RUBY_METHOD_FUNC(get_clip), 0);
505
+ rb_define_method(cPainter, "stroke_width=", RUBY_METHOD_FUNC(set_stroke_width), 1);
506
+ rb_define_method(cPainter, "stroke_width", RUBY_METHOD_FUNC(get_stroke_width), 0);
507
+ rb_define_method(cPainter, "nsegment=", RUBY_METHOD_FUNC(set_nsegment), 1);
508
+ rb_define_method(cPainter, "nsegment", RUBY_METHOD_FUNC(get_nsegment), 0);
509
+ rb_define_method(cPainter, "clip=", RUBY_METHOD_FUNC(set_clip), -1);
510
+ rb_define_method(cPainter, "clip", RUBY_METHOD_FUNC(get_clip), 0);
696
511
  rb_define_method(cPainter, "no_clip", RUBY_METHOD_FUNC(no_clip), 0);
697
- rb_define_private_method(cPainter, "set_font", RUBY_METHOD_FUNC(set_font), -1);
698
- rb_define_private_method(cPainter, "get_font", RUBY_METHOD_FUNC(get_font), 0);
699
- rb_define_method(cPainter, "push_attr", RUBY_METHOD_FUNC(push_attr), 0);
700
- rb_define_method(cPainter, "pop_attr", RUBY_METHOD_FUNC(pop_attr), 0);
701
-
702
- rb_define_private_method(cPainter, "attach_shader", RUBY_METHOD_FUNC(attach_shader), 1);
703
- rb_define_private_method(cPainter, "detach_shader", RUBY_METHOD_FUNC(detach_shader), 1);
704
- rb_define_private_method(cPainter, "set_uniform", RUBY_METHOD_FUNC(set_uniform), -1);
705
- rb_define_method(cPainter, "push_shader", RUBY_METHOD_FUNC(push_shader), 0);
706
- rb_define_method(cPainter, "pop_shader", RUBY_METHOD_FUNC(pop_shader), 0);
512
+ rb_define_method(cPainter, "font=", RUBY_METHOD_FUNC(set_font), -1);
513
+ rb_define_method(cPainter, "font", RUBY_METHOD_FUNC(get_font), 0);
514
+ rb_define_private_method(cPainter, "set_shader", RUBY_METHOD_FUNC(set_shader), -1);
515
+ rb_define_method(cPainter, "shader", RUBY_METHOD_FUNC(get_shader), 0);
516
+ rb_define_method(cPainter, "no_shader", RUBY_METHOD_FUNC(no_shader), 0);
517
+ rb_define_method(cPainter, "push_state", RUBY_METHOD_FUNC(push_state), 0);
518
+ rb_define_method(cPainter, "pop_state", RUBY_METHOD_FUNC(pop_state), 0);
707
519
 
708
520
  rb_define_method(cPainter, "translate", RUBY_METHOD_FUNC(translate), -1);
709
521
  rb_define_method(cPainter, "scale", RUBY_METHOD_FUNC(scale), -1);
710
522
  rb_define_method(cPainter, "rotate", RUBY_METHOD_FUNC(rotate), -1);
711
- rb_define_private_method(cPainter, "set_matrix", RUBY_METHOD_FUNC(set_matrix), -1);
712
- rb_define_private_method(cPainter, "get_matrix", RUBY_METHOD_FUNC(get_matrix), 0);
523
+ rb_define_method(cPainter, "matrix=", RUBY_METHOD_FUNC(set_matrix), -1);
524
+ rb_define_method(cPainter, "matrix", RUBY_METHOD_FUNC(get_matrix), 0);
713
525
  rb_define_method(cPainter, "push_matrix", RUBY_METHOD_FUNC(push_matrix), 0);
714
526
  rb_define_method(cPainter, "pop_matrix", RUBY_METHOD_FUNC(pop_matrix), 0);
715
527
  }