ruby-dnn 0.8.7 → 0.8.8
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/Rakefile +3 -2
- data/{lib/dnn/ext → ext}/cifar10_loader/cifar10_loader.c +0 -0
- data/{lib/dnn/ext → ext}/cifar10_loader/extconf.rb +0 -0
- data/{lib/dnn/ext → ext}/rb_stb_image/extconf.rb +0 -0
- data/{lib/dnn/ext → ext}/rb_stb_image/rb_stb_image.c +2 -2
- data/lib/dnn/core/rnn_layers.rb +10 -10
- data/lib/dnn/lib/cifar10.rb +1 -1
- data/lib/dnn/lib/image.rb +1 -1
- data/lib/dnn/version.rb +1 -1
- data/ruby-dnn.gemspec +1 -1
- data/{lib/dnn/ext/rb_stb_image → third_party}/stb_image.h +139 -54
- data/{lib/dnn/ext/rb_stb_image → third_party}/stb_image_write.h +108 -54
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7fe476037a4238a20708637ccd5c7fcd8e31d824e23019ba9d779a905eb5539
|
4
|
+
data.tar.gz: 2f6a78ab7fdd95cb73992b43f9f40868af838d58ca53b489e48f1bdff4ca3dbb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a86bbe0fdc6cf4a572b33f6ec03256fee9ed61cba365c639e108efba60572752ff8fc5d0ccf76401f9885599e269423a5e0aadbf32fff08cf4f25ab002732ec
|
7
|
+
data.tar.gz: cd4615a5f1bcd4b495b9583d672dcbe248245ba26de5bc6fe768cd5e98a0ba1dce3570b266c5a15360fd45879325af6ad79a6a2620f1927f2ef1e03a9478bdb2
|
data/Rakefile
CHANGED
@@ -3,16 +3,17 @@ require "rake/testtask"
|
|
3
3
|
|
4
4
|
Rake::TestTask.new(:test) do |t|
|
5
5
|
t.libs << "test"
|
6
|
+
t.libs << "ext"
|
6
7
|
t.libs << "lib"
|
7
8
|
t.test_files = FileList["test/*_test.rb"]
|
8
9
|
end
|
9
10
|
|
10
11
|
task :build_dataset_loader do
|
11
|
-
sh "cd
|
12
|
+
sh "cd ext/cifar10_loader; ruby extconf.rb; make"
|
12
13
|
end
|
13
14
|
|
14
15
|
task :build_image_io do
|
15
|
-
sh "cd
|
16
|
+
sh "cd ext/rb_stb_image; ruby extconf.rb; make"
|
16
17
|
end
|
17
18
|
|
18
19
|
task :default => [:test, :build_dataset_loader, :build_image_io]
|
File without changes
|
File without changes
|
File without changes
|
@@ -4,8 +4,8 @@
|
|
4
4
|
#define STB_IMAGE_IMPLEMENTATION
|
5
5
|
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
6
6
|
|
7
|
-
#include "stb_image.h"
|
8
|
-
#include "stb_image_write.h"
|
7
|
+
#include "../../third_party/stb_image.h"
|
8
|
+
#include "../../third_party/stb_image_write.h"
|
9
9
|
|
10
10
|
// STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp);
|
11
11
|
static VALUE rb_stbi_load(VALUE self, VALUE rb_filename, VALUE rb_req_comp) {
|
data/lib/dnn/core/rnn_layers.rb
CHANGED
@@ -24,20 +24,20 @@ module DNN
|
|
24
24
|
@stateful = stateful
|
25
25
|
@return_sequences = return_sequences
|
26
26
|
@layers = []
|
27
|
-
@params[:h] =
|
27
|
+
@hidden = @params[:h] = Param.new
|
28
28
|
@params[:weight2] = @weight2 = Param.new
|
29
29
|
end
|
30
30
|
|
31
31
|
def forward(xs)
|
32
32
|
@xs_shape = xs.shape
|
33
33
|
hs = Xumo::SFloat.zeros(xs.shape[0], @time_length, @num_nodes)
|
34
|
-
h = (@stateful && @
|
34
|
+
h = (@stateful && @hidden.data) ? @hidden.data : Xumo::SFloat.zeros(xs.shape[0], @num_nodes)
|
35
35
|
xs.shape[1].times do |t|
|
36
36
|
x = xs[true, t, false]
|
37
37
|
h = @layers[t].forward(x, h)
|
38
38
|
hs[true, t, false] = h
|
39
39
|
end
|
40
|
-
@
|
40
|
+
@hidden.data = h
|
41
41
|
@return_sequences ? hs : h
|
42
42
|
end
|
43
43
|
|
@@ -75,7 +75,7 @@ module DNN
|
|
75
75
|
end
|
76
76
|
|
77
77
|
def reset_state
|
78
|
-
@
|
78
|
+
@hidden.data = @hidden.data.fill(0) if @hidden.data
|
79
79
|
end
|
80
80
|
|
81
81
|
def lasso
|
@@ -274,7 +274,7 @@ module DNN
|
|
274
274
|
l1_lambda: 0,
|
275
275
|
l2_lambda: 0)
|
276
276
|
super
|
277
|
-
@params[:c] =
|
277
|
+
@cell = @params[:c] = Param.new
|
278
278
|
end
|
279
279
|
|
280
280
|
def forward(xs)
|
@@ -283,8 +283,8 @@ module DNN
|
|
283
283
|
h = nil
|
284
284
|
c = nil
|
285
285
|
if @stateful
|
286
|
-
h = @
|
287
|
-
c = @
|
286
|
+
h = @hidden.data if @hidden.data
|
287
|
+
c = @cell.data if @cell.data
|
288
288
|
end
|
289
289
|
h ||= Xumo::SFloat.zeros(xs.shape[0], @num_nodes)
|
290
290
|
c ||= Xumo::SFloat.zeros(xs.shape[0], @num_nodes)
|
@@ -293,8 +293,8 @@ module DNN
|
|
293
293
|
h, c = @layers[t].forward(x, h, c)
|
294
294
|
hs[true, t, false] = h
|
295
295
|
end
|
296
|
-
@
|
297
|
-
@
|
296
|
+
@hidden.data = h
|
297
|
+
@cell.data = c
|
298
298
|
@return_sequences ? hs : h
|
299
299
|
end
|
300
300
|
|
@@ -320,7 +320,7 @@ module DNN
|
|
320
320
|
|
321
321
|
def reset_state
|
322
322
|
super()
|
323
|
-
@
|
323
|
+
@cell.data = @cell.data.fill(0) if @cell.data
|
324
324
|
end
|
325
325
|
|
326
326
|
private
|
data/lib/dnn/lib/cifar10.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require "zlib"
|
2
2
|
require "archive/tar/minitar"
|
3
|
-
require_relative "
|
3
|
+
require_relative "../../../ext/cifar10_loader/cifar10_loader"
|
4
4
|
require_relative "downloader"
|
5
5
|
|
6
6
|
URL_CIFAR10 = "https://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz"
|
data/lib/dnn/lib/image.rb
CHANGED
data/lib/dnn/version.rb
CHANGED
data/ruby-dnn.gemspec
CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.description = %q{ruby-dnn is a ruby deep learning library.}
|
14
14
|
spec.homepage = "https://github.com/unagiootoro/ruby-dnn.git"
|
15
15
|
spec.license = "MIT"
|
16
|
-
spec.extensions = ["
|
16
|
+
spec.extensions = ["ext/cifar10_loader/extconf.rb", "ext/rb_stb_image/extconf.rb"]
|
17
17
|
|
18
18
|
spec.add_dependency "numo-narray"
|
19
19
|
spec.add_dependency "archive-tar-minitar"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
/* stb_image - v2.
|
1
|
+
/* stb_image - v2.22 - public domain image loader - http://nothings.org/stb
|
2
2
|
no warranty implied; use at your own risk
|
3
3
|
|
4
4
|
Do this:
|
@@ -48,6 +48,9 @@ LICENSE
|
|
48
48
|
|
49
49
|
RECENT REVISION HISTORY:
|
50
50
|
|
51
|
+
2.22 (2019-03-04) gif fixes, fix warnings
|
52
|
+
2.21 (2019-02-25) fix typo in comment
|
53
|
+
2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
|
51
54
|
2.19 (2018-02-11) fix warning
|
52
55
|
2.18 (2018-01-30) fix warnings
|
53
56
|
2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings
|
@@ -84,6 +87,7 @@ RECENT REVISION HISTORY:
|
|
84
87
|
Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query)
|
85
88
|
Arseny Kapoulkine
|
86
89
|
John-Mark Allen
|
90
|
+
Carmelo J Fdez-Aguera
|
87
91
|
|
88
92
|
Bug & warning fixes
|
89
93
|
Marc LeBlanc David Woo Guillaume George Martins Mozeiko
|
@@ -99,7 +103,7 @@ RECENT REVISION HISTORY:
|
|
99
103
|
Aldo Culquicondor Philipp Wiesemann Dale Weiler github:sammyhw
|
100
104
|
Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:phprus
|
101
105
|
Julian Raschke Gregory Mullen Baldur Karlsson github:poppolopoppo
|
102
|
-
Christian Floisand Kevin Schmidt
|
106
|
+
Christian Floisand Kevin Schmidt JR Smith github:darealshinji
|
103
107
|
Blazej Dariusz Roszkowski github:Michaelangel007
|
104
108
|
*/
|
105
109
|
|
@@ -161,6 +165,16 @@ RECENT REVISION HISTORY:
|
|
161
165
|
//
|
162
166
|
// ===========================================================================
|
163
167
|
//
|
168
|
+
// UNICODE:
|
169
|
+
//
|
170
|
+
// If compiling for Windows and you wish to use Unicode filenames, compile
|
171
|
+
// with
|
172
|
+
// #define STBI_WINDOWS_UTF8
|
173
|
+
// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert
|
174
|
+
// Windows wchar_t filenames to utf8.
|
175
|
+
//
|
176
|
+
// ===========================================================================
|
177
|
+
//
|
164
178
|
// Philosophy
|
165
179
|
//
|
166
180
|
// stb libraries are designed with the following priorities:
|
@@ -171,12 +185,12 @@ RECENT REVISION HISTORY:
|
|
171
185
|
//
|
172
186
|
// Sometimes I let "good performance" creep up in priority over "easy to maintain",
|
173
187
|
// and for best performance I may provide less-easy-to-use APIs that give higher
|
174
|
-
// performance, in addition to the easy
|
188
|
+
// performance, in addition to the easy-to-use ones. Nevertheless, it's important
|
175
189
|
// to keep in mind that from the standpoint of you, a client of this library,
|
176
190
|
// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all.
|
177
191
|
//
|
178
192
|
// Some secondary priorities arise directly from the first two, some of which
|
179
|
-
//
|
193
|
+
// provide more explicit reasons why performance can't be emphasized.
|
180
194
|
//
|
181
195
|
// - Portable ("ease of use")
|
182
196
|
// - Small source code footprint ("easy to maintain")
|
@@ -219,11 +233,10 @@ RECENT REVISION HISTORY:
|
|
219
233
|
//
|
220
234
|
// HDR image support (disable by defining STBI_NO_HDR)
|
221
235
|
//
|
222
|
-
// stb_image
|
223
|
-
//
|
224
|
-
//
|
225
|
-
//
|
226
|
-
// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
|
236
|
+
// stb_image supports loading HDR images in general, and currently the Radiance
|
237
|
+
// .HDR file format specifically. You can still load any file through the existing
|
238
|
+
// interface; if you attempt to load an HDR file, it will be automatically remapped
|
239
|
+
// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
|
227
240
|
// both of these constants can be reconfigured through this interface:
|
228
241
|
//
|
229
242
|
// stbi_hdr_to_ldr_gamma(2.2f);
|
@@ -257,7 +270,7 @@ RECENT REVISION HISTORY:
|
|
257
270
|
//
|
258
271
|
// By default we convert iphone-formatted PNGs back to RGB, even though
|
259
272
|
// they are internally encoded differently. You can disable this conversion
|
260
|
-
// by
|
273
|
+
// by calling stbi_convert_iphone_png_to_rgb(0), in which case
|
261
274
|
// you will always just get the native iphone "format" through (which
|
262
275
|
// is BGR stored in RGB).
|
263
276
|
//
|
@@ -319,6 +332,7 @@ enum
|
|
319
332
|
STBI_rgb_alpha = 4
|
320
333
|
};
|
321
334
|
|
335
|
+
#include <stdlib.h>
|
322
336
|
typedef unsigned char stbi_uc;
|
323
337
|
typedef unsigned short stbi_us;
|
324
338
|
|
@@ -326,11 +340,13 @@ typedef unsigned short stbi_us;
|
|
326
340
|
extern "C" {
|
327
341
|
#endif
|
328
342
|
|
343
|
+
#ifndef STBIDEF
|
329
344
|
#ifdef STB_IMAGE_STATIC
|
330
345
|
#define STBIDEF static
|
331
346
|
#else
|
332
347
|
#define STBIDEF extern
|
333
348
|
#endif
|
349
|
+
#endif
|
334
350
|
|
335
351
|
//////////////////////////////////////////////////////////////////////////////
|
336
352
|
//
|
@@ -355,10 +371,6 @@ typedef struct
|
|
355
371
|
|
356
372
|
STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels);
|
357
373
|
STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels);
|
358
|
-
#ifndef STBI_NO_GIF
|
359
|
-
STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp);
|
360
|
-
#endif
|
361
|
-
|
362
374
|
|
363
375
|
#ifndef STBI_NO_STDIO
|
364
376
|
STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
|
@@ -366,6 +378,14 @@ STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in
|
|
366
378
|
// for stbi_load_from_file, file pointer is left pointing immediately after image
|
367
379
|
#endif
|
368
380
|
|
381
|
+
#ifndef STBI_NO_GIF
|
382
|
+
STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp);
|
383
|
+
#endif
|
384
|
+
|
385
|
+
#ifdef STBI_WINDOWS_UTF8
|
386
|
+
STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input);
|
387
|
+
#endif
|
388
|
+
|
369
389
|
////////////////////////////////////
|
370
390
|
//
|
371
391
|
// 16-bits-per-channel interface
|
@@ -525,6 +545,12 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const ch
|
|
525
545
|
#define STBI_ASSERT(x) assert(x)
|
526
546
|
#endif
|
527
547
|
|
548
|
+
#ifdef __cplusplus
|
549
|
+
#define STBI_EXTERN extern "C"
|
550
|
+
#else
|
551
|
+
#define STBI_EXTERN extern
|
552
|
+
#endif
|
553
|
+
|
528
554
|
|
529
555
|
#ifndef _MSC_VER
|
530
556
|
#ifdef __cplusplus
|
@@ -649,14 +675,18 @@ static int stbi__cpuid3(void)
|
|
649
675
|
|
650
676
|
#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
|
651
677
|
|
678
|
+
#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
|
652
679
|
static int stbi__sse2_available(void)
|
653
680
|
{
|
654
681
|
int info3 = stbi__cpuid3();
|
655
682
|
return ((info3 >> 26) & 1) != 0;
|
656
683
|
}
|
684
|
+
#endif
|
685
|
+
|
657
686
|
#else // assume GCC-style if not VC++
|
658
687
|
#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
|
659
688
|
|
689
|
+
#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
|
660
690
|
static int stbi__sse2_available(void)
|
661
691
|
{
|
662
692
|
// If we're even attempting to compile this on GCC/Clang, that means
|
@@ -664,6 +694,8 @@ static int stbi__sse2_available(void)
|
|
664
694
|
// instructions at will, and so are we.
|
665
695
|
return 1;
|
666
696
|
}
|
697
|
+
#endif
|
698
|
+
|
667
699
|
#endif
|
668
700
|
#endif
|
669
701
|
|
@@ -1070,6 +1102,7 @@ static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel)
|
|
1070
1102
|
}
|
1071
1103
|
}
|
1072
1104
|
|
1105
|
+
#ifndef STBI_NO_GIF
|
1073
1106
|
static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel)
|
1074
1107
|
{
|
1075
1108
|
int slice;
|
@@ -1081,6 +1114,7 @@ static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int byt
|
|
1081
1114
|
bytes += slice_size;
|
1082
1115
|
}
|
1083
1116
|
}
|
1117
|
+
#endif
|
1084
1118
|
|
1085
1119
|
static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
|
1086
1120
|
{
|
@@ -1131,7 +1165,7 @@ static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x,
|
|
1131
1165
|
return (stbi__uint16 *) result;
|
1132
1166
|
}
|
1133
1167
|
|
1134
|
-
#if !defined(STBI_NO_HDR)
|
1168
|
+
#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR)
|
1135
1169
|
static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp)
|
1136
1170
|
{
|
1137
1171
|
if (stbi__vertically_flip_on_load && result != NULL) {
|
@@ -1143,10 +1177,38 @@ static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, in
|
|
1143
1177
|
|
1144
1178
|
#ifndef STBI_NO_STDIO
|
1145
1179
|
|
1180
|
+
#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
|
1181
|
+
STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide);
|
1182
|
+
STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default);
|
1183
|
+
#endif
|
1184
|
+
|
1185
|
+
#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
|
1186
|
+
STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input)
|
1187
|
+
{
|
1188
|
+
return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL);
|
1189
|
+
}
|
1190
|
+
#endif
|
1191
|
+
|
1146
1192
|
static FILE *stbi__fopen(char const *filename, char const *mode)
|
1147
1193
|
{
|
1148
1194
|
FILE *f;
|
1149
|
-
#if defined(_MSC_VER) &&
|
1195
|
+
#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
|
1196
|
+
wchar_t wMode[64];
|
1197
|
+
wchar_t wFilename[1024];
|
1198
|
+
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)))
|
1199
|
+
return 0;
|
1200
|
+
|
1201
|
+
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)))
|
1202
|
+
return 0;
|
1203
|
+
|
1204
|
+
#if _MSC_VER >= 1400
|
1205
|
+
if (0 != _wfopen_s(&f, wFilename, wMode))
|
1206
|
+
f = 0;
|
1207
|
+
#else
|
1208
|
+
f = _wfopen(wFilename, wMode);
|
1209
|
+
#endif
|
1210
|
+
|
1211
|
+
#elif defined(_MSC_VER) && _MSC_VER >= 1400
|
1150
1212
|
if (0 != fopen_s(&f, filename, mode))
|
1151
1213
|
f=0;
|
1152
1214
|
#else
|
@@ -1539,18 +1601,18 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r
|
|
1539
1601
|
// convert source image with img_n components to one with req_comp components;
|
1540
1602
|
// avoid switch per pixel, so use switch per scanline and massive macros
|
1541
1603
|
switch (STBI__COMBO(img_n, req_comp)) {
|
1542
|
-
STBI__CASE(1,2) { dest[0]=src[0]
|
1604
|
+
STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break;
|
1543
1605
|
STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
|
1544
|
-
STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]
|
1606
|
+
STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break;
|
1545
1607
|
STBI__CASE(2,1) { dest[0]=src[0]; } break;
|
1546
1608
|
STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
|
1547
|
-
STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]
|
1548
|
-
STBI__CASE(3,4) { dest[0]=src[0]
|
1609
|
+
STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break;
|
1610
|
+
STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break;
|
1549
1611
|
STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break;
|
1550
|
-
STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2])
|
1612
|
+
STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break;
|
1551
1613
|
STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break;
|
1552
|
-
STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2])
|
1553
|
-
STBI__CASE(4,3) { dest[0]=src[0]
|
1614
|
+
STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break;
|
1615
|
+
STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break;
|
1554
1616
|
default: STBI_ASSERT(0);
|
1555
1617
|
}
|
1556
1618
|
#undef STBI__CASE
|
@@ -1588,18 +1650,18 @@ static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int r
|
|
1588
1650
|
// convert source image with img_n components to one with req_comp components;
|
1589
1651
|
// avoid switch per pixel, so use switch per scanline and massive macros
|
1590
1652
|
switch (STBI__COMBO(img_n, req_comp)) {
|
1591
|
-
STBI__CASE(1,2) { dest[0]=src[0]
|
1653
|
+
STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break;
|
1592
1654
|
STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
|
1593
|
-
STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]
|
1655
|
+
STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break;
|
1594
1656
|
STBI__CASE(2,1) { dest[0]=src[0]; } break;
|
1595
1657
|
STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
|
1596
|
-
STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]
|
1597
|
-
STBI__CASE(3,4) { dest[0]=src[0]
|
1658
|
+
STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break;
|
1659
|
+
STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break;
|
1598
1660
|
STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break;
|
1599
|
-
STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2])
|
1661
|
+
STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break;
|
1600
1662
|
STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break;
|
1601
|
-
STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2])
|
1602
|
-
STBI__CASE(4,3) { dest[0]=src[0]
|
1663
|
+
STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break;
|
1664
|
+
STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break;
|
1603
1665
|
default: STBI_ASSERT(0);
|
1604
1666
|
}
|
1605
1667
|
#undef STBI__CASE
|
@@ -1623,7 +1685,11 @@ static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
|
|
1623
1685
|
for (k=0; k < n; ++k) {
|
1624
1686
|
output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
|
1625
1687
|
}
|
1626
|
-
|
1688
|
+
}
|
1689
|
+
if (n < comp) {
|
1690
|
+
for (i=0; i < x*y; ++i) {
|
1691
|
+
output[i*comp + n] = data[i*comp + n]/255.0f;
|
1692
|
+
}
|
1627
1693
|
}
|
1628
1694
|
STBI_FREE(data);
|
1629
1695
|
return output;
|
@@ -3596,7 +3662,7 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp
|
|
3596
3662
|
int k;
|
3597
3663
|
unsigned int i,j;
|
3598
3664
|
stbi_uc *output;
|
3599
|
-
stbi_uc *coutput[4];
|
3665
|
+
stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL };
|
3600
3666
|
|
3601
3667
|
stbi__resample res_comp[4];
|
3602
3668
|
|
@@ -3717,7 +3783,7 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp
|
|
3717
3783
|
if (n == 1)
|
3718
3784
|
for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
|
3719
3785
|
else
|
3720
|
-
for (i=0; i < z->s->img_x; ++i) *out++ = y[i]
|
3786
|
+
for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; }
|
3721
3787
|
}
|
3722
3788
|
}
|
3723
3789
|
}
|
@@ -4731,7 +4797,7 @@ static void stbi__de_iphone(stbi__png *z)
|
|
4731
4797
|
static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
|
4732
4798
|
{
|
4733
4799
|
stbi_uc palette[1024], pal_img_n=0;
|
4734
|
-
stbi_uc has_trans=0, tc[3];
|
4800
|
+
stbi_uc has_trans=0, tc[3]={0};
|
4735
4801
|
stbi__uint16 tc16[3];
|
4736
4802
|
stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
|
4737
4803
|
int first=1,k,interlace=0, color=0, is_iphone=0;
|
@@ -5009,11 +5075,11 @@ static int stbi__high_bit(unsigned int z)
|
|
5009
5075
|
{
|
5010
5076
|
int n=0;
|
5011
5077
|
if (z == 0) return -1;
|
5012
|
-
if (z >= 0x10000) n += 16
|
5013
|
-
if (z >= 0x00100) n += 8
|
5014
|
-
if (z >= 0x00010) n += 4
|
5015
|
-
if (z >= 0x00004) n += 2
|
5016
|
-
if (z >= 0x00002) n += 1
|
5078
|
+
if (z >= 0x10000) { n += 16; z >>= 16; }
|
5079
|
+
if (z >= 0x00100) { n += 8; z >>= 8; }
|
5080
|
+
if (z >= 0x00010) { n += 4; z >>= 4; }
|
5081
|
+
if (z >= 0x00004) { n += 2; z >>= 2; }
|
5082
|
+
if (z >= 0x00002) { n += 1; z >>= 1; }
|
5017
5083
|
return n;
|
5018
5084
|
}
|
5019
5085
|
|
@@ -5030,7 +5096,7 @@ static int stbi__bitcount(unsigned int a)
|
|
5030
5096
|
// extract an arbitrarily-aligned N-bit value (N=bits)
|
5031
5097
|
// from v, and then make it 8-bits long and fractionally
|
5032
5098
|
// extend it to full full range.
|
5033
|
-
static int stbi__shiftsigned(int v, int shift, int bits)
|
5099
|
+
static int stbi__shiftsigned(unsigned int v, int shift, int bits)
|
5034
5100
|
{
|
5035
5101
|
static unsigned int mul_table[9] = {
|
5036
5102
|
0,
|
@@ -5207,6 +5273,8 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req
|
|
5207
5273
|
out[z++] = pal[color][0];
|
5208
5274
|
out[z++] = pal[color][1];
|
5209
5275
|
out[z++] = pal[color][2];
|
5276
|
+
if (target == 4) out[z++] = 255;
|
5277
|
+
if (i+1 == (int) s->img_x) break;
|
5210
5278
|
if((--bit_offset) < 0) {
|
5211
5279
|
bit_offset = 7;
|
5212
5280
|
v = stbi__get8(s);
|
@@ -5299,7 +5367,7 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req
|
|
5299
5367
|
stbi_uc *p1 = out + j *s->img_x*target;
|
5300
5368
|
stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
|
5301
5369
|
for (i=0; i < (int) s->img_x*target; ++i) {
|
5302
|
-
t = p1[i]
|
5370
|
+
t = p1[i]; p1[i] = p2[i]; p2[i] = t;
|
5303
5371
|
}
|
5304
5372
|
}
|
5305
5373
|
}
|
@@ -5789,7 +5857,7 @@ static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req
|
|
5789
5857
|
// Else if n is 128, noop.
|
5790
5858
|
// Endloop
|
5791
5859
|
|
5792
|
-
// The RLE-compressed data is
|
5860
|
+
// The RLE-compressed data is preceded by a 2-byte data count for each row in the data,
|
5793
5861
|
// which we're going to just skip.
|
5794
5862
|
stbi__skip(s, h * channelCount * 2 );
|
5795
5863
|
|
@@ -6342,22 +6410,27 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
|
|
6342
6410
|
int first_frame;
|
6343
6411
|
int pi;
|
6344
6412
|
int pcount;
|
6413
|
+
STBI_NOTUSED(req_comp);
|
6345
6414
|
|
6346
6415
|
// on first frame, any non-written pixels get the background colour (non-transparent)
|
6347
6416
|
first_frame = 0;
|
6348
6417
|
if (g->out == 0) {
|
6349
|
-
if (!stbi__gif_header(s, g, comp,0))
|
6350
|
-
|
6351
|
-
|
6352
|
-
|
6353
|
-
|
6354
|
-
|
6355
|
-
|
6418
|
+
if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header
|
6419
|
+
if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
|
6420
|
+
return stbi__errpuc("too large", "GIF image is too large");
|
6421
|
+
pcount = g->w * g->h;
|
6422
|
+
g->out = (stbi_uc *) stbi__malloc(4 * pcount);
|
6423
|
+
g->background = (stbi_uc *) stbi__malloc(4 * pcount);
|
6424
|
+
g->history = (stbi_uc *) stbi__malloc(pcount);
|
6425
|
+
if (!g->out || !g->background || !g->history)
|
6426
|
+
return stbi__errpuc("outofmem", "Out of memory");
|
6427
|
+
|
6428
|
+
// image is treated as "transparent" at the start - ie, nothing overwrites the current background;
|
6356
6429
|
// background colour is only used for pixels that are not rendered first frame, after that "background"
|
6357
|
-
// color refers to
|
6358
|
-
memset(
|
6359
|
-
memset(
|
6360
|
-
memset(
|
6430
|
+
// color refers to the color that was there the previous frame.
|
6431
|
+
memset(g->out, 0x00, 4 * pcount);
|
6432
|
+
memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent)
|
6433
|
+
memset(g->history, 0x00, pcount); // pixels that were affected previous frame
|
6361
6434
|
first_frame = 1;
|
6362
6435
|
} else {
|
6363
6436
|
// second frame - how do we dispoase of the previous one?
|
@@ -6418,6 +6491,13 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
|
|
6418
6491
|
g->cur_x = g->start_x;
|
6419
6492
|
g->cur_y = g->start_y;
|
6420
6493
|
|
6494
|
+
// if the width of the specified rectangle is 0, that means
|
6495
|
+
// we may not see *any* pixels or the image is malformed;
|
6496
|
+
// to make sure this is caught, move the current y down to
|
6497
|
+
// max_y (which is what out_gif_code checks).
|
6498
|
+
if (w == 0)
|
6499
|
+
g->cur_y = g->max_y;
|
6500
|
+
|
6421
6501
|
g->lflags = stbi__get8(s);
|
6422
6502
|
|
6423
6503
|
if (g->lflags & 0x40) {
|
@@ -6437,7 +6517,7 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
|
|
6437
6517
|
return stbi__errpuc("missing color table", "Corrupt GIF");
|
6438
6518
|
|
6439
6519
|
o = stbi__process_gif_raster(s, g);
|
6440
|
-
if (o
|
6520
|
+
if (!o) return NULL;
|
6441
6521
|
|
6442
6522
|
// if this was the first frame,
|
6443
6523
|
pcount = g->w * g->h;
|
@@ -6565,6 +6645,7 @@ static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req
|
|
6565
6645
|
stbi_uc *u = 0;
|
6566
6646
|
stbi__gif g;
|
6567
6647
|
memset(&g, 0, sizeof(g));
|
6648
|
+
STBI_NOTUSED(ri);
|
6568
6649
|
|
6569
6650
|
u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
|
6570
6651
|
if (u == (stbi_uc *) s) u = 0; // end of animated gif marker
|
@@ -6576,6 +6657,9 @@ static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req
|
|
6576
6657
|
// can be done for multiple frames.
|
6577
6658
|
if (req_comp && req_comp != 4)
|
6578
6659
|
u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
|
6660
|
+
} else if (g.out) {
|
6661
|
+
// if there was an error and we allocated an image buffer, free it!
|
6662
|
+
STBI_FREE(g.out);
|
6579
6663
|
}
|
6580
6664
|
|
6581
6665
|
// free buffers needed for multiple frame loading;
|
@@ -7238,6 +7322,7 @@ STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user
|
|
7238
7322
|
|
7239
7323
|
/*
|
7240
7324
|
revision history:
|
7325
|
+
2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
|
7241
7326
|
2.19 (2018-02-11) fix warning
|
7242
7327
|
2.18 (2018-01-30) fix warnings
|
7243
7328
|
2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug
|
@@ -1,4 +1,4 @@
|
|
1
|
-
/* stb_image_write - v1.
|
1
|
+
/* stb_image_write - v1.13 - public domain - http://nothings.org/stb/stb_image_write.h
|
2
2
|
writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015
|
3
3
|
no warranty implied; use at your own risk
|
4
4
|
|
@@ -17,8 +17,7 @@
|
|
17
17
|
|
18
18
|
ABOUT:
|
19
19
|
|
20
|
-
This header file is a library for writing images to C stdio
|
21
|
-
adapted to write to memory or a general streaming interface; let me know.
|
20
|
+
This header file is a library for writing images to C stdio or a callback.
|
22
21
|
|
23
22
|
The PNG output is not optimal; it is 20-50% larger than the file
|
24
23
|
written by a decent optimizing implementation; though providing a custom
|
@@ -38,6 +37,14 @@ BUILDING:
|
|
38
37
|
The returned data will be freed with STBIW_FREE() (free() by default),
|
39
38
|
so it must be heap allocated with STBIW_MALLOC() (malloc() by default),
|
40
39
|
|
40
|
+
UNICODE:
|
41
|
+
|
42
|
+
If compiling for Windows and you wish to use Unicode filenames, compile
|
43
|
+
with
|
44
|
+
#define STBIW_WINDOWS_UTF8
|
45
|
+
and pass utf8-encoded filenames. Call stbiw_convert_wchar_to_utf8 to convert
|
46
|
+
Windows wchar_t filenames to utf8.
|
47
|
+
|
41
48
|
USAGE:
|
42
49
|
|
43
50
|
There are five functions, one for each image file format:
|
@@ -148,6 +155,8 @@ LICENSE
|
|
148
155
|
#ifndef INCLUDE_STB_IMAGE_WRITE_H
|
149
156
|
#define INCLUDE_STB_IMAGE_WRITE_H
|
150
157
|
|
158
|
+
#include <stdlib.h>
|
159
|
+
|
151
160
|
// if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline'
|
152
161
|
#ifndef STBIWDEF
|
153
162
|
#ifdef STB_IMAGE_WRITE_STATIC
|
@@ -173,6 +182,10 @@ STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const
|
|
173
182
|
STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data);
|
174
183
|
STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data);
|
175
184
|
STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality);
|
185
|
+
|
186
|
+
#ifdef STBI_WINDOWS_UTF8
|
187
|
+
STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input);
|
188
|
+
#endif
|
176
189
|
#endif
|
177
190
|
|
178
191
|
typedef void stbi_write_func(void *context, void *data, int size);
|
@@ -275,15 +288,52 @@ static void stbi__stdio_write(void *context, void *data, int size)
|
|
275
288
|
fwrite(data,1,size,(FILE*) context);
|
276
289
|
}
|
277
290
|
|
278
|
-
|
291
|
+
#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
|
292
|
+
#ifdef __cplusplus
|
293
|
+
#define STBIW_EXTERN extern "C"
|
294
|
+
#else
|
295
|
+
#define STBIW_EXTERN extern
|
296
|
+
#endif
|
297
|
+
STBIW_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide);
|
298
|
+
STBIW_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default);
|
299
|
+
|
300
|
+
STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input)
|
301
|
+
{
|
302
|
+
return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL);
|
303
|
+
}
|
304
|
+
#endif
|
305
|
+
|
306
|
+
static FILE *stbiw__fopen(char const *filename, char const *mode)
|
279
307
|
{
|
280
308
|
FILE *f;
|
281
|
-
#
|
282
|
-
|
283
|
-
|
309
|
+
#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
|
310
|
+
wchar_t wMode[64];
|
311
|
+
wchar_t wFilename[1024];
|
312
|
+
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)))
|
313
|
+
return 0;
|
314
|
+
|
315
|
+
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)))
|
316
|
+
return 0;
|
317
|
+
|
318
|
+
#if _MSC_VER >= 1400
|
319
|
+
if (0 != _wfopen_s(&f, wFilename, wMode))
|
320
|
+
f = 0;
|
321
|
+
#else
|
322
|
+
f = _wfopen(wFilename, wMode);
|
323
|
+
#endif
|
324
|
+
|
325
|
+
#elif defined(_MSC_VER) && _MSC_VER >= 1400
|
326
|
+
if (0 != fopen_s(&f, filename, mode))
|
327
|
+
f=0;
|
284
328
|
#else
|
285
|
-
f = fopen(filename,
|
329
|
+
f = fopen(filename, mode);
|
286
330
|
#endif
|
331
|
+
return f;
|
332
|
+
}
|
333
|
+
|
334
|
+
static int stbi__start_write_file(stbi__write_context *s, const char *filename)
|
335
|
+
{
|
336
|
+
FILE *f = stbiw__fopen(filename, "wb");
|
287
337
|
stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f);
|
288
338
|
return f != NULL;
|
289
339
|
}
|
@@ -343,7 +393,7 @@ static void stbiw__putc(stbi__write_context *s, unsigned char c)
|
|
343
393
|
static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c)
|
344
394
|
{
|
345
395
|
unsigned char arr[3];
|
346
|
-
arr[0] = a
|
396
|
+
arr[0] = a; arr[1] = b; arr[2] = c;
|
347
397
|
s->func(s->context, arr, 3);
|
348
398
|
}
|
349
399
|
|
@@ -391,10 +441,11 @@ static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, i
|
|
391
441
|
if (stbi__flip_vertically_on_write)
|
392
442
|
vdir *= -1;
|
393
443
|
|
394
|
-
if (vdir < 0)
|
395
|
-
j_end = -1
|
396
|
-
else
|
397
|
-
j_end = y
|
444
|
+
if (vdir < 0) {
|
445
|
+
j_end = -1; j = y-1;
|
446
|
+
} else {
|
447
|
+
j_end = y; j = 0;
|
448
|
+
}
|
398
449
|
|
399
450
|
for (; j != j_end; j += vdir) {
|
400
451
|
for (i=0; i < x; ++i) {
|
@@ -552,7 +603,7 @@ STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const
|
|
552
603
|
|
553
604
|
#define stbiw__max(a, b) ((a) > (b) ? (a) : (b))
|
554
605
|
|
555
|
-
void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear)
|
606
|
+
static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear)
|
556
607
|
{
|
557
608
|
int exponent;
|
558
609
|
float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2]));
|
@@ -569,7 +620,7 @@ void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear)
|
|
569
620
|
}
|
570
621
|
}
|
571
622
|
|
572
|
-
void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte)
|
623
|
+
static void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte)
|
573
624
|
{
|
574
625
|
unsigned char lengthbyte = STBIW_UCHAR(length+128);
|
575
626
|
STBIW_ASSERT(length+128 <= 255);
|
@@ -577,7 +628,7 @@ void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char dat
|
|
577
628
|
s->func(s->context, &databyte, 1);
|
578
629
|
}
|
579
630
|
|
580
|
-
void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data)
|
631
|
+
static void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data)
|
581
632
|
{
|
582
633
|
unsigned char lengthbyte = STBIW_UCHAR(length);
|
583
634
|
STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code
|
@@ -585,7 +636,7 @@ void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *d
|
|
585
636
|
s->func(s->context, data, length);
|
586
637
|
}
|
587
638
|
|
588
|
-
void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline)
|
639
|
+
static void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline)
|
589
640
|
{
|
590
641
|
unsigned char scanlineheader[4] = { 2, 2, 0, 0 };
|
591
642
|
unsigned char rgbe[4];
|
@@ -686,15 +737,15 @@ static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, f
|
|
686
737
|
char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n";
|
687
738
|
s->func(s->context, header, sizeof(header)-1);
|
688
739
|
|
689
|
-
#ifdef
|
690
|
-
len = sprintf_s(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x);
|
740
|
+
#ifdef __STDC_WANT_SECURE_LIB__
|
741
|
+
len = sprintf_s(buffer, sizeof(buffer), "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x);
|
691
742
|
#else
|
692
743
|
len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x);
|
693
744
|
#endif
|
694
745
|
s->func(s->context, buffer, len);
|
695
746
|
|
696
747
|
for(i=0; i < y; i++)
|
697
|
-
stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i)
|
748
|
+
stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i));
|
698
749
|
STBIW_FREE(scratch);
|
699
750
|
return 1;
|
700
751
|
}
|
@@ -809,7 +860,7 @@ static unsigned int stbiw__zhash(unsigned char *data)
|
|
809
860
|
|
810
861
|
#endif // STBIW_ZLIB_COMPRESS
|
811
862
|
|
812
|
-
unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality)
|
863
|
+
STBIWDEF unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality)
|
813
864
|
{
|
814
865
|
#ifdef STBIW_ZLIB_COMPRESS
|
815
866
|
// user provided a zlib compress implementation, use that
|
@@ -845,7 +896,7 @@ unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_l
|
|
845
896
|
for (j=0; j < n; ++j) {
|
846
897
|
if (hlist[j]-data > i-32768) { // if entry lies within window
|
847
898
|
int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i);
|
848
|
-
if (d >= best) best=d
|
899
|
+
if (d >= best) { best=d; bestloc=hlist[j]; }
|
849
900
|
}
|
850
901
|
}
|
851
902
|
// when hash table entry is too long, delete half the entries
|
@@ -904,8 +955,8 @@ unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_l
|
|
904
955
|
int blocklen = (int) (data_len % 5552);
|
905
956
|
j=0;
|
906
957
|
while (j < data_len) {
|
907
|
-
for (i=0; i < blocklen; ++i) s1 += data[j+i]
|
908
|
-
s1 %= 65521
|
958
|
+
for (i=0; i < blocklen; ++i) { s1 += data[j+i]; s2 += s1; }
|
959
|
+
s1 %= 65521; s2 %= 65521;
|
909
960
|
j += blocklen;
|
910
961
|
blocklen = 5552;
|
911
962
|
}
|
@@ -923,6 +974,9 @@ unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_l
|
|
923
974
|
|
924
975
|
static unsigned int stbiw__crc32(unsigned char *buffer, int len)
|
925
976
|
{
|
977
|
+
#ifdef STBIW_CRC32
|
978
|
+
return STBIW_CRC32(buffer, len);
|
979
|
+
#else
|
926
980
|
static unsigned int crc_table[256] =
|
927
981
|
{
|
928
982
|
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
|
@@ -964,6 +1018,7 @@ static unsigned int stbiw__crc32(unsigned char *buffer, int len)
|
|
964
1018
|
for (i=0; i < len; ++i)
|
965
1019
|
crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)];
|
966
1020
|
return ~crc;
|
1021
|
+
#endif
|
967
1022
|
}
|
968
1023
|
|
969
1024
|
#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4)
|
@@ -994,9 +1049,15 @@ static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int
|
|
994
1049
|
int type = mymap[filter_type];
|
995
1050
|
unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y);
|
996
1051
|
int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes;
|
1052
|
+
|
1053
|
+
if (type==0) {
|
1054
|
+
memcpy(line_buffer, z, width*n);
|
1055
|
+
return;
|
1056
|
+
}
|
1057
|
+
|
1058
|
+
// first loop isn't optimized since it's just one pixel
|
997
1059
|
for (i = 0; i < n; ++i) {
|
998
1060
|
switch (type) {
|
999
|
-
case 0: line_buffer[i] = z[i]; break;
|
1000
1061
|
case 1: line_buffer[i] = z[i]; break;
|
1001
1062
|
case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break;
|
1002
1063
|
case 3: line_buffer[i] = z[i] - (z[i-signed_stride]>>1); break;
|
@@ -1005,20 +1066,17 @@ static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int
|
|
1005
1066
|
case 6: line_buffer[i] = z[i]; break;
|
1006
1067
|
}
|
1007
1068
|
}
|
1008
|
-
|
1009
|
-
|
1010
|
-
|
1011
|
-
|
1012
|
-
|
1013
|
-
|
1014
|
-
|
1015
|
-
case 5: line_buffer[i] = z[i] - (z[i-n]>>1); break;
|
1016
|
-
case 6: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break;
|
1017
|
-
}
|
1069
|
+
switch (type) {
|
1070
|
+
case 1: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-n]; break;
|
1071
|
+
case 2: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-signed_stride]; break;
|
1072
|
+
case 3: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break;
|
1073
|
+
case 4: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-signed_stride], z[i-signed_stride-n]); break;
|
1074
|
+
case 5: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - (z[i-n]>>1); break;
|
1075
|
+
case 6: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break;
|
1018
1076
|
}
|
1019
1077
|
}
|
1020
1078
|
|
1021
|
-
unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len)
|
1079
|
+
STBIWDEF unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len)
|
1022
1080
|
{
|
1023
1081
|
int force_filter = stbi_write_force_png_filter;
|
1024
1082
|
int ctype[5] = { -1, 0, 4, 2, 6 };
|
@@ -1040,11 +1098,11 @@ unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, in
|
|
1040
1098
|
int filter_type;
|
1041
1099
|
if (force_filter > -1) {
|
1042
1100
|
filter_type = force_filter;
|
1043
|
-
stbiw__encode_png_line(pixels, stride_bytes, x, y, j, n, force_filter, line_buffer);
|
1101
|
+
stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, force_filter, line_buffer);
|
1044
1102
|
} else { // Estimate the best filter by running through all of them:
|
1045
1103
|
int best_filter = 0, best_filter_val = 0x7fffffff, est, i;
|
1046
1104
|
for (filter_type = 0; filter_type < 5; filter_type++) {
|
1047
|
-
stbiw__encode_png_line(pixels, stride_bytes, x, y, j, n, filter_type, line_buffer);
|
1105
|
+
stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, filter_type, line_buffer);
|
1048
1106
|
|
1049
1107
|
// Estimate the entropy of the line using this filter; the less, the better.
|
1050
1108
|
est = 0;
|
@@ -1057,7 +1115,7 @@ unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, in
|
|
1057
1115
|
}
|
1058
1116
|
}
|
1059
1117
|
if (filter_type != best_filter) { // If the last iteration already got us the best filter, don't redo it
|
1060
|
-
stbiw__encode_png_line(pixels, stride_bytes, x, y, j, n, best_filter, line_buffer);
|
1118
|
+
stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, best_filter, line_buffer);
|
1061
1119
|
filter_type = best_filter;
|
1062
1120
|
}
|
1063
1121
|
}
|
@@ -1109,14 +1167,10 @@ STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const
|
|
1109
1167
|
{
|
1110
1168
|
FILE *f;
|
1111
1169
|
int len;
|
1112
|
-
unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len);
|
1170
|
+
unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len);
|
1113
1171
|
if (png == NULL) return 0;
|
1114
|
-
|
1115
|
-
|
1116
|
-
f = NULL;
|
1117
|
-
#else
|
1118
|
-
f = fopen(filename, "wb");
|
1119
|
-
#endif
|
1172
|
+
|
1173
|
+
f = stbiw__fopen(filename, "wb");
|
1120
1174
|
if (!f) { STBIW_FREE(png); return 0; }
|
1121
1175
|
fwrite(png, 1, len, f);
|
1122
1176
|
fclose(f);
|
@@ -1128,7 +1182,7 @@ STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const
|
|
1128
1182
|
STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes)
|
1129
1183
|
{
|
1130
1184
|
int len;
|
1131
|
-
unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len);
|
1185
|
+
unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len);
|
1132
1186
|
if (png == NULL) return 0;
|
1133
1187
|
func(context, png, len);
|
1134
1188
|
STBIW_FREE(png);
|
@@ -1423,15 +1477,13 @@ static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, in
|
|
1423
1477
|
for(x = 0; x < width; x += 8) {
|
1424
1478
|
float YDU[64], UDU[64], VDU[64];
|
1425
1479
|
for(row = y, pos = 0; row < y+8; ++row) {
|
1480
|
+
// row >= height => use last input row
|
1481
|
+
int clamped_row = (row < height) ? row : height - 1;
|
1482
|
+
int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp;
|
1426
1483
|
for(col = x; col < x+8; ++col, ++pos) {
|
1427
|
-
int p = (stbi__flip_vertically_on_write ? height-1-row : row)*width*comp + col*comp;
|
1428
1484
|
float r, g, b;
|
1429
|
-
if
|
1430
|
-
|
1431
|
-
}
|
1432
|
-
if(col >= width) {
|
1433
|
-
p -= comp*(col+1 - width);
|
1434
|
-
}
|
1485
|
+
// if col >= width => use pixel from last input column
|
1486
|
+
int p = base_p + ((col < width) ? col : (width-1))*comp;
|
1435
1487
|
|
1436
1488
|
r = imageData[p+0];
|
1437
1489
|
g = imageData[p+ofsG];
|
@@ -1483,6 +1535,8 @@ STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const
|
|
1483
1535
|
#endif // STB_IMAGE_WRITE_IMPLEMENTATION
|
1484
1536
|
|
1485
1537
|
/* Revision history
|
1538
|
+
1.10 (2019-02-07)
|
1539
|
+
support utf8 filenames in Windows; fix warnings and platform ifdefs
|
1486
1540
|
1.09 (2018-02-11)
|
1487
1541
|
fix typo in zlib quality API, improve STB_I_W_STATIC in C++
|
1488
1542
|
1.08 (2018-01-29)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-dnn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- unagiootoro
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: numo-narray
|
@@ -85,8 +85,8 @@ email:
|
|
85
85
|
- ootoro838861@outlook.jp
|
86
86
|
executables: []
|
87
87
|
extensions:
|
88
|
-
-
|
89
|
-
-
|
88
|
+
- ext/cifar10_loader/extconf.rb
|
89
|
+
- ext/rb_stb_image/extconf.rb
|
90
90
|
extra_rdoc_files: []
|
91
91
|
files:
|
92
92
|
- ".gitignore"
|
@@ -105,6 +105,10 @@ files:
|
|
105
105
|
- examples/mnist_example.rb
|
106
106
|
- examples/mnist_lstm_example.rb
|
107
107
|
- examples/xor_example.rb
|
108
|
+
- ext/cifar10_loader/cifar10_loader.c
|
109
|
+
- ext/cifar10_loader/extconf.rb
|
110
|
+
- ext/rb_stb_image/extconf.rb
|
111
|
+
- ext/rb_stb_image/rb_stb_image.c
|
108
112
|
- lib/dnn.rb
|
109
113
|
- lib/dnn/core/activations.rb
|
110
114
|
- lib/dnn/core/cnn_layers.rb
|
@@ -116,18 +120,14 @@ files:
|
|
116
120
|
- lib/dnn/core/param.rb
|
117
121
|
- lib/dnn/core/rnn_layers.rb
|
118
122
|
- lib/dnn/core/util.rb
|
119
|
-
- lib/dnn/ext/cifar10_loader/cifar10_loader.c
|
120
|
-
- lib/dnn/ext/cifar10_loader/extconf.rb
|
121
|
-
- lib/dnn/ext/rb_stb_image/extconf.rb
|
122
|
-
- lib/dnn/ext/rb_stb_image/rb_stb_image.c
|
123
|
-
- lib/dnn/ext/rb_stb_image/stb_image.h
|
124
|
-
- lib/dnn/ext/rb_stb_image/stb_image_write.h
|
125
123
|
- lib/dnn/lib/cifar10.rb
|
126
124
|
- lib/dnn/lib/downloader.rb
|
127
125
|
- lib/dnn/lib/image.rb
|
128
126
|
- lib/dnn/lib/mnist.rb
|
129
127
|
- lib/dnn/version.rb
|
130
128
|
- ruby-dnn.gemspec
|
129
|
+
- third_party/stb_image.h
|
130
|
+
- third_party/stb_image_write.h
|
131
131
|
homepage: https://github.com/unagiootoro/ruby-dnn.git
|
132
132
|
licenses:
|
133
133
|
- MIT
|