stb-image 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/COPYING +10 -0
- data/README.md +58 -0
- data/ext/bindings.c +387 -0
- data/ext/extconf.rb +14 -0
- data/ext/stb_image.c +4673 -0
- data/lib/stb-image.rb +12 -0
- data/rdoc/stb_image.c.md +66 -0
- metadata +64 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e73e6f2f11e07296a4a09386b46fb9bef372ecc8
|
4
|
+
data.tar.gz: 0d84e354e6971e9e101af7cf35c41e5fa6ec7d3e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 38253ce9a581f1afadf8ffb3247c25a7fe54b83e0b2684e6ba39d27dbc084881ac80ee9974b329af0b4577b2d8d51bb921028cc59d33e699be8ce255ee94151f
|
7
|
+
data.tar.gz: 08ae2c60e53410e2faa892b9709aab3b91453af266b463465908d38916c07ee78c12c4932075597adf94b346f4c3445b82548cd30d4e8d5ea7090900a30c9011
|
data/COPYING
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
These bindings for stb_image ("the software") are public domain, as with
|
2
|
+
stb_image itself.
|
3
|
+
|
4
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
5
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
6
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
7
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
8
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
9
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
10
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
stb-image gem
|
2
|
+
=============
|
3
|
+
|
4
|
+
$ gem install stb-image
|
5
|
+
|
6
|
+
-------------------------------------------------------------------------------
|
7
|
+
|
8
|
+
This stb-image gem is a simple wrapper around [Sean Barrett's][sean-barrett]
|
9
|
+
stb_image.c file (including contributions by others), which provides a simple,
|
10
|
+
easy to use image loading API fo folks who really don't want anything other
|
11
|
+
than to load an image, cram it into a GL texture object, and discard it.
|
12
|
+
|
13
|
+
[sean-barrett]: http://nothings.org
|
14
|
+
|
15
|
+
Using it is fairly simple, and best illustrated by the following example:
|
16
|
+
|
17
|
+
require 'stb-image'
|
18
|
+
|
19
|
+
info = open('image.png') { |io|
|
20
|
+
STBI.load_image(io)
|
21
|
+
}
|
22
|
+
raise "Unable to load image" unless info
|
23
|
+
image_data, width, height, num_components = info
|
24
|
+
|
25
|
+
So, let's walk through this line by line.
|
26
|
+
|
27
|
+
1. Require the stb-image gem. You probably know why this is necessary.
|
28
|
+
2. Open 'image.png' with a block with the intent to store the result of the
|
29
|
+
block in the info variable.
|
30
|
+
3. In the block, call STBI.load_image and pass the open IO object to it so it
|
31
|
+
can read data. The result, an array containing the image data string, the
|
32
|
+
width and height of the image, and the number of components per texel in the
|
33
|
+
image.
|
34
|
+
4. If info is nil, raise an exception.
|
35
|
+
5. Grab the data, width, height, and components from the returned info.
|
36
|
+
Commence doing whatever you want with this data.
|
37
|
+
|
38
|
+
It's pretty simple. Arguably, at least two or three steps here are optional.
|
39
|
+
|
40
|
+
In addition, if you'd like to load an HDR image or any image as floats instead
|
41
|
+
of bytes, you can use STBI.load_float_image, whose returned data is an array
|
42
|
+
of floats rather than bytes. You can inspect the results of either by using
|
43
|
+
info[0].unpack('f*') for HDR images and `'C*'` for LDR images.
|
44
|
+
|
45
|
+
|
46
|
+
License (or Lack Thereof)
|
47
|
+
-------
|
48
|
+
|
49
|
+
These bindings for stb_image ("the software") are public domain, as with
|
50
|
+
stb_image itself.
|
51
|
+
|
52
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
53
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
54
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
55
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
56
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
57
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
58
|
+
THE SOFTWARE.
|
data/ext/bindings.c
ADDED
@@ -0,0 +1,387 @@
|
|
1
|
+
/*
|
2
|
+
This source is part of the Ruby bindings for stb_image.
|
3
|
+
It is released into the public domain, as with stb_image itself.
|
4
|
+
|
5
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
6
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
7
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
8
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
9
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
10
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
11
|
+
THE SOFTWARE.
|
12
|
+
*/
|
13
|
+
|
14
|
+
#define STBI_NO_STDIO
|
15
|
+
#define STBI_HEADER_FILE_ONLY
|
16
|
+
|
17
|
+
#include "stb_image.c"
|
18
|
+
#include "ruby.h"
|
19
|
+
|
20
|
+
static VALUE s_stbi_module;
|
21
|
+
static ID s_read_funcid;
|
22
|
+
static ID s_skip_funcid;
|
23
|
+
static ID s_eof_funcid;
|
24
|
+
static ID s_eof_qm_funcid;
|
25
|
+
|
26
|
+
/******************************************************************************
|
27
|
+
Callbacks used by STBI to load data using either Ruby IO objects or 'special'
|
28
|
+
IO objects that implement both read and eof/eof? (and optionally skip).
|
29
|
+
|
30
|
+
Specifically, any class that has the following
|
31
|
+
|
32
|
+
class STBI_IO
|
33
|
+
def read(num_bytes)
|
34
|
+
end
|
35
|
+
|
36
|
+
def skip(num_bytes)
|
37
|
+
# optional
|
38
|
+
end
|
39
|
+
|
40
|
+
def eof?
|
41
|
+
end
|
42
|
+
end
|
43
|
+
******************************************************************************/
|
44
|
+
|
45
|
+
static int sr_read_callback(void *user, char *data, int size)
|
46
|
+
{
|
47
|
+
VALUE callback_obj = *(VALUE *)user;
|
48
|
+
VALUE sr_size = INT2NUM(size);
|
49
|
+
VALUE sr_data = rb_check_funcall(callback_obj, s_read_funcid, 1, &sr_size);
|
50
|
+
|
51
|
+
if (sr_data != Qundef && RTEST(sr_data)) {
|
52
|
+
const char *string_data = StringValuePtr(sr_data);
|
53
|
+
int string_length = RSTRING_LENINT(sr_data);
|
54
|
+
memcpy(data, string_data, string_length);
|
55
|
+
return string_length;
|
56
|
+
}
|
57
|
+
|
58
|
+
rb_warn("IO object did not respond to read, returning 0 bytes read");
|
59
|
+
|
60
|
+
/*
|
61
|
+
stb_image should fail on its own if it doesn't get the data it wants here,
|
62
|
+
so just return 0
|
63
|
+
*/
|
64
|
+
return 0;
|
65
|
+
}
|
66
|
+
|
67
|
+
static void sr_skip_callback(void *user, unsigned size)
|
68
|
+
{
|
69
|
+
VALUE callback_obj = *(VALUE *)user;
|
70
|
+
VALUE sr_size = UINT2NUM(size);
|
71
|
+
|
72
|
+
/* If skip doesn't exist, call read and discard the result */
|
73
|
+
if (rb_check_funcall(callback_obj, s_skip_funcid, 1, &sr_size) != Qundef ||
|
74
|
+
rb_check_funcall(callback_obj, s_read_funcid, 1, &sr_size) != Qundef) {
|
75
|
+
return;
|
76
|
+
}
|
77
|
+
|
78
|
+
rb_warn("IO object did not respond to either skip or read");
|
79
|
+
}
|
80
|
+
|
81
|
+
static int sr_eof_callback(void *user)
|
82
|
+
{
|
83
|
+
VALUE callback_obj = *(VALUE *)user;
|
84
|
+
VALUE result = rb_check_funcall(callback_obj, s_eof_qm_funcid, 0, NULL);
|
85
|
+
if (result == Qundef && (result = rb_check_funcall(callback_obj, s_eof_qm_funcid, 0, NULL)) == Qundef) {
|
86
|
+
rb_warn("IO object did not respond to eof or eof?, assuming not at EOF");
|
87
|
+
result = Qfalse;
|
88
|
+
}
|
89
|
+
return RTEST(result);
|
90
|
+
}
|
91
|
+
|
92
|
+
/* Callback structure -- passed to STBI */
|
93
|
+
static stbi_io_callbacks s_st_callbacks = {
|
94
|
+
sr_read_callback,
|
95
|
+
sr_skip_callback,
|
96
|
+
sr_eof_callback
|
97
|
+
};
|
98
|
+
|
99
|
+
/******************************************************************************
|
100
|
+
Bindings implementations
|
101
|
+
******************************************************************************/
|
102
|
+
|
103
|
+
/*
|
104
|
+
call-seq:
|
105
|
+
load_image(io, required_components = COMPONENTS_DEFAULT) => [data, width, height, components]
|
106
|
+
load_image(io, required_components = COMPONENTS_DEFAULT) { |info| ... } => obj
|
107
|
+
|
108
|
+
Loads an image using stb_image and returns the resulting data and its width,
|
109
|
+
height, and the number of components per pixel in the data. The returned data
|
110
|
+
is a packed string of unsigned 8-bit integers (8 bits per component). The
|
111
|
+
length of the string will always be width * height * components.
|
112
|
+
|
113
|
+
In the second form, the info array is yielded to the block if the image is
|
114
|
+
successfully loaded. Otherwise, the method returns nil. This is possibly more
|
115
|
+
convenient than doing an <tt>if info ... end</tt> block to check if the
|
116
|
+
image was successfully loaded.
|
117
|
+
|
118
|
+
=== IO Objects
|
119
|
+
|
120
|
+
IO objects accepted for loading data with must implement at least
|
121
|
+
IO#read(length) and either IO#eof or IO#eof?. In addition, they may also
|
122
|
+
implement a skip(length) method that skips length bytes and does not return
|
123
|
+
any value. If the IO object does not respond to #skip, #read will be called
|
124
|
+
instead and its result will be discarded. If you want to avoid unnecessary
|
125
|
+
allocations, it may be wise to implement a skip method.
|
126
|
+
|
127
|
+
=== Components
|
128
|
+
|
129
|
+
If required_components is provided and not the default value, the image data
|
130
|
+
returned will have as many components as are requested. In turn, the number of
|
131
|
+
components returned via the array will be the same as required_components.
|
132
|
+
|
133
|
+
Valid options for required_components are:
|
134
|
+
|
135
|
+
[::COMPONENTS_DEFAULT] The default value, loads as many components as are
|
136
|
+
provided by the image.
|
137
|
+
[::COMPONENTS_GREY] Loads only one component.
|
138
|
+
[::COMPONENTS_GREY_ALPHA] Loads two components.
|
139
|
+
[::COMPONENTS_RGB] Loads three components (red, green, and blue).
|
140
|
+
[::COMPONENTS_RGB_ALPHA] Loads four components (red, green, blue, and alpha).
|
141
|
+
|
142
|
+
=== Example
|
143
|
+
|
144
|
+
open('image.png') { |io|
|
145
|
+
STBI.load_image(io) { |data, width, height, components|
|
146
|
+
format = case components
|
147
|
+
when STBI::COMPONENTS_GREY then Gl::GL_RED
|
148
|
+
when STBI::COMPONENTS_GREY_ALPHA then Gl::GL_RG
|
149
|
+
when STBI_COMPONENTS_RGB then Gl::RGB
|
150
|
+
when STBI_COMPONENTS_RGB_ALPHA then Gl::RGBA
|
151
|
+
end
|
152
|
+
|
153
|
+
Gl::glTexImage2D(Gl::GL_TEXTURE_2D, 0, format, width, height, 0,
|
154
|
+
format, Gl::GL_UNSIGNED_BYTE, data)
|
155
|
+
}
|
156
|
+
}
|
157
|
+
*/
|
158
|
+
static VALUE sr_load_image(int argc, VALUE *argv, VALUE sr_self)
|
159
|
+
{
|
160
|
+
VALUE sr_callbacks;
|
161
|
+
VALUE sr_req_comp;
|
162
|
+
VALUE sr_image_data = Qnil;
|
163
|
+
int x = 0;
|
164
|
+
int y = 0;
|
165
|
+
int components[2] = {
|
166
|
+
STBI_default,
|
167
|
+
0
|
168
|
+
};
|
169
|
+
|
170
|
+
rb_scan_args(argc, argv, "11", &sr_callbacks, &sr_req_comp);
|
171
|
+
|
172
|
+
if (NIL_P(sr_callbacks)) {
|
173
|
+
rb_raise(rb_eArgError, "IO object cannot be nil");
|
174
|
+
return Qnil;
|
175
|
+
} if (RTEST(sr_req_comp)) {
|
176
|
+
components[0] = FIX2INT(sr_req_comp);
|
177
|
+
}
|
178
|
+
|
179
|
+
if (!rb_obj_respond_to(sr_callbacks, s_read_funcid, 0) ||
|
180
|
+
!(rb_obj_respond_to(sr_callbacks, s_eof_funcid, 0) ||
|
181
|
+
rb_obj_respond_to(sr_callbacks, s_eof_qm_funcid, 0))) {
|
182
|
+
rb_raise(rb_eTypeError, "IO object does not respond to either read or eof/eof?");
|
183
|
+
}
|
184
|
+
|
185
|
+
stbi_uc *data = stbi_load_from_callbacks(&s_st_callbacks, &sr_callbacks,
|
186
|
+
&x, &y, &components[1], components[0]);
|
187
|
+
|
188
|
+
if (data) {
|
189
|
+
const long length = x * y * components[!components[0]];
|
190
|
+
sr_image_data = rb_ary_new3(4,
|
191
|
+
rb_external_str_new((const char *)data, length),
|
192
|
+
INT2FIX(x), INT2FIX(y),
|
193
|
+
INT2FIX(components[!components[0]]));
|
194
|
+
stbi_image_free(data);
|
195
|
+
}
|
196
|
+
|
197
|
+
if (!NIL_P(sr_image_data) && rb_block_given_p()) {
|
198
|
+
return rb_yield_splat(sr_image_data);
|
199
|
+
} else {
|
200
|
+
return sr_image_data;
|
201
|
+
}
|
202
|
+
}
|
203
|
+
|
204
|
+
/*
|
205
|
+
call-seq:
|
206
|
+
load_float_image(io, required_components = COMPONENTS_DEFAULT) => [data, width, height, components]
|
207
|
+
load_float_image(io, required_components = COMPONENTS_DEFAULT) { |info| ... } => obj
|
208
|
+
|
209
|
+
Similar to ::load_image, except the returned image data is a packaed string
|
210
|
+
for an array of 32-bit floats (e.g., String#unpack('f*') will extract an array
|
211
|
+
of floating point values representing the components of the image's pixels).
|
212
|
+
|
213
|
+
In the second form, the info array is yielded to the block if the image is
|
214
|
+
successfully loaded. Otherwise, the method returns nil. This is possibly more
|
215
|
+
convenient than doing an <tt>if info ... end</tt> block to check if the
|
216
|
+
image was successfully loaded.
|
217
|
+
|
218
|
+
For further information on the IO object, the required_components argument,
|
219
|
+
and so on, see the documentation for load_image.
|
220
|
+
|
221
|
+
=== Example
|
222
|
+
|
223
|
+
open('image.png') { |io|
|
224
|
+
STBI.load_float_image(io) { |data, width, height, components|
|
225
|
+
format = case components
|
226
|
+
when STBI::COMPONENTS_GREY then Gl::GL_RED
|
227
|
+
when STBI::COMPONENTS_GREY_ALPHA then Gl::GL_RG
|
228
|
+
when STBI_COMPONENTS_RGB then Gl::RGB
|
229
|
+
when STBI_COMPONENTS_RGB_ALPHA then Gl::RGBA
|
230
|
+
end
|
231
|
+
|
232
|
+
Gl::glTexImage2D(Gl::GL_TEXTURE_2D, 0, format, width, height, 0,
|
233
|
+
format, Gl::GL_FLOAT, data)
|
234
|
+
}
|
235
|
+
}
|
236
|
+
*/
|
237
|
+
static VALUE sr_load_float_image(int argc, VALUE *argv, VALUE sr_self)
|
238
|
+
{
|
239
|
+
VALUE sr_callbacks;
|
240
|
+
VALUE sr_req_comp;
|
241
|
+
VALUE sr_image_data = Qnil;
|
242
|
+
int x = 0;
|
243
|
+
int y = 0;
|
244
|
+
int components[2] = {
|
245
|
+
STBI_default,
|
246
|
+
0
|
247
|
+
};
|
248
|
+
|
249
|
+
rb_scan_args(argc, argv, "11", &sr_callbacks, &sr_req_comp);
|
250
|
+
|
251
|
+
if (NIL_P(sr_callbacks)) {
|
252
|
+
rb_raise(rb_eArgError, "IO object cannot be nil");
|
253
|
+
return Qnil;
|
254
|
+
} if (RTEST(sr_req_comp)) {
|
255
|
+
components[0] = FIX2INT(sr_req_comp);
|
256
|
+
}
|
257
|
+
|
258
|
+
float *data = stbi_loadf_from_callbacks(&s_st_callbacks, &sr_callbacks,
|
259
|
+
&x, &y, &components[1], components[0]);
|
260
|
+
|
261
|
+
if (data) {
|
262
|
+
const long length = x * y * components[!components[0]] * sizeof(float);
|
263
|
+
sr_image_data = rb_ary_new3(4,
|
264
|
+
rb_external_str_new((const char *)data, length),
|
265
|
+
INT2FIX(x), INT2FIX(y),
|
266
|
+
INT2FIX(components[!components[0]]));
|
267
|
+
stbi_image_free(data);
|
268
|
+
}
|
269
|
+
|
270
|
+
if (!NIL_P(sr_image_data) && rb_block_given_p()) {
|
271
|
+
return rb_yield_splat(sr_image_data);
|
272
|
+
} else {
|
273
|
+
return sr_image_data;
|
274
|
+
}
|
275
|
+
}
|
276
|
+
|
277
|
+
/*
|
278
|
+
call-seq:
|
279
|
+
set_hdr_to_ldr_gamma(value) => value
|
280
|
+
|
281
|
+
Sets the HDR to LDR gamma used when loading HDR images with load_image.
|
282
|
+
*/
|
283
|
+
static VALUE sr_set_hdr_to_ldr_gamma(VALUE self, VALUE gamma)
|
284
|
+
{
|
285
|
+
stbi_hdr_to_ldr_gamma((float)NUM2DBL(gamma));
|
286
|
+
return gamma;
|
287
|
+
}
|
288
|
+
|
289
|
+
/*
|
290
|
+
call-seq:
|
291
|
+
set_hdr_to_ldr_scale(value) => value
|
292
|
+
|
293
|
+
Sets the HDR to LDR scale used when loading HDR images with load_image.
|
294
|
+
*/
|
295
|
+
static VALUE sr_set_hdr_to_ldr_scale(VALUE self, VALUE scale)
|
296
|
+
{
|
297
|
+
stbi_hdr_to_ldr_scale((float)NUM2DBL(scale));
|
298
|
+
return scale;
|
299
|
+
}
|
300
|
+
|
301
|
+
/*
|
302
|
+
call-seq:
|
303
|
+
set_ldr_to_hdr_gamma(value) => value
|
304
|
+
|
305
|
+
Sets the LDR to HDR gamma used when loading LDR images with load_float_image.
|
306
|
+
*/
|
307
|
+
static VALUE sr_set_ldr_to_hdr_gamma(VALUE self, VALUE gamma)
|
308
|
+
{
|
309
|
+
stbi_ldr_to_hdr_gamma((float)NUM2DBL(gamma));
|
310
|
+
return gamma;
|
311
|
+
}
|
312
|
+
|
313
|
+
/*
|
314
|
+
call-seq:
|
315
|
+
set_ldr_to_hdr_scale(value) => value
|
316
|
+
|
317
|
+
Sets the LDR to HDR scale used when loading LDR images with load_float_image.
|
318
|
+
*/
|
319
|
+
static VALUE sr_set_ldr_to_hdr_scale(VALUE self, VALUE scale)
|
320
|
+
{
|
321
|
+
stbi_ldr_to_hdr_scale((float)NUM2DBL(scale));
|
322
|
+
return scale;
|
323
|
+
}
|
324
|
+
|
325
|
+
void Init_stb_image_bindings(void)
|
326
|
+
{
|
327
|
+
s_read_funcid = rb_intern("read");
|
328
|
+
s_skip_funcid = rb_intern("skip");
|
329
|
+
s_eof_funcid = rb_intern("eof");
|
330
|
+
s_eof_qm_funcid = rb_intern("eof?");
|
331
|
+
|
332
|
+
/*
|
333
|
+
Container module for stb-image bindings. Of main interest are load_image
|
334
|
+
and load_float_image, which allow you to load data from a variety of image
|
335
|
+
formats, including
|
336
|
+
|
337
|
+
- PNG
|
338
|
+
- JPEG
|
339
|
+
- TGA
|
340
|
+
- BMP
|
341
|
+
- PSD
|
342
|
+
- GIF
|
343
|
+
- HDR
|
344
|
+
- PIC
|
345
|
+
|
346
|
+
These formats come with some limitations, which you can read in the original
|
347
|
+
stb_image.c header.
|
348
|
+
*/
|
349
|
+
s_stbi_module = rb_define_module("STBI");
|
350
|
+
|
351
|
+
/* The version constant provided by stb_image.c */
|
352
|
+
rb_define_const(s_stbi_module, "STBI_VERSION", INT2FIX(STBI_VERSION));
|
353
|
+
/*
|
354
|
+
Only valid for required_components arguments to load_image
|
355
|
+
and load_float_image. See load_image for usage.
|
356
|
+
*/
|
357
|
+
rb_define_const(s_stbi_module, "COMPONENTS_DEFAULT", INT2FIX(STBI_default));
|
358
|
+
/*
|
359
|
+
Specifies that pixels in image data must have or has 1 component.
|
360
|
+
See load_image for usage.
|
361
|
+
*/
|
362
|
+
rb_define_const(s_stbi_module, "COMPONENTS_GREY", INT2FIX(STBI_grey));
|
363
|
+
/*
|
364
|
+
Specifies that pixels in image data must have or has 2 components.
|
365
|
+
See load_image for usage.
|
366
|
+
*/
|
367
|
+
rb_define_const(s_stbi_module, "COMPONENTS_GREY_ALPHA", INT2FIX(STBI_grey_alpha));
|
368
|
+
/*
|
369
|
+
Specifies that pixels in image data must have or has 3 components.
|
370
|
+
See load_image for usage.
|
371
|
+
*/
|
372
|
+
rb_define_const(s_stbi_module, "COMPONENTS_RGB", INT2FIX(STBI_rgb));
|
373
|
+
/*
|
374
|
+
Specifies that pixels in image data must have or has 4 components.
|
375
|
+
See load_image for usage.
|
376
|
+
*/
|
377
|
+
rb_define_const(s_stbi_module, "COMPONENTS_RGB_ALPHA", INT2FIX(STBI_rgb_alpha));
|
378
|
+
|
379
|
+
rb_define_singleton_method(s_stbi_module, "load_image", sr_load_image, -1);
|
380
|
+
rb_define_singleton_method(s_stbi_module, "load_float_image", sr_load_float_image, -1);
|
381
|
+
|
382
|
+
rb_define_singleton_method(s_stbi_module, "hdr_to_ldr_gamma=", sr_set_hdr_to_ldr_gamma, 1);
|
383
|
+
rb_define_singleton_method(s_stbi_module, "hdr_to_ldr_scale=", sr_set_hdr_to_ldr_scale, 1);
|
384
|
+
rb_define_singleton_method(s_stbi_module, "ldr_to_hdr_gamma=", sr_set_ldr_to_hdr_gamma, 1);
|
385
|
+
rb_define_singleton_method(s_stbi_module, "ldr_to_hdr_scale=", sr_set_ldr_to_hdr_scale, 1);
|
386
|
+
}
|
387
|
+
|