rays 0.1.6 → 0.1.7
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 +7 -0
- data/.doc/ext/rays/bitmap.cpp +70 -233
- data/.doc/ext/rays/bounds.cpp +339 -57
- data/.doc/ext/rays/color.cpp +58 -48
- data/.doc/ext/rays/color_space.cpp +174 -0
- data/.doc/ext/rays/font.cpp +31 -53
- data/.doc/ext/rays/image.cpp +64 -67
- data/.doc/ext/rays/matrix.cpp +22 -50
- data/.doc/ext/rays/native.cpp +9 -2
- data/.doc/ext/rays/painter.cpp +276 -259
- data/.doc/ext/rays/point.cpp +186 -52
- data/.doc/ext/rays/rays.cpp +25 -20
- data/.doc/ext/rays/shader.cpp +61 -0
- data/.doc/ext/rays/texture.cpp +47 -59
- data/{README → README.md} +0 -0
- data/Rakefile +6 -5
- data/VERSION +1 -1
- data/ext/rays/bitmap.cpp +88 -248
- data/ext/rays/bounds.cpp +437 -141
- data/ext/rays/color.cpp +79 -69
- data/ext/rays/color_space.cpp +185 -0
- data/ext/rays/extconf.rb +14 -63
- data/ext/rays/font.cpp +44 -65
- data/ext/rays/image.cpp +82 -81
- data/ext/rays/matrix.cpp +32 -60
- data/ext/rays/native.cpp +9 -2
- data/ext/rays/painter.cpp +345 -321
- data/ext/rays/point.cpp +212 -69
- data/ext/rays/rays.cpp +29 -23
- data/ext/rays/shader.cpp +63 -0
- data/ext/rays/texture.cpp +64 -74
- data/include/rays/bitmap.h +21 -12
- data/include/rays/bounds.h +67 -9
- data/include/rays/color.h +23 -7
- data/include/rays/{colorspace.h → color_space.h} +6 -3
- data/include/rays/exception.h +17 -11
- data/include/rays/font.h +4 -3
- data/include/rays/image.h +11 -6
- data/include/rays/matrix.h +15 -12
- data/include/rays/opengl.h +54 -1
- data/include/rays/painter.h +98 -108
- data/include/rays/point.h +45 -5
- data/include/rays/rays.h +2 -2
- data/include/rays/ruby/bitmap.h +2 -16
- data/include/rays/ruby/bounds.h +4 -16
- data/include/rays/ruby/color.h +3 -16
- data/include/rays/ruby/color_space.h +27 -0
- data/include/rays/ruby/font.h +2 -16
- data/include/rays/ruby/image.h +2 -16
- data/include/rays/ruby/matrix.h +2 -16
- data/include/rays/ruby/painter.h +2 -16
- data/include/rays/ruby/point.h +3 -16
- data/include/rays/ruby/shader.h +27 -0
- data/include/rays/ruby/texture.h +2 -16
- data/include/rays/ruby.h +1 -0
- data/include/rays/shader.h +48 -0
- data/include/rays/texture.h +13 -2
- data/include/rays.h +2 -1
- data/lib/rays/bitmap.rb +20 -11
- data/lib/rays/bounds.rb +29 -68
- data/lib/rays/color.rb +39 -0
- data/lib/rays/color_space.rb +33 -0
- data/lib/rays/font.rb +29 -0
- data/lib/rays/image.rb +22 -0
- data/lib/rays/module.rb +11 -7
- data/lib/rays/painter.rb +103 -40
- data/lib/rays/point.rb +19 -36
- data/lib/rays/shader.rb +13 -0
- data/lib/rays/texture.rb +9 -0
- data/lib/rays.rb +4 -0
- data/rays.gemspec +3 -4
- data/src/bounds.cpp +272 -63
- data/src/color.cpp +168 -21
- data/src/{colorspace.cpp → color_space.cpp} +38 -1
- data/src/exception.cpp +24 -15
- data/src/frame_buffer.cpp +275 -0
- data/src/frame_buffer.h +79 -0
- data/src/image.cpp +80 -36
- data/src/ios/bitmap.mm +340 -0
- data/src/ios/font.mm +206 -0
- data/src/{cocoa → ios}/helper.h +2 -2
- data/src/{cocoa → ios}/helper.mm +0 -0
- data/src/ios/opengl.mm +21 -0
- data/src/ios/program.cpp +122 -0
- data/src/{cocoa → ios}/rays.mm +8 -7
- data/src/matrix.cpp +10 -22
- data/src/opengl.cpp +64 -0
- data/src/{cocoa → osx}/bitmap.mm +121 -70
- data/src/{cocoa → osx}/font.mm +32 -24
- data/src/osx/helper.h +26 -0
- data/src/osx/helper.mm +25 -0
- data/src/osx/opengl.mm +103 -0
- data/src/osx/rays.mm +43 -0
- data/src/painter.cpp +596 -422
- data/src/point.cpp +154 -11
- data/src/program.cpp +513 -0
- data/src/program.h +73 -0
- data/src/render_buffer.cpp +120 -0
- data/src/render_buffer.h +47 -0
- data/src/shader.cpp +117 -0
- data/src/texture.cpp +104 -134
- data/test/helper.rb +10 -3
- data/test/test_bitmap.rb +18 -0
- data/test/test_bounds.rb +81 -35
- data/test/test_color.rb +29 -2
- data/test/test_image.rb +63 -0
- data/test/test_painter.rb +120 -0
- data/test/test_point.rb +30 -9
- data/test/test_shader.rb +37 -0
- data/test/test_texture.rb +18 -0
- metadata +75 -58
- data/.gitignore +0 -14
- data/ChangeLog +0 -8
data/src/bounds.cpp
CHANGED
@@ -1,29 +1,43 @@
|
|
1
1
|
#include "rays/bounds.h"
|
2
2
|
|
3
3
|
|
4
|
+
#include <algorithm>
|
5
|
+
#include "rays/exception.h"
|
6
|
+
|
7
|
+
|
4
8
|
namespace Rays
|
5
9
|
{
|
6
10
|
|
7
11
|
|
8
12
|
Bounds::Bounds (coord size)
|
9
13
|
{
|
10
|
-
|
14
|
+
reset(size);
|
11
15
|
}
|
12
16
|
|
13
17
|
Bounds::Bounds (coord width, coord height, coord depth)
|
14
18
|
{
|
15
|
-
|
19
|
+
reset(width, height, depth);
|
16
20
|
}
|
17
21
|
|
18
22
|
Bounds::Bounds (coord x, coord y, coord width, coord height)
|
19
23
|
{
|
20
|
-
|
24
|
+
reset(x, y, width, height);
|
21
25
|
}
|
22
26
|
|
23
27
|
Bounds::Bounds (
|
24
28
|
coord x, coord y, coord z, coord width, coord height, coord depth)
|
25
29
|
{
|
26
|
-
|
30
|
+
reset(x, y, z, width, height, depth);
|
31
|
+
}
|
32
|
+
|
33
|
+
Bounds::Bounds (const Point& size)
|
34
|
+
{
|
35
|
+
reset(size);
|
36
|
+
}
|
37
|
+
|
38
|
+
Bounds::Bounds (const Point& position, const Point& size)
|
39
|
+
{
|
40
|
+
reset(position, size);
|
27
41
|
}
|
28
42
|
|
29
43
|
Bounds
|
@@ -32,69 +46,183 @@ namespace Rays
|
|
32
46
|
return *this;
|
33
47
|
}
|
34
48
|
|
49
|
+
bool
|
50
|
+
Bounds::is_intersect (const Bounds& other, int dimension) const
|
51
|
+
{
|
52
|
+
if (dimension < 1 || 3 < dimension)
|
53
|
+
argument_error(__FILE__, __LINE__);
|
54
|
+
|
55
|
+
Point size = (*this & other).size();
|
56
|
+
for (int i = 0; i < dimension; ++i)
|
57
|
+
if (size[i] <= 0) return false;
|
58
|
+
|
59
|
+
return true;
|
60
|
+
}
|
61
|
+
|
62
|
+
bool
|
63
|
+
Bounds::is_include (coord x, coord y, coord z, int dimension) const
|
64
|
+
{
|
65
|
+
return is_include(Point(x, y, z), dimension);
|
66
|
+
}
|
67
|
+
|
68
|
+
bool
|
69
|
+
Bounds::is_include (const Point& point, int dimension) const
|
70
|
+
{
|
71
|
+
if (dimension < 1 || 3 < dimension)
|
72
|
+
argument_error(__FILE__, __LINE__);
|
73
|
+
|
74
|
+
const Point &pos = position(), &size_ = size();
|
75
|
+
for (int i = 0; i < dimension; ++i)
|
76
|
+
{
|
77
|
+
coord value = point[i], min_ = pos[i], max_ = min_ + size_[i];
|
78
|
+
if (value < min_ || max_ <= value)
|
79
|
+
return false;
|
80
|
+
}
|
81
|
+
|
82
|
+
return true;
|
83
|
+
}
|
84
|
+
|
85
|
+
Bounds&
|
86
|
+
Bounds::reset (coord size)
|
87
|
+
{
|
88
|
+
return reset(size, size, 0);
|
89
|
+
}
|
90
|
+
|
91
|
+
Bounds&
|
92
|
+
Bounds::reset (coord width, coord height, coord depth)
|
93
|
+
{
|
94
|
+
this->x =
|
95
|
+
this->y =
|
96
|
+
this->z = 0;
|
97
|
+
this->w = width;
|
98
|
+
this->h = height;
|
99
|
+
this->d = depth;
|
100
|
+
return *this;
|
101
|
+
}
|
102
|
+
|
103
|
+
Bounds&
|
104
|
+
Bounds::reset (coord x, coord y, coord width, coord height)
|
105
|
+
{
|
106
|
+
return reset(x, y, 0, width, height, 0);
|
107
|
+
}
|
108
|
+
|
109
|
+
Bounds&
|
110
|
+
Bounds::reset (coord x, coord y, coord z, coord width, coord height, coord depth)
|
111
|
+
{
|
112
|
+
this->x = x;
|
113
|
+
this->y = y;
|
114
|
+
this->z = z;
|
115
|
+
this->w = width;
|
116
|
+
this->h = height;
|
117
|
+
this->d = depth;
|
118
|
+
return *this;
|
119
|
+
}
|
120
|
+
|
35
121
|
Bounds&
|
36
|
-
Bounds::
|
122
|
+
Bounds::reset (const Point& size)
|
37
123
|
{
|
38
|
-
|
124
|
+
this->x = this->y = this->z = 0;
|
125
|
+
this->w = size.x;
|
126
|
+
this->h = size.y;
|
127
|
+
this->d = size.z;
|
128
|
+
return *this;
|
39
129
|
}
|
40
130
|
|
41
131
|
Bounds&
|
42
|
-
Bounds::
|
132
|
+
Bounds::reset (const Point& position, const Point& size)
|
133
|
+
{
|
134
|
+
this->x = position.x;
|
135
|
+
this->y = position.y;
|
136
|
+
this->z = position.z;
|
137
|
+
this->w = size.x;
|
138
|
+
this->h = size.y;
|
139
|
+
this->d = size.z;
|
140
|
+
return *this;
|
141
|
+
}
|
142
|
+
|
143
|
+
Bounds&
|
144
|
+
Bounds::move_to (coord x, coord y, coord z)
|
43
145
|
{
|
44
|
-
this->x
|
45
|
-
this->y
|
46
|
-
this->z
|
47
|
-
this->width = width;
|
48
|
-
this->height = height;
|
49
|
-
this->depth = depth;
|
146
|
+
this->x = x;
|
147
|
+
this->y = y;
|
148
|
+
this->z = z;
|
50
149
|
return *this;
|
51
150
|
}
|
52
151
|
|
53
152
|
Bounds&
|
54
|
-
Bounds::
|
153
|
+
Bounds::move_to (const Point& point)
|
55
154
|
{
|
56
|
-
return
|
155
|
+
return move_to(point.x, point.y, point.z);
|
57
156
|
}
|
58
157
|
|
59
158
|
Bounds&
|
60
|
-
Bounds::
|
159
|
+
Bounds::move_by (coord x, coord y, coord z)
|
61
160
|
{
|
62
|
-
this->x
|
63
|
-
this->y
|
64
|
-
this->z
|
65
|
-
this->width = width;
|
66
|
-
this->height = height;
|
67
|
-
this->depth = depth;
|
161
|
+
this->x += x;
|
162
|
+
this->y += y;
|
163
|
+
this->z += z;
|
68
164
|
return *this;
|
69
165
|
}
|
70
166
|
|
71
|
-
|
72
|
-
Bounds::
|
167
|
+
Bounds&
|
168
|
+
Bounds::move_by (const Point& point)
|
73
169
|
{
|
74
|
-
return
|
170
|
+
return move_by(point.x, point.y, point.z);
|
75
171
|
}
|
76
172
|
|
77
|
-
|
78
|
-
Bounds::
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
173
|
+
Bounds&
|
174
|
+
Bounds::resize_to (coord width, coord height, coord depth)
|
175
|
+
{
|
176
|
+
this->w = width;
|
177
|
+
this->h = height;
|
178
|
+
this->d = depth;
|
179
|
+
return *this;
|
180
|
+
}
|
181
|
+
|
182
|
+
Bounds&
|
183
|
+
Bounds::resize_to (const Point& point)
|
184
|
+
{
|
185
|
+
return resize_to(point.x, point.y, point.z);
|
186
|
+
}
|
187
|
+
|
188
|
+
Bounds&
|
189
|
+
Bounds::resize_by (coord width, coord height, coord depth)
|
190
|
+
{
|
191
|
+
this->w += width;
|
192
|
+
this->h += height;
|
193
|
+
this->d += depth;
|
194
|
+
return *this;
|
195
|
+
}
|
196
|
+
|
197
|
+
Bounds&
|
198
|
+
Bounds::resize_by (const Point& point)
|
199
|
+
{
|
200
|
+
return resize_by(point.x, point.y, point.z);
|
201
|
+
}
|
202
|
+
|
203
|
+
Bounds&
|
204
|
+
Bounds::inset_by (coord x, coord y, coord z)
|
205
|
+
{
|
206
|
+
this->x += x;
|
207
|
+
this->y += y;
|
208
|
+
this->z += z;
|
209
|
+
this->w -= x * 2;
|
210
|
+
this->h -= y * 2;
|
211
|
+
this->d -= z * 2;
|
212
|
+
return *this;
|
213
|
+
}
|
214
|
+
|
215
|
+
Bounds&
|
216
|
+
Bounds::inset_by (const Point& point)
|
217
|
+
{
|
218
|
+
return inset_by(point.x, point.y, point.z);
|
91
219
|
}
|
92
220
|
|
93
221
|
void
|
94
222
|
Bounds::set_left (coord left)
|
95
223
|
{
|
96
|
-
|
97
|
-
x
|
224
|
+
w -= left - x;
|
225
|
+
x = left;
|
98
226
|
}
|
99
227
|
|
100
228
|
coord
|
@@ -106,20 +234,20 @@ namespace Rays
|
|
106
234
|
void
|
107
235
|
Bounds::set_right (coord right)
|
108
236
|
{
|
109
|
-
|
237
|
+
w = right - x + (right >= 0 ? 1 : -1);
|
110
238
|
}
|
111
239
|
|
112
240
|
coord
|
113
241
|
Bounds::right () const
|
114
242
|
{
|
115
|
-
return x +
|
243
|
+
return x + w - 1;
|
116
244
|
}
|
117
245
|
|
118
246
|
void
|
119
247
|
Bounds::set_top (coord top)
|
120
248
|
{
|
121
|
-
|
122
|
-
y
|
249
|
+
h -= top - y;
|
250
|
+
y = top;
|
123
251
|
}
|
124
252
|
|
125
253
|
coord
|
@@ -131,20 +259,20 @@ namespace Rays
|
|
131
259
|
void
|
132
260
|
Bounds::set_bottom (coord bottom)
|
133
261
|
{
|
134
|
-
|
262
|
+
h = bottom - y + (bottom >= 0 ? 1 : -1);
|
135
263
|
}
|
136
264
|
|
137
265
|
coord
|
138
266
|
Bounds::bottom () const
|
139
267
|
{
|
140
|
-
return y +
|
268
|
+
return y + h - 1;
|
141
269
|
}
|
142
270
|
|
143
271
|
void
|
144
272
|
Bounds::set_back (coord back)
|
145
273
|
{
|
146
|
-
|
147
|
-
z
|
274
|
+
d -= back - z;
|
275
|
+
z = back;
|
148
276
|
}
|
149
277
|
|
150
278
|
coord
|
@@ -156,19 +284,19 @@ namespace Rays
|
|
156
284
|
void
|
157
285
|
Bounds::set_front (coord front)
|
158
286
|
{
|
159
|
-
|
287
|
+
d = front - z + (front >= 0 ? 1 : -1);
|
160
288
|
}
|
161
289
|
|
162
290
|
coord
|
163
291
|
Bounds::front () const
|
164
292
|
{
|
165
|
-
return z +
|
293
|
+
return z + d - 1;
|
166
294
|
}
|
167
295
|
|
168
296
|
Point&
|
169
297
|
Bounds::position ()
|
170
298
|
{
|
171
|
-
return (
|
299
|
+
return (*this)[0];
|
172
300
|
}
|
173
301
|
|
174
302
|
const Point&
|
@@ -180,7 +308,7 @@ namespace Rays
|
|
180
308
|
Point&
|
181
309
|
Bounds::size ()
|
182
310
|
{
|
183
|
-
return (
|
311
|
+
return (*this)[1];
|
184
312
|
}
|
185
313
|
|
186
314
|
const Point&
|
@@ -189,21 +317,50 @@ namespace Rays
|
|
189
317
|
return const_cast<This*>(this)->size();
|
190
318
|
}
|
191
319
|
|
192
|
-
|
193
|
-
Bounds::
|
320
|
+
void
|
321
|
+
Bounds::set_center (coord x, coord y, coord z)
|
322
|
+
{
|
323
|
+
this->x = x - w / 2;
|
324
|
+
this->y = y - h / 2;
|
325
|
+
this->z = z - d / 2;
|
326
|
+
}
|
327
|
+
|
328
|
+
void
|
329
|
+
Bounds::set_center (const Point& point)
|
330
|
+
{
|
331
|
+
set_center(point.x, point.y, point.z);
|
332
|
+
}
|
333
|
+
|
334
|
+
Point
|
335
|
+
Bounds::center () const
|
336
|
+
{
|
337
|
+
return Point(x + w / 2, y + h / 2, z + d / 2);
|
338
|
+
}
|
339
|
+
|
340
|
+
String
|
341
|
+
Bounds::inspect () const
|
194
342
|
{
|
195
|
-
return (
|
343
|
+
return Xot::stringf("x=%f y=%f z=%f width=%f height=%f depth=%f", x, y, z, w, h, d);
|
344
|
+
}
|
345
|
+
|
346
|
+
Point&
|
347
|
+
Bounds::operator [] (size_t index)
|
348
|
+
{
|
349
|
+
if (index > 1)
|
350
|
+
argument_error(__FILE__, __LINE__);
|
351
|
+
|
352
|
+
return ((Point*) array)[index];
|
196
353
|
}
|
197
354
|
|
198
|
-
const
|
199
|
-
Bounds::
|
355
|
+
const Point&
|
356
|
+
Bounds::operator [] (size_t index) const
|
200
357
|
{
|
201
|
-
return const_cast<Bounds*>(this)->
|
358
|
+
return const_cast<Bounds*>(this)->operator[](index);
|
202
359
|
}
|
203
360
|
|
204
361
|
Bounds::operator bool () const
|
205
362
|
{
|
206
|
-
return
|
363
|
+
return w >= 0 && h >= 0 && d >= 0;
|
207
364
|
}
|
208
365
|
|
209
366
|
bool
|
@@ -212,6 +369,42 @@ namespace Rays
|
|
212
369
|
return !operator bool();
|
213
370
|
}
|
214
371
|
|
372
|
+
Bounds&
|
373
|
+
Bounds::operator &= (const Bounds& rhs)
|
374
|
+
{
|
375
|
+
if (!*this || !rhs)
|
376
|
+
argument_error(__FILE__, __LINE__);
|
377
|
+
|
378
|
+
coord x = std::max(this->x, rhs.x);
|
379
|
+
coord y = std::max(this->y, rhs.y);
|
380
|
+
coord z = std::max(this->z, rhs.z);
|
381
|
+
coord w = std::min(this->x + this->w, rhs.x + rhs.w) - x;
|
382
|
+
coord h = std::min(this->y + this->h, rhs.y + rhs.h) - y;
|
383
|
+
coord d = std::min(this->z + this->d, rhs.z + rhs.d) - z;
|
384
|
+
|
385
|
+
return reset(
|
386
|
+
x, y, z,
|
387
|
+
std::max(w, (coord) 0),
|
388
|
+
std::max(h, (coord) 0),
|
389
|
+
std::max(d, (coord) 0));
|
390
|
+
}
|
391
|
+
|
392
|
+
Bounds&
|
393
|
+
Bounds::operator |= (const Bounds& rhs)
|
394
|
+
{
|
395
|
+
if (!*this || !rhs)
|
396
|
+
argument_error(__FILE__, __LINE__);
|
397
|
+
|
398
|
+
coord x = std::min(this->x, rhs.x);
|
399
|
+
coord y = std::min(this->y, rhs.y);
|
400
|
+
coord z = std::min(this->z, rhs.z);
|
401
|
+
coord w = std::max(this->x + this->w, rhs.x + rhs.w) - x;
|
402
|
+
coord h = std::max(this->y + this->h, rhs.y + rhs.h) - y;
|
403
|
+
coord d = std::max(this->z + this->d, rhs.z + rhs.d) - z;
|
404
|
+
|
405
|
+
return reset(x, y, z, w, h, d);
|
406
|
+
}
|
407
|
+
|
215
408
|
bool
|
216
409
|
operator == (const Bounds& lhs, const Bounds& rhs)
|
217
410
|
{
|
@@ -219,9 +412,9 @@ namespace Rays
|
|
219
412
|
lhs.x == rhs.x &&
|
220
413
|
lhs.y == rhs.y &&
|
221
414
|
lhs.z == rhs.z &&
|
222
|
-
lhs.
|
223
|
-
lhs.
|
224
|
-
lhs.
|
415
|
+
lhs.w == rhs.w &&
|
416
|
+
lhs.h == rhs.h &&
|
417
|
+
lhs.d == rhs.d;
|
225
418
|
}
|
226
419
|
|
227
420
|
bool
|
@@ -230,5 +423,21 @@ namespace Rays
|
|
230
423
|
return !operator==(lhs, rhs);
|
231
424
|
}
|
232
425
|
|
426
|
+
Bounds
|
427
|
+
operator & (const Bounds& lhs, const Bounds& rhs)
|
428
|
+
{
|
429
|
+
Bounds t = lhs;
|
430
|
+
t &= rhs;
|
431
|
+
return t;
|
432
|
+
}
|
433
|
+
|
434
|
+
Bounds
|
435
|
+
operator | (const Bounds& lhs, const Bounds& rhs)
|
436
|
+
{
|
437
|
+
Bounds t = lhs;
|
438
|
+
t |= rhs;
|
439
|
+
return t;
|
440
|
+
}
|
441
|
+
|
233
442
|
|
234
443
|
}// Rays
|
data/src/color.cpp
CHANGED
@@ -1,18 +1,45 @@
|
|
1
1
|
#include "rays/color.h"
|
2
2
|
|
3
3
|
|
4
|
+
#include <limits.h>
|
5
|
+
#include <xot/util.h>
|
6
|
+
#include "rays/exception.h"
|
7
|
+
#include "rays/color_space.h"
|
8
|
+
|
9
|
+
|
4
10
|
namespace Rays
|
5
11
|
{
|
6
12
|
|
7
13
|
|
8
|
-
Color::Color (float
|
14
|
+
Color::Color (float gray, float alpha)
|
9
15
|
{
|
10
|
-
|
16
|
+
reset(gray, alpha);
|
11
17
|
}
|
12
18
|
|
13
19
|
Color::Color (float red, float green, float blue, float alpha)
|
14
20
|
{
|
15
|
-
|
21
|
+
reset(red, green, blue, alpha);
|
22
|
+
}
|
23
|
+
|
24
|
+
Color::Color (void* pixel, const ColorSpace& cs)
|
25
|
+
{
|
26
|
+
reset(pixel, cs);
|
27
|
+
}
|
28
|
+
|
29
|
+
Color
|
30
|
+
Color8 (uchar gray, uchar alpha)
|
31
|
+
{
|
32
|
+
Color c;
|
33
|
+
c.reset8(gray, alpha);
|
34
|
+
return c;
|
35
|
+
}
|
36
|
+
|
37
|
+
Color
|
38
|
+
Color8 (uchar red, uchar green, uchar blue, uchar alpha)
|
39
|
+
{
|
40
|
+
Color c;
|
41
|
+
c.reset8(red, green, blue, alpha);
|
42
|
+
return c;
|
16
43
|
}
|
17
44
|
|
18
45
|
Color
|
@@ -22,13 +49,13 @@ namespace Rays
|
|
22
49
|
}
|
23
50
|
|
24
51
|
Color&
|
25
|
-
Color::
|
52
|
+
Color::reset (float gray, float alpha)
|
26
53
|
{
|
27
|
-
return
|
54
|
+
return reset(gray, gray, gray, alpha);
|
28
55
|
}
|
29
56
|
|
30
57
|
Color&
|
31
|
-
Color::
|
58
|
+
Color::reset (float red, float green, float blue, float alpha)
|
32
59
|
{
|
33
60
|
this->red = red;
|
34
61
|
this->green = green;
|
@@ -37,29 +64,149 @@ namespace Rays
|
|
37
64
|
return *this;
|
38
65
|
}
|
39
66
|
|
40
|
-
|
41
|
-
Color::
|
67
|
+
Color&
|
68
|
+
Color::reset8 (uchar gray, uchar alpha)
|
69
|
+
{
|
70
|
+
float g = uchar2float(gray);
|
71
|
+
float a = uchar2float(alpha);
|
72
|
+
return reset(g, g, g, a);
|
73
|
+
}
|
74
|
+
|
75
|
+
Color&
|
76
|
+
Color::reset8 (uchar red, uchar green, uchar blue, uchar alpha)
|
77
|
+
{
|
78
|
+
this->red = uchar2float(red);
|
79
|
+
this->green = uchar2float(green);
|
80
|
+
this->blue = uchar2float(blue);
|
81
|
+
this->alpha = uchar2float(alpha);
|
82
|
+
return *this;
|
83
|
+
}
|
84
|
+
|
85
|
+
Color&
|
86
|
+
Color::reset (const void* pixel, const ColorSpace& cs)
|
87
|
+
{
|
88
|
+
if (!pixel || !cs)
|
89
|
+
argument_error(__FILE__, __LINE__);
|
90
|
+
|
91
|
+
if (cs.is_float())
|
92
|
+
{
|
93
|
+
float* p = (float*) pixel;
|
94
|
+
switch (cs.type())
|
95
|
+
{
|
96
|
+
case GRAY_float: reset(p[0]); break;
|
97
|
+
case RGB_float: reset(p[0], p[1], p[2]); break;
|
98
|
+
case RGBA_float: reset(p[0], p[1], p[2], p[3]); break;
|
99
|
+
case ARGB_float: reset(p[1], p[2], p[3], p[0]); break;
|
100
|
+
case BGR_float: reset(p[2], p[1], p[0]); break;
|
101
|
+
case BGRA_float: reset(p[2], p[1], p[0], p[3]); break;
|
102
|
+
case ABGR_float: reset(p[3], p[2], p[1], p[0]); break;
|
103
|
+
default: rays_error(__FILE__, __LINE__);
|
104
|
+
}
|
105
|
+
}
|
106
|
+
else
|
107
|
+
{
|
108
|
+
uchar* p = (uchar*) pixel;
|
109
|
+
switch (cs.type())
|
110
|
+
{
|
111
|
+
case GRAY_8: reset8(*((uchar*) pixel) / (float) UCHAR_MAX); break;
|
112
|
+
case GRAY_16: reset8(*((ushort*) pixel) / (float) USHRT_MAX); break;
|
113
|
+
case GRAY_32: reset8((float) (*((uint*) pixel) / (double) UINT_MAX)); break;
|
114
|
+
case RGB_888: reset8(p[0], p[1], p[2]); break;
|
115
|
+
case RGBA_8888: reset8(p[0], p[1], p[2], p[3]); break;
|
116
|
+
case ARGB_8888: reset8(p[1], p[2], p[3], p[0]); break;
|
117
|
+
case RGBX_8888: reset8(p[0], p[1], p[2]); break;
|
118
|
+
case XRGB_8888: reset8(p[1], p[2], p[3]); break;
|
119
|
+
case BGR_888: reset8(p[2], p[1], p[0]); break;
|
120
|
+
case BGRA_8888: reset8(p[2], p[1], p[0], p[3]); break;
|
121
|
+
case ABGR_8888: reset8(p[3], p[2], p[1], p[0]); break;
|
122
|
+
case BGRX_8888: reset8(p[2], p[1], p[0]); break;
|
123
|
+
case XBGR_8888: reset8(p[3], p[2], p[1]); break;
|
124
|
+
default: rays_error(__FILE__, __LINE__);
|
125
|
+
}
|
126
|
+
}
|
127
|
+
|
128
|
+
return *this;
|
129
|
+
}
|
130
|
+
|
131
|
+
static float
|
132
|
+
to_gray (const float* c)
|
42
133
|
{
|
43
|
-
|
44
|
-
|
134
|
+
return (c[0] + c[1] + c[2]) / 3;
|
135
|
+
}
|
45
136
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
return true;
|
137
|
+
static uint
|
138
|
+
to_gray (const float* c, uint max)
|
139
|
+
{
|
140
|
+
return Xot::clip<uint>(0, max, to_gray(c) * max);
|
51
141
|
}
|
52
142
|
|
53
|
-
|
54
|
-
|
143
|
+
static void
|
144
|
+
get_rgba (float* red, float* green, float* blue, float* alpha, const float* c)
|
55
145
|
{
|
56
|
-
|
146
|
+
if ((!red && !green && !blue && !alpha) || !c)
|
147
|
+
argument_error(__FILE__, __LINE__);
|
148
|
+
|
149
|
+
if (red) *red = c[0];
|
150
|
+
if (green) *green = c[1];
|
151
|
+
if (blue) *blue = c[2];
|
152
|
+
if (alpha) *alpha = c[3];
|
153
|
+
}
|
154
|
+
|
155
|
+
static void
|
156
|
+
get_rgba (uchar* red, uchar* green, uchar* blue, uchar* alpha, const float* c)
|
157
|
+
{
|
158
|
+
if ((!red && !green && !blue && !alpha) || !c)
|
159
|
+
argument_error(__FILE__, __LINE__);
|
160
|
+
|
161
|
+
if (red) *red = Color::float2uchar(c[0]);
|
162
|
+
if (green) *green = Color::float2uchar(c[1]);
|
163
|
+
if (blue) *blue = Color::float2uchar(c[2]);
|
164
|
+
if (alpha) *alpha = Color::float2uchar(c[3]);
|
57
165
|
}
|
58
166
|
|
59
|
-
|
60
|
-
Color::
|
167
|
+
void
|
168
|
+
Color::get (void* pixel, const ColorSpace& cs) const
|
61
169
|
{
|
62
|
-
|
170
|
+
if (!pixel || !cs)
|
171
|
+
argument_error(__FILE__, __LINE__);
|
172
|
+
|
173
|
+
const float* c = array;
|
174
|
+
if (cs.is_float())
|
175
|
+
{
|
176
|
+
float* p = (float*) pixel;
|
177
|
+
switch (cs.type())
|
178
|
+
{
|
179
|
+
case GRAY_float: p[0] = to_gray(c); break;
|
180
|
+
case RGB_float: get_rgba(p+0, p+1, p+2, NULL, c); break;
|
181
|
+
case RGBA_float: get_rgba(p+0, p+1, p+2, p+3, c); break;
|
182
|
+
case ARGB_float: get_rgba(p+1, p+2, p+3, p+0, c); break;
|
183
|
+
case BGR_float: get_rgba(p+2, p+1, p+0, NULL, c); break;
|
184
|
+
case BGRA_float: get_rgba(p+2, p+1, p+0, p+3, c); break;
|
185
|
+
case ABGR_float: get_rgba(p+3, p+2, p+1, p+0, c); break;
|
186
|
+
default: rays_error(__FILE__, __LINE__);
|
187
|
+
}
|
188
|
+
}
|
189
|
+
else
|
190
|
+
{
|
191
|
+
uchar* p = (uchar*) pixel;
|
192
|
+
switch (cs.type())
|
193
|
+
{
|
194
|
+
case GRAY_8: *(uchar*) p = (uchar) to_gray(c, UCHAR_MAX); break;
|
195
|
+
case GRAY_16: *(ushort*) p = (ushort) to_gray(c, USHRT_MAX); break;
|
196
|
+
case GRAY_32: *(uint*) p = (uint) to_gray(c, UINT_MAX); break;
|
197
|
+
case RGB_888: get_rgba(p+0, p+1, p+2, NULL, c); break;
|
198
|
+
case RGBA_8888: get_rgba(p+0, p+1, p+2, p+3, c); break;
|
199
|
+
case ARGB_8888: get_rgba(p+1, p+2, p+3, p+0, c); break;
|
200
|
+
case RGBX_8888: get_rgba(p+0, p+1, p+2, NULL, c); break;
|
201
|
+
case XRGB_8888: get_rgba(p+1, p+2, p+3, NULL, c); break;
|
202
|
+
case BGR_888: get_rgba(p+2, p+1, p+0, NULL, c); break;
|
203
|
+
case BGRA_8888: get_rgba(p+2, p+1, p+0, p+3, c); break;
|
204
|
+
case ABGR_8888: get_rgba(p+3, p+2, p+1, p+0, c); break;
|
205
|
+
case BGRX_8888: get_rgba(p+2, p+1, p+0, NULL, c); break;
|
206
|
+
case XBGR_8888: get_rgba(p+3, p+2, p+1, NULL, c); break;
|
207
|
+
default: rays_error(__FILE__, __LINE__);
|
208
|
+
}
|
209
|
+
}
|
63
210
|
}
|
64
211
|
|
65
212
|
Color::operator bool () const
|