rays 0.1.46 → 0.1.47
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.
- checksums.yaml +4 -4
- data/.doc/ext/rays/bitmap.cpp +258 -0
- data/.doc/ext/rays/defs.cpp +3 -3
- data/.doc/ext/rays/painter.cpp +38 -3
- data/.doc/ext/rays/polygon.cpp +81 -4
- data/.doc/ext/rays/rays.cpp +11 -11
- data/.github/workflows/test.yml +0 -1
- data/ChangeLog.md +15 -0
- data/Rakefile +4 -4
- data/VERSION +1 -1
- data/ext/rays/bitmap.cpp +259 -0
- data/ext/rays/defs.cpp +3 -3
- data/ext/rays/painter.cpp +45 -8
- data/ext/rays/polygon.cpp +89 -4
- data/ext/rays/rays.cpp +11 -11
- data/include/rays/defs.h +26 -0
- data/include/rays/matrix.h +2 -0
- data/include/rays/painter.h +15 -1
- data/include/rays/polygon.h +6 -1
- data/include/rays/polyline.h +4 -0
- data/lib/rays/painter.rb +1 -1
- data/lib/rays/polygon.rb +36 -7
- data/rays.gemspec +2 -2
- data/src/color_space.cpp +2 -2
- data/src/matrix.cpp +8 -0
- data/src/painter.cpp +72 -5
- data/src/polygon.cpp +385 -91
- data/src/polyline.cpp +33 -18
- data/src/polyline.h +2 -2
- data/test/test_bitmap.rb +7 -0
- data/test/test_polygon.rb +2 -2
- data/test/test_polygon_line.rb +5 -5
- data/test/test_polyline.rb +7 -7
- metadata +6 -6
data/ext/rays/bitmap.cpp
CHANGED
@@ -72,6 +72,264 @@ RUCY_DEF0(color_space)
|
|
72
72
|
}
|
73
73
|
RUCY_END
|
74
74
|
|
75
|
+
static inline Value
|
76
|
+
to_rgb_value (uint8_t r, uint8_t g, uint8_t b)
|
77
|
+
{
|
78
|
+
return value(
|
79
|
+
((uint) r) << 16 |
|
80
|
+
((uint) g) << 8 |
|
81
|
+
((uint) b));
|
82
|
+
}
|
83
|
+
|
84
|
+
static inline Value
|
85
|
+
to_rgba_value (uint8_t r, uint8_t g, uint8_t b, uint8_t a)
|
86
|
+
{
|
87
|
+
return value(
|
88
|
+
((uint) a) << 24 |
|
89
|
+
((uint) r) << 16 |
|
90
|
+
((uint) g) << 8 |
|
91
|
+
((uint) b));
|
92
|
+
}
|
93
|
+
|
94
|
+
static void
|
95
|
+
get_pixels (auto* pixels, const Rays::Bitmap& bmp)
|
96
|
+
{
|
97
|
+
int w = bmp.width(), h = bmp.height();
|
98
|
+
|
99
|
+
const auto& cs = bmp.color_space();
|
100
|
+
pixels->clear();
|
101
|
+
pixels->reserve(w * h * (cs.is_float() ? cs.Bpp() / cs.Bpc() : 1));
|
102
|
+
|
103
|
+
switch (cs.type())
|
104
|
+
{
|
105
|
+
case Rays::GRAY_8:
|
106
|
+
case Rays::ALPHA_8:
|
107
|
+
for (int y = 0; y < h; ++y)
|
108
|
+
{
|
109
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
110
|
+
for (int x = 0; x < w; ++x, ++p)
|
111
|
+
pixels->push_back(value(*p));
|
112
|
+
}
|
113
|
+
break;
|
114
|
+
|
115
|
+
case Rays::GRAY_16:
|
116
|
+
case Rays::ALPHA_16:
|
117
|
+
for (int y = 0; y < h; ++y)
|
118
|
+
{
|
119
|
+
const auto* p = bmp.at<uint16_t>(0, y);
|
120
|
+
for (int x = 0; x < w; ++x, ++p)
|
121
|
+
pixels->push_back(value(*p));
|
122
|
+
}
|
123
|
+
break;
|
124
|
+
|
125
|
+
case Rays::GRAY_32:
|
126
|
+
case Rays::ALPHA_32:
|
127
|
+
for (int y = 0; y < h; ++y)
|
128
|
+
{
|
129
|
+
const auto* p = bmp.at<uint32_t>(0, y);
|
130
|
+
for (int x = 0; x < w; ++x, ++p)
|
131
|
+
pixels->push_back(value(*p));
|
132
|
+
}
|
133
|
+
break;
|
134
|
+
|
135
|
+
case Rays::GRAY_float:
|
136
|
+
case Rays::ALPHA_float:
|
137
|
+
for (int y = 0; y < h; ++y)
|
138
|
+
{
|
139
|
+
const auto* p = bmp.at<float>(0, y);
|
140
|
+
for (int x = 0; x < w; ++x, ++p)
|
141
|
+
pixels->push_back(value(*p));
|
142
|
+
}
|
143
|
+
break;
|
144
|
+
|
145
|
+
case Rays::RGB_888:
|
146
|
+
for (int y = 0; y < h; ++y)
|
147
|
+
{
|
148
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
149
|
+
for (int x = 0; x < w; ++x, p += 3)
|
150
|
+
pixels->push_back(to_rgb_value(p[0], p[1], p[2]));
|
151
|
+
}
|
152
|
+
break;
|
153
|
+
|
154
|
+
case Rays::RGBA_8888:
|
155
|
+
for (int y = 0; y < h; ++y)
|
156
|
+
{
|
157
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
158
|
+
for (int x = 0; x < w; ++x, p += 4)
|
159
|
+
pixels->push_back(to_rgba_value(p[0], p[1], p[2], p[3]));
|
160
|
+
}
|
161
|
+
break;
|
162
|
+
|
163
|
+
case Rays::RGBX_8888:
|
164
|
+
for (int y = 0; y < h; ++y)
|
165
|
+
{
|
166
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
167
|
+
for (int x = 0; x < w; ++x, p += 4)
|
168
|
+
pixels->push_back(to_rgb_value(p[0], p[1], p[2]));
|
169
|
+
}
|
170
|
+
break;
|
171
|
+
|
172
|
+
case Rays::ARGB_8888:
|
173
|
+
for (int y = 0; y < h; ++y)
|
174
|
+
{
|
175
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
176
|
+
for (int x = 0; x < w; ++x, p += 4)
|
177
|
+
pixels->push_back(to_rgba_value(p[1], p[2], p[3], p[0]));
|
178
|
+
}
|
179
|
+
break;
|
180
|
+
|
181
|
+
case Rays::XRGB_8888:
|
182
|
+
for (int y = 0; y < h; ++y)
|
183
|
+
{
|
184
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
185
|
+
for (int x = 0; x < w; ++x, p += 4)
|
186
|
+
pixels->push_back(to_rgb_value(p[1], p[2], p[3]));
|
187
|
+
}
|
188
|
+
break;
|
189
|
+
|
190
|
+
case Rays::BGR_888:
|
191
|
+
for (int y = 0; y < h; ++y)
|
192
|
+
{
|
193
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
194
|
+
for (int x = 0; x < w; ++x, p += 3)
|
195
|
+
pixels->push_back(to_rgb_value(p[2], p[1], p[0]));
|
196
|
+
}
|
197
|
+
break;
|
198
|
+
|
199
|
+
case Rays::BGRA_8888:
|
200
|
+
for (int y = 0; y < h; ++y)
|
201
|
+
{
|
202
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
203
|
+
for (int x = 0; x < w; ++x, p += 4)
|
204
|
+
pixels->push_back(to_rgba_value(p[2], p[1], p[0], p[3]));
|
205
|
+
}
|
206
|
+
break;
|
207
|
+
|
208
|
+
case Rays::BGRX_8888:
|
209
|
+
for (int y = 0; y < h; ++y)
|
210
|
+
{
|
211
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
212
|
+
for (int x = 0; x < w; ++x, p += 4)
|
213
|
+
pixels->push_back(to_rgb_value(p[2], p[1], p[0]));
|
214
|
+
}
|
215
|
+
break;
|
216
|
+
|
217
|
+
case Rays::ABGR_8888:
|
218
|
+
for (int y = 0; y < h; ++y)
|
219
|
+
{
|
220
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
221
|
+
for (int x = 0; x < w; ++x, p += 4)
|
222
|
+
pixels->push_back(to_rgba_value(p[3], p[2], p[1], p[0]));
|
223
|
+
}
|
224
|
+
break;
|
225
|
+
|
226
|
+
case Rays::XBGR_8888:
|
227
|
+
for (int y = 0; y < h; ++y)
|
228
|
+
{
|
229
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
230
|
+
for (int x = 0; x < w; ++x, p += 4)
|
231
|
+
pixels->push_back(to_rgb_value(p[3], p[2], p[1]));
|
232
|
+
}
|
233
|
+
break;
|
234
|
+
|
235
|
+
case Rays::RGB_float:
|
236
|
+
for (int y = 0; y < h; ++y)
|
237
|
+
{
|
238
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
239
|
+
for (int x = 0; x < w; ++x, p += 3)
|
240
|
+
{
|
241
|
+
pixels->push_back(value(p[0]));
|
242
|
+
pixels->push_back(value(p[1]));
|
243
|
+
pixels->push_back(value(p[2]));
|
244
|
+
}
|
245
|
+
}
|
246
|
+
break;
|
247
|
+
|
248
|
+
case Rays::RGBA_float:
|
249
|
+
for (int y = 0; y < h; ++y)
|
250
|
+
{
|
251
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
252
|
+
for (int x = 0; x < w; ++x, p += 4)
|
253
|
+
{
|
254
|
+
pixels->push_back(value(p[0]));
|
255
|
+
pixels->push_back(value(p[1]));
|
256
|
+
pixels->push_back(value(p[2]));
|
257
|
+
pixels->push_back(value(p[3]));
|
258
|
+
}
|
259
|
+
}
|
260
|
+
break;
|
261
|
+
|
262
|
+
case Rays::ARGB_float:
|
263
|
+
for (int y = 0; y < h; ++y)
|
264
|
+
{
|
265
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
266
|
+
for (int x = 0; x < w; ++x, p += 4)
|
267
|
+
{
|
268
|
+
pixels->push_back(value(p[1]));
|
269
|
+
pixels->push_back(value(p[2]));
|
270
|
+
pixels->push_back(value(p[3]));
|
271
|
+
pixels->push_back(value(p[0]));
|
272
|
+
}
|
273
|
+
}
|
274
|
+
break;
|
275
|
+
|
276
|
+
case Rays::BGR_float:
|
277
|
+
for (int y = 0; y < h; ++y)
|
278
|
+
{
|
279
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
280
|
+
for (int x = 0; x < w; ++x, p += 3)
|
281
|
+
{
|
282
|
+
pixels->push_back(value(p[2]));
|
283
|
+
pixels->push_back(value(p[1]));
|
284
|
+
pixels->push_back(value(p[0]));
|
285
|
+
}
|
286
|
+
}
|
287
|
+
break;
|
288
|
+
|
289
|
+
case Rays::BGRA_float:
|
290
|
+
for (int y = 0; y < h; ++y)
|
291
|
+
{
|
292
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
293
|
+
for (int x = 0; x < w; ++x, p += 4)
|
294
|
+
{
|
295
|
+
pixels->push_back(value(p[2]));
|
296
|
+
pixels->push_back(value(p[1]));
|
297
|
+
pixels->push_back(value(p[0]));
|
298
|
+
pixels->push_back(value(p[3]));
|
299
|
+
}
|
300
|
+
}
|
301
|
+
break;
|
302
|
+
|
303
|
+
case Rays::ABGR_float:
|
304
|
+
for (int y = 0; y < h; ++y)
|
305
|
+
{
|
306
|
+
const auto* p = bmp.at<uint8_t>(0, y);
|
307
|
+
for (int x = 0; x < w; ++x, p += 4)
|
308
|
+
{
|
309
|
+
pixels->push_back(value(p[3]));
|
310
|
+
pixels->push_back(value(p[2]));
|
311
|
+
pixels->push_back(value(p[1]));
|
312
|
+
pixels->push_back(value(p[0]));
|
313
|
+
}
|
314
|
+
}
|
315
|
+
break;
|
316
|
+
|
317
|
+
default:
|
318
|
+
argument_error(__FILE__, __LINE__);
|
319
|
+
}
|
320
|
+
}
|
321
|
+
|
322
|
+
static
|
323
|
+
RUCY_DEF0(pixels)
|
324
|
+
{
|
325
|
+
CHECK;
|
326
|
+
|
327
|
+
std::vector<VALUE> pixels;
|
328
|
+
get_pixels(&pixels, *THIS);
|
329
|
+
return value(pixels.size(), (const Value*) &pixels[0]);
|
330
|
+
}
|
331
|
+
RUCY_END
|
332
|
+
|
75
333
|
static
|
76
334
|
RUCY_DEF3(set_at, x, y, color)
|
77
335
|
{
|
@@ -113,6 +371,7 @@ Init_rays_bitmap ()
|
|
113
371
|
cBitmap.define_method("width", width);
|
114
372
|
cBitmap.define_method("height", height);
|
115
373
|
cBitmap.define_method("color_space", color_space);
|
374
|
+
cBitmap.define_method("pixels", pixels);
|
116
375
|
cBitmap.define_method("[]=", set_at);
|
117
376
|
cBitmap.define_method("[]", get_at);
|
118
377
|
}
|
data/ext/rays/defs.cpp
CHANGED
@@ -24,9 +24,9 @@ get_line_args (std::vector<Rays::Point>* points, int argc, const Value* argv)
|
|
24
24
|
points->reserve(argc / 2);
|
25
25
|
for (int i = 0; i < argc; i += 2)
|
26
26
|
{
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
points->emplace_back(
|
28
|
+
to<coord>(argv[i + 0]),
|
29
|
+
to<coord>(argv[i + 1]));
|
30
30
|
}
|
31
31
|
}
|
32
32
|
else
|
data/ext/rays/painter.cpp
CHANGED
@@ -129,11 +129,29 @@ RUCY_DEF0(clear)
|
|
129
129
|
RUCY_END
|
130
130
|
|
131
131
|
static
|
132
|
-
|
132
|
+
RUCY_DEFN(polygon)
|
133
133
|
{
|
134
134
|
CHECK;
|
135
|
+
check_arg_count(__FILE__, __LINE__, "Painter#polygon", argc, 1, 3, 5);
|
136
|
+
|
137
|
+
const Rays::Polygon* polygon = to<Rays::Polygon*>(argv[0]);
|
138
|
+
if (!polygon)
|
139
|
+
argument_error(__FILE__, __LINE__, "%s is not a polygon.", argv[0].inspect().c_str());
|
140
|
+
|
141
|
+
if (argc == 1)
|
142
|
+
THIS->polygon(*polygon);
|
143
|
+
else if (argc == 3)
|
144
|
+
{
|
145
|
+
coord x = to<coord>(argv[1]), y = to<coord>(argv[2]);
|
146
|
+
THIS->polygon(*polygon, x, y);
|
147
|
+
}
|
148
|
+
else if (argc == 5)
|
149
|
+
{
|
150
|
+
coord x = to<coord>(argv[1]), w = to<coord>(argv[3]);
|
151
|
+
coord y = to<coord>(argv[2]), h = to<coord>(argv[4]);
|
152
|
+
THIS->polygon(*polygon, x, y, w, h);
|
153
|
+
}
|
135
154
|
|
136
|
-
THIS->polygon(to<Rays::Polygon&>(poly));
|
137
155
|
return self;
|
138
156
|
}
|
139
157
|
RUCY_END
|
@@ -393,6 +411,23 @@ RUCY_DEF0(get_stroke_width)
|
|
393
411
|
}
|
394
412
|
RUCY_END
|
395
413
|
|
414
|
+
static
|
415
|
+
RUCY_DEF1(set_stroke_outset, outset)
|
416
|
+
{
|
417
|
+
CHECK;
|
418
|
+
THIS->set_stroke_outset(to<float>(outset));
|
419
|
+
return self;
|
420
|
+
}
|
421
|
+
RUCY_END
|
422
|
+
|
423
|
+
static
|
424
|
+
RUCY_DEF0(get_stroke_outset)
|
425
|
+
{
|
426
|
+
CHECK;
|
427
|
+
return value(THIS->stroke_outset());
|
428
|
+
}
|
429
|
+
RUCY_END
|
430
|
+
|
396
431
|
static
|
397
432
|
RUCY_DEF1(set_stroke_cap, cap)
|
398
433
|
{
|
@@ -698,12 +733,14 @@ Init_rays_painter ()
|
|
698
733
|
cPainter.define_method( "stroke=", set_stroke);
|
699
734
|
cPainter.define_method( "stroke", get_stroke);
|
700
735
|
cPainter.define_method("no_stroke", no_stroke);
|
701
|
-
cPainter.define_method( "stroke_width=",
|
702
|
-
cPainter.define_method( "stroke_width",
|
703
|
-
cPainter.define_method( "
|
704
|
-
cPainter.define_method( "
|
705
|
-
cPainter.define_method( "
|
706
|
-
cPainter.define_method( "
|
736
|
+
cPainter.define_method( "stroke_width=", set_stroke_width);
|
737
|
+
cPainter.define_method( "stroke_width", get_stroke_width);
|
738
|
+
cPainter.define_method( "stroke_outset=", set_stroke_outset);
|
739
|
+
cPainter.define_method( "stroke_outset", get_stroke_outset);
|
740
|
+
cPainter.define_method( "stroke_cap=", set_stroke_cap);
|
741
|
+
cPainter.define_method( "stroke_cap", get_stroke_cap);
|
742
|
+
cPainter.define_method( "stroke_join=", set_stroke_join);
|
743
|
+
cPainter.define_method( "stroke_join", get_stroke_join);
|
707
744
|
cPainter.define_method("miter_limit=", set_miter_limit);
|
708
745
|
cPainter.define_method("miter_limit", get_miter_limit);
|
709
746
|
cPainter.define_method("nsegment=", set_nsegment);
|
data/ext/rays/polygon.cpp
CHANGED
@@ -194,6 +194,34 @@ RUCY_DEF1(op_xor, obj)
|
|
194
194
|
}
|
195
195
|
RUCY_END
|
196
196
|
|
197
|
+
static
|
198
|
+
RUCY_DEF1(create_points, args)
|
199
|
+
{
|
200
|
+
std::vector<Rays::Point> points;
|
201
|
+
get_line_args(&points, args.size(), args.as_array());
|
202
|
+
return value(Rays::Polygon(Rays::DRAW_POINTS, &points[0], points.size()));
|
203
|
+
}
|
204
|
+
RUCY_END
|
205
|
+
|
206
|
+
static
|
207
|
+
RUCY_DEF1(create_lines, args)
|
208
|
+
{
|
209
|
+
std::vector<Rays::Point> points;
|
210
|
+
get_line_args(&points, args.size(), args.as_array());
|
211
|
+
return value(Rays::Polygon(Rays::DRAW_LINES, &points[0], points.size()));
|
212
|
+
}
|
213
|
+
RUCY_END
|
214
|
+
|
215
|
+
static
|
216
|
+
RUCY_DEF2(create_line_strip, args, loop)
|
217
|
+
{
|
218
|
+
std::vector<Rays::Point> points;
|
219
|
+
get_line_args(&points, args.size(), args.as_array());
|
220
|
+
return value(
|
221
|
+
Rays::Polygon(Rays::DRAW_LINE_STRIP, &points[0], points.size(), loop));
|
222
|
+
}
|
223
|
+
RUCY_END
|
224
|
+
|
197
225
|
static
|
198
226
|
RUCY_DEF7(create_rect,
|
199
227
|
args, round, lefttop, righttop, leftbottom, rightbottom, nsegment)
|
@@ -226,6 +254,55 @@ RUCY_DEF7(create_ellipse,
|
|
226
254
|
}
|
227
255
|
RUCY_END
|
228
256
|
|
257
|
+
static
|
258
|
+
RUCY_DEF2(create_triangles, args, loop)
|
259
|
+
{
|
260
|
+
std::vector<Rays::Point> points;
|
261
|
+
get_line_args(&points, args.size(), args.as_array());
|
262
|
+
return value(
|
263
|
+
Rays::Polygon(Rays::DRAW_TRIANGLES, &points[0], points.size(), loop));
|
264
|
+
}
|
265
|
+
RUCY_END
|
266
|
+
|
267
|
+
static
|
268
|
+
RUCY_DEF1(create_triangle_strip, args)
|
269
|
+
{
|
270
|
+
std::vector<Rays::Point> points;
|
271
|
+
get_line_args(&points, args.size(), args.as_array());
|
272
|
+
return value(
|
273
|
+
Rays::Polygon(Rays::DRAW_TRIANGLE_STRIP, &points[0], points.size()));
|
274
|
+
}
|
275
|
+
RUCY_END
|
276
|
+
|
277
|
+
static
|
278
|
+
RUCY_DEF1(create_triangle_fan, args)
|
279
|
+
{
|
280
|
+
std::vector<Rays::Point> points;
|
281
|
+
get_line_args(&points, args.size(), args.as_array());
|
282
|
+
return value(
|
283
|
+
Rays::Polygon(Rays::DRAW_TRIANGLE_FAN, &points[0], points.size()));
|
284
|
+
}
|
285
|
+
RUCY_END
|
286
|
+
|
287
|
+
static
|
288
|
+
RUCY_DEF2(create_quads, args, loop)
|
289
|
+
{
|
290
|
+
std::vector<Rays::Point> points;
|
291
|
+
get_line_args(&points, args.size(), args.as_array());
|
292
|
+
return value(
|
293
|
+
Rays::Polygon(Rays::DRAW_QUADS, &points[0], points.size(), loop));
|
294
|
+
}
|
295
|
+
RUCY_END
|
296
|
+
|
297
|
+
static
|
298
|
+
RUCY_DEF1(create_quad_strip, args)
|
299
|
+
{
|
300
|
+
std::vector<Rays::Point> points;
|
301
|
+
get_line_args(&points, args.size(), args.as_array());
|
302
|
+
return value(Rays::Polygon(Rays::DRAW_QUAD_STRIP, &points[0], points.size()));
|
303
|
+
}
|
304
|
+
RUCY_END
|
305
|
+
|
229
306
|
static
|
230
307
|
RUCY_DEF2(create_curve, args, loop)
|
231
308
|
{
|
@@ -268,10 +345,18 @@ Init_rays_polygon ()
|
|
268
345
|
cPolygon.define_method("&", op_and);
|
269
346
|
cPolygon.define_method("|", op_or);
|
270
347
|
cPolygon.define_method("^", op_xor);
|
271
|
-
cPolygon.define_singleton_method("
|
272
|
-
cPolygon.define_singleton_method("
|
273
|
-
cPolygon.define_singleton_method("
|
274
|
-
cPolygon.define_singleton_method("
|
348
|
+
cPolygon.define_singleton_method("points!", create_points);
|
349
|
+
cPolygon.define_singleton_method("lines!", create_lines);
|
350
|
+
cPolygon.define_singleton_method("line_strip!", create_line_strip);
|
351
|
+
cPolygon.define_singleton_method("rect!", create_rect);
|
352
|
+
cPolygon.define_singleton_method("ellipse!", create_ellipse);
|
353
|
+
cPolygon.define_singleton_method("triangles!", create_triangles);
|
354
|
+
cPolygon.define_singleton_method("triangle_strip!", create_triangle_strip);
|
355
|
+
cPolygon.define_singleton_method("triangle_fan!", create_triangle_fan);
|
356
|
+
cPolygon.define_singleton_method("quads!", create_quads);
|
357
|
+
cPolygon.define_singleton_method("quad_strip!", create_quad_strip);
|
358
|
+
cPolygon.define_singleton_method("curve!", create_curve);
|
359
|
+
cPolygon.define_singleton_method("bezier!", create_bezier);
|
275
360
|
}
|
276
361
|
|
277
362
|
|
data/ext/rays/rays.cpp
CHANGED
@@ -16,7 +16,7 @@ struct EnumType
|
|
16
16
|
{
|
17
17
|
const char* name;
|
18
18
|
const char* short_name;
|
19
|
-
T
|
19
|
+
T value;
|
20
20
|
};
|
21
21
|
|
22
22
|
static std::vector<EnumType<Rays::CapType>> CAP_TYPES({
|
@@ -72,13 +72,13 @@ Init_rays ()
|
|
72
72
|
mRays.define_singleton_method("fin!", fin);
|
73
73
|
|
74
74
|
for (auto it = CAP_TYPES.begin(); it != CAP_TYPES.end(); ++it)
|
75
|
-
mRays.define_const(it->name, it->
|
75
|
+
mRays.define_const(it->name, it->value);
|
76
76
|
|
77
77
|
for (auto it = JOIN_TYPES.begin(); it != JOIN_TYPES.end(); ++it)
|
78
|
-
mRays.define_const(it->name, it->
|
78
|
+
mRays.define_const(it->name, it->value);
|
79
79
|
|
80
80
|
for (auto it = BLEND_MODES.begin(); it != BLEND_MODES.end(); ++it)
|
81
|
-
mRays.define_const(it->name, it->
|
81
|
+
mRays.define_const(it->name, it->value);
|
82
82
|
}
|
83
83
|
|
84
84
|
|
@@ -102,7 +102,7 @@ namespace Rucy
|
|
102
102
|
strcasecmp(str, it->name) == 0 ||
|
103
103
|
strcasecmp(str, it->short_name) == 0)
|
104
104
|
{
|
105
|
-
return it->
|
105
|
+
return it->value;
|
106
106
|
}
|
107
107
|
}
|
108
108
|
argument_error(__FILE__, __LINE__, "invalid cap type -- %s", str);
|
@@ -133,7 +133,7 @@ namespace Rucy
|
|
133
133
|
strcasecmp(str, it->name) == 0 ||
|
134
134
|
strcasecmp(str, it->short_name) == 0)
|
135
135
|
{
|
136
|
-
return it->
|
136
|
+
return it->value;
|
137
137
|
}
|
138
138
|
}
|
139
139
|
argument_error(__FILE__, __LINE__, "invalid join type -- %s", str);
|
@@ -164,18 +164,18 @@ namespace Rucy
|
|
164
164
|
strcasecmp(str, it->name) == 0 ||
|
165
165
|
strcasecmp(str, it->short_name) == 0)
|
166
166
|
{
|
167
|
-
return it->
|
167
|
+
return it->value;
|
168
168
|
}
|
169
169
|
}
|
170
170
|
argument_error(__FILE__, __LINE__, "invalid blend mode -- %s", str);
|
171
171
|
}
|
172
172
|
}
|
173
173
|
|
174
|
-
int
|
175
|
-
if (
|
176
|
-
argument_error(__FILE__, __LINE__, "invalid blend mode -- %d",
|
174
|
+
int mode = value_to<int>(*argv, convert);
|
175
|
+
if (mode < 0 || Rays::BLEND_MAX <= mode)
|
176
|
+
argument_error(__FILE__, __LINE__, "invalid blend mode -- %d", mode);
|
177
177
|
|
178
|
-
return (Rays::BlendMode)
|
178
|
+
return (Rays::BlendMode) mode;
|
179
179
|
}
|
180
180
|
|
181
181
|
|
data/include/rays/defs.h
CHANGED
@@ -23,6 +23,32 @@ namespace Rays
|
|
23
23
|
typedef float coord;
|
24
24
|
|
25
25
|
|
26
|
+
enum DrawMode
|
27
|
+
{
|
28
|
+
|
29
|
+
DRAW_POINTS = 0,
|
30
|
+
|
31
|
+
DRAW_LINES,
|
32
|
+
|
33
|
+
DRAW_LINE_STRIP,
|
34
|
+
|
35
|
+
DRAW_TRIANGLES,
|
36
|
+
|
37
|
+
DRAW_TRIANGLE_STRIP,
|
38
|
+
|
39
|
+
DRAW_TRIANGLE_FAN,
|
40
|
+
|
41
|
+
DRAW_QUADS,
|
42
|
+
|
43
|
+
DRAW_QUAD_STRIP,
|
44
|
+
|
45
|
+
DRAW_POLYGON,
|
46
|
+
|
47
|
+
DRAW_MAX,
|
48
|
+
|
49
|
+
};// DrawMode
|
50
|
+
|
51
|
+
|
26
52
|
enum CapType
|
27
53
|
{
|
28
54
|
|
data/include/rays/matrix.h
CHANGED
data/include/rays/painter.h
CHANGED
@@ -65,7 +65,17 @@ namespace Rays
|
|
65
65
|
|
66
66
|
void clear ();
|
67
67
|
|
68
|
-
void polygon (
|
68
|
+
void polygon (
|
69
|
+
const Polygon& polygon, coord x = 0, coord y = 0);
|
70
|
+
|
71
|
+
void polygon (
|
72
|
+
const Polygon& polygon, const Point& position);
|
73
|
+
|
74
|
+
void polygon (
|
75
|
+
const Polygon& polygon, coord x, coord y, coord width, coord height);
|
76
|
+
|
77
|
+
void polygon (
|
78
|
+
const Polygon& polygon, const Bounds& bounds);
|
69
79
|
|
70
80
|
void line (coord x1, coord y1, coord x2, coord y2);
|
71
81
|
|
@@ -205,6 +215,10 @@ namespace Rays
|
|
205
215
|
|
206
216
|
coord stroke_width () const;
|
207
217
|
|
218
|
+
void set_stroke_outset (float outset);
|
219
|
+
|
220
|
+
float stroke_outset () const;
|
221
|
+
|
208
222
|
void set_stroke_cap (CapType cap);
|
209
223
|
|
210
224
|
CapType stroke_cap () const;
|
data/include/rays/polygon.h
CHANGED
@@ -54,7 +54,12 @@ namespace Rays
|
|
54
54
|
|
55
55
|
Polygon ();
|
56
56
|
|
57
|
-
Polygon (
|
57
|
+
Polygon (
|
58
|
+
const Point* points, size_t size, bool loop = true);
|
59
|
+
|
60
|
+
Polygon (
|
61
|
+
DrawMode mode,
|
62
|
+
const Point* points, size_t size, bool loop = true);
|
58
63
|
|
59
64
|
Polygon (const Polyline& polyline);
|
60
65
|
|
data/include/rays/polyline.h
CHANGED
@@ -31,6 +31,8 @@ namespace Rays
|
|
31
31
|
|
32
32
|
Polyline (const Point* points, size_t size, bool loop = false);
|
33
33
|
|
34
|
+
Polyline (const Point* points, size_t size, bool loop, bool fill);
|
35
|
+
|
34
36
|
~Polyline ();
|
35
37
|
|
36
38
|
bool expand (
|
@@ -44,6 +46,8 @@ namespace Rays
|
|
44
46
|
|
45
47
|
bool loop () const;
|
46
48
|
|
49
|
+
bool fill () const;
|
50
|
+
|
47
51
|
size_t size () const;
|
48
52
|
|
49
53
|
bool empty () const;
|
data/lib/rays/painter.rb
CHANGED
@@ -119,7 +119,7 @@ module Rays
|
|
119
119
|
}
|
120
120
|
|
121
121
|
universal_accessor :background, :fill, :stroke, :color,
|
122
|
-
:stroke_width, :stroke_cap, :stroke_join, :miter_limit,
|
122
|
+
:stroke_width, :stroke_outset, :stroke_cap, :stroke_join, :miter_limit,
|
123
123
|
:nsegment, :blend_mode, :shader, :clip, :font
|
124
124
|
|
125
125
|
private
|