gosu 0.13.2 → 0.13.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/COPYING +1 -1
- data/Gosu/Version.hpp +1 -1
- data/README.md +3 -3
- data/src/RubyGosu.cxx +1 -1
- data/src/stb_image.h +434 -165
- data/src/stb_image_write.h +172 -71
- data/src/stb_vorbis.c +22 -8
- metadata +2 -4
- data/src/stb_truetype.h +0 -4566
- data/src/utf8proc.h +0 -699
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 11cad0cf3c250ded2f28767de4b16a3813fe9344ab7ae4fced8fc175c84f1a45
|
4
|
+
data.tar.gz: 1ed49eebd7f989d77af063d9ba72a39623f61ce2ef0ad650c670cbe41ebe2c77
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70dc3a30a7bda5cb80f3ec61f51869ee764e18a96f0403ce592b10b8c66124b7d190ca5585c8fa8ad530adafe723d901775c0e45995d18b5f91f431b213fc43a
|
7
|
+
data.tar.gz: 04c99a303c628114457eba9b4f3f770a3ca9278862b86ea15bd3f0fa30dad3cd3155f054ee98e95d2c844efd2869b0ef29bda63553061ca167caa10631723947
|
data/COPYING
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (C) 2001-
|
1
|
+
Copyright (C) 2001-2018 Julian Raschke, Jan Lücker and all contributors.
|
2
2
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining a
|
4
4
|
copy of this software and associated documentation files (the "Software"),
|
data/Gosu/Version.hpp
CHANGED
data/README.md
CHANGED
@@ -19,9 +19,9 @@ Community
|
|
19
19
|
---------
|
20
20
|
|
21
21
|
- Visit our [message board](https://www.libgosu.org/cgi-bin/mwf/forum.pl) or the [r/gosu subreddit](https://reddit.com/r/gosu).
|
22
|
-
- There’s also an IRC room, [#gosu on freenode](https://webchat.freenode.net/?channels=gosu).
|
23
|
-
|
24
|
-
-
|
22
|
+
- There’s also an IRC room, [#gosu on freenode](https://webchat.freenode.net/?channels=gosu).
|
23
|
+
The regulars are spread across many timezones, so you’ll need some patience.
|
24
|
+
- Please file bugs and request features [on GitHub](https://github.com/gosu/gosu/issues).
|
25
25
|
|
26
26
|
Build Status
|
27
27
|
------------
|
data/src/RubyGosu.cxx
CHANGED
@@ -11656,7 +11656,7 @@ SWIGEXPORT void Init_gosu(void) {
|
|
11656
11656
|
rb_define_const(mGosu, "LICENSES", SWIG_From_std_string(static_cast< std::string >(Gosu::LICENSES)));
|
11657
11657
|
rb_define_const(mGosu, "MAJOR_VERSION", SWIG_From_int(static_cast< int >(0)));
|
11658
11658
|
rb_define_const(mGosu, "MINOR_VERSION", SWIG_From_int(static_cast< int >(13)));
|
11659
|
-
rb_define_const(mGosu, "POINT_VERSION", SWIG_From_int(static_cast< int >(
|
11659
|
+
rb_define_const(mGosu, "POINT_VERSION", SWIG_From_int(static_cast< int >(3)));
|
11660
11660
|
rb_define_module_function(mGosu, "milliseconds", VALUEFUNC(_wrap_milliseconds), -1);
|
11661
11661
|
rb_define_module_function(mGosu, "random", VALUEFUNC(_wrap_random), -1);
|
11662
11662
|
rb_define_module_function(mGosu, "degrees_to_radians", VALUEFUNC(_wrap_degrees_to_radians), -1);
|
data/src/stb_image.h
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
/* stb_image - v2.
|
2
|
-
|
1
|
+
/* stb_image - v2.18 - public domain image loader - http://nothings.org/stb
|
2
|
+
no warranty implied; use at your own risk
|
3
3
|
|
4
4
|
Do this:
|
5
5
|
#define STB_IMAGE_IMPLEMENTATION
|
@@ -48,6 +48,8 @@ LICENSE
|
|
48
48
|
|
49
49
|
RECENT REVISION HISTORY:
|
50
50
|
|
51
|
+
2.18 (2018-01-30) fix warnings
|
52
|
+
2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings
|
51
53
|
2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes
|
52
54
|
2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC
|
53
55
|
2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs
|
@@ -74,11 +76,11 @@ RECENT REVISION HISTORY:
|
|
74
76
|
Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip)
|
75
77
|
Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD)
|
76
78
|
github:urraka (animated gif) Junggon Kim (PNM comments)
|
77
|
-
|
79
|
+
Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA)
|
78
80
|
socks-the-fox (16-bit PNG)
|
79
81
|
Jeremy Sawicki (handle all ImageNet JPGs)
|
80
|
-
Optimizations & bugfixes
|
81
|
-
Fabian "ryg" Giesen
|
82
|
+
Optimizations & bugfixes Mikhail Morozov (1-bit BMP)
|
83
|
+
Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query)
|
82
84
|
Arseny Kapoulkine
|
83
85
|
John-Mark Allen
|
84
86
|
|
@@ -87,16 +89,17 @@ RECENT REVISION HISTORY:
|
|
87
89
|
Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan
|
88
90
|
Dave Moore Roy Eltham Hayaki Saito Nathan Reed
|
89
91
|
Won Chun Luke Graham Johan Duparc Nick Verigakis
|
90
|
-
the Horde3D community Thomas Ruf Ronny Chevalier
|
91
|
-
Janez Zemva John Bartholomew Michal Cichon github:
|
92
|
-
Jonathan Blow Ken Hamada Tero Hanninen github:
|
93
|
-
Laurent Gomila Cort Stratton Sergio Gonzalez github:
|
94
|
-
Aruelien Pocheville Thibault Reuille Cass Everitt github:
|
95
|
-
Ryamond Barbiero Paul Du Bois Engin Manap github:
|
96
|
-
|
97
|
-
Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:
|
98
|
-
|
99
|
-
Christian Floisand Kevin Schmidt github:
|
92
|
+
the Horde3D community Thomas Ruf Ronny Chevalier github:rlyeh
|
93
|
+
Janez Zemva John Bartholomew Michal Cichon github:romigrou
|
94
|
+
Jonathan Blow Ken Hamada Tero Hanninen github:svdijk
|
95
|
+
Laurent Gomila Cort Stratton Sergio Gonzalez github:snagar
|
96
|
+
Aruelien Pocheville Thibault Reuille Cass Everitt github:Zelex
|
97
|
+
Ryamond Barbiero Paul Du Bois Engin Manap github:grim210
|
98
|
+
Aldo Culquicondor Philipp Wiesemann Dale Weiler github:sammyhw
|
99
|
+
Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:phprus
|
100
|
+
Julian Raschke Gregory Mullen Baldur Karlsson github:poppolopoppo
|
101
|
+
Christian Floisand Kevin Schmidt github:darealshinji
|
102
|
+
Blazej Dariusz Roszkowski github:Michaelangel007
|
100
103
|
*/
|
101
104
|
|
102
105
|
#ifndef STBI_INCLUDE_STB_IMAGE_H
|
@@ -105,10 +108,8 @@ RECENT REVISION HISTORY:
|
|
105
108
|
// DOCUMENTATION
|
106
109
|
//
|
107
110
|
// Limitations:
|
108
|
-
// - no 16-bit-per-channel PNG
|
109
111
|
// - no 12-bit-per-channel JPEG
|
110
112
|
// - no JPEGs with arithmetic coding
|
111
|
-
// - no 1-bit BMP
|
112
113
|
// - GIF always returns *comp=4
|
113
114
|
//
|
114
115
|
// Basic usage (see HDR discussion below for HDR usage):
|
@@ -353,6 +354,10 @@ typedef struct
|
|
353
354
|
|
354
355
|
STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels);
|
355
356
|
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);
|
357
|
+
#ifndef STBI_NO_GIF
|
358
|
+
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);
|
359
|
+
#endif
|
360
|
+
|
356
361
|
|
357
362
|
#ifndef STBI_NO_STDIO
|
358
363
|
STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
|
@@ -416,11 +421,14 @@ STBIDEF void stbi_image_free (void *retval_from_stbi_load);
|
|
416
421
|
// get image dimensions & components without fully decoding
|
417
422
|
STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
|
418
423
|
STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);
|
424
|
+
STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len);
|
425
|
+
STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user);
|
419
426
|
|
420
427
|
#ifndef STBI_NO_STDIO
|
421
|
-
STBIDEF int stbi_info
|
422
|
-
STBIDEF int stbi_info_from_file
|
423
|
-
|
428
|
+
STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp);
|
429
|
+
STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp);
|
430
|
+
STBIDEF int stbi_is_16_bit (char const *filename);
|
431
|
+
STBIDEF int stbi_is_16_bit_from_file(FILE *f);
|
424
432
|
#endif
|
425
433
|
|
426
434
|
|
@@ -504,7 +512,7 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const ch
|
|
504
512
|
#include <limits.h>
|
505
513
|
|
506
514
|
#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
|
507
|
-
#include <math.h> // ldexp
|
515
|
+
#include <math.h> // ldexp, pow
|
508
516
|
#endif
|
509
517
|
|
510
518
|
#ifndef STBI_NO_STDIO
|
@@ -784,6 +792,7 @@ static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);
|
|
784
792
|
static int stbi__png_test(stbi__context *s);
|
785
793
|
static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
|
786
794
|
static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp);
|
795
|
+
static int stbi__png_is16(stbi__context *s);
|
787
796
|
#endif
|
788
797
|
|
789
798
|
#ifndef STBI_NO_BMP
|
@@ -802,6 +811,7 @@ static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);
|
|
802
811
|
static int stbi__psd_test(stbi__context *s);
|
803
812
|
static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc);
|
804
813
|
static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);
|
814
|
+
static int stbi__psd_is16(stbi__context *s);
|
805
815
|
#endif
|
806
816
|
|
807
817
|
#ifndef STBI_NO_HDR
|
@@ -819,6 +829,7 @@ static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);
|
|
819
829
|
#ifndef STBI_NO_GIF
|
820
830
|
static int stbi__gif_test(stbi__context *s);
|
821
831
|
static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
|
832
|
+
static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp);
|
822
833
|
static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);
|
823
834
|
#endif
|
824
835
|
|
@@ -893,11 +904,13 @@ static int stbi__mad3sizes_valid(int a, int b, int c, int add)
|
|
893
904
|
}
|
894
905
|
|
895
906
|
// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow
|
907
|
+
#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
|
896
908
|
static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add)
|
897
909
|
{
|
898
910
|
return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
|
899
911
|
stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);
|
900
912
|
}
|
913
|
+
#endif
|
901
914
|
|
902
915
|
// mallocs with size overflow checking
|
903
916
|
static void *stbi__malloc_mad2(int a, int b, int add)
|
@@ -912,11 +925,13 @@ static void *stbi__malloc_mad3(int a, int b, int c, int add)
|
|
912
925
|
return stbi__malloc(a*b*c + add);
|
913
926
|
}
|
914
927
|
|
928
|
+
#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
|
915
929
|
static void *stbi__malloc_mad4(int a, int b, int c, int d, int add)
|
916
930
|
{
|
917
931
|
if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL;
|
918
932
|
return stbi__malloc(a*b*c*d + add);
|
919
933
|
}
|
934
|
+
#endif
|
920
935
|
|
921
936
|
// stbi__err - error
|
922
937
|
// stbi__errpf - error returning pointer to float
|
@@ -1054,6 +1069,18 @@ static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel)
|
|
1054
1069
|
}
|
1055
1070
|
}
|
1056
1071
|
|
1072
|
+
static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel)
|
1073
|
+
{
|
1074
|
+
int slice;
|
1075
|
+
int slice_size = w * h * bytes_per_pixel;
|
1076
|
+
|
1077
|
+
stbi_uc *bytes = (stbi_uc *)image;
|
1078
|
+
for (slice = 0; slice < z; ++slice) {
|
1079
|
+
stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
|
1080
|
+
bytes += slice_size;
|
1081
|
+
}
|
1082
|
+
}
|
1083
|
+
|
1057
1084
|
static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
|
1058
1085
|
{
|
1059
1086
|
stbi__result_info ri;
|
@@ -1103,7 +1130,7 @@ static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x,
|
|
1103
1130
|
return (stbi__uint16 *) result;
|
1104
1131
|
}
|
1105
1132
|
|
1106
|
-
#if !defined(STBI_NO_HDR)
|
1133
|
+
#if !defined(STBI_NO_HDR) || !defined(STBI_NO_LINEAR)
|
1107
1134
|
static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp)
|
1108
1135
|
{
|
1109
1136
|
if (stbi__vertically_flip_on_load && result != NULL) {
|
@@ -1205,6 +1232,22 @@ STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *u
|
|
1205
1232
|
return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
|
1206
1233
|
}
|
1207
1234
|
|
1235
|
+
#ifndef STBI_NO_GIF
|
1236
|
+
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)
|
1237
|
+
{
|
1238
|
+
unsigned char *result;
|
1239
|
+
stbi__context s;
|
1240
|
+
stbi__start_mem(&s,buffer,len);
|
1241
|
+
|
1242
|
+
result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);
|
1243
|
+
if (stbi__vertically_flip_on_load) {
|
1244
|
+
stbi__vertical_flip_slices( result, *x, *y, *z, *comp );
|
1245
|
+
}
|
1246
|
+
|
1247
|
+
return result;
|
1248
|
+
}
|
1249
|
+
#endif
|
1250
|
+
|
1208
1251
|
#ifndef STBI_NO_LINEAR
|
1209
1252
|
static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
|
1210
1253
|
{
|
@@ -1288,12 +1331,16 @@ STBIDEF int stbi_is_hdr (char const *filename)
|
|
1288
1331
|
return result;
|
1289
1332
|
}
|
1290
1333
|
|
1291
|
-
STBIDEF int
|
1334
|
+
STBIDEF int stbi_is_hdr_from_file(FILE *f)
|
1292
1335
|
{
|
1293
1336
|
#ifndef STBI_NO_HDR
|
1337
|
+
long pos = ftell(f);
|
1338
|
+
int res;
|
1294
1339
|
stbi__context s;
|
1295
1340
|
stbi__start_file(&s,f);
|
1296
|
-
|
1341
|
+
res = stbi__hdr_test(&s);
|
1342
|
+
fseek(f, pos, SEEK_SET);
|
1343
|
+
return res;
|
1297
1344
|
#else
|
1298
1345
|
STBI_NOTUSED(f);
|
1299
1346
|
return 0;
|
@@ -1705,7 +1752,8 @@ typedef struct
|
|
1705
1752
|
|
1706
1753
|
static int stbi__build_huffman(stbi__huffman *h, int *count)
|
1707
1754
|
{
|
1708
|
-
int i,j,k=0
|
1755
|
+
int i,j,k=0;
|
1756
|
+
unsigned int code;
|
1709
1757
|
// build size list for each symbol (from JPEG spec)
|
1710
1758
|
for (i=0; i < 16; ++i)
|
1711
1759
|
for (j=0; j < count[i]; ++j)
|
@@ -1721,7 +1769,7 @@ static int stbi__build_huffman(stbi__huffman *h, int *count)
|
|
1721
1769
|
if (h->size[k] == j) {
|
1722
1770
|
while (h->size[k] == j)
|
1723
1771
|
h->code[k++] = (stbi__uint16) (code++);
|
1724
|
-
if (code-1 >= (
|
1772
|
+
if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG");
|
1725
1773
|
}
|
1726
1774
|
// compute largest code + 1 for this size, preshifted as needed later
|
1727
1775
|
h->maxcode[j] = code << (16-j);
|
@@ -1765,7 +1813,7 @@ static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
|
|
1765
1813
|
if (k < m) k += (~0U << magbits) + 1;
|
1766
1814
|
// if the result is small enough, we can fit it in fast_ac table
|
1767
1815
|
if (k >= -128 && k <= 127)
|
1768
|
-
fast_ac[i] = (stbi__int16) ((k
|
1816
|
+
fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));
|
1769
1817
|
}
|
1770
1818
|
}
|
1771
1819
|
}
|
@@ -1774,7 +1822,7 @@ static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
|
|
1774
1822
|
static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
|
1775
1823
|
{
|
1776
1824
|
do {
|
1777
|
-
int b = j->nomore ? 0 : stbi__get8(j->s);
|
1825
|
+
unsigned int b = j->nomore ? 0 : stbi__get8(j->s);
|
1778
1826
|
if (b == 0xff) {
|
1779
1827
|
int c = stbi__get8(j->s);
|
1780
1828
|
while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes
|
@@ -1790,7 +1838,7 @@ static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
|
|
1790
1838
|
}
|
1791
1839
|
|
1792
1840
|
// (1 << n) - 1
|
1793
|
-
static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
|
1841
|
+
static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
|
1794
1842
|
|
1795
1843
|
// decode a jpeg huffman value from the bitstream
|
1796
1844
|
stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
|
@@ -1843,7 +1891,7 @@ stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
|
|
1843
1891
|
}
|
1844
1892
|
|
1845
1893
|
// bias[n] = (-1<<n) + 1
|
1846
|
-
static int
|
1894
|
+
static const int stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
|
1847
1895
|
|
1848
1896
|
// combined JPEG 'receive' and JPEG 'extend', since baseline
|
1849
1897
|
// always extends everything it receives.
|
@@ -1886,7 +1934,7 @@ stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)
|
|
1886
1934
|
|
1887
1935
|
// given a value that's at position X in the zigzag stream,
|
1888
1936
|
// where does it appear in the 8x8 matrix coded as row-major?
|
1889
|
-
static stbi_uc stbi__jpeg_dezigzag[64+15] =
|
1937
|
+
static const stbi_uc stbi__jpeg_dezigzag[64+15] =
|
1890
1938
|
{
|
1891
1939
|
0, 1, 8, 16, 9, 2, 3, 10,
|
1892
1940
|
17, 24, 32, 25, 18, 11, 4, 5,
|
@@ -2112,7 +2160,7 @@ stbi_inline static stbi_uc stbi__clamp(int x)
|
|
2112
2160
|
}
|
2113
2161
|
|
2114
2162
|
#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
|
2115
|
-
#define stbi__fsh(x) ((x)
|
2163
|
+
#define stbi__fsh(x) ((x) * 4096)
|
2116
2164
|
|
2117
2165
|
// derived from jidctint -- DCT_ISLOW
|
2118
2166
|
#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
|
@@ -2167,7 +2215,7 @@ static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])
|
|
2167
2215
|
// (1|2|3|4|5|6|7)==0 0 seconds
|
2168
2216
|
// all separate -0.047 seconds
|
2169
2217
|
// 1 && 2|3 && 4|5 && 6|7: -0.047 seconds
|
2170
|
-
int dcterm = d[0]
|
2218
|
+
int dcterm = d[0]*4;
|
2171
2219
|
v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
|
2172
2220
|
} else {
|
2173
2221
|
STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
|
@@ -2968,7 +3016,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan)
|
|
2968
3016
|
|
2969
3017
|
z->rgb = 0;
|
2970
3018
|
for (i=0; i < s->img_n; ++i) {
|
2971
|
-
static unsigned char rgb[3] = { 'R', 'G', 'B' };
|
3019
|
+
static const unsigned char rgb[3] = { 'R', 'G', 'B' };
|
2972
3020
|
z->img_comp[i].id = stbi__get8(s);
|
2973
3021
|
if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
|
2974
3022
|
++z->rgb;
|
@@ -3093,8 +3141,8 @@ static int stbi__decode_jpeg_image(stbi__jpeg *j)
|
|
3093
3141
|
} else if (stbi__DNL(m)) {
|
3094
3142
|
int Ld = stbi__get16be(j->s);
|
3095
3143
|
stbi__uint32 NL = stbi__get16be(j->s);
|
3096
|
-
if (Ld != 4) stbi__err("bad DNL len", "Corrupt JPEG");
|
3097
|
-
if (NL != j->s->img_y) stbi__err("bad DNL height", "Corrupt JPEG");
|
3144
|
+
if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG");
|
3145
|
+
if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG");
|
3098
3146
|
} else {
|
3099
3147
|
if (!stbi__process_marker(j, m)) return 0;
|
3100
3148
|
}
|
@@ -3912,18 +3960,18 @@ static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room
|
|
3912
3960
|
return 1;
|
3913
3961
|
}
|
3914
3962
|
|
3915
|
-
static int stbi__zlength_base[31] = {
|
3963
|
+
static const int stbi__zlength_base[31] = {
|
3916
3964
|
3,4,5,6,7,8,9,10,11,13,
|
3917
3965
|
15,17,19,23,27,31,35,43,51,59,
|
3918
3966
|
67,83,99,115,131,163,195,227,258,0,0 };
|
3919
3967
|
|
3920
|
-
static int stbi__zlength_extra[31]=
|
3968
|
+
static const int stbi__zlength_extra[31]=
|
3921
3969
|
{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };
|
3922
3970
|
|
3923
|
-
static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
|
3971
|
+
static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
|
3924
3972
|
257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
|
3925
3973
|
|
3926
|
-
static int stbi__zdist_extra[32] =
|
3974
|
+
static const int stbi__zdist_extra[32] =
|
3927
3975
|
{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
|
3928
3976
|
|
3929
3977
|
static int stbi__parse_huffman_block(stbi__zbuf *a)
|
@@ -3970,7 +4018,7 @@ static int stbi__parse_huffman_block(stbi__zbuf *a)
|
|
3970
4018
|
|
3971
4019
|
static int stbi__compute_huffman_codes(stbi__zbuf *a)
|
3972
4020
|
{
|
3973
|
-
static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
|
4021
|
+
static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
|
3974
4022
|
stbi__zhuffman z_codelength;
|
3975
4023
|
stbi_uc lencodes[286+32+137];//padding for maximum single op
|
3976
4024
|
stbi_uc codelength_sizes[19];
|
@@ -4229,7 +4277,7 @@ static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
|
|
4229
4277
|
|
4230
4278
|
static int stbi__check_png_header(stbi__context *s)
|
4231
4279
|
{
|
4232
|
-
static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
|
4280
|
+
static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
|
4233
4281
|
int i;
|
4234
4282
|
for (i=0; i < 8; ++i)
|
4235
4283
|
if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG");
|
@@ -4275,7 +4323,7 @@ static int stbi__paeth(int a, int b, int c)
|
|
4275
4323
|
return c;
|
4276
4324
|
}
|
4277
4325
|
|
4278
|
-
static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
|
4326
|
+
static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
|
4279
4327
|
|
4280
4328
|
// create the png data from post-deflated data
|
4281
4329
|
static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color)
|
@@ -4295,8 +4343,10 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r
|
|
4295
4343
|
a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into
|
4296
4344
|
if (!a->out) return stbi__err("outofmem", "Out of memory");
|
4297
4345
|
|
4346
|
+
if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG");
|
4298
4347
|
img_width_bytes = (((img_n * x * depth) + 7) >> 3);
|
4299
4348
|
img_len = (img_width_bytes + 1) * y;
|
4349
|
+
|
4300
4350
|
// we used to check for exact match between raw_len and img_len on non-interlaced PNGs,
|
4301
4351
|
// but issue #276 reported a PNG in the wild that had extra data at the end (all zeros),
|
4302
4352
|
// so just check for raw_len < img_len always.
|
@@ -4675,7 +4725,7 @@ static void stbi__de_iphone(stbi__png *z)
|
|
4675
4725
|
}
|
4676
4726
|
}
|
4677
4727
|
|
4678
|
-
#define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))
|
4728
|
+
#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))
|
4679
4729
|
|
4680
4730
|
static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
|
4681
4731
|
{
|
@@ -4912,6 +4962,19 @@ static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)
|
|
4912
4962
|
p.s = s;
|
4913
4963
|
return stbi__png_info_raw(&p, x, y, comp);
|
4914
4964
|
}
|
4965
|
+
|
4966
|
+
static int stbi__png_is16(stbi__context *s)
|
4967
|
+
{
|
4968
|
+
stbi__png p;
|
4969
|
+
p.s = s;
|
4970
|
+
if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
|
4971
|
+
return 0;
|
4972
|
+
if (p.depth != 16) {
|
4973
|
+
stbi__rewind(p.s);
|
4974
|
+
return 0;
|
4975
|
+
}
|
4976
|
+
return 1;
|
4977
|
+
}
|
4915
4978
|
#endif
|
4916
4979
|
|
4917
4980
|
// Microsoft/Windows BMP image
|
@@ -4963,24 +5026,27 @@ static int stbi__bitcount(unsigned int a)
|
|
4963
5026
|
return a & 0xff;
|
4964
5027
|
}
|
4965
5028
|
|
5029
|
+
// extract an arbitrarily-aligned N-bit value (N=bits)
|
5030
|
+
// from v, and then make it 8-bits long and fractionally
|
5031
|
+
// extend it to full full range.
|
4966
5032
|
static int stbi__shiftsigned(int v, int shift, int bits)
|
4967
5033
|
{
|
4968
|
-
|
4969
|
-
|
4970
|
-
|
4971
|
-
|
4972
|
-
|
4973
|
-
|
4974
|
-
|
4975
|
-
|
4976
|
-
|
4977
|
-
|
4978
|
-
|
4979
|
-
|
4980
|
-
|
4981
|
-
|
4982
|
-
|
4983
|
-
|
5034
|
+
static unsigned int mul_table[9] = {
|
5035
|
+
0,
|
5036
|
+
0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/,
|
5037
|
+
0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/,
|
5038
|
+
};
|
5039
|
+
static unsigned int shift_table[9] = {
|
5040
|
+
0, 0,0,1,0,2,4,6,0,
|
5041
|
+
};
|
5042
|
+
if (shift < 0)
|
5043
|
+
v <<= -shift;
|
5044
|
+
else
|
5045
|
+
v >>= shift;
|
5046
|
+
STBI_ASSERT(v >= 0 && v < 256);
|
5047
|
+
v >>= (8-bits);
|
5048
|
+
STBI_ASSERT(bits >= 0 && bits <= 8);
|
5049
|
+
return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];
|
4984
5050
|
}
|
4985
5051
|
|
4986
5052
|
typedef struct
|
@@ -5010,7 +5076,6 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
|
|
5010
5076
|
}
|
5011
5077
|
if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP");
|
5012
5078
|
info->bpp = stbi__get16le(s);
|
5013
|
-
if (info->bpp == 1) return stbi__errpuc("monochrome", "BMP type not supported: 1-bit");
|
5014
5079
|
if (hsz != 12) {
|
5015
5080
|
int compress = stbi__get32le(s);
|
5016
5081
|
if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE");
|
@@ -5128,29 +5193,47 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req
|
|
5128
5193
|
pal[i][3] = 255;
|
5129
5194
|
}
|
5130
5195
|
stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
|
5131
|
-
if (info.bpp ==
|
5196
|
+
if (info.bpp == 1) width = (s->img_x + 7) >> 3;
|
5197
|
+
else if (info.bpp == 4) width = (s->img_x + 1) >> 1;
|
5132
5198
|
else if (info.bpp == 8) width = s->img_x;
|
5133
5199
|
else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); }
|
5134
5200
|
pad = (-width)&3;
|
5135
|
-
|
5136
|
-
for (
|
5137
|
-
int v=stbi__get8(s)
|
5138
|
-
|
5139
|
-
|
5140
|
-
|
5201
|
+
if (info.bpp == 1) {
|
5202
|
+
for (j=0; j < (int) s->img_y; ++j) {
|
5203
|
+
int bit_offset = 7, v = stbi__get8(s);
|
5204
|
+
for (i=0; i < (int) s->img_x; ++i) {
|
5205
|
+
int color = (v>>bit_offset)&0x1;
|
5206
|
+
out[z++] = pal[color][0];
|
5207
|
+
out[z++] = pal[color][1];
|
5208
|
+
out[z++] = pal[color][2];
|
5209
|
+
if((--bit_offset) < 0) {
|
5210
|
+
bit_offset = 7;
|
5211
|
+
v = stbi__get8(s);
|
5212
|
+
}
|
5141
5213
|
}
|
5142
|
-
|
5143
|
-
|
5144
|
-
|
5145
|
-
|
5146
|
-
|
5147
|
-
|
5148
|
-
|
5149
|
-
|
5150
|
-
|
5151
|
-
|
5214
|
+
stbi__skip(s, pad);
|
5215
|
+
}
|
5216
|
+
} else {
|
5217
|
+
for (j=0; j < (int) s->img_y; ++j) {
|
5218
|
+
for (i=0; i < (int) s->img_x; i += 2) {
|
5219
|
+
int v=stbi__get8(s),v2=0;
|
5220
|
+
if (info.bpp == 4) {
|
5221
|
+
v2 = v & 15;
|
5222
|
+
v >>= 4;
|
5223
|
+
}
|
5224
|
+
out[z++] = pal[v][0];
|
5225
|
+
out[z++] = pal[v][1];
|
5226
|
+
out[z++] = pal[v][2];
|
5227
|
+
if (target == 4) out[z++] = 255;
|
5228
|
+
if (i+1 == (int) s->img_x) break;
|
5229
|
+
v = (info.bpp == 8) ? stbi__get8(s) : v2;
|
5230
|
+
out[z++] = pal[v][0];
|
5231
|
+
out[z++] = pal[v][1];
|
5232
|
+
out[z++] = pal[v][2];
|
5233
|
+
if (target == 4) out[z++] = 255;
|
5234
|
+
}
|
5235
|
+
stbi__skip(s, pad);
|
5152
5236
|
}
|
5153
|
-
stbi__skip(s, pad);
|
5154
5237
|
}
|
5155
5238
|
} else {
|
5156
5239
|
int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
|
@@ -5191,7 +5274,7 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req
|
|
5191
5274
|
int bpp = info.bpp;
|
5192
5275
|
for (i=0; i < (int) s->img_x; ++i) {
|
5193
5276
|
stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
|
5194
|
-
int a;
|
5277
|
+
unsigned int a;
|
5195
5278
|
out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
|
5196
5279
|
out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
|
5197
5280
|
out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
|
@@ -5239,14 +5322,14 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req
|
|
5239
5322
|
static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16)
|
5240
5323
|
{
|
5241
5324
|
// only RGB or RGBA (incl. 16bit) or grey allowed
|
5242
|
-
if(is_rgb16) *is_rgb16 = 0;
|
5325
|
+
if (is_rgb16) *is_rgb16 = 0;
|
5243
5326
|
switch(bits_per_pixel) {
|
5244
5327
|
case 8: return STBI_grey;
|
5245
5328
|
case 16: if(is_grey) return STBI_grey_alpha;
|
5246
|
-
|
5329
|
+
// fallthrough
|
5247
5330
|
case 15: if(is_rgb16) *is_rgb16 = 1;
|
5248
|
-
|
5249
|
-
case 24: //
|
5331
|
+
return STBI_rgb;
|
5332
|
+
case 24: // fallthrough
|
5250
5333
|
case 32: return bits_per_pixel/8;
|
5251
5334
|
default: return 0;
|
5252
5335
|
}
|
@@ -6041,11 +6124,13 @@ typedef struct
|
|
6041
6124
|
typedef struct
|
6042
6125
|
{
|
6043
6126
|
int w,h;
|
6044
|
-
stbi_uc *out
|
6045
|
-
|
6127
|
+
stbi_uc *out; // output buffer (always 4 components)
|
6128
|
+
stbi_uc *background; // The current "background" as far as a gif is concerned
|
6129
|
+
stbi_uc *history;
|
6130
|
+
int flags, bgindex, ratio, transparent, eflags;
|
6046
6131
|
stbi_uc pal[256][4];
|
6047
6132
|
stbi_uc lpal[256][4];
|
6048
|
-
stbi__gif_lzw codes[
|
6133
|
+
stbi__gif_lzw codes[8192];
|
6049
6134
|
stbi_uc *color_table;
|
6050
6135
|
int parse, step;
|
6051
6136
|
int lflags;
|
@@ -6053,6 +6138,7 @@ typedef struct
|
|
6053
6138
|
int max_x, max_y;
|
6054
6139
|
int cur_x, cur_y;
|
6055
6140
|
int line_size;
|
6141
|
+
int delay;
|
6056
6142
|
} stbi__gif;
|
6057
6143
|
|
6058
6144
|
static int stbi__gif_test_raw(stbi__context *s)
|
@@ -6128,6 +6214,7 @@ static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)
|
|
6128
6214
|
static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
|
6129
6215
|
{
|
6130
6216
|
stbi_uc *p, *c;
|
6217
|
+
int idx;
|
6131
6218
|
|
6132
6219
|
// recurse to decode the prefixes, since the linked-list is backwards,
|
6133
6220
|
// and working backwards through an interleaved image would be nasty
|
@@ -6136,10 +6223,12 @@ static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
|
|
6136
6223
|
|
6137
6224
|
if (g->cur_y >= g->max_y) return;
|
6138
6225
|
|
6139
|
-
|
6140
|
-
|
6226
|
+
idx = g->cur_x + g->cur_y;
|
6227
|
+
p = &g->out[idx];
|
6228
|
+
g->history[idx / 4] = 1;
|
6141
6229
|
|
6142
|
-
|
6230
|
+
c = &g->color_table[g->codes[code].suffix * 4];
|
6231
|
+
if (c[3] > 128) { // don't render transparent pixels;
|
6143
6232
|
p[0] = c[2];
|
6144
6233
|
p[1] = c[1];
|
6145
6234
|
p[2] = c[0];
|
@@ -6213,11 +6302,16 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
|
|
6213
6302
|
stbi__skip(s,len);
|
6214
6303
|
return g->out;
|
6215
6304
|
} else if (code <= avail) {
|
6216
|
-
if (first)
|
6305
|
+
if (first) {
|
6306
|
+
return stbi__errpuc("no clear code", "Corrupt GIF");
|
6307
|
+
}
|
6217
6308
|
|
6218
6309
|
if (oldcode >= 0) {
|
6219
6310
|
p = &g->codes[avail++];
|
6220
|
-
if (avail >
|
6311
|
+
if (avail > 8192) {
|
6312
|
+
return stbi__errpuc("too many codes", "Corrupt GIF");
|
6313
|
+
}
|
6314
|
+
|
6221
6315
|
p->prefix = (stbi__int16) oldcode;
|
6222
6316
|
p->first = g->codes[oldcode].first;
|
6223
6317
|
p->suffix = (code == avail) ? p->first : g->codes[code].first;
|
@@ -6239,62 +6333,72 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
|
|
6239
6333
|
}
|
6240
6334
|
}
|
6241
6335
|
|
6242
|
-
static void stbi__fill_gif_background(stbi__gif *g, int x0, int y0, int x1, int y1)
|
6243
|
-
{
|
6244
|
-
int x, y;
|
6245
|
-
stbi_uc *c = g->pal[g->bgindex];
|
6246
|
-
for (y = y0; y < y1; y += 4 * g->w) {
|
6247
|
-
for (x = x0; x < x1; x += 4) {
|
6248
|
-
stbi_uc *p = &g->out[y + x];
|
6249
|
-
p[0] = c[2];
|
6250
|
-
p[1] = c[1];
|
6251
|
-
p[2] = c[0];
|
6252
|
-
p[3] = 0;
|
6253
|
-
}
|
6254
|
-
}
|
6255
|
-
}
|
6256
|
-
|
6257
6336
|
// this function is designed to support animated gifs, although stb_image doesn't support it
|
6258
|
-
|
6259
|
-
|
6260
|
-
|
6261
|
-
|
6262
|
-
|
6263
|
-
|
6264
|
-
|
6265
|
-
|
6266
|
-
|
6267
|
-
|
6337
|
+
// two back is the image from two frames ago, used for a very specific disposal format
|
6338
|
+
static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back)
|
6339
|
+
{
|
6340
|
+
int dispose;
|
6341
|
+
int first_frame;
|
6342
|
+
int pi;
|
6343
|
+
int pcount;
|
6344
|
+
|
6345
|
+
// on first frame, any non-written pixels get the background colour (non-transparent)
|
6346
|
+
first_frame = 0;
|
6347
|
+
if (g->out == 0) {
|
6348
|
+
if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header
|
6349
|
+
g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h);
|
6350
|
+
g->background = (stbi_uc *) stbi__malloc(4 * g->w * g->h);
|
6351
|
+
g->history = (stbi_uc *) stbi__malloc(g->w * g->h);
|
6352
|
+
if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory");
|
6353
|
+
|
6354
|
+
// image is treated as "tranparent" at the start - ie, nothing overwrites the current background;
|
6355
|
+
// background colour is only used for pixels that are not rendered first frame, after that "background"
|
6356
|
+
// color refers to teh color that was there the previous frame.
|
6357
|
+
memset( g->out, 0x00, 4 * g->w * g->h );
|
6358
|
+
memset( g->background, 0x00, 4 * g->w * g->h ); // state of the background (starts transparent)
|
6359
|
+
memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame
|
6360
|
+
first_frame = 1;
|
6361
|
+
} else {
|
6362
|
+
// second frame - how do we dispoase of the previous one?
|
6363
|
+
dispose = (g->eflags & 0x1C) >> 2;
|
6364
|
+
pcount = g->w * g->h;
|
6268
6365
|
|
6269
|
-
|
6270
|
-
|
6271
|
-
|
6366
|
+
if ((dispose == 3) && (two_back == 0)) {
|
6367
|
+
dispose = 2; // if I don't have an image to revert back to, default to the old background
|
6368
|
+
}
|
6272
6369
|
|
6273
|
-
|
6274
|
-
|
6275
|
-
|
6276
|
-
|
6277
|
-
|
6278
|
-
if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
|
6279
|
-
g->old_out = prev_out;
|
6280
|
-
break;
|
6281
|
-
case 2: // dispose to background
|
6282
|
-
if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
|
6283
|
-
stbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y);
|
6284
|
-
break;
|
6285
|
-
case 3: // dispose to previous
|
6286
|
-
if (g->old_out) {
|
6287
|
-
for (i = g->start_y; i < g->max_y; i += 4 * g->w)
|
6288
|
-
memcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x);
|
6370
|
+
if (dispose == 3) { // use previous graphic
|
6371
|
+
for (pi = 0; pi < pcount; ++pi) {
|
6372
|
+
if (g->history[pi]) {
|
6373
|
+
memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );
|
6374
|
+
}
|
6289
6375
|
}
|
6290
|
-
|
6376
|
+
} else if (dispose == 2) {
|
6377
|
+
// restore what was changed last frame to background before that frame;
|
6378
|
+
for (pi = 0; pi < pcount; ++pi) {
|
6379
|
+
if (g->history[pi]) {
|
6380
|
+
memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );
|
6381
|
+
}
|
6382
|
+
}
|
6383
|
+
} else {
|
6384
|
+
// This is a non-disposal case eithe way, so just
|
6385
|
+
// leave the pixels as is, and they will become the new background
|
6386
|
+
// 1: do not dispose
|
6387
|
+
// 0: not specified.
|
6388
|
+
}
|
6389
|
+
|
6390
|
+
// background is what out is after the undoing of the previou frame;
|
6391
|
+
memcpy( g->background, g->out, 4 * g->w * g->h );
|
6291
6392
|
}
|
6292
6393
|
|
6394
|
+
// clear my history;
|
6395
|
+
memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame
|
6396
|
+
|
6293
6397
|
for (;;) {
|
6294
|
-
|
6398
|
+
int tag = stbi__get8(s);
|
6399
|
+
switch (tag) {
|
6295
6400
|
case 0x2C: /* Image Descriptor */
|
6296
6401
|
{
|
6297
|
-
int prev_trans = -1;
|
6298
6402
|
stbi__int32 x, y, w, h;
|
6299
6403
|
stbi_uc *o;
|
6300
6404
|
|
@@ -6327,19 +6431,24 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
|
|
6327
6431
|
stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
|
6328
6432
|
g->color_table = (stbi_uc *) g->lpal;
|
6329
6433
|
} else if (g->flags & 0x80) {
|
6330
|
-
if (g->transparent >= 0 && (g->eflags & 0x01)) {
|
6331
|
-
prev_trans = g->pal[g->transparent][3];
|
6332
|
-
g->pal[g->transparent][3] = 0;
|
6333
|
-
}
|
6334
6434
|
g->color_table = (stbi_uc *) g->pal;
|
6335
6435
|
} else
|
6336
|
-
return stbi__errpuc("missing color table", "Corrupt GIF");
|
6337
|
-
|
6436
|
+
return stbi__errpuc("missing color table", "Corrupt GIF");
|
6437
|
+
|
6338
6438
|
o = stbi__process_gif_raster(s, g);
|
6339
6439
|
if (o == NULL) return NULL;
|
6340
6440
|
|
6341
|
-
if
|
6342
|
-
|
6441
|
+
// if this was the first frame,
|
6442
|
+
pcount = g->w * g->h;
|
6443
|
+
if (first_frame && (g->bgindex > 0)) {
|
6444
|
+
// if first frame, any pixel not drawn to gets the background color
|
6445
|
+
for (pi = 0; pi < pcount; ++pi) {
|
6446
|
+
if (g->history[pi] == 0) {
|
6447
|
+
g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be;
|
6448
|
+
memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );
|
6449
|
+
}
|
6450
|
+
}
|
6451
|
+
}
|
6343
6452
|
|
6344
6453
|
return o;
|
6345
6454
|
}
|
@@ -6347,19 +6456,35 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
|
|
6347
6456
|
case 0x21: // Comment Extension.
|
6348
6457
|
{
|
6349
6458
|
int len;
|
6350
|
-
|
6459
|
+
int ext = stbi__get8(s);
|
6460
|
+
if (ext == 0xF9) { // Graphic Control Extension.
|
6351
6461
|
len = stbi__get8(s);
|
6352
6462
|
if (len == 4) {
|
6353
6463
|
g->eflags = stbi__get8(s);
|
6354
|
-
g->delay = stbi__get16le(s);
|
6355
|
-
|
6464
|
+
g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths.
|
6465
|
+
|
6466
|
+
// unset old transparent
|
6467
|
+
if (g->transparent >= 0) {
|
6468
|
+
g->pal[g->transparent][3] = 255;
|
6469
|
+
}
|
6470
|
+
if (g->eflags & 0x01) {
|
6471
|
+
g->transparent = stbi__get8(s);
|
6472
|
+
if (g->transparent >= 0) {
|
6473
|
+
g->pal[g->transparent][3] = 0;
|
6474
|
+
}
|
6475
|
+
} else {
|
6476
|
+
// don't need transparent
|
6477
|
+
stbi__skip(s, 1);
|
6478
|
+
g->transparent = -1;
|
6479
|
+
}
|
6356
6480
|
} else {
|
6357
6481
|
stbi__skip(s, len);
|
6358
6482
|
break;
|
6359
6483
|
}
|
6360
|
-
}
|
6361
|
-
while ((len = stbi__get8(s)) != 0)
|
6484
|
+
}
|
6485
|
+
while ((len = stbi__get8(s)) != 0) {
|
6362
6486
|
stbi__skip(s, len);
|
6487
|
+
}
|
6363
6488
|
break;
|
6364
6489
|
}
|
6365
6490
|
|
@@ -6370,28 +6495,92 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
|
|
6370
6495
|
return stbi__errpuc("unknown code", "Corrupt GIF");
|
6371
6496
|
}
|
6372
6497
|
}
|
6498
|
+
}
|
6373
6499
|
|
6374
|
-
|
6500
|
+
static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
|
6501
|
+
{
|
6502
|
+
if (stbi__gif_test(s)) {
|
6503
|
+
int layers = 0;
|
6504
|
+
stbi_uc *u = 0;
|
6505
|
+
stbi_uc *out = 0;
|
6506
|
+
stbi_uc *two_back = 0;
|
6507
|
+
stbi__gif g;
|
6508
|
+
int stride;
|
6509
|
+
memset(&g, 0, sizeof(g));
|
6510
|
+
if (delays) {
|
6511
|
+
*delays = 0;
|
6512
|
+
}
|
6513
|
+
|
6514
|
+
do {
|
6515
|
+
u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);
|
6516
|
+
if (u == (stbi_uc *) s) u = 0; // end of animated gif marker
|
6517
|
+
|
6518
|
+
if (u) {
|
6519
|
+
*x = g.w;
|
6520
|
+
*y = g.h;
|
6521
|
+
++layers;
|
6522
|
+
stride = g.w * g.h * 4;
|
6523
|
+
|
6524
|
+
if (out) {
|
6525
|
+
out = (stbi_uc*) STBI_REALLOC( out, layers * stride );
|
6526
|
+
if (delays) {
|
6527
|
+
*delays = (int*) STBI_REALLOC( *delays, sizeof(int) * layers );
|
6528
|
+
}
|
6529
|
+
} else {
|
6530
|
+
out = (stbi_uc*)stbi__malloc( layers * stride );
|
6531
|
+
if (delays) {
|
6532
|
+
*delays = (int*) stbi__malloc( layers * sizeof(int) );
|
6533
|
+
}
|
6534
|
+
}
|
6535
|
+
memcpy( out + ((layers - 1) * stride), u, stride );
|
6536
|
+
if (layers >= 2) {
|
6537
|
+
two_back = out - 2 * stride;
|
6538
|
+
}
|
6539
|
+
|
6540
|
+
if (delays) {
|
6541
|
+
(*delays)[layers - 1U] = g.delay;
|
6542
|
+
}
|
6543
|
+
}
|
6544
|
+
} while (u != 0);
|
6545
|
+
|
6546
|
+
// free temp buffer;
|
6547
|
+
STBI_FREE(g.out);
|
6548
|
+
STBI_FREE(g.history);
|
6549
|
+
STBI_FREE(g.background);
|
6550
|
+
|
6551
|
+
// do the final conversion after loading everything;
|
6552
|
+
if (req_comp && req_comp != 4)
|
6553
|
+
out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
|
6554
|
+
|
6555
|
+
*z = layers;
|
6556
|
+
return out;
|
6557
|
+
} else {
|
6558
|
+
return stbi__errpuc("not GIF", "Image was not as a gif type.");
|
6559
|
+
}
|
6375
6560
|
}
|
6376
6561
|
|
6377
6562
|
static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
|
6378
6563
|
{
|
6379
6564
|
stbi_uc *u = 0;
|
6380
|
-
stbi__gif
|
6381
|
-
memset(g, 0, sizeof(
|
6382
|
-
STBI_NOTUSED(ri);
|
6565
|
+
stbi__gif g;
|
6566
|
+
memset(&g, 0, sizeof(g));
|
6383
6567
|
|
6384
|
-
u = stbi__gif_load_next(s, g, comp, req_comp);
|
6568
|
+
u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
|
6385
6569
|
if (u == (stbi_uc *) s) u = 0; // end of animated gif marker
|
6386
6570
|
if (u) {
|
6387
|
-
*x = g
|
6388
|
-
*y = g
|
6571
|
+
*x = g.w;
|
6572
|
+
*y = g.h;
|
6573
|
+
|
6574
|
+
// moved conversion to after successful load so that the same
|
6575
|
+
// can be done for multiple frames.
|
6389
6576
|
if (req_comp && req_comp != 4)
|
6390
|
-
u = stbi__convert_format(u, 4, req_comp, g
|
6577
|
+
u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
|
6391
6578
|
}
|
6392
|
-
|
6393
|
-
|
6394
|
-
STBI_FREE(g);
|
6579
|
+
|
6580
|
+
// free buffers needed for multiple frame loading;
|
6581
|
+
STBI_FREE(g.history);
|
6582
|
+
STBI_FREE(g.background);
|
6583
|
+
|
6395
6584
|
return u;
|
6396
6585
|
}
|
6397
6586
|
|
@@ -6670,7 +6859,7 @@ static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
|
|
6670
6859
|
#ifndef STBI_NO_PSD
|
6671
6860
|
static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
|
6672
6861
|
{
|
6673
|
-
int channelCount, dummy;
|
6862
|
+
int channelCount, dummy, depth;
|
6674
6863
|
if (!x) x = &dummy;
|
6675
6864
|
if (!y) y = &dummy;
|
6676
6865
|
if (!comp) comp = &dummy;
|
@@ -6690,7 +6879,8 @@ static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
|
|
6690
6879
|
}
|
6691
6880
|
*y = stbi__get32be(s);
|
6692
6881
|
*x = stbi__get32be(s);
|
6693
|
-
|
6882
|
+
depth = stbi__get16be(s);
|
6883
|
+
if (depth != 8 && depth != 16) {
|
6694
6884
|
stbi__rewind( s );
|
6695
6885
|
return 0;
|
6696
6886
|
}
|
@@ -6701,6 +6891,33 @@ static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
|
|
6701
6891
|
*comp = 4;
|
6702
6892
|
return 1;
|
6703
6893
|
}
|
6894
|
+
|
6895
|
+
static int stbi__psd_is16(stbi__context *s)
|
6896
|
+
{
|
6897
|
+
int channelCount, dummy, depth;
|
6898
|
+
if (stbi__get32be(s) != 0x38425053) {
|
6899
|
+
stbi__rewind( s );
|
6900
|
+
return 0;
|
6901
|
+
}
|
6902
|
+
if (stbi__get16be(s) != 1) {
|
6903
|
+
stbi__rewind( s );
|
6904
|
+
return 0;
|
6905
|
+
}
|
6906
|
+
stbi__skip(s, 6);
|
6907
|
+
channelCount = stbi__get16be(s);
|
6908
|
+
if (channelCount < 0 || channelCount > 16) {
|
6909
|
+
stbi__rewind( s );
|
6910
|
+
return 0;
|
6911
|
+
}
|
6912
|
+
dummy = stbi__get32be(s);
|
6913
|
+
dummy = stbi__get32be(s);
|
6914
|
+
depth = stbi__get16be(s);
|
6915
|
+
if (depth != 16) {
|
6916
|
+
stbi__rewind( s );
|
6917
|
+
return 0;
|
6918
|
+
}
|
6919
|
+
return 1;
|
6920
|
+
}
|
6704
6921
|
#endif
|
6705
6922
|
|
6706
6923
|
#ifndef STBI_NO_PIC
|
@@ -6931,6 +7148,19 @@ static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)
|
|
6931
7148
|
return stbi__err("unknown image type", "Image not of any known type, or corrupt");
|
6932
7149
|
}
|
6933
7150
|
|
7151
|
+
static int stbi__is_16_main(stbi__context *s)
|
7152
|
+
{
|
7153
|
+
#ifndef STBI_NO_PNG
|
7154
|
+
if (stbi__png_is16(s)) return 1;
|
7155
|
+
#endif
|
7156
|
+
|
7157
|
+
#ifndef STBI_NO_PSD
|
7158
|
+
if (stbi__psd_is16(s)) return 1;
|
7159
|
+
#endif
|
7160
|
+
|
7161
|
+
return 0;
|
7162
|
+
}
|
7163
|
+
|
6934
7164
|
#ifndef STBI_NO_STDIO
|
6935
7165
|
STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
|
6936
7166
|
{
|
@@ -6952,6 +7182,27 @@ STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
|
|
6952
7182
|
fseek(f,pos,SEEK_SET);
|
6953
7183
|
return r;
|
6954
7184
|
}
|
7185
|
+
|
7186
|
+
STBIDEF int stbi_is_16_bit(char const *filename)
|
7187
|
+
{
|
7188
|
+
FILE *f = stbi__fopen(filename, "rb");
|
7189
|
+
int result;
|
7190
|
+
if (!f) return stbi__err("can't fopen", "Unable to open file");
|
7191
|
+
result = stbi_is_16_bit_from_file(f);
|
7192
|
+
fclose(f);
|
7193
|
+
return result;
|
7194
|
+
}
|
7195
|
+
|
7196
|
+
STBIDEF int stbi_is_16_bit_from_file(FILE *f)
|
7197
|
+
{
|
7198
|
+
int r;
|
7199
|
+
stbi__context s;
|
7200
|
+
long pos = ftell(f);
|
7201
|
+
stbi__start_file(&s, f);
|
7202
|
+
r = stbi__is_16_main(&s);
|
7203
|
+
fseek(f,pos,SEEK_SET);
|
7204
|
+
return r;
|
7205
|
+
}
|
6955
7206
|
#endif // !STBI_NO_STDIO
|
6956
7207
|
|
6957
7208
|
STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
|
@@ -6968,10 +7219,28 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int
|
|
6968
7219
|
return stbi__info_main(&s,x,y,comp);
|
6969
7220
|
}
|
6970
7221
|
|
7222
|
+
STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len)
|
7223
|
+
{
|
7224
|
+
stbi__context s;
|
7225
|
+
stbi__start_mem(&s,buffer,len);
|
7226
|
+
return stbi__is_16_main(&s);
|
7227
|
+
}
|
7228
|
+
|
7229
|
+
STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user)
|
7230
|
+
{
|
7231
|
+
stbi__context s;
|
7232
|
+
stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);
|
7233
|
+
return stbi__is_16_main(&s);
|
7234
|
+
}
|
7235
|
+
|
6971
7236
|
#endif // STB_IMAGE_IMPLEMENTATION
|
6972
7237
|
|
6973
7238
|
/*
|
6974
7239
|
revision history:
|
7240
|
+
2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug
|
7241
|
+
1-bit BMP
|
7242
|
+
*_is_16_bit api
|
7243
|
+
avoid warnings
|
6975
7244
|
2.16 (2017-07-23) all functions have 16-bit variants;
|
6976
7245
|
STBI_NO_STDIO works again;
|
6977
7246
|
compilation fixes;
|