rays 0.1.48 → 0.1.49
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/color.cpp +11 -0
- data/.doc/ext/rays/image.cpp +3 -3
- data/.doc/ext/rays/matrix.cpp +65 -7
- data/.doc/ext/rays/painter.cpp +44 -6
- data/.doc/ext/rays/point.cpp +1 -11
- data/.doc/ext/rays/polygon.cpp +6 -4
- data/ChangeLog.md +23 -0
- data/VERSION +1 -1
- data/ext/rays/color.cpp +13 -1
- data/ext/rays/image.cpp +3 -3
- data/ext/rays/matrix.cpp +69 -7
- data/ext/rays/painter.cpp +52 -10
- data/ext/rays/point.cpp +1 -12
- data/ext/rays/polygon.cpp +6 -4
- data/include/rays/color.h +3 -1
- data/include/rays/image.h +1 -1
- data/include/rays/matrix.h +24 -0
- data/include/rays/painter.h +10 -0
- data/include/rays/polygon.h +12 -6
- data/lib/rays/color.rb +6 -0
- data/lib/rays/image.rb +11 -1
- data/lib/rays/matrix.rb +16 -0
- data/lib/rays/painter.rb +8 -8
- data/lib/rays/point.rb +4 -0
- data/lib/rays/polygon.rb +4 -4
- data/rays.gemspec +2 -2
- data/src/color.cpp +11 -2
- data/src/font.cpp +13 -16
- data/src/font.h +0 -6
- data/src/image.cpp +58 -14
- data/src/ios/font.mm +6 -10
- data/src/ios/helper.h +2 -2
- data/src/ios/helper.mm +2 -2
- data/src/matrix.cpp +45 -0
- data/src/osx/font.mm +3 -5
- data/src/painter.cpp +91 -29
- data/src/polygon.cpp +28 -18
- data/src/texture.cpp +21 -2
- data/src/texture.h +2 -0
- data/test/test_color.rb +21 -4
- data/test/test_font.rb +3 -0
- data/test/test_image.rb +26 -0
- data/test/test_matrix.rb +22 -0
- data/test/test_painter.rb +27 -0
- metadata +7 -7
data/src/painter.cpp
CHANGED
@@ -59,6 +59,8 @@ namespace Rays
|
|
59
59
|
|
60
60
|
uint nsegment;
|
61
61
|
|
62
|
+
coord line_height;
|
63
|
+
|
62
64
|
BlendMode blend_mode;
|
63
65
|
|
64
66
|
Bounds clip;
|
@@ -84,6 +86,7 @@ namespace Rays
|
|
84
86
|
stroke_join = JOIN_DEFAULT;
|
85
87
|
miter_limit = JOIN_DEFAULT_MITER_LIMIT;
|
86
88
|
nsegment = 0;
|
89
|
+
line_height = -1;
|
87
90
|
blend_mode = BLEND_NORMAL;
|
88
91
|
clip .reset(-1);
|
89
92
|
font = get_default_font();
|
@@ -723,7 +726,13 @@ namespace Rays
|
|
723
726
|
set_blend_mode(self->state.blend_mode);
|
724
727
|
|
725
728
|
FrameBuffer& fb = self->frame_buffer;
|
726
|
-
if (fb)
|
729
|
+
if (fb)
|
730
|
+
{
|
731
|
+
FrameBuffer_bind(fb.id());
|
732
|
+
|
733
|
+
Texture& tex = fb.texture();
|
734
|
+
if (tex) tex.set_modified();
|
735
|
+
}
|
727
736
|
|
728
737
|
const Bounds& vp = self->viewport;
|
729
738
|
float density = self->pixel_density;
|
@@ -773,12 +782,7 @@ namespace Rays
|
|
773
782
|
glFinish();
|
774
783
|
|
775
784
|
if (self->frame_buffer)
|
776
|
-
{
|
777
785
|
FrameBuffer_unbind();
|
778
|
-
|
779
|
-
Texture& tex = self->frame_buffer.texture();
|
780
|
-
if (tex) tex.set_modified();
|
781
|
-
}
|
782
786
|
}
|
783
787
|
|
784
788
|
bool
|
@@ -893,6 +897,24 @@ namespace Rays
|
|
893
897
|
this, polygon, bounds.x, bounds.y, bounds.width, bounds.height, true);
|
894
898
|
}
|
895
899
|
|
900
|
+
void
|
901
|
+
Painter::point (coord x, coord y)
|
902
|
+
{
|
903
|
+
polygon(create_point(x, y));
|
904
|
+
}
|
905
|
+
|
906
|
+
void
|
907
|
+
Painter::point (const Point& point)
|
908
|
+
{
|
909
|
+
polygon(create_point(point));
|
910
|
+
}
|
911
|
+
|
912
|
+
void
|
913
|
+
Painter::points (const Point* points, size_t size)
|
914
|
+
{
|
915
|
+
polygon(create_points(points, size));
|
916
|
+
}
|
917
|
+
|
896
918
|
void
|
897
919
|
Painter::line (coord x1, coord y1, coord x2, coord y2)
|
898
920
|
{
|
@@ -990,7 +1012,7 @@ namespace Rays
|
|
990
1012
|
coord x3, coord y3, coord x4, coord y4,
|
991
1013
|
bool loop)
|
992
1014
|
{
|
993
|
-
polygon(create_curve(x1, y1, x2, y2, x3, y3, x4, y4, loop));
|
1015
|
+
polygon(create_curve(x1, y1, x2, y2, x3, y3, x4, y4, loop, nsegment()));
|
994
1016
|
}
|
995
1017
|
|
996
1018
|
void
|
@@ -998,13 +1020,13 @@ namespace Rays
|
|
998
1020
|
const Point& p1, const Point& p2, const Point& p3, const Point& p4,
|
999
1021
|
bool loop)
|
1000
1022
|
{
|
1001
|
-
polygon(create_curve(p1, p2, p3, p4, loop));
|
1023
|
+
polygon(create_curve(p1, p2, p3, p4, loop, nsegment()));
|
1002
1024
|
}
|
1003
1025
|
|
1004
1026
|
void
|
1005
1027
|
Painter::curve (const Point* points, size_t size, bool loop)
|
1006
1028
|
{
|
1007
|
-
polygon(create_curve(points, size, loop));
|
1029
|
+
polygon(create_curve(points, size, loop, nsegment()));
|
1008
1030
|
}
|
1009
1031
|
|
1010
1032
|
void
|
@@ -1013,7 +1035,7 @@ namespace Rays
|
|
1013
1035
|
coord x3, coord y3, coord x4, coord y4,
|
1014
1036
|
bool loop)
|
1015
1037
|
{
|
1016
|
-
polygon(create_bezier(x1, y1, x2, y2, x3, y3, x4, y4, loop));
|
1038
|
+
polygon(create_bezier(x1, y1, x2, y2, x3, y3, x4, y4, loop, nsegment()));
|
1017
1039
|
}
|
1018
1040
|
|
1019
1041
|
void
|
@@ -1021,13 +1043,13 @@ namespace Rays
|
|
1021
1043
|
const Point& p1, const Point& p2, const Point& p3, const Point& p4,
|
1022
1044
|
bool loop)
|
1023
1045
|
{
|
1024
|
-
polygon(create_bezier(p1, p2, p3, p4, loop));
|
1046
|
+
polygon(create_bezier(p1, p2, p3, p4, loop, nsegment()));
|
1025
1047
|
}
|
1026
1048
|
|
1027
1049
|
void
|
1028
1050
|
Painter::bezier (const Point* points, size_t size, bool loop)
|
1029
1051
|
{
|
1030
|
-
polygon(create_bezier(points, size, loop));
|
1052
|
+
polygon(create_bezier(points, size, loop, nsegment()));
|
1031
1053
|
}
|
1032
1054
|
|
1033
1055
|
static void
|
@@ -1176,7 +1198,7 @@ namespace Rays
|
|
1176
1198
|
}
|
1177
1199
|
|
1178
1200
|
static inline void
|
1179
|
-
|
1201
|
+
debug_draw_line (
|
1180
1202
|
Painter* painter, const Font& font,
|
1181
1203
|
coord x, coord y, coord str_width, coord str_height)
|
1182
1204
|
{
|
@@ -1210,25 +1232,20 @@ namespace Rays
|
|
1210
1232
|
}
|
1211
1233
|
|
1212
1234
|
static void
|
1213
|
-
|
1235
|
+
draw_line (
|
1214
1236
|
Painter* painter, const Font& font,
|
1215
|
-
const char*
|
1237
|
+
const char* line, coord x, coord y, coord width = 0, coord height = 0)
|
1216
1238
|
{
|
1217
1239
|
assert(painter && font && str && *str != '\0');
|
1218
1240
|
|
1219
1241
|
Painter::Data* self = painter->self.get();
|
1220
1242
|
|
1221
|
-
|
1222
|
-
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1226
|
-
|
1227
|
-
float density = self->pixel_density;
|
1228
|
-
coord str_w = Font_get_width(font, density, str);
|
1229
|
-
coord str_h = Font_get_height(font, density);
|
1230
|
-
int tex_w = ceil(str_w);
|
1231
|
-
int tex_h = ceil(str_h);
|
1243
|
+
float density = self->pixel_density;
|
1244
|
+
const RawFont& rawfont = Font_get_raw(font, density);
|
1245
|
+
coord str_w = rawfont.get_width(line);
|
1246
|
+
coord str_h = rawfont.get_height();
|
1247
|
+
int tex_w = ceil(str_w);
|
1248
|
+
int tex_h = ceil(str_h);
|
1232
1249
|
const Texture& texture = Image_get_texture(self->text_image);
|
1233
1250
|
if (
|
1234
1251
|
texture.width() < tex_w ||
|
@@ -1245,8 +1262,7 @@ namespace Rays
|
|
1245
1262
|
|
1246
1263
|
assert(self->text_image.pixel_density() == density);
|
1247
1264
|
|
1248
|
-
Bitmap_draw_string(
|
1249
|
-
&self->text_image.bitmap(), Font_get_raw(font, density), str, 0, 0);
|
1265
|
+
Bitmap_draw_string(&self->text_image.bitmap(), rawfont, line, 0, 0);
|
1250
1266
|
|
1251
1267
|
str_w /= density;
|
1252
1268
|
str_h /= density;
|
@@ -1259,7 +1275,38 @@ namespace Rays
|
|
1259
1275
|
x, y, str_w, str_h,
|
1260
1276
|
false, true, &Shader_get_shader_for_text());
|
1261
1277
|
|
1262
|
-
|
1278
|
+
debug_draw_line(painter, font, x, y, str_w / density, str_h / density);
|
1279
|
+
}
|
1280
|
+
|
1281
|
+
static void
|
1282
|
+
draw_text (
|
1283
|
+
Painter* painter, const Font& font,
|
1284
|
+
const char* str, coord x, coord y, coord width = 0, coord height = 0)
|
1285
|
+
{
|
1286
|
+
assert(painter && font && str && *str != '\0');
|
1287
|
+
|
1288
|
+
Painter::Data* self = painter->self.get();
|
1289
|
+
|
1290
|
+
if (!self->painting)
|
1291
|
+
invalid_state_error(__FILE__, __LINE__, "painting flag should be true.");
|
1292
|
+
|
1293
|
+
if (!self->state.has_color())
|
1294
|
+
return;
|
1295
|
+
|
1296
|
+
if (!strchr(str, '\n'))
|
1297
|
+
draw_line(painter, font, str, x, y, width, height);
|
1298
|
+
else
|
1299
|
+
{
|
1300
|
+
coord line_height = painter->line_height();
|
1301
|
+
|
1302
|
+
Xot::StringList lines;
|
1303
|
+
split(&lines, str, '\n');
|
1304
|
+
for (const auto& line : lines)
|
1305
|
+
{
|
1306
|
+
draw_line(painter, font, line.c_str(), x, y, width, height);
|
1307
|
+
y += line_height;
|
1308
|
+
}
|
1309
|
+
}
|
1263
1310
|
}
|
1264
1311
|
|
1265
1312
|
void
|
@@ -1454,6 +1501,21 @@ namespace Rays
|
|
1454
1501
|
return self->state.nsegment;
|
1455
1502
|
}
|
1456
1503
|
|
1504
|
+
void
|
1505
|
+
Painter::set_line_height (coord height)
|
1506
|
+
{
|
1507
|
+
if (height < 0) height = -1;
|
1508
|
+
self->state.line_height = height;
|
1509
|
+
}
|
1510
|
+
|
1511
|
+
coord
|
1512
|
+
Painter::line_height (bool raw) const
|
1513
|
+
{
|
1514
|
+
coord height = self->state.line_height;
|
1515
|
+
if (!raw && height < 0) height = self->state.font.get_height();
|
1516
|
+
return height;
|
1517
|
+
}
|
1518
|
+
|
1457
1519
|
void
|
1458
1520
|
Painter::set_blend_mode (BlendMode mode)
|
1459
1521
|
{
|
data/src/polygon.cpp
CHANGED
@@ -431,7 +431,7 @@ namespace Rays
|
|
431
431
|
#endif
|
432
432
|
|
433
433
|
static uint
|
434
|
-
|
434
|
+
get_nsegment_for_angle (
|
435
435
|
uint nsegment, uint nsegment_min, float angle_from, float angle_to)
|
436
436
|
{
|
437
437
|
float angle = angle_to - angle_from;
|
@@ -700,7 +700,7 @@ namespace Rays
|
|
700
700
|
left_top != 0 || right_top != 0 ||
|
701
701
|
left_bottom != 0 || right_bottom != 0);
|
702
702
|
|
703
|
-
nsegment =
|
703
|
+
nsegment = get_nsegment_for_angle(nsegment, 1, 0, 90);
|
704
704
|
|
705
705
|
fix_rounds(
|
706
706
|
&left_top, &right_top,
|
@@ -863,7 +863,7 @@ namespace Rays
|
|
863
863
|
{
|
864
864
|
assert(width != 0 && height != 0);
|
865
865
|
|
866
|
-
nsegment =
|
866
|
+
nsegment = get_nsegment_for_angle(nsegment, 3, 0, 360);
|
867
867
|
|
868
868
|
bool has_hole = hole_size != 0;
|
869
869
|
float radian_from = Xot::deg2rad(0);
|
@@ -904,7 +904,7 @@ namespace Rays
|
|
904
904
|
{
|
905
905
|
assert(width != 0 && height != 0 && angle_from != angle_to);
|
906
906
|
|
907
|
-
nsegment =
|
907
|
+
nsegment = get_nsegment_for_angle(nsegment, 3, angle_from, angle_to);
|
908
908
|
|
909
909
|
bool has_hole = hole_size != 0;
|
910
910
|
float radian_from = Xot::deg2rad(angle_from);
|
@@ -973,9 +973,17 @@ namespace Rays
|
|
973
973
|
Polygon
|
974
974
|
create_points (const Point* points, size_t size)
|
975
975
|
{
|
976
|
+
static const coord DELTA = 0.01;
|
977
|
+
|
976
978
|
Polygon p;
|
977
979
|
for (size_t i = 0; i < size; ++i)
|
978
|
-
|
980
|
+
{
|
981
|
+
// Polyline(&points[i], 1, false, false).expand() ignores CapType
|
982
|
+
|
983
|
+
coord x = points[i].x, y = points[i].y;
|
984
|
+
Point array[] = {{x, y}, {x + DELTA, y + DELTA}};
|
985
|
+
p.self->append(Polyline(array, 2, false, false));
|
986
|
+
}
|
979
987
|
return p;
|
980
988
|
}
|
981
989
|
|
@@ -1353,11 +1361,13 @@ namespace Rays
|
|
1353
1361
|
create_spline (
|
1354
1362
|
SplineType type,
|
1355
1363
|
const Point* points, size_t size, bool loop,
|
1356
|
-
uint nsegment =
|
1364
|
+
uint nsegment = 0)
|
1357
1365
|
{
|
1358
1366
|
if (size % 4 != 0)
|
1359
1367
|
argument_error(__FILE__, __LINE__);
|
1360
1368
|
|
1369
|
+
if (nsegment <= 0) nsegment = 16;
|
1370
|
+
|
1361
1371
|
size_t count = size / 4;
|
1362
1372
|
auto spline_fun = get_spline_fun(type);
|
1363
1373
|
|
@@ -1384,7 +1394,7 @@ namespace Rays
|
|
1384
1394
|
create_curve (
|
1385
1395
|
coord x1, coord y1, coord x2, coord y2,
|
1386
1396
|
coord x3, coord y3, coord x4, coord y4,
|
1387
|
-
bool loop)
|
1397
|
+
bool loop, uint nsegment)
|
1388
1398
|
{
|
1389
1399
|
const Point points[] = {
|
1390
1400
|
Point(x1, y1),
|
@@ -1392,29 +1402,29 @@ namespace Rays
|
|
1392
1402
|
Point(x3, y3),
|
1393
1403
|
Point(x4, y4)
|
1394
1404
|
};
|
1395
|
-
return create_spline(CATMULLROM, points, 4, loop);
|
1405
|
+
return create_spline(CATMULLROM, points, 4, loop, nsegment);
|
1396
1406
|
}
|
1397
1407
|
|
1398
1408
|
Polygon
|
1399
1409
|
create_curve (
|
1400
1410
|
const Point& p1, const Point& p2, const Point& p3, const Point& p4,
|
1401
|
-
bool loop)
|
1411
|
+
bool loop, uint nsegment)
|
1402
1412
|
{
|
1403
1413
|
const Point points[] = {p1, p2, p3, p4};
|
1404
|
-
return create_spline(CATMULLROM, points, 4, loop);
|
1414
|
+
return create_spline(CATMULLROM, points, 4, loop, nsegment);
|
1405
1415
|
}
|
1406
1416
|
|
1407
1417
|
Polygon
|
1408
|
-
create_curve (const Point* points, size_t size, bool loop)
|
1418
|
+
create_curve (const Point* points, size_t size, bool loop, uint nsegment)
|
1409
1419
|
{
|
1410
|
-
return create_spline(CATMULLROM, points, size, loop);
|
1420
|
+
return create_spline(CATMULLROM, points, size, loop, nsegment);
|
1411
1421
|
}
|
1412
1422
|
|
1413
1423
|
Polygon
|
1414
1424
|
create_bezier (
|
1415
1425
|
coord x1, coord y1, coord x2, coord y2,
|
1416
1426
|
coord x3, coord y3, coord x4, coord y4,
|
1417
|
-
bool loop)
|
1427
|
+
bool loop, uint nsegment)
|
1418
1428
|
{
|
1419
1429
|
const Point points[] = {
|
1420
1430
|
Point(x1, y1),
|
@@ -1422,22 +1432,22 @@ namespace Rays
|
|
1422
1432
|
Point(x3, y3),
|
1423
1433
|
Point(x4, y4)
|
1424
1434
|
};
|
1425
|
-
return create_spline(BEZIER, points, 4, loop);
|
1435
|
+
return create_spline(BEZIER, points, 4, loop, nsegment);
|
1426
1436
|
}
|
1427
1437
|
|
1428
1438
|
Polygon
|
1429
1439
|
create_bezier (
|
1430
1440
|
const Point& p1, const Point& p2, const Point& p3, const Point& p4,
|
1431
|
-
bool loop)
|
1441
|
+
bool loop, uint nsegment)
|
1432
1442
|
{
|
1433
1443
|
const Point points[] = {p1, p2, p3, p4};
|
1434
|
-
return create_spline(BEZIER, points, 4, loop);
|
1444
|
+
return create_spline(BEZIER, points, 4, loop, nsegment);
|
1435
1445
|
}
|
1436
1446
|
|
1437
1447
|
Polygon
|
1438
|
-
create_bezier (const Point* points, size_t size, bool loop)
|
1448
|
+
create_bezier (const Point* points, size_t size, bool loop, uint nsegment)
|
1439
1449
|
{
|
1440
|
-
return create_spline(BEZIER, points, size, loop);
|
1450
|
+
return create_spline(BEZIER, points, size, loop, nsegment);
|
1441
1451
|
}
|
1442
1452
|
|
1443
1453
|
void
|
data/src/texture.cpp
CHANGED
@@ -145,7 +145,7 @@ namespace Rays
|
|
145
145
|
}
|
146
146
|
|
147
147
|
static void
|
148
|
-
|
148
|
+
copy_pixels (Bitmap* dest, const Bitmap& src)
|
149
149
|
{
|
150
150
|
assert(dest);
|
151
151
|
|
@@ -174,7 +174,7 @@ namespace Rays
|
|
174
174
|
if (!*bmp)
|
175
175
|
rays_error(__FILE__, __LINE__);
|
176
176
|
|
177
|
-
|
177
|
+
copy_pixels(bmp.get(), bitmap);
|
178
178
|
return bmp;
|
179
179
|
}
|
180
180
|
|
@@ -258,6 +258,25 @@ namespace Rays
|
|
258
258
|
&bitmap);
|
259
259
|
}
|
260
260
|
|
261
|
+
Texture&
|
262
|
+
Texture::operator = (const Bitmap& bitmap)
|
263
|
+
{
|
264
|
+
if (!bitmap)
|
265
|
+
argument_error(__FILE__, __LINE__);
|
266
|
+
|
267
|
+
int w = bitmap.width(), h = bitmap.height();
|
268
|
+
if (w != width() || h != height())
|
269
|
+
argument_error(__FILE__, __LINE__, "the size of bitmap does not match");
|
270
|
+
|
271
|
+
GLenum format, type;
|
272
|
+
ColorSpace_get_gl_format_and_type(&format, &type, bitmap.color_space());
|
273
|
+
|
274
|
+
glBindTexture(GL_TEXTURE_2D, self->id);
|
275
|
+
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, format, type, bitmap.pixels());
|
276
|
+
|
277
|
+
return *this;
|
278
|
+
}
|
279
|
+
|
261
280
|
Texture::~Texture ()
|
262
281
|
{
|
263
282
|
}
|
data/src/texture.h
CHANGED
data/test/test_color.rb
CHANGED
@@ -66,19 +66,18 @@ class TestColor < Test::Unit::TestCase
|
|
66
66
|
def test_set_rgb()
|
67
67
|
o = color
|
68
68
|
assert_equal [0, 0, 0, 1], o.to_a
|
69
|
-
o.red
|
69
|
+
o.red = 1
|
70
70
|
assert_equal [1, 0, 0, 1], o.to_a
|
71
71
|
o.green = 2
|
72
72
|
assert_equal [1, 2, 0, 1], o.to_a
|
73
|
-
o.blue
|
73
|
+
o.blue = 3
|
74
74
|
assert_equal [1, 2, 3, 1], o.to_a
|
75
75
|
o.alpha = 4
|
76
76
|
assert_equal [1, 2, 3, 4], o.to_a
|
77
77
|
end
|
78
78
|
|
79
79
|
def test_to_a()
|
80
|
-
|
81
|
-
assert_equal [1, 2, 3, 4], o.to_a
|
80
|
+
assert_equal [1, 2, 3, 4], color(1, 2, 3, 4).to_a
|
82
81
|
end
|
83
82
|
|
84
83
|
def test_index()
|
@@ -121,6 +120,14 @@ class TestColor < Test::Unit::TestCase
|
|
121
120
|
assert o > color(1, 2, 3, 3)
|
122
121
|
end
|
123
122
|
|
123
|
+
def test_to_hsv()
|
124
|
+
h, s, v, a = hsv(0.1, 0.2, 0.3, 0.4).to_hsv
|
125
|
+
assert_in_delta 0.1, h
|
126
|
+
assert_in_delta 0.2, s
|
127
|
+
assert_in_delta 0.3, v
|
128
|
+
assert_in_delta 0.4, a
|
129
|
+
end
|
130
|
+
|
124
131
|
def test_hsv_hue()
|
125
132
|
assert_equal_color color(0.5, 0, 1), hsv(-0.25, 1, 1)
|
126
133
|
assert_equal_color color(1, 0, 0), hsv( 0, 1, 1)
|
@@ -149,6 +156,16 @@ class TestColor < Test::Unit::TestCase
|
|
149
156
|
assert_equal_color color(1, 0, 0, 1), hsv(1, 1, 1, 1)
|
150
157
|
end
|
151
158
|
|
159
|
+
def test_hsb()
|
160
|
+
assert_equal(
|
161
|
+
Rays::Color.hsv(0.1, 0.2, 0.3, 0.4),
|
162
|
+
Rays::Color.hsb(0.1, 0.2, 0.3, 0.4))
|
163
|
+
|
164
|
+
assert_equal(
|
165
|
+
color(0.1, 0.2, 0.3, 0.4).to_hsv,
|
166
|
+
color(0.1, 0.2, 0.3, 0.4).to_hsb)
|
167
|
+
end
|
168
|
+
|
152
169
|
def test_inspect()
|
153
170
|
assert_equal "#<Rays::Color 1.0 2.0 3.0 1.0>", color(1, 2, 3).inspect
|
154
171
|
end
|
data/test/test_font.rb
CHANGED
@@ -34,6 +34,9 @@ class TestFont < Test::Unit::TestCase
|
|
34
34
|
assert_equal 0, font.width('')
|
35
35
|
w = font.width 'X'
|
36
36
|
assert_equal w * 2, font.width('XX')
|
37
|
+
assert_equal w * 2, font.width("XX\nX")
|
38
|
+
assert_equal w * 2, font.width("XX\nXX")
|
39
|
+
assert_equal w * 3, font.width("XX\nXXX")
|
37
40
|
end
|
38
41
|
|
39
42
|
def test_height()
|
data/test/test_image.rb
CHANGED
@@ -19,6 +19,10 @@ class TestImage < Test::Unit::TestCase
|
|
19
19
|
Rays::Bounds.new(*args)
|
20
20
|
end
|
21
21
|
|
22
|
+
def update_texture(img)
|
23
|
+
image(1, 1).paint {image img}
|
24
|
+
end
|
25
|
+
|
22
26
|
def test_initialize()
|
23
27
|
assert_equal 10, image(10, 20).width
|
24
28
|
assert_equal 20, image(10, 20).height
|
@@ -42,6 +46,28 @@ class TestImage < Test::Unit::TestCase
|
|
42
46
|
assert_equal 10, image(20, 10).bitmap.height
|
43
47
|
end
|
44
48
|
|
49
|
+
def test_bitmap_with_modify_flag()
|
50
|
+
img1 = image 1, 1
|
51
|
+
update_texture img1
|
52
|
+
img1.bitmap(false).tap {|bmp| bmp[0, 0] = color 1, 0, 0, 1}
|
53
|
+
|
54
|
+
img2 = image 1, 1
|
55
|
+
update_texture img2
|
56
|
+
img2.bitmap(true) .tap {|bmp| bmp[0, 0] = color 0, 1, 0, 1}
|
57
|
+
|
58
|
+
assert_equal [0x00000000], image(1, 1).paint {image img1}.pixels
|
59
|
+
assert_equal [0xff00ff00], image(1, 1).paint {image img2}.pixels
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_pixels()
|
63
|
+
img = image 2, 1
|
64
|
+
assert_equal [0x00000000, 0x00000000], img.pixels
|
65
|
+
|
66
|
+
img.pixels = [0xffff0000, 0xff00ff00]
|
67
|
+
assert_equal [0xffff0000, 0xff00ff00], img.pixels
|
68
|
+
assert_equal [0xffff0000, 0xff00ff00], image(2, 1).paint {image img}.pixels
|
69
|
+
end
|
70
|
+
|
45
71
|
def test_painter()
|
46
72
|
pa = image(10, 10).painter
|
47
73
|
assert_equal color(0, 0, 0, 0), pa.background
|
data/test/test_matrix.rb
CHANGED
@@ -87,6 +87,10 @@ class TestMatrix < Test::Unit::TestCase
|
|
87
87
|
assert o > matrix(0)
|
88
88
|
end
|
89
89
|
|
90
|
+
def test_transpose()
|
91
|
+
assert_equal mat_str('1594 2615 3726 4837'), mat_str('1234 5678 9123 4567').transpose
|
92
|
+
end
|
93
|
+
|
90
94
|
def test_transform()
|
91
95
|
assert_equal mat_str('1001 0102 0013 0001'), translate(1, 2, 3)
|
92
96
|
assert_equal mat_str('2000 0300 0040 0001'), scale(2, 3, 4)
|
@@ -100,4 +104,22 @@ class TestMatrix < Test::Unit::TestCase
|
|
100
104
|
assert (rotate(90, 1, 0, 0) * point(0, 1, 0)).z > 0.99
|
101
105
|
end
|
102
106
|
|
107
|
+
def test_ortho()
|
108
|
+
m = Rays::Matrix
|
109
|
+
assert_equal m, m.ortho(1, 2, 3, 4) .class
|
110
|
+
assert_equal m, m.ortho(1, 2, 3, 4, 5, 6).class
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_projection()
|
114
|
+
m = Rays::Matrix
|
115
|
+
assert_equal m, m.ortho(1, 2, 3, 4).class
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_look_at()
|
119
|
+
m = Rays::Matrix
|
120
|
+
assert_equal m, m.look_at(1, 2, 3, 4, 5, 6) .class
|
121
|
+
assert_equal m, m.look_at(1, 2, 3, 4, 5, 6, 7, 8, 9) .class
|
122
|
+
assert_equal m, m.look_at(point(1, 2, 3), point(4, 5, 6), point(7, 8, 9)).class
|
123
|
+
end
|
124
|
+
|
103
125
|
end# TestMatrix
|
data/test/test_painter.rb
CHANGED
@@ -152,6 +152,33 @@ class TestPainter < Test::Unit::TestCase
|
|
152
152
|
assert_equal 4, pa.miter_limit
|
153
153
|
end
|
154
154
|
|
155
|
+
def test_line_height_accessor()
|
156
|
+
pa = painter
|
157
|
+
|
158
|
+
h = pa.line_height
|
159
|
+
assert h > 0
|
160
|
+
assert_not_equal 1, h
|
161
|
+
|
162
|
+
assert_equal [h, -1], [pa.line_height, pa.line_height!]
|
163
|
+
pa.line_height = 1
|
164
|
+
assert_equal [1, 1], [pa.line_height, pa.line_height!]
|
165
|
+
pa.line_height 2
|
166
|
+
assert_equal [2, 2], [pa.line_height, pa.line_height!]
|
167
|
+
pa.push line_height: 9 do |_|
|
168
|
+
assert_equal [9, 9], [pa.line_height, pa.line_height!]
|
169
|
+
end
|
170
|
+
assert_equal [2, 2], [pa.line_height, pa.line_height!]
|
171
|
+
pa.line_height = -1
|
172
|
+
assert_equal [h, -1], [pa.line_height, pa.line_height!]
|
173
|
+
pa.line_height 0
|
174
|
+
assert_equal [0, 0], [pa.line_height, pa.line_height!]
|
175
|
+
pa.line_height = nil
|
176
|
+
assert_equal [h, -1], [pa.line_height, pa.line_height!]
|
177
|
+
|
178
|
+
pa.font "Menlo", 100
|
179
|
+
assert_equal pa.font.height, pa.line_height
|
180
|
+
end
|
181
|
+
|
155
182
|
def test_blend_mode_accessor()
|
156
183
|
pa = painter
|
157
184
|
assert_equal :normal, pa.blend_mode
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rays
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.49
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- xordog
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-02-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xot
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.1.
|
19
|
+
version: 0.1.42
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.1.
|
26
|
+
version: 0.1.42
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rucy
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.1.
|
33
|
+
version: 0.1.44
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.1.
|
40
|
+
version: 0.1.44
|
41
41
|
description: This library helps you to develop graphics application with OpenGL.
|
42
42
|
email: xordog@gmail.com
|
43
43
|
executables: []
|
@@ -260,7 +260,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
260
260
|
- !ruby/object:Gem::Version
|
261
261
|
version: '0'
|
262
262
|
requirements: []
|
263
|
-
rubygems_version: 3.4.
|
263
|
+
rubygems_version: 3.4.19
|
264
264
|
signing_key:
|
265
265
|
specification_version: 4
|
266
266
|
summary: A Drawing Engine using OpenGL.
|