rays 0.2.1 → 0.3
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 +99 -32
- data/.doc/ext/rays/bounds.cpp +2 -2
- data/.doc/ext/rays/camera.cpp +1 -1
- data/.doc/ext/rays/color.cpp +2 -2
- data/.doc/ext/rays/color_space.cpp +3 -3
- data/.doc/ext/rays/font.cpp +4 -3
- data/.doc/ext/rays/image.cpp +1 -1
- data/.doc/ext/rays/matrix.cpp +4 -4
- data/.doc/ext/rays/painter.cpp +1 -1
- data/.doc/ext/rays/point.cpp +2 -2
- data/.doc/ext/rays/polygon.cpp +3 -3
- data/.doc/ext/rays/polyline.cpp +3 -3
- data/.doc/ext/rays/rays.cpp +10 -10
- data/.doc/ext/rays/shader.cpp +2 -2
- data/.github/workflows/release-gem.yml +1 -1
- data/.github/workflows/test.yml +3 -0
- data/ChangeLog.md +5 -0
- data/Rakefile +17 -2
- data/VERSION +1 -1
- data/ext/rays/bitmap.cpp +99 -32
- data/ext/rays/bounds.cpp +2 -2
- data/ext/rays/camera.cpp +1 -1
- data/ext/rays/color.cpp +2 -2
- data/ext/rays/color_space.cpp +3 -3
- data/ext/rays/defs.h +2 -0
- data/ext/rays/extconf.rb +4 -2
- data/ext/rays/font.cpp +4 -3
- data/ext/rays/image.cpp +1 -1
- data/ext/rays/matrix.cpp +4 -4
- data/ext/rays/painter.cpp +1 -1
- data/ext/rays/point.cpp +2 -2
- data/ext/rays/polygon.cpp +3 -3
- data/ext/rays/polyline.cpp +3 -3
- data/ext/rays/rays.cpp +10 -10
- data/ext/rays/shader.cpp +2 -2
- data/include/rays/defs.h +7 -0
- data/include/rays/ruby/bitmap.h +2 -2
- data/include/rays/ruby/bounds.h +2 -2
- data/include/rays/ruby/camera.h +2 -2
- data/include/rays/ruby/color.h +2 -2
- data/include/rays/ruby/color_space.h +2 -2
- data/include/rays/ruby/exception.h +3 -3
- data/include/rays/ruby/font.h +2 -2
- data/include/rays/ruby/image.h +2 -2
- data/include/rays/ruby/matrix.h +2 -2
- data/include/rays/ruby/painter.h +2 -2
- data/include/rays/ruby/point.h +2 -2
- data/include/rays/ruby/polygon.h +2 -2
- data/include/rays/ruby/polyline.h +2 -2
- data/include/rays/ruby/rays.h +6 -6
- data/include/rays/ruby/shader.h +2 -2
- data/lib/rays/bitmap.rb +7 -0
- data/lib/rays/extension.rb +4 -0
- data/rays.gemspec +2 -2
- data/src/coord.h +2 -2
- data/src/font.cpp +1 -0
- data/src/ios/bitmap.mm +23 -30
- data/src/ios/font.mm +4 -1
- data/src/ios/rays.mm +2 -2
- data/src/matrix.h +1 -1
- data/src/opengl.h +1 -2
- data/src/osx/bitmap.mm +23 -30
- data/src/osx/font.mm +4 -1
- data/src/osx/rays.mm +2 -2
- data/src/painter.cpp +1 -0
- data/src/shader.cpp +3 -0
- data/src/win32/bitmap.cpp +167 -65
- data/src/win32/camera.cpp +119 -0
- data/src/win32/font.cpp +179 -40
- data/src/win32/gdi.h +1 -1
- data/src/win32/opengl.cpp +127 -0
- data/src/win32/rays.cpp +16 -9
- data/test/helper.rb +2 -0
- data/test/test_bitmap.rb +3 -1
- data/test/test_image.rb +8 -14
- data/test/test_painter.rb +4 -4
- metadata +7 -6
- data/src/win32/font.h +0 -24
data/src/win32/bitmap.cpp
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
#include "../bitmap.h"
|
2
2
|
|
3
3
|
|
4
|
-
#
|
5
|
-
#include
|
4
|
+
#define STB_IMAGE_IMPLEMENTATION
|
5
|
+
#include <stb_image.h>
|
6
|
+
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
7
|
+
#include <stb_image_write.h>
|
8
|
+
|
9
|
+
#include "rays/exception.h"
|
10
|
+
#include "../color_space.h"
|
11
|
+
#include "../font.h"
|
12
|
+
#include "../texture.h"
|
13
|
+
#include "../frame_buffer.h"
|
6
14
|
#include "gdi.h"
|
7
15
|
|
8
16
|
|
@@ -15,60 +23,55 @@ namespace Rays
|
|
15
23
|
|
16
24
|
int width, height, pitch;
|
17
25
|
|
18
|
-
ColorSpace
|
26
|
+
ColorSpace color_space;
|
19
27
|
|
20
|
-
void* pixels;
|
28
|
+
void* pixels = NULL;
|
21
29
|
|
22
30
|
Win32::MemoryDC memdc;
|
23
31
|
|
24
32
|
bool modified;
|
25
33
|
|
26
34
|
Data ()
|
27
|
-
: pixels(NULL), modified(true)
|
28
35
|
{
|
36
|
+
clear();
|
29
37
|
}
|
30
38
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
init_bitmap_pixels (Bitmap* bmp)
|
36
|
-
{
|
37
|
-
if (!*bmp) return false;
|
38
|
-
|
39
|
-
memset(bmp->data(), 0, bmp->size());
|
40
|
-
|
41
|
-
if (!bmp->color_space().has_alpha())
|
42
|
-
return true;
|
39
|
+
~Data ()
|
40
|
+
{
|
41
|
+
clear();
|
42
|
+
}
|
43
43
|
|
44
|
-
|
45
|
-
for (int y = 0; y < bmp->height(); ++y)
|
44
|
+
void clear ()
|
46
45
|
{
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
p += Bpp;
|
54
|
-
}
|
46
|
+
if (memdc) memdc = Win32::MemoryDC();
|
47
|
+
|
48
|
+
width = height = pitch = 0;
|
49
|
+
color_space = COLORSPACE_UNKNOWN;
|
50
|
+
pixels = NULL;
|
51
|
+
modified = false;
|
55
52
|
}
|
56
53
|
|
57
|
-
|
58
|
-
}
|
54
|
+
};// Bitmap::Data
|
59
55
|
|
60
|
-
|
61
|
-
|
56
|
+
|
57
|
+
static void
|
58
|
+
setup_bitmap (
|
59
|
+
Bitmap* bitmap,
|
60
|
+
int w, int h, const ColorSpace& cs,
|
61
|
+
const void* pixels = NULL, bool clear_pixels = true, HDC hdc = NULL)
|
62
62
|
{
|
63
|
-
if (w <= 0 || h <= 0 || !cs
|
64
|
-
|
63
|
+
if (w <= 0 || h <= 0 || !cs)
|
64
|
+
argument_error(__FILE__, __LINE__);
|
65
|
+
|
66
|
+
Bitmap::Data* self = bitmap->self.get();
|
65
67
|
|
66
|
-
|
68
|
+
self->clear();
|
67
69
|
|
68
|
-
self->width
|
69
|
-
self->height
|
70
|
-
self->
|
71
|
-
self->
|
70
|
+
self->width = w;
|
71
|
+
self->height = h;
|
72
|
+
self->pitch = w * cs.Bpp();
|
73
|
+
self->color_space = cs;
|
74
|
+
self->modified = true;
|
72
75
|
|
73
76
|
int padding = 4 - self->pitch % 4;
|
74
77
|
if (padding < 4) self->pitch += padding;
|
@@ -81,32 +84,49 @@ namespace Rays
|
|
81
84
|
header.biWidth = self->width;
|
82
85
|
header.biHeight = -self->height;
|
83
86
|
header.biPlanes = 1;
|
84
|
-
header.biBitCount = self->
|
87
|
+
header.biBitCount = self->color_space.bpp();
|
85
88
|
header.biCompression = BI_RGB;
|
86
89
|
|
87
90
|
Win32::DC dc = hdc ? Win32::DC(hdc) : Win32::screen_dc();
|
88
91
|
|
89
92
|
HBITMAP hbmp = CreateDIBSection(
|
90
93
|
dc.handle(), &bmpinfo, DIB_RGB_COLORS, (void**) &self->pixels, NULL, 0);
|
91
|
-
if (!hbmp)
|
94
|
+
if (!hbmp)
|
95
|
+
rays_error(__FILE__, __LINE__);
|
92
96
|
|
93
97
|
self->memdc = Win32::MemoryDC(dc.handle(), Win32::Bitmap(hbmp, true));
|
94
|
-
if (!self->memdc)
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
not_implemented_error(__FILE__, __LINE__);
|
98
|
+
if (!self->memdc)
|
99
|
+
rays_error(__FILE__, __LINE__);
|
100
|
+
|
101
|
+
size_t size = self->pitch * self->height;
|
102
|
+
if (pixels)
|
103
|
+
memcpy(self->pixels, pixels, size);
|
104
|
+
else if (clear_pixels)
|
105
|
+
memset(self->pixels, 0, size);
|
103
106
|
}
|
104
107
|
|
105
108
|
Bitmap
|
106
|
-
Bitmap_from (const Texture&
|
109
|
+
Bitmap_from (const Texture& tex)
|
107
110
|
{
|
111
|
+
if (!tex)
|
112
|
+
argument_error(__FILE__, __LINE__);
|
113
|
+
|
108
114
|
Bitmap bmp;
|
109
|
-
setup_bitmap(
|
115
|
+
setup_bitmap(
|
116
|
+
&bmp, tex.width(), tex.height(), tex.color_space(), NULL, false);
|
117
|
+
|
118
|
+
GLenum format, type;
|
119
|
+
ColorSpace_get_gl_format_and_type(&format, &type, tex.color_space());
|
120
|
+
|
121
|
+
FrameBuffer fb(tex);
|
122
|
+
FrameBufferBinder binder(fb.id());
|
123
|
+
|
124
|
+
for (int y = 0; y < bmp.height(); ++y)
|
125
|
+
{
|
126
|
+
GLvoid* ptr = (GLvoid*) bmp.at<uchar>(0, y);
|
127
|
+
glReadPixels(0, y, bmp.width(), 1, format, type, ptr);
|
128
|
+
}
|
129
|
+
|
110
130
|
return bmp;
|
111
131
|
}
|
112
132
|
|
@@ -126,8 +146,6 @@ namespace Rays
|
|
126
146
|
void
|
127
147
|
Bitmap_set_modified (Bitmap* bitmap, bool modified)
|
128
148
|
{
|
129
|
-
assert(bitmap);
|
130
|
-
|
131
149
|
bitmap->self->modified = modified;
|
132
150
|
}
|
133
151
|
|
@@ -137,16 +155,83 @@ namespace Rays
|
|
137
155
|
return bitmap.self->modified;
|
138
156
|
}
|
139
157
|
|
140
|
-
|
141
|
-
|
158
|
+
static const char*
|
159
|
+
get_ext (const char* path)
|
142
160
|
{
|
143
|
-
|
161
|
+
if (!path)
|
162
|
+
return NULL;
|
163
|
+
|
164
|
+
return strrchr(path, '.');
|
144
165
|
}
|
145
166
|
|
146
|
-
|
147
|
-
|
167
|
+
void
|
168
|
+
Bitmap_save (const Bitmap& bmp, const char* path)
|
148
169
|
{
|
149
|
-
|
170
|
+
const char* ext = get_ext(path);
|
171
|
+
if (!ext)
|
172
|
+
{
|
173
|
+
argument_error(
|
174
|
+
__FILE__, __LINE__, "invalid image file extension: '%s'", path);
|
175
|
+
}
|
176
|
+
|
177
|
+
const auto& cs = bmp.color_space();
|
178
|
+
size_t w = bmp.width();
|
179
|
+
size_t h = bmp.height();
|
180
|
+
size_t pitch = w * cs.Bpp();
|
181
|
+
|
182
|
+
std::unique_ptr<uchar[]> pixels(new uchar[h * pitch]);
|
183
|
+
for (size_t y = 0; y < h; ++y)
|
184
|
+
memcpy(pixels.get() + pitch * y, bmp.at<uchar>(0, y), pitch);
|
185
|
+
|
186
|
+
int ret = 0;
|
187
|
+
if (stricmp(ext, ".bmp") == 0)
|
188
|
+
ret = stbi_write_bmp(path, w, h, cs.Bpp(), pixels.get());
|
189
|
+
else
|
190
|
+
if (stricmp(ext, ".png") == 0)
|
191
|
+
ret = stbi_write_png(path, w, h, cs.Bpp(), pixels.get(), 0);
|
192
|
+
else
|
193
|
+
if (stricmp(ext, ".jpg") == 0 || stricmp(ext, ".jpeg") == 0)
|
194
|
+
ret = stbi_write_jpg(path, w, h, cs.Bpp(), pixels.get(), 90);
|
195
|
+
else
|
196
|
+
if (stricmp(ext, ".tga") == 0)
|
197
|
+
ret = stbi_write_tga(path, w, h, cs.Bpp(), pixels.get());
|
198
|
+
else
|
199
|
+
argument_error(__FILE__, __LINE__, "unknown image file type");
|
200
|
+
|
201
|
+
if (!ret)
|
202
|
+
rays_error(__FILE__, __LINE__, "failed to save: '%s'", path);
|
203
|
+
}
|
204
|
+
|
205
|
+
Bitmap
|
206
|
+
Bitmap_load (const char* path)
|
207
|
+
{
|
208
|
+
if (!path)
|
209
|
+
argument_error(__FILE__, __LINE__);
|
210
|
+
|
211
|
+
int w = 0, h = 0, Bpp = 0;
|
212
|
+
uchar* pixels = stbi_load(path, &w, &h, &Bpp, 0);
|
213
|
+
if (!pixels)
|
214
|
+
rays_error(__FILE__, __LINE__, "failed to load: '%s'", path);
|
215
|
+
|
216
|
+
ColorSpace cs;
|
217
|
+
switch (Bpp)
|
218
|
+
{
|
219
|
+
case 1: cs = GRAY_8; break;
|
220
|
+
case 3: cs = RGB_888; break;
|
221
|
+
case 4: cs = RGBA_8888; break;
|
222
|
+
default:
|
223
|
+
rays_error(__FILE__, __LINE__, "unsupported image file: '%s'", path);
|
224
|
+
}
|
225
|
+
|
226
|
+
Bitmap bmp(w, h, cs);
|
227
|
+
if (!bmp)
|
228
|
+
rays_error(__FILE__, __LINE__, "failed to create Bitmap object");
|
229
|
+
|
230
|
+
int pitch = Bpp * w;
|
231
|
+
for (int y = 0; y < h; ++y)
|
232
|
+
memcpy(bmp.at<uchar>(0, y), pixels + pitch * y, pitch);
|
233
|
+
|
234
|
+
return bmp;
|
150
235
|
}
|
151
236
|
|
152
237
|
|
@@ -154,31 +239,45 @@ namespace Rays
|
|
154
239
|
{
|
155
240
|
}
|
156
241
|
|
157
|
-
Bitmap::Bitmap (
|
242
|
+
Bitmap::Bitmap (
|
243
|
+
int width, int height, const ColorSpace& color_space, const void* pixels)
|
158
244
|
{
|
159
|
-
setup_bitmap(this, width, height,
|
245
|
+
setup_bitmap(this, width, height, color_space, pixels);
|
160
246
|
}
|
161
247
|
|
162
248
|
Bitmap::~Bitmap ()
|
163
249
|
{
|
164
250
|
}
|
165
251
|
|
252
|
+
Bitmap
|
253
|
+
Bitmap::dup () const
|
254
|
+
{
|
255
|
+
return Bitmap(width(), height(), color_space(), pixels());
|
256
|
+
}
|
257
|
+
|
166
258
|
int
|
167
259
|
Bitmap::width () const
|
168
260
|
{
|
261
|
+
if (!*this) return 0;
|
169
262
|
return self->width;
|
170
263
|
}
|
171
264
|
|
172
265
|
int
|
173
266
|
Bitmap::height () const
|
174
267
|
{
|
268
|
+
if (!*this) return 0;
|
175
269
|
return self->height;
|
176
270
|
}
|
177
271
|
|
178
272
|
const ColorSpace&
|
179
273
|
Bitmap::color_space () const
|
180
274
|
{
|
181
|
-
|
275
|
+
if (!*this)
|
276
|
+
{
|
277
|
+
static const ColorSpace UNKNOWN = COLORSPACE_UNKNOWN;
|
278
|
+
return UNKNOWN;
|
279
|
+
}
|
280
|
+
return self->color_space;
|
182
281
|
}
|
183
282
|
|
184
283
|
int
|
@@ -196,6 +295,7 @@ namespace Rays
|
|
196
295
|
void*
|
197
296
|
Bitmap::pixels ()
|
198
297
|
{
|
298
|
+
if (!*this) return NULL;
|
199
299
|
return self->pixels;
|
200
300
|
}
|
201
301
|
|
@@ -208,9 +308,11 @@ namespace Rays
|
|
208
308
|
Bitmap::operator bool () const
|
209
309
|
{
|
210
310
|
return
|
211
|
-
self &&
|
212
|
-
self->
|
213
|
-
self->
|
311
|
+
self->width > 0 &&
|
312
|
+
self->height > 0 &&
|
313
|
+
self->pitch > 0 &&
|
314
|
+
self->color_space &&
|
315
|
+
self->pixels;
|
214
316
|
}
|
215
317
|
|
216
318
|
bool
|
@@ -0,0 +1,119 @@
|
|
1
|
+
#include "rays/camera.h"
|
2
|
+
|
3
|
+
|
4
|
+
#include "rays/exception.h"
|
5
|
+
|
6
|
+
|
7
|
+
namespace Rays
|
8
|
+
{
|
9
|
+
|
10
|
+
|
11
|
+
struct Camera::Data
|
12
|
+
{
|
13
|
+
};// Camera::Data
|
14
|
+
|
15
|
+
|
16
|
+
std::vector<String>
|
17
|
+
get_camera_device_names ()
|
18
|
+
{
|
19
|
+
not_implemented_error(__FILE__, __LINE__);
|
20
|
+
}
|
21
|
+
|
22
|
+
|
23
|
+
Camera::Camera (
|
24
|
+
const char* device_name,
|
25
|
+
int min_width, int min_height, bool resize, bool crop)
|
26
|
+
{
|
27
|
+
not_implemented_error(__FILE__, __LINE__);
|
28
|
+
}
|
29
|
+
|
30
|
+
Camera::~Camera ()
|
31
|
+
{
|
32
|
+
not_implemented_error(__FILE__, __LINE__);
|
33
|
+
}
|
34
|
+
|
35
|
+
bool
|
36
|
+
Camera::start ()
|
37
|
+
{
|
38
|
+
not_implemented_error(__FILE__, __LINE__);
|
39
|
+
}
|
40
|
+
|
41
|
+
void
|
42
|
+
Camera::stop ()
|
43
|
+
{
|
44
|
+
not_implemented_error(__FILE__, __LINE__);
|
45
|
+
}
|
46
|
+
|
47
|
+
bool
|
48
|
+
Camera::is_active () const
|
49
|
+
{
|
50
|
+
not_implemented_error(__FILE__, __LINE__);
|
51
|
+
}
|
52
|
+
|
53
|
+
void
|
54
|
+
Camera::set_min_width (int width)
|
55
|
+
{
|
56
|
+
not_implemented_error(__FILE__, __LINE__);
|
57
|
+
}
|
58
|
+
|
59
|
+
int
|
60
|
+
Camera::min_width () const
|
61
|
+
{
|
62
|
+
not_implemented_error(__FILE__, __LINE__);
|
63
|
+
}
|
64
|
+
|
65
|
+
void
|
66
|
+
Camera::set_min_height (int height)
|
67
|
+
{
|
68
|
+
not_implemented_error(__FILE__, __LINE__);
|
69
|
+
}
|
70
|
+
|
71
|
+
int
|
72
|
+
Camera::min_height () const
|
73
|
+
{
|
74
|
+
not_implemented_error(__FILE__, __LINE__);
|
75
|
+
}
|
76
|
+
|
77
|
+
void
|
78
|
+
Camera::set_resize (bool resize)
|
79
|
+
{
|
80
|
+
not_implemented_error(__FILE__, __LINE__);
|
81
|
+
}
|
82
|
+
|
83
|
+
bool
|
84
|
+
Camera::is_resize () const
|
85
|
+
{
|
86
|
+
not_implemented_error(__FILE__, __LINE__);
|
87
|
+
}
|
88
|
+
|
89
|
+
void
|
90
|
+
Camera::set_crop (bool crop)
|
91
|
+
{
|
92
|
+
not_implemented_error(__FILE__, __LINE__);
|
93
|
+
}
|
94
|
+
|
95
|
+
bool
|
96
|
+
Camera::is_crop () const
|
97
|
+
{
|
98
|
+
not_implemented_error(__FILE__, __LINE__);
|
99
|
+
}
|
100
|
+
|
101
|
+
const Image*
|
102
|
+
Camera::image () const
|
103
|
+
{
|
104
|
+
not_implemented_error(__FILE__, __LINE__);
|
105
|
+
}
|
106
|
+
|
107
|
+
Camera::operator bool () const
|
108
|
+
{
|
109
|
+
return false;
|
110
|
+
}
|
111
|
+
|
112
|
+
bool
|
113
|
+
Camera::operator ! () const
|
114
|
+
{
|
115
|
+
return !operator bool();
|
116
|
+
}
|
117
|
+
|
118
|
+
|
119
|
+
}// Rays
|