rays 0.1.47 → 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/bitmap.cpp +287 -46
- data/.doc/ext/rays/camera.cpp +2 -2
- data/.doc/ext/rays/color.cpp +11 -0
- data/.doc/ext/rays/defs.cpp +32 -8
- data/.doc/ext/rays/font.cpp +50 -2
- data/.doc/ext/rays/image.cpp +3 -3
- data/.doc/ext/rays/matrix.cpp +65 -7
- data/.doc/ext/rays/native.cpp +2 -4
- data/.doc/ext/rays/painter.cpp +117 -9
- data/.doc/ext/rays/point.cpp +1 -11
- data/.doc/ext/rays/polygon.cpp +133 -97
- data/.doc/ext/rays/polyline.cpp +89 -10
- data/.doc/ext/rays/rays.cpp +80 -0
- data/.doc/ext/rays/{noise.cpp → util.cpp} +2 -2
- data/ChangeLog.md +46 -0
- data/VERSION +1 -1
- data/ext/rays/bitmap.cpp +288 -46
- data/ext/rays/camera.cpp +2 -2
- data/ext/rays/color.cpp +13 -1
- data/ext/rays/defs.cpp +32 -8
- data/ext/rays/defs.h +56 -3
- data/ext/rays/font.cpp +56 -4
- data/ext/rays/image.cpp +3 -3
- data/ext/rays/matrix.cpp +69 -7
- data/ext/rays/native.cpp +2 -4
- data/ext/rays/painter.cpp +132 -13
- data/ext/rays/point.cpp +1 -12
- data/ext/rays/polygon.cpp +136 -99
- data/ext/rays/polyline.cpp +95 -9
- data/ext/rays/rays.cpp +80 -0
- data/ext/rays/{noise.cpp → util.cpp} +2 -2
- data/include/rays/color.h +3 -1
- data/include/rays/defs.h +24 -26
- data/include/rays/font.h +17 -3
- data/include/rays/image.h +1 -1
- data/include/rays/matrix.h +24 -0
- data/include/rays/painter.h +24 -0
- data/include/rays/polygon.h +68 -43
- data/include/rays/polyline.h +17 -2
- data/include/rays/ruby/polygon.h +0 -11
- data/include/rays/ruby/rays.h +4 -0
- data/include/rays/{noise.h → util.h} +2 -2
- data/lib/rays/color.rb +7 -1
- data/lib/rays/font.rb +1 -1
- data/lib/rays/image.rb +11 -1
- data/lib/rays/matrix.rb +16 -0
- data/lib/rays/painter.rb +18 -7
- data/lib/rays/point.rb +5 -1
- data/lib/rays/polygon.rb +44 -35
- data/lib/rays/polyline.rb +54 -8
- data/lib/rays.rb +0 -1
- data/rays.gemspec +2 -2
- data/src/color.cpp +11 -2
- data/src/font.cpp +37 -18
- data/src/font.h +6 -5
- data/src/image.cpp +58 -14
- data/src/ios/font.mm +89 -32
- 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 +93 -33
- data/src/osx/helper.h +2 -2
- data/src/osx/helper.mm +2 -2
- data/src/painter.cpp +246 -114
- data/src/painter.h +11 -3
- data/src/polygon.cpp +431 -332
- data/src/polyline.cpp +138 -27
- data/src/polyline.h +3 -5
- data/src/shader.cpp +36 -4
- data/src/shader.h +1 -1
- data/src/texture.cpp +23 -4
- data/src/texture.h +2 -0
- data/src/{noise.cpp → util.cpp} +1 -1
- data/src/win32/font.cpp +1 -1
- data/test/test_bitmap.rb +12 -5
- data/test/test_color.rb +25 -4
- data/test/test_font.rb +23 -2
- data/test/test_image.rb +44 -18
- data/test/test_matrix.rb +22 -0
- data/test/test_painter.rb +27 -0
- data/test/test_point.rb +1 -1
- data/test/test_polygon.rb +52 -45
- data/test/test_polyline.rb +191 -72
- metadata +12 -18
- data/.doc/ext/rays/polygon_line.cpp +0 -97
- data/ext/rays/polygon_line.cpp +0 -100
- data/lib/rays/polygon_line.rb +0 -33
- data/test/test_polygon_line.rb +0 -164
data/src/polyline.cpp
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
#include "polyline.h"
|
2
2
|
|
3
3
|
|
4
|
-
#include <
|
4
|
+
#include <memory>
|
5
|
+
#include "rays/color.h"
|
5
6
|
#include "rays/debug.h"
|
6
7
|
|
7
8
|
|
@@ -15,43 +16,122 @@ namespace Rays
|
|
15
16
|
struct Polyline::Data
|
16
17
|
{
|
17
18
|
|
19
|
+
typedef std::vector<Color> ColorList;
|
20
|
+
|
21
|
+
typedef std::vector<Coord3> TexCoordList;
|
22
|
+
|
18
23
|
PointList points;
|
19
24
|
|
20
|
-
|
25
|
+
std::unique_ptr<ColorList> pcolors;
|
26
|
+
|
27
|
+
std::unique_ptr<TexCoordList> ptexcoords;
|
21
28
|
|
22
|
-
|
23
|
-
|
29
|
+
bool loop = false, fill = false, hole = false;
|
30
|
+
|
31
|
+
void reset (
|
32
|
+
const auto* points_, const Color* colors_, const Coord3* texcoords_,
|
33
|
+
size_t size_, bool loop_, bool fill_, bool hole_,
|
34
|
+
auto to_point_fun)
|
24
35
|
{
|
25
|
-
|
26
|
-
|
36
|
+
ColorList* colors = colors_ ? &this->colors() : NULL;
|
37
|
+
TexCoordList* texcoords = texcoords_ ? &this->texcoords() : NULL;
|
38
|
+
int size = (int) size_;
|
27
39
|
|
28
|
-
points.clear();
|
29
40
|
loop = loop_;
|
30
41
|
fill = fill_;
|
42
|
+
hole = hole_;
|
43
|
+
if (!is_valid())
|
44
|
+
argument_error(__FILE__, __LINE__, "hole polyline must be looped");
|
31
45
|
|
32
|
-
|
33
|
-
if (size <= 0) return;
|
34
|
-
|
46
|
+
points.clear();
|
35
47
|
points.reserve(size);
|
36
|
-
|
37
|
-
|
48
|
+
if (hole)
|
49
|
+
{
|
50
|
+
for (int i = size - 1; i >= 0; --i)
|
51
|
+
points.emplace_back(to_point_fun(points_[i]));
|
52
|
+
}
|
53
|
+
else
|
54
|
+
{
|
55
|
+
for (int i = 0; i < size; ++i)
|
56
|
+
points.emplace_back(to_point_fun(points_[i]));
|
57
|
+
}
|
58
|
+
|
59
|
+
if (colors)
|
60
|
+
{
|
61
|
+
colors->clear();
|
62
|
+
colors->reserve(size);
|
63
|
+
if (hole)
|
64
|
+
{
|
65
|
+
for (int i = size - 1; i >= 0; --i)
|
66
|
+
colors->emplace_back(colors_[i]);
|
67
|
+
}
|
68
|
+
else
|
69
|
+
{
|
70
|
+
for (int i = 0; i < size; ++i)
|
71
|
+
colors->emplace_back(colors_[i]);
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
if (texcoords)
|
76
|
+
{
|
77
|
+
texcoords->clear();
|
78
|
+
texcoords->reserve(size);
|
79
|
+
if (hole)
|
80
|
+
{
|
81
|
+
for (int i = size - 1; i >= 0; --i)
|
82
|
+
texcoords->emplace_back(texcoords_[i]);
|
83
|
+
}
|
84
|
+
else
|
85
|
+
{
|
86
|
+
for (int i = 0; i < size; ++i)
|
87
|
+
texcoords->emplace_back(texcoords_[i]);
|
88
|
+
}
|
89
|
+
}
|
38
90
|
}
|
39
91
|
|
92
|
+
ColorList& colors ()
|
93
|
+
{
|
94
|
+
if (!pcolors) pcolors.reset(new ColorList());
|
95
|
+
return *pcolors;
|
96
|
+
}
|
97
|
+
|
98
|
+
TexCoordList& texcoords ()
|
99
|
+
{
|
100
|
+
if (!ptexcoords) ptexcoords.reset(new TexCoordList());
|
101
|
+
return *ptexcoords;
|
102
|
+
}
|
103
|
+
|
104
|
+
bool is_valid () const
|
105
|
+
{
|
106
|
+
return loop || !hole;
|
107
|
+
}
|
108
|
+
|
109
|
+
private:
|
110
|
+
#if 0
|
111
|
+
void reset_values (size_t size_, bool hole, auto fun)
|
112
|
+
{
|
113
|
+
int size = (int) size_;
|
114
|
+
|
115
|
+
if (hole)
|
116
|
+
for (int i = size - 1; i >= 0; --i) fun((size_t) i);
|
117
|
+
else
|
118
|
+
for (int i = 0; i < size; ++i) fun((size_t) i);
|
119
|
+
}
|
120
|
+
#endif
|
40
121
|
};// Polyline::Data
|
41
122
|
|
42
123
|
|
43
|
-
|
44
|
-
Polyline_create (
|
45
|
-
Polyline* polyline, const Path& path, bool loop, bool hole)
|
124
|
+
Polyline
|
125
|
+
Polyline_create (const Path& path, bool loop, bool hole)
|
46
126
|
{
|
47
127
|
Path cleaned;
|
48
128
|
ClipperLib::CleanPolygon(path, cleaned);
|
49
129
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
130
|
+
Polyline pl;
|
131
|
+
pl.self->reset(
|
132
|
+
&cleaned[0], NULL, NULL, cleaned.size(), loop, loop, hole,
|
133
|
+
[](const IntPoint& point) {return from_clipper(point);});
|
134
|
+
return pl;
|
55
135
|
}
|
56
136
|
|
57
137
|
template <typename I>
|
@@ -66,8 +146,6 @@ namespace Rays
|
|
66
146
|
void
|
67
147
|
Polyline_get_path (Path* path, const Polyline& polyline, bool hole)
|
68
148
|
{
|
69
|
-
assert(path);
|
70
|
-
|
71
149
|
const auto& points = polyline.self->points;
|
72
150
|
if (hole)
|
73
151
|
reset_path(path, points.rbegin(), points.rend());
|
@@ -80,17 +158,23 @@ namespace Rays
|
|
80
158
|
{
|
81
159
|
}
|
82
160
|
|
83
|
-
Polyline::Polyline (
|
161
|
+
Polyline::Polyline (
|
162
|
+
const Point* points, size_t size, bool loop,
|
163
|
+
const Color* colors, const Coord3* texcoords,
|
164
|
+
bool hole)
|
84
165
|
{
|
85
166
|
self->reset(
|
86
|
-
points,
|
167
|
+
points, colors, texcoords, size, loop, loop, hole,
|
87
168
|
[](const Point& p) {return p;});
|
88
169
|
}
|
89
170
|
|
90
|
-
Polyline::Polyline (
|
171
|
+
Polyline::Polyline (
|
172
|
+
const Point* points, size_t size, bool loop, bool fill,
|
173
|
+
const Color* colors, const Coord3* texcoords,
|
174
|
+
bool hole)
|
91
175
|
{
|
92
176
|
self->reset(
|
93
|
-
points,
|
177
|
+
points, colors, texcoords, size, loop, fill, hole,
|
94
178
|
[](const Point& p) {return p;});
|
95
179
|
}
|
96
180
|
|
@@ -130,6 +214,33 @@ namespace Rays
|
|
130
214
|
return self->fill;
|
131
215
|
}
|
132
216
|
|
217
|
+
bool
|
218
|
+
Polyline::hole () const
|
219
|
+
{
|
220
|
+
return self->hole;
|
221
|
+
}
|
222
|
+
|
223
|
+
const Point*
|
224
|
+
Polyline::points () const
|
225
|
+
{
|
226
|
+
const auto& v = self->points;
|
227
|
+
return !v.empty() ? &v[0] : NULL;
|
228
|
+
}
|
229
|
+
|
230
|
+
const Color*
|
231
|
+
Polyline::colors () const
|
232
|
+
{
|
233
|
+
const auto& pv = self->pcolors;
|
234
|
+
return pv && !pv->empty() ? &(*pv)[0] : NULL;
|
235
|
+
}
|
236
|
+
|
237
|
+
const Coord3*
|
238
|
+
Polyline::texcoords () const
|
239
|
+
{
|
240
|
+
const auto& pv = self->ptexcoords;
|
241
|
+
return pv && !pv->empty() ? &(*pv)[0] : NULL;
|
242
|
+
}
|
243
|
+
|
133
244
|
size_t
|
134
245
|
Polyline::size () const
|
135
246
|
{
|
@@ -162,7 +273,7 @@ namespace Rays
|
|
162
273
|
|
163
274
|
Polyline::operator bool () const
|
164
275
|
{
|
165
|
-
return
|
276
|
+
return self->is_valid();
|
166
277
|
}
|
167
278
|
|
168
279
|
bool
|
data/src/polyline.h
CHANGED
@@ -50,13 +50,11 @@ namespace Rays
|
|
50
50
|
}
|
51
51
|
|
52
52
|
|
53
|
-
|
54
|
-
|
55
|
-
bool hole = false);
|
53
|
+
Polyline Polyline_create (
|
54
|
+
const ClipperLib::Path& path, bool loop, bool hole = false);
|
56
55
|
|
57
56
|
void Polyline_get_path (
|
58
|
-
ClipperLib::Path* path, const Polyline& polyline,
|
59
|
-
bool hole = false);
|
57
|
+
ClipperLib::Path* path, const Polyline& polyline, bool hole = false);
|
60
58
|
|
61
59
|
bool Polyline_expand (
|
62
60
|
Polygon* result, const Polyline& polyline,
|
data/src/shader.cpp
CHANGED
@@ -97,7 +97,30 @@ namespace Rays
|
|
97
97
|
}
|
98
98
|
|
99
99
|
static Shader
|
100
|
-
|
100
|
+
make_default_shader_for_texture_clamp ()
|
101
|
+
{
|
102
|
+
const ShaderBuiltinVariableNames& names =
|
103
|
+
ShaderEnv_get_builtin_variable_names(DEFAULT_ENV);
|
104
|
+
return Shader(
|
105
|
+
"varying vec4 " + V_TEXCOORD + ";\n"
|
106
|
+
"varying vec4 " + V_COLOR + ";\n"
|
107
|
+
"uniform vec3 " + U_TEXCOORD_MIN + ";\n"
|
108
|
+
"uniform vec3 " + U_TEXCOORD_MAX + ";\n"
|
109
|
+
"uniform vec3 " + U_TEXCOORD_OFFSET + ";\n"
|
110
|
+
"uniform sampler2D " + U_TEXTURE + ";\n"
|
111
|
+
"void main ()\n"
|
112
|
+
"{\n"
|
113
|
+
" vec2 texcoord__ = clamp(" +
|
114
|
+
V_TEXCOORD + ".xy, " +
|
115
|
+
U_TEXCOORD_MIN + ".xy, " +
|
116
|
+
U_TEXCOORD_MAX + ".xy - " + U_TEXCOORD_OFFSET + ".xy);\n"
|
117
|
+
" vec4 color__ = texture2D(" + U_TEXTURE + ", texcoord__);\n"
|
118
|
+
" gl_FragColor = " + V_COLOR + " * color__;\n"
|
119
|
+
"}\n");
|
120
|
+
}
|
121
|
+
|
122
|
+
static Shader
|
123
|
+
make_default_shader_for_texture_repeat ()
|
101
124
|
{
|
102
125
|
const ShaderBuiltinVariableNames& names =
|
103
126
|
ShaderEnv_get_builtin_variable_names(DEFAULT_ENV);
|
@@ -160,10 +183,19 @@ namespace Rays
|
|
160
183
|
}
|
161
184
|
|
162
185
|
const Shader&
|
163
|
-
Shader_get_default_shader_for_texture ()
|
186
|
+
Shader_get_default_shader_for_texture (TexCoordWrap wrap)
|
164
187
|
{
|
165
|
-
|
166
|
-
|
188
|
+
switch (wrap)
|
189
|
+
{
|
190
|
+
case TEXCOORD_REPEAT:
|
191
|
+
static const Shader REPEAT = make_default_shader_for_texture_repeat();
|
192
|
+
return REPEAT;
|
193
|
+
|
194
|
+
case TEXCOORD_CLAMP:
|
195
|
+
default:
|
196
|
+
static const Shader CLAMP = make_default_shader_for_texture_clamp();
|
197
|
+
return CLAMP;
|
198
|
+
}
|
167
199
|
}
|
168
200
|
|
169
201
|
const Shader&
|
data/src/shader.h
CHANGED
@@ -57,7 +57,7 @@ namespace Rays
|
|
57
57
|
|
58
58
|
const Shader& Shader_get_default_shader_for_shape ();
|
59
59
|
|
60
|
-
const Shader& Shader_get_default_shader_for_texture ();
|
60
|
+
const Shader& Shader_get_default_shader_for_texture (TexCoordWrap wrap);
|
61
61
|
|
62
62
|
const Shader& Shader_get_shader_for_text ();
|
63
63
|
|
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
|
|
@@ -197,8 +197,8 @@ namespace Rays
|
|
197
197
|
if (glIsTexture(self->id) == GL_FALSE)
|
198
198
|
opengl_error(__FILE__, __LINE__, "failed to create texture.");
|
199
199
|
|
200
|
-
|
201
|
-
|
200
|
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
201
|
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
202
202
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
203
203
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);//GL_LINEAR);
|
204
204
|
|
@@ -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/src/{noise.cpp → util.cpp}
RENAMED
data/src/win32/font.cpp
CHANGED
data/test/test_bitmap.rb
CHANGED
@@ -6,8 +6,8 @@ class TestBitmap < Test::Unit::TestCase
|
|
6
6
|
W = 32
|
7
7
|
H = 16
|
8
8
|
|
9
|
-
def bitmap(w = W, h = H)
|
10
|
-
Rays::Bitmap.new w, h
|
9
|
+
def bitmap(w = W, h = H, *args)
|
10
|
+
Rays::Bitmap.new w, h, *args
|
11
11
|
end
|
12
12
|
|
13
13
|
def color(*args)
|
@@ -32,10 +32,17 @@ class TestBitmap < Test::Unit::TestCase
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def test_pixels()
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
bmp = bitmap 2, 2, Rays::RGBA
|
36
|
+
assert_equal [0] * 4, bmp.pixels
|
37
|
+
|
38
|
+
bmp.pixels = [0xffff0000, 0xff00ff00, 0xff0000ff, 0xffffff00]
|
38
39
|
assert_equal [0xffff0000, 0xff00ff00, 0xff0000ff, 0xffffff00], bmp.pixels
|
40
|
+
|
41
|
+
bmp = bitmap 2, 2, Rays::RGBA_float
|
42
|
+
assert_equal [0,0,0,0] * 4, bmp.pixels
|
43
|
+
|
44
|
+
bmp.pixels = [1,0,0,1, 0,1,0,1, 0,0,1,1, 1,1,0,1]
|
45
|
+
assert_equal [1,0,0,1, 0,1,0,1, 0,0,1,1, 1,1,0,1], bmp.pixels
|
39
46
|
end
|
40
47
|
|
41
48
|
def test_at()
|
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,4 +156,18 @@ 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
|
+
|
169
|
+
def test_inspect()
|
170
|
+
assert_equal "#<Rays::Color 1.0 2.0 3.0 1.0>", color(1, 2, 3).inspect
|
171
|
+
end
|
172
|
+
|
152
173
|
end# TestColor
|
data/test/test_font.rb
CHANGED
@@ -3,8 +3,10 @@ require_relative 'helper'
|
|
3
3
|
|
4
4
|
class TestFont < Test::Unit::TestCase
|
5
5
|
|
6
|
+
R = Rays
|
7
|
+
|
6
8
|
def font(*args)
|
7
|
-
|
9
|
+
R::Font.new(*args)
|
8
10
|
end
|
9
11
|
|
10
12
|
def test_name()
|
@@ -13,13 +15,28 @@ class TestFont < Test::Unit::TestCase
|
|
13
15
|
|
14
16
|
def test_size()
|
15
17
|
assert_kind_of Numeric, font.size
|
16
|
-
|
18
|
+
|
19
|
+
f = font('Arial', 10)
|
20
|
+
assert_equal 10, f.size
|
21
|
+
|
22
|
+
name = f.name
|
23
|
+
f.size = 11
|
24
|
+
assert_equal 11, f.size
|
25
|
+
assert_equal name, f.name
|
26
|
+
|
27
|
+
f11 = f.dup
|
28
|
+
f.size = 12
|
29
|
+
assert_equal 12, f .size
|
30
|
+
assert_equal 11, f11.size
|
17
31
|
end
|
18
32
|
|
19
33
|
def test_width()
|
20
34
|
assert_equal 0, font.width('')
|
21
35
|
w = font.width 'X'
|
22
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")
|
23
40
|
end
|
24
41
|
|
25
42
|
def test_height()
|
@@ -27,4 +44,8 @@ class TestFont < Test::Unit::TestCase
|
|
27
44
|
assert_equal f.height, f.ascent + f.descent + f.leading
|
28
45
|
end
|
29
46
|
|
47
|
+
def test_families()
|
48
|
+
assert_not R::Font.families.empty?
|
49
|
+
end
|
50
|
+
|
30
51
|
end# TestFont
|
data/test/test_image.rb
CHANGED
@@ -11,7 +11,7 @@ class TestImage < Test::Unit::TestCase
|
|
11
11
|
Rays::Image.load path
|
12
12
|
end
|
13
13
|
|
14
|
-
def color(r
|
14
|
+
def color(r, g, b, a)
|
15
15
|
Rays::Color.new r, g, b, a
|
16
16
|
end
|
17
17
|
|
@@ -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
|
@@ -52,24 +78,24 @@ class TestImage < Test::Unit::TestCase
|
|
52
78
|
end
|
53
79
|
|
54
80
|
def test_paint()
|
55
|
-
|
81
|
+
paint = -> &block {
|
56
82
|
Rays::Image.new(10, 10).paint(&block)
|
57
|
-
|
58
|
-
|
59
|
-
paint {|p| p.fill 1, 0, 0; p.stroke nil; block.call p}
|
60
|
-
|
61
|
-
|
62
|
-
paint {|p| p.fill nil; p.stroke 1, 0, 0; block.call p}
|
63
|
-
|
64
|
-
|
65
|
-
fill
|
66
|
-
|
67
|
-
|
68
|
-
assert_equal color(0, 0, 0, 0), fill {|p| p.rect 1, 1, 8, 8}[0, 0]
|
69
|
-
assert_equal color(1, 0, 0, 1), fill {|p| p.rect 1, 1, 8, 8}[1, 1]
|
70
|
-
assert_equal color(1, 0, 0, 1), stroke {|p| p.line 0, 0, 1, 1}[0, 0]
|
71
|
-
|
72
|
-
assert drawn {|p| p.text "a"}
|
83
|
+
}
|
84
|
+
fill = -> &block {
|
85
|
+
paint.call {|p| p.fill 1, 0, 0; p.stroke nil; block.call p}
|
86
|
+
}
|
87
|
+
stroke = -> &block {
|
88
|
+
paint.call {|p| p.fill nil; p.stroke 1, 0, 0; block.call p}
|
89
|
+
}
|
90
|
+
drawn = -> &block {
|
91
|
+
fill[&block].bitmap.to_a.reject {|o| o.transparent?}.uniq.size > 0
|
92
|
+
}
|
93
|
+
|
94
|
+
assert_equal color(0, 0, 0, 0), fill.call {|p| p.rect 1, 1, 8, 8}[0, 0]
|
95
|
+
assert_equal color(1, 0, 0, 1), fill.call {|p| p.rect 1, 1, 8, 8}[1, 1]
|
96
|
+
assert_equal color(1, 0, 0, 1), stroke.call {|p| p.line 0, 0, 1, 1}[0, 0]
|
97
|
+
|
98
|
+
assert drawn.call {|p| p.text "a"}
|
73
99
|
end
|
74
100
|
|
75
101
|
def test_save_load()
|
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
|