1 /* stb_image_write - v1.16 - public domain - http://nothings.org/stb
2    writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015
3                                      no warranty implied; use at your own risk
4 
5    Before #including,
6 
7        #define STB_IMAGE_WRITE_IMPLEMENTATION
8 
9    in the file that you want to have the implementation.
10 
11    Will probably not work correctly with strict-aliasing optimizations.
12 
13 ABOUT:
14 
15    This header file is a library for writing images to C stdio or a callback.
16 
17    The PNG output is not optimal; it is 20-50% larger than the file
18    written by a decent optimizing implementation; though providing a custom
19    zlib compress function (see STBIW_ZLIB_COMPRESS) can mitigate that.
20    This library is designed for source code compactness and simplicity,
21    not optimal image file size or run-time performance.
22 
23 BUILDING:
24 
25    You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h.
26    You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace
27    malloc,realloc,free.
28    You can #define STBIW_MEMMOVE() to replace memmove()
29    You can #define STBIW_ZLIB_COMPRESS to use a custom zlib-style compress function
30    for PNG compression (instead of the builtin one), it must have the following signature:
31    unsigned char * my_compress(unsigned char *data, int data_len, int *out_len, int quality);
32    The returned data will be freed with STBIW_FREE() (free() by default),
33    so it must be heap allocated with STBIW_MALLOC() (malloc() by default),
34 
35 UNICODE:
36 
37    If compiling for Windows and you wish to use Unicode filenames, compile
38    with
39        #define STBIW_WINDOWS_UTF8
40    and pass utf8-encoded filenames. Call stbiw_convert_wchar_to_utf8 to convert
41    Windows wchar_t filenames to utf8.
42 
43 USAGE:
44 
45    There are five functions, one for each image file format:
46 
47      int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes);
48      int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data);
49      int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data);
50      int stbi_write_jpg(char const *filename, int w, int h, int comp, const void *data, int quality);
51      int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data);
52 
53      void stbi_flip_vertically_on_write(int flag); // flag is non-zero to flip data vertically
54 
55    There are also five equivalent functions that use an arbitrary write function. You are
56    expected to open/close your file-equivalent before and after calling these:
57 
58      int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data, int stride_in_bytes);
59      int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);
60      int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);
61      int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data);
62      int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality);
63 
64    where the callback is:
65       void stbi_write_func(void *context, void *data, int size);
66 
67    You can configure it with these global variables:
68       int stbi_write_tga_with_rle;             // defaults to true; set to 0 to disable RLE
69       int stbi_write_png_compression_level;    // defaults to 8; set to higher for more compression
70       int stbi_write_force_png_filter;         // defaults to -1; set to 0..5 to force a filter mode
71 
72 
73    You can define STBI_WRITE_NO_STDIO to disable the file variant of these
74    functions, so the library will not use stdio.h at all. However, this will
75    also disable HDR writing, because it requires stdio for formatted output.
76 
77    Each function returns 0 on failure and non-0 on success.
78 
79    The functions create an image file defined by the parameters. The image
80    is a rectangle of pixels stored from left-to-right, top-to-bottom.
81    Each pixel contains 'comp' channels of data stored interleaved with 8-bits
82    per channel, in the following order: 1=Y, 2=YA, 3=RGB, 4=RGBA. (Y is
83    monochrome color.) The rectangle is 'w' pixels wide and 'h' pixels tall.
84    The *data pointer points to the first byte of the top-left-most pixel.
85    For PNG, "stride_in_bytes" is the distance in bytes from the first byte of
86    a row of pixels to the first byte of the next row of pixels.
87 
88    PNG creates output files with the same number of components as the input.
89    The BMP format expands Y to RGB in the file format and does not
90    output alpha.
91 
92    PNG supports writing rectangles of data even when the bytes storing rows of
93    data are not consecutive in memory (e.g. sub-rectangles of a larger image),
94    by supplying the stride between the beginning of adjacent rows. The other
95    formats do not. (Thus you cannot write a native-format BMP through the BMP
96    writer, both because it is in BGR order and because it may have padding
97    at the end of the line.)
98 
99    PNG allows you to set the deflate compression level by setting the global
100    variable 'stbi_write_png_compression_level' (it defaults to 8).
101 
102    HDR expects linear float data. Since the format is always 32-bit rgb(e)
103    data, alpha (if provided) is discarded, and for monochrome data it is
104    replicated across all three channels.
105 
106    TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed
107    data, set the global variable 'stbi_write_tga_with_rle' to 0.
108 
109    JPEG does ignore alpha channels in input data; quality is between 1 and 100.
110    Higher quality looks better but results in a bigger image.
111    JPEG baseline (no JPEG progressive).
112 
113 CREDITS:
114 
115 
116    Sean Barrett           -    PNG/BMP/TGA
117    Baldur Karlsson        -    HDR
118    Jean-Sebastien Guay    -    TGA monochrome
119    Tim Kelsey             -    misc enhancements
120    Alan Hickman           -    TGA RLE
121    Emmanuel Julien        -    initial file IO callback implementation
122    Jon Olick              -    original jo_jpeg.cpp code
123    Daniel Gibson          -    integrate JPEG, allow external zlib
124    Aarni Koskela          -    allow choosing PNG filter
125 
126    bugfixes:
127       github:Chribba
128       Guillaume Chereau
129       github:jry2
130       github:romigrou
131       Sergio Gonzalez
132       Jonas Karlsson
133       Filip Wasil
134       Thatcher Ulrich
135       github:poppolopoppo
136       Patrick Boettcher
137       github:xeekworx
138       Cap Petschulat
139       Simon Rodriguez
140       Ivan Tikhonov
141       github:ignotion
142       Adam Schackart
143       Andrew Kensler
144 
145 LICENSE
146 
147   See end of file for license information.
148 
149 */
150 
151 #ifndef INCLUDE_STB_IMAGE_WRITE_H
152 #define INCLUDE_STB_IMAGE_WRITE_H
153 
154 #include <stdlib.h>
155 
156 // if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline'
157 #ifndef STBIWDEF
158 #ifdef STB_IMAGE_WRITE_STATIC
159 #define STBIWDEF  static
160 #else
161 #ifdef __cplusplus
162 #define STBIWDEF  extern "C"
163 #else
164 #define STBIWDEF  extern
165 #endif
166 #endif
167 #endif
168 
169 #ifndef STB_IMAGE_WRITE_STATIC  // C++ forbids static forward declarations
170 STBIWDEF int stbi_write_tga_with_rle;
171 STBIWDEF int stbi_write_png_compression_level;
172 STBIWDEF int stbi_write_force_png_filter;
173 #endif
174 
175 #ifndef STBI_WRITE_NO_STDIO
176 STBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void  *data, int stride_in_bytes);
177 STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void  *data);
178 STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void  *data);
179 STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data);
180 STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void  *data, int quality);
181 
182 #ifdef STBIW_WINDOWS_UTF8
183 STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input);
184 #endif
185 #endif
186 
187 typedef void stbi_write_func(void *context, void *data, int size);
188 
189 STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data, int stride_in_bytes);
190 STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);
191 STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);
192 STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data);
193 STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void  *data, int quality);
194 
195 STBIWDEF void stbi_flip_vertically_on_write(int flip_boolean);
196 
197 #endif//INCLUDE_STB_IMAGE_WRITE_H
198 
199 #ifdef STB_IMAGE_WRITE_IMPLEMENTATION
200 
201 #ifdef _WIN32
202    #ifndef _CRT_SECURE_NO_WARNINGS
203    #define _CRT_SECURE_NO_WARNINGS
204    #endif
205    #ifndef _CRT_NONSTDC_NO_DEPRECATE
206    #define _CRT_NONSTDC_NO_DEPRECATE
207    #endif
208 #endif
209 
210 #ifndef STBI_WRITE_NO_STDIO
211 #include <stdio.h>
212 #endif // STBI_WRITE_NO_STDIO
213 
214 #include <stdarg.h>
215 #include <stdlib.h>
216 #include <string.h>
217 #include <math.h>
218 
219 #if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED))
220 // ok
221 #elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED)
222 // ok
223 #else
224 #error "Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED)."
225 #endif
226 
227 #ifndef STBIW_MALLOC
228 #define STBIW_MALLOC(sz)        malloc(sz)
229 #define STBIW_REALLOC(p,newsz)  realloc(p,newsz)
230 #define STBIW_FREE(p)           free(p)
231 #endif
232 
233 #ifndef STBIW_REALLOC_SIZED
234 #define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz)
235 #endif
236 
237 
238 #ifndef STBIW_MEMMOVE
239 #define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz)
240 #endif
241 
242 
243 #ifndef STBIW_ASSERT
244 #include <assert.h>
245 #define STBIW_ASSERT(x) assert(x)
246 #endif
247 
248 #define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff)
249 
250 #ifdef STB_IMAGE_WRITE_STATIC
251 static int stbi_write_png_compression_level = 8;
252 static int stbi_write_tga_with_rle = 1;
253 static int stbi_write_force_png_filter = -1;
254 #else
255 int stbi_write_png_compression_level = 8;
256 int stbi_write_tga_with_rle = 1;
257 int stbi_write_force_png_filter = -1;
258 #endif
259 
260 static int stbi__flip_vertically_on_write = 0;
261 
stbi_flip_vertically_on_write(int flag)262 STBIWDEF void stbi_flip_vertically_on_write(int flag)
263 {
264    stbi__flip_vertically_on_write = flag;
265 }
266 
267 typedef struct
268 {
269    stbi_write_func *func;
270    void *context;
271    unsigned char buffer[64];
272    int buf_used;
273 } stbi__write_context;
274 
275 // initialize a callback-based context
stbi__start_write_callbacks(stbi__write_context * s,stbi_write_func * c,void * context)276 static void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context)
277 {
278    s->func    = c;
279    s->context = context;
280 }
281 
282 #ifndef STBI_WRITE_NO_STDIO
283 
stbi__stdio_write(void * context,void * data,int size)284 static void stbi__stdio_write(void *context, void *data, int size)
285 {
286    fwrite(data,1,size,(FILE*) context);
287 }
288 
289 #if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8)
290 #ifdef __cplusplus
291 #define STBIW_EXTERN extern "C"
292 #else
293 #define STBIW_EXTERN extern
294 #endif
295 STBIW_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide);
296 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);
297 
stbiw_convert_wchar_to_utf8(char * buffer,size_t bufferlen,const wchar_t * input)298 STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input)
299 {
300    return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL);
301 }
302 #endif
303 
stbiw__fopen(char const * filename,char const * mode)304 static FILE *stbiw__fopen(char const *filename, char const *mode)
305 {
306    FILE *f;
307 #if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8)
308    wchar_t wMode[64];
309    wchar_t wFilename[1024];
310    if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename)))
311       return 0;
312 
313    if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode)))
314       return 0;
315 
316 #if defined(_MSC_VER) && _MSC_VER >= 1400
317    if (0 != _wfopen_s(&f, wFilename, wMode))
318       f = 0;
319 #else
320    f = _wfopen(wFilename, wMode);
321 #endif
322 
323 #elif defined(_MSC_VER) && _MSC_VER >= 1400
324    if (0 != fopen_s(&f, filename, mode))
325       f=0;
326 #else
327    f = fopen(filename, mode);
328 #endif
329    return f;
330 }
331 
stbi__start_write_file(stbi__write_context * s,const char * filename)332 static int stbi__start_write_file(stbi__write_context *s, const char *filename)
333 {
334    FILE *f = stbiw__fopen(filename, "wb");
335    stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f);
336    return f != NULL;
337 }
338 
stbi__end_write_file(stbi__write_context * s)339 static void stbi__end_write_file(stbi__write_context *s)
340 {
341    fclose((FILE *)s->context);
342 }
343 
344 #endif // !STBI_WRITE_NO_STDIO
345 
346 typedef unsigned int stbiw_uint32;
347 typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1];
348 
stbiw__writefv(stbi__write_context * s,const char * fmt,va_list v)349 static void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v)
350 {
351    while (*fmt) {
352       switch (*fmt++) {
353          case ' ': break;
354          case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int));
355                      s->func(s->context,&x,1);
356                      break; }
357          case '2': { int x = va_arg(v,int);
358                      unsigned char b[2];
359                      b[0] = STBIW_UCHAR(x);
360                      b[1] = STBIW_UCHAR(x>>8);
361                      s->func(s->context,b,2);
362                      break; }
363          case '4': { stbiw_uint32 x = va_arg(v,int);
364                      unsigned char b[4];
365                      b[0]=STBIW_UCHAR(x);
366                      b[1]=STBIW_UCHAR(x>>8);
367                      b[2]=STBIW_UCHAR(x>>16);
368                      b[3]=STBIW_UCHAR(x>>24);
369                      s->func(s->context,b,4);
370                      break; }
371          default:
372             STBIW_ASSERT(0);
373             return;
374       }
375    }
376 }
377 
stbiw__writef(stbi__write_context * s,const char * fmt,...)378 static void stbiw__writef(stbi__write_context *s, const char *fmt, ...)
379 {
380    va_list v;
381    va_start(v, fmt);
382    stbiw__writefv(s, fmt, v);
383    va_end(v);
384 }
385 
stbiw__write_flush(stbi__write_context * s)386 static void stbiw__write_flush(stbi__write_context *s)
387 {
388    if (s->buf_used) {
389       s->func(s->context, &s->buffer, s->buf_used);
390       s->buf_used = 0;
391    }
392 }
393 
stbiw__putc(stbi__write_context * s,unsigned char c)394 static void stbiw__putc(stbi__write_context *s, unsigned char c)
395 {
396    s->func(s->context, &c, 1);
397 }
398 
stbiw__write1(stbi__write_context * s,unsigned char a)399 static void stbiw__write1(stbi__write_context *s, unsigned char a)
400 {
401    if ((size_t)s->buf_used + 1 > sizeof(s->buffer))
402       stbiw__write_flush(s);
403    s->buffer[s->buf_used++] = a;
404 }
405 
stbiw__write3(stbi__write_context * s,unsigned char a,unsigned char b,unsigned char c)406 static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c)
407 {
408    int n;
409    if ((size_t)s->buf_used + 3 > sizeof(s->buffer))
410       stbiw__write_flush(s);
411    n = s->buf_used;
412    s->buf_used = n+3;
413    s->buffer[n+0] = a;
414    s->buffer[n+1] = b;
415    s->buffer[n+2] = c;
416 }
417 
stbiw__write_pixel(stbi__write_context * s,int rgb_dir,int comp,int write_alpha,int expand_mono,unsigned char * d)418 static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d)
419 {
420    unsigned char bg[3] = { 255, 0, 255}, px[3];
421    int k;
422 
423    if (write_alpha < 0)
424       stbiw__write1(s, d[comp - 1]);
425 
426    switch (comp) {
427       case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case
428       case 1:
429          if (expand_mono)
430             stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp
431          else
432             stbiw__write1(s, d[0]);  // monochrome TGA
433          break;
434       case 4:
435          if (!write_alpha) {
436             // composite against pink background
437             for (k = 0; k < 3; ++k)
438                px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255;
439             stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]);
440             break;
441          }
442          /* FALLTHROUGH */
443       case 3:
444          stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]);
445          break;
446    }
447    if (write_alpha > 0)
448       stbiw__write1(s, d[comp - 1]);
449 }
450 
stbiw__write_pixels(stbi__write_context * s,int rgb_dir,int vdir,int x,int y,int comp,void * data,int write_alpha,int scanline_pad,int expand_mono)451 static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono)
452 {
453    stbiw_uint32 zero = 0;
454    int i,j, j_end;
455 
456    if (y <= 0)
457       return;
458 
459    if (stbi__flip_vertically_on_write)
460       vdir *= -1;
461 
462    if (vdir < 0) {
463       j_end = -1; j = y-1;
464    } else {
465       j_end =  y; j = 0;
466    }
467 
468    for (; j != j_end; j += vdir) {
469       for (i=0; i < x; ++i) {
470          unsigned char *d = (unsigned char *) data + (j*x+i)*comp;
471          stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d);
472       }
473       stbiw__write_flush(s);
474       s->func(s->context, &zero, scanline_pad);
475    }
476 }
477 
stbiw__outfile(stbi__write_context * s,int rgb_dir,int vdir,int x,int y,int comp,int expand_mono,void * data,int alpha,int pad,const char * fmt,...)478 static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...)
479 {
480    if (y < 0 || x < 0) {
481       return 0;
482    } else {
483       va_list v;
484       va_start(v, fmt);
485       stbiw__writefv(s, fmt, v);
486       va_end(v);
487       stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono);
488       return 1;
489    }
490 }
491 
stbi_write_bmp_core(stbi__write_context * s,int x,int y,int comp,const void * data)492 static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data)
493 {
494    if (comp != 4) {
495       // write RGB bitmap
496       int pad = (-x*3) & 3;
497       return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad,
498               "11 4 22 4" "4 44 22 444444",
499               'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40,  // file header
500                40, x,y, 1,24, 0,0,0,0,0,0);             // bitmap header
501    } else {
502       // RGBA bitmaps need a v4 header
503       // use BI_BITFIELDS mode with 32bpp and alpha mask
504       // (straight BI_RGB with alpha mask doesn't work in most readers)
505       return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *)data,1,0,
506          "11 4 22 4" "4 44 22 444444 4444 4 444 444 444 444",
507          'B', 'M', 14+108+x*y*4, 0, 0, 14+108, // file header
508          108, x,y, 1,32, 3,0,0,0,0,0, 0xff0000,0xff00,0xff,0xff000000u, 0, 0,0,0, 0,0,0, 0,0,0, 0,0,0); // bitmap V4 header
509    }
510 }
511 
stbi_write_bmp_to_func(stbi_write_func * func,void * context,int x,int y,int comp,const void * data)512 STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data)
513 {
514    stbi__write_context s = { 0 };
515    stbi__start_write_callbacks(&s, func, context);
516    return stbi_write_bmp_core(&s, x, y, comp, data);
517 }
518 
519 #ifndef STBI_WRITE_NO_STDIO
stbi_write_bmp(char const * filename,int x,int y,int comp,const void * data)520 STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data)
521 {
522    stbi__write_context s = { 0 };
523    if (stbi__start_write_file(&s,filename)) {
524       int r = stbi_write_bmp_core(&s, x, y, comp, data);
525       stbi__end_write_file(&s);
526       return r;
527    } else
528       return 0;
529 }
530 #endif //!STBI_WRITE_NO_STDIO
531 
stbi_write_tga_core(stbi__write_context * s,int x,int y,int comp,void * data)532 static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data)
533 {
534    int has_alpha = (comp == 2 || comp == 4);
535    int colorbytes = has_alpha ? comp-1 : comp;
536    int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3
537 
538    if (y < 0 || x < 0)
539       return 0;
540 
541    if (!stbi_write_tga_with_rle) {
542       return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0,
543          "111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8);
544    } else {
545       int i,j,k;
546       int jend, jdir;
547 
548       stbiw__writef(s, "111 221 2222 11", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8);
549 
550       if (stbi__flip_vertically_on_write) {
551          j = 0;
552          jend = y;
553          jdir = 1;
554       } else {
555          j = y-1;
556          jend = -1;
557          jdir = -1;
558       }
559       for (; j != jend; j += jdir) {
560          unsigned char *row = (unsigned char *) data + j * x * comp;
561          int len;
562 
563          for (i = 0; i < x; i += len) {
564             unsigned char *begin = row + i * comp;
565             int diff = 1;
566             len = 1;
567 
568             if (i < x - 1) {
569                ++len;
570                diff = memcmp(begin, row + (i + 1) * comp, comp);
571                if (diff) {
572                   const unsigned char *prev = begin;
573                   for (k = i + 2; k < x && len < 128; ++k) {
574                      if (memcmp(prev, row + k * comp, comp)) {
575                         prev += comp;
576                         ++len;
577                      } else {
578                         --len;
579                         break;
580                      }
581                   }
582                } else {
583                   for (k = i + 2; k < x && len < 128; ++k) {
584                      if (!memcmp(begin, row + k * comp, comp)) {
585                         ++len;
586                      } else {
587                         break;
588                      }
589                   }
590                }
591             }
592 
593             if (diff) {
594                unsigned char header = STBIW_UCHAR(len - 1);
595                stbiw__write1(s, header);
596                for (k = 0; k < len; ++k) {
597                   stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp);
598                }
599             } else {
600                unsigned char header = STBIW_UCHAR(len - 129);
601                stbiw__write1(s, header);
602                stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin);
603             }
604          }
605       }
606       stbiw__write_flush(s);
607    }
608    return 1;
609 }
610 
stbi_write_tga_to_func(stbi_write_func * func,void * context,int x,int y,int comp,const void * data)611 STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data)
612 {
613    stbi__write_context s = { 0 };
614    stbi__start_write_callbacks(&s, func, context);
615    return stbi_write_tga_core(&s, x, y, comp, (void *) data);
616 }
617 
618 #ifndef STBI_WRITE_NO_STDIO
stbi_write_tga(char const * filename,int x,int y,int comp,const void * data)619 STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data)
620 {
621    stbi__write_context s = { 0 };
622    if (stbi__start_write_file(&s,filename)) {
623       int r = stbi_write_tga_core(&s, x, y, comp, (void *) data);
624       stbi__end_write_file(&s);
625       return r;
626    } else
627       return 0;
628 }
629 #endif
630 
631 // *************************************************************************************************
632 // Radiance RGBE HDR writer
633 // by Baldur Karlsson
634 
635 #define stbiw__max(a, b)  ((a) > (b) ? (a) : (b))
636 
637 #ifndef STBI_WRITE_NO_STDIO
638 
stbiw__linear_to_rgbe(unsigned char * rgbe,float * linear)639 static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear)
640 {
641    int exponent;
642    float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2]));
643 
644    if (maxcomp < 1e-32f) {
645       rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0;
646    } else {
647       float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp;
648 
649       rgbe[0] = (unsigned char)(linear[0] * normalize);
650       rgbe[1] = (unsigned char)(linear[1] * normalize);
651       rgbe[2] = (unsigned char)(linear[2] * normalize);
652       rgbe[3] = (unsigned char)(exponent + 128);
653    }
654 }
655 
stbiw__write_run_data(stbi__write_context * s,int length,unsigned char databyte)656 static void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte)
657 {
658    unsigned char lengthbyte = STBIW_UCHAR(length+128);
659    STBIW_ASSERT(length+128 <= 255);
660    s->func(s->context, &lengthbyte, 1);
661    s->func(s->context, &databyte, 1);
662 }
663 
stbiw__write_dump_data(stbi__write_context * s,int length,unsigned char * data)664 static void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data)
665 {
666    unsigned char lengthbyte = STBIW_UCHAR(length);
667    STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code
668    s->func(s->context, &lengthbyte, 1);
669    s->func(s->context, data, length);
670 }
671 
stbiw__write_hdr_scanline(stbi__write_context * s,int width,int ncomp,unsigned char * scratch,float * scanline)672 static void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline)
673 {
674    unsigned char scanlineheader[4] = { 2, 2, 0, 0 };
675    unsigned char rgbe[4];
676    float linear[3];
677    int x;
678 
679    scanlineheader[2] = (width&0xff00)>>8;
680    scanlineheader[3] = (width&0x00ff);
681 
682    /* skip RLE for images too small or large */
683    if (width < 8 || width >= 32768) {
684       for (x=0; x < width; x++) {
685          switch (ncomp) {
686             case 4: /* fallthrough */
687             case 3: linear[2] = scanline[x*ncomp + 2];
688                     linear[1] = scanline[x*ncomp + 1];
689                     linear[0] = scanline[x*ncomp + 0];
690                     break;
691             default:
692                     linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0];
693                     break;
694          }
695          stbiw__linear_to_rgbe(rgbe, linear);
696          s->func(s->context, rgbe, 4);
697       }
698    } else {
699       int c,r;
700       /* encode into scratch buffer */
701       for (x=0; x < width; x++) {
702          switch(ncomp) {
703             case 4: /* fallthrough */
704             case 3: linear[2] = scanline[x*ncomp + 2];
705                     linear[1] = scanline[x*ncomp + 1];
706                     linear[0] = scanline[x*ncomp + 0];
707                     break;
708             default:
709                     linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0];
710                     break;
711          }
712          stbiw__linear_to_rgbe(rgbe, linear);
713          scratch[x + width*0] = rgbe[0];
714          scratch[x + width*1] = rgbe[1];
715          scratch[x + width*2] = rgbe[2];
716          scratch[x + width*3] = rgbe[3];
717       }
718 
719       s->func(s->context, scanlineheader, 4);
720 
721       /* RLE each component separately */
722       for (c=0; c < 4; c++) {
723          unsigned char *comp = &scratch[width*c];
724 
725          x = 0;
726          while (x < width) {
727             // find first run
728             r = x;
729             while (r+2 < width) {
730                if (comp[r] == comp[r+1] && comp[r] == comp[r+2])
731                   break;
732                ++r;
733             }
734             if (r+2 >= width)
735                r = width;
736             // dump up to first run
737             while (x < r) {
738                int len = r-x;
739                if (len > 128) len = 128;
740                stbiw__write_dump_data(s, len, &comp[x]);
741                x += len;
742             }
743             // if there's a run, output it
744             if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd
745                // find next byte after run
746                while (r < width && comp[r] == comp[x])
747                   ++r;
748                // output run up to r
749                while (x < r) {
750                   int len = r-x;
751                   if (len > 127) len = 127;
752                   stbiw__write_run_data(s, len, comp[x]);
753                   x += len;
754                }
755             }
756          }
757       }
758    }
759 }
760 
stbi_write_hdr_core(stbi__write_context * s,int x,int y,int comp,float * data)761 static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data)
762 {
763    if (y <= 0 || x <= 0 || data == NULL)
764       return 0;
765    else {
766       // Each component is stored separately. Allocate scratch space for full output scanline.
767       unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4);
768       int i, len;
769       char buffer[128];
770       char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n";
771       s->func(s->context, header, sizeof(header)-1);
772 
773 #ifdef __STDC_LIB_EXT1__
774       len = sprintf_s(buffer, sizeof(buffer), "EXPOSURE=          1.0000000000000\n\n-Y %d +X %d\n", y, x);
775 #else
776       len = sprintf(buffer, "EXPOSURE=          1.0000000000000\n\n-Y %d +X %d\n", y, x);
777 #endif
778       s->func(s->context, buffer, len);
779 
780       for(i=0; i < y; i++)
781          stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i));
782       STBIW_FREE(scratch);
783       return 1;
784    }
785 }
786 
stbi_write_hdr_to_func(stbi_write_func * func,void * context,int x,int y,int comp,const float * data)787 STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data)
788 {
789    stbi__write_context s = { 0 };
790    stbi__start_write_callbacks(&s, func, context);
791    return stbi_write_hdr_core(&s, x, y, comp, (float *) data);
792 }
793 
stbi_write_hdr(char const * filename,int x,int y,int comp,const float * data)794 STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data)
795 {
796    stbi__write_context s = { 0 };
797    if (stbi__start_write_file(&s,filename)) {
798       int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data);
799       stbi__end_write_file(&s);
800       return r;
801    } else
802       return 0;
803 }
804 #endif // STBI_WRITE_NO_STDIO
805 
806 
807 //////////////////////////////////////////////////////////////////////////////
808 //
809 // PNG writer
810 //
811 
812 #ifndef STBIW_ZLIB_COMPRESS
813 // stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size()
814 #define stbiw__sbraw(a) ((int *) (void *) (a) - 2)
815 #define stbiw__sbm(a)   stbiw__sbraw(a)[0]
816 #define stbiw__sbn(a)   stbiw__sbraw(a)[1]
817 
818 #define stbiw__sbneedgrow(a,n)  ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a))
819 #define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0)
820 #define stbiw__sbgrow(a,n)  stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a)))
821 
822 #define stbiw__sbpush(a, v)      (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v))
823 #define stbiw__sbcount(a)        ((a) ? stbiw__sbn(a) : 0)
824 #define stbiw__sbfree(a)         ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0)
825 
stbiw__sbgrowf(void ** arr,int increment,int itemsize)826 static void *stbiw__sbgrowf(void **arr, int increment, int itemsize)
827 {
828    int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1;
829    void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2);
830    STBIW_ASSERT(p);
831    if (p) {
832       if (!*arr) ((int *) p)[1] = 0;
833       *arr = (void *) ((int *) p + 2);
834       stbiw__sbm(*arr) = m;
835    }
836    return *arr;
837 }
838 
stbiw__zlib_flushf(unsigned char * data,unsigned int * bitbuffer,int * bitcount)839 static unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount)
840 {
841    while (*bitcount >= 8) {
842       stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer));
843       *bitbuffer >>= 8;
844       *bitcount -= 8;
845    }
846    return data;
847 }
848 
stbiw__zlib_bitrev(int code,int codebits)849 static int stbiw__zlib_bitrev(int code, int codebits)
850 {
851    int res=0;
852    while (codebits--) {
853       res = (res << 1) | (code & 1);
854       code >>= 1;
855    }
856    return res;
857 }
858 
stbiw__zlib_countm(unsigned char * a,unsigned char * b,int limit)859 static unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit)
860 {
861    int i;
862    for (i=0; i < limit && i < 258; ++i)
863       if (a[i] != b[i]) break;
864    return i;
865 }
866 
stbiw__zhash(unsigned char * data)867 static unsigned int stbiw__zhash(unsigned char *data)
868 {
869    stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16);
870    hash ^= hash << 3;
871    hash += hash >> 5;
872    hash ^= hash << 4;
873    hash += hash >> 17;
874    hash ^= hash << 25;
875    hash += hash >> 6;
876    return hash;
877 }
878 
879 #define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount))
880 #define stbiw__zlib_add(code,codebits) \
881       (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush())
882 #define stbiw__zlib_huffa(b,c)  stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c)
883 // default huffman tables
884 #define stbiw__zlib_huff1(n)  stbiw__zlib_huffa(0x30 + (n), 8)
885 #define stbiw__zlib_huff2(n)  stbiw__zlib_huffa(0x190 + (n)-144, 9)
886 #define stbiw__zlib_huff3(n)  stbiw__zlib_huffa(0 + (n)-256,7)
887 #define stbiw__zlib_huff4(n)  stbiw__zlib_huffa(0xc0 + (n)-280,8)
888 #define stbiw__zlib_huff(n)  ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n))
889 #define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n))
890 
891 #define stbiw__ZHASH   16384
892 
893 #endif // STBIW_ZLIB_COMPRESS
894 
stbi_zlib_compress(unsigned char * data,int data_len,int * out_len,int quality)895 STBIWDEF unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality)
896 {
897 #ifdef STBIW_ZLIB_COMPRESS
898    // user provided a zlib compress implementation, use that
899    return STBIW_ZLIB_COMPRESS(data, data_len, out_len, quality);
900 #else // use builtin
901    static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 };
902    static unsigned char  lengtheb[]= { 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 };
903    static unsigned short distc[]   = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 };
904    static unsigned char  disteb[]  = { 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 };
905    unsigned int bitbuf=0;
906    int i,j, bitcount=0;
907    unsigned char *out = NULL;
908    unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(unsigned char**));
909    if (hash_table == NULL)
910       return NULL;
911    if (quality < 5) quality = 5;
912 
913    stbiw__sbpush(out, 0x78);   // DEFLATE 32K window
914    stbiw__sbpush(out, 0x5e);   // FLEVEL = 1
915    stbiw__zlib_add(1,1);  // BFINAL = 1
916    stbiw__zlib_add(1,2);  // BTYPE = 1 -- fixed huffman
917 
918    for (i=0; i < stbiw__ZHASH; ++i)
919       hash_table[i] = NULL;
920 
921    i=0;
922    while (i < data_len-3) {
923       // hash next 3 bytes of data to be compressed
924       int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3;
925       unsigned char *bestloc = 0;
926       unsigned char **hlist = hash_table[h];
927       int n = stbiw__sbcount(hlist);
928       for (j=0; j < n; ++j) {
929          if (hlist[j]-data > i-32768) { // if entry lies within window
930             int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i);
931             if (d >= best) { best=d; bestloc=hlist[j]; }
932          }
933       }
934       // when hash table entry is too long, delete half the entries
935       if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) {
936          STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality);
937          stbiw__sbn(hash_table[h]) = quality;
938       }
939       stbiw__sbpush(hash_table[h],data+i);
940 
941       if (bestloc) {
942          // "lazy matching" - check match at *next* byte, and if it's better, do cur byte as literal
943          h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1);
944          hlist = hash_table[h];
945          n = stbiw__sbcount(hlist);
946          for (j=0; j < n; ++j) {
947             if (hlist[j]-data > i-32767) {
948                int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1);
949                if (e > best) { // if next match is better, bail on current match
950                   bestloc = NULL;
951                   break;
952                }
953             }
954          }
955       }
956 
957       if (bestloc) {
958          int d = (int) (data+i - bestloc); // distance back
959          STBIW_ASSERT(d <= 32767 && best <= 258);
960          for (j=0; best > lengthc[j+1]-1; ++j);
961          stbiw__zlib_huff(j+257);
962          if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]);
963          for (j=0; d > distc[j+1]-1; ++j);
964          stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5);
965          if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]);
966          i += best;
967       } else {
968          stbiw__zlib_huffb(data[i]);
969          ++i;
970       }
971    }
972    // write out final bytes
973    for (;i < data_len; ++i)
974       stbiw__zlib_huffb(data[i]);
975    stbiw__zlib_huff(256); // end of block
976    // pad with 0 bits to byte boundary
977    while (bitcount)
978       stbiw__zlib_add(0,1);
979 
980    for (i=0; i < stbiw__ZHASH; ++i)
981       (void) stbiw__sbfree(hash_table[i]);
982    STBIW_FREE(hash_table);
983 
984    // store uncompressed instead if compression was worse
985    if (stbiw__sbn(out) > data_len + 2 + ((data_len+32766)/32767)*5) {
986       stbiw__sbn(out) = 2;  // truncate to DEFLATE 32K window and FLEVEL = 1
987       for (j = 0; j < data_len;) {
988          int blocklen = data_len - j;
989          if (blocklen > 32767) blocklen = 32767;
990          stbiw__sbpush(out, data_len - j == blocklen); // BFINAL = ?, BTYPE = 0 -- no compression
991          stbiw__sbpush(out, STBIW_UCHAR(blocklen)); // LEN
992          stbiw__sbpush(out, STBIW_UCHAR(blocklen >> 8));
993          stbiw__sbpush(out, STBIW_UCHAR(~blocklen)); // NLEN
994          stbiw__sbpush(out, STBIW_UCHAR(~blocklen >> 8));
995          memcpy(out+stbiw__sbn(out), data+j, blocklen);
996          stbiw__sbn(out) += blocklen;
997          j += blocklen;
998       }
999    }
1000 
1001    {
1002       // compute adler32 on input
1003       unsigned int s1=1, s2=0;
1004       int blocklen = (int) (data_len % 5552);
1005       j=0;
1006       while (j < data_len) {
1007          for (i=0; i < blocklen; ++i) { s1 += data[j+i]; s2 += s1; }
1008          s1 %= 65521; s2 %= 65521;
1009          j += blocklen;
1010          blocklen = 5552;
1011       }
1012       stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8));
1013       stbiw__sbpush(out, STBIW_UCHAR(s2));
1014       stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8));
1015       stbiw__sbpush(out, STBIW_UCHAR(s1));
1016    }
1017    *out_len = stbiw__sbn(out);
1018    // make returned pointer freeable
1019    STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len);
1020    return (unsigned char *) stbiw__sbraw(out);
1021 #endif // STBIW_ZLIB_COMPRESS
1022 }
1023 
stbiw__crc32(unsigned char * buffer,int len)1024 static unsigned int stbiw__crc32(unsigned char *buffer, int len)
1025 {
1026 #ifdef STBIW_CRC32
1027     return STBIW_CRC32(buffer, len);
1028 #else
1029    static unsigned int crc_table[256] =
1030    {
1031       0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
1032       0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
1033       0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
1034       0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
1035       0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
1036       0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
1037       0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
1038       0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
1039       0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
1040       0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
1041       0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
1042       0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
1043       0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
1044       0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
1045       0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
1046       0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
1047       0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
1048       0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
1049       0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
1050       0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
1051       0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
1052       0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
1053       0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
1054       0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
1055       0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
1056       0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
1057       0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
1058       0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
1059       0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
1060       0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
1061       0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
1062       0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
1063    };
1064 
1065    unsigned int crc = ~0u;
1066    int i;
1067    for (i=0; i < len; ++i)
1068       crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)];
1069    return ~crc;
1070 #endif
1071 }
1072 
1073 #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)
1074 #define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v));
1075 #define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3])
1076 
stbiw__wpcrc(unsigned char ** data,int len)1077 static void stbiw__wpcrc(unsigned char **data, int len)
1078 {
1079    unsigned int crc = stbiw__crc32(*data - len - 4, len+4);
1080    stbiw__wp32(*data, crc);
1081 }
1082 
stbiw__paeth(int a,int b,int c)1083 static unsigned char stbiw__paeth(int a, int b, int c)
1084 {
1085    int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c);
1086    if (pa <= pb && pa <= pc) return STBIW_UCHAR(a);
1087    if (pb <= pc) return STBIW_UCHAR(b);
1088    return STBIW_UCHAR(c);
1089 }
1090 
1091 // @OPTIMIZE: provide an option that always forces left-predict or paeth predict
stbiw__encode_png_line(unsigned char * pixels,int stride_bytes,int width,int height,int y,int n,int filter_type,signed char * line_buffer)1092 static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int width, int height, int y, int n, int filter_type, signed char *line_buffer)
1093 {
1094    static int mapping[] = { 0,1,2,3,4 };
1095    static int firstmap[] = { 0,1,0,5,6 };
1096    int *mymap = (y != 0) ? mapping : firstmap;
1097    int i;
1098    int type = mymap[filter_type];
1099    unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y);
1100    int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes;
1101 
1102    if (type==0) {
1103       memcpy(line_buffer, z, width*n);
1104       return;
1105    }
1106 
1107    // first loop isn't optimized since it's just one pixel
1108    for (i = 0; i < n; ++i) {
1109       switch (type) {
1110          case 1: line_buffer[i] = z[i]; break;
1111          case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break;
1112          case 3: line_buffer[i] = z[i] - (z[i-signed_stride]>>1); break;
1113          case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-signed_stride],0)); break;
1114          case 5: line_buffer[i] = z[i]; break;
1115          case 6: line_buffer[i] = z[i]; break;
1116       }
1117    }
1118    switch (type) {
1119       case 1: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-n]; break;
1120       case 2: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-signed_stride]; break;
1121       case 3: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break;
1122       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;
1123       case 5: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - (z[i-n]>>1); break;
1124       case 6: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break;
1125    }
1126 }
1127 
stbi_write_png_to_mem(const unsigned char * pixels,int stride_bytes,int x,int y,int n,int * out_len)1128 STBIWDEF unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len)
1129 {
1130    int force_filter = stbi_write_force_png_filter;
1131    int ctype[5] = { -1, 0, 4, 2, 6 };
1132    unsigned char sig[8] = { 137,80,78,71,13,10,26,10 };
1133    unsigned char *out,*o, *filt, *zlib;
1134    signed char *line_buffer;
1135    int j,zlen;
1136 
1137    if (stride_bytes == 0)
1138       stride_bytes = x * n;
1139 
1140    if (force_filter >= 5) {
1141       force_filter = -1;
1142    }
1143 
1144    filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0;
1145    line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; }
1146    for (j=0; j < y; ++j) {
1147       int filter_type;
1148       if (force_filter > -1) {
1149          filter_type = force_filter;
1150          stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, force_filter, line_buffer);
1151       } else { // Estimate the best filter by running through all of them:
1152          int best_filter = 0, best_filter_val = 0x7fffffff, est, i;
1153          for (filter_type = 0; filter_type < 5; filter_type++) {
1154             stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, filter_type, line_buffer);
1155 
1156             // Estimate the entropy of the line using this filter; the less, the better.
1157             est = 0;
1158             for (i = 0; i < x*n; ++i) {
1159                est += abs((signed char) line_buffer[i]);
1160             }
1161             if (est < best_filter_val) {
1162                best_filter_val = est;
1163                best_filter = filter_type;
1164             }
1165          }
1166          if (filter_type != best_filter) {  // If the last iteration already got us the best filter, don't redo it
1167             stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, best_filter, line_buffer);
1168             filter_type = best_filter;
1169          }
1170       }
1171       // when we get here, filter_type contains the filter type, and line_buffer contains the data
1172       filt[j*(x*n+1)] = (unsigned char) filter_type;
1173       STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n);
1174    }
1175    STBIW_FREE(line_buffer);
1176    zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, stbi_write_png_compression_level);
1177    STBIW_FREE(filt);
1178    if (!zlib) return 0;
1179 
1180    // each tag requires 12 bytes of overhead
1181    out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12);
1182    if (!out) return 0;
1183    *out_len = 8 + 12+13 + 12+zlen + 12;
1184 
1185    o=out;
1186    STBIW_MEMMOVE(o,sig,8); o+= 8;
1187    stbiw__wp32(o, 13); // header length
1188    stbiw__wptag(o, "IHDR");
1189    stbiw__wp32(o, x);
1190    stbiw__wp32(o, y);
1191    *o++ = 8;
1192    *o++ = STBIW_UCHAR(ctype[n]);
1193    *o++ = 0;
1194    *o++ = 0;
1195    *o++ = 0;
1196    stbiw__wpcrc(&o,13);
1197 
1198    stbiw__wp32(o, zlen);
1199    stbiw__wptag(o, "IDAT");
1200    STBIW_MEMMOVE(o, zlib, zlen);
1201    o += zlen;
1202    STBIW_FREE(zlib);
1203    stbiw__wpcrc(&o, zlen);
1204 
1205    stbiw__wp32(o,0);
1206    stbiw__wptag(o, "IEND");
1207    stbiw__wpcrc(&o,0);
1208 
1209    STBIW_ASSERT(o == out + *out_len);
1210 
1211    return out;
1212 }
1213 
1214 #ifndef STBI_WRITE_NO_STDIO
stbi_write_png(char const * filename,int x,int y,int comp,const void * data,int stride_bytes)1215 STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes)
1216 {
1217    FILE *f;
1218    int len;
1219    unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len);
1220    if (png == NULL) return 0;
1221 
1222    f = stbiw__fopen(filename, "wb");
1223    if (!f) { STBIW_FREE(png); return 0; }
1224    fwrite(png, 1, len, f);
1225    fclose(f);
1226    STBIW_FREE(png);
1227    return 1;
1228 }
1229 #endif
1230 
stbi_write_png_to_func(stbi_write_func * func,void * context,int x,int y,int comp,const void * data,int stride_bytes)1231 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)
1232 {
1233    int len;
1234    unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len);
1235    if (png == NULL) return 0;
1236    func(context, png, len);
1237    STBIW_FREE(png);
1238    return 1;
1239 }
1240 
1241 
1242 /* ***************************************************************************
1243  *
1244  * JPEG writer
1245  *
1246  * This is based on Jon Olick's jo_jpeg.cpp:
1247  * public domain Simple, Minimalistic JPEG writer - http://www.jonolick.com/code.html
1248  */
1249 
1250 static const unsigned char stbiw__jpg_ZigZag[] = { 0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,
1251       24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63 };
1252 
stbiw__jpg_writeBits(stbi__write_context * s,int * bitBufP,int * bitCntP,const unsigned short * bs)1253 static void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, int *bitCntP, const unsigned short *bs) {
1254    int bitBuf = *bitBufP, bitCnt = *bitCntP;
1255    bitCnt += bs[1];
1256    bitBuf |= bs[0] << (24 - bitCnt);
1257    while(bitCnt >= 8) {
1258       unsigned char c = (bitBuf >> 16) & 255;
1259       stbiw__putc(s, c);
1260       if(c == 255) {
1261          stbiw__putc(s, 0);
1262       }
1263       bitBuf <<= 8;
1264       bitCnt -= 8;
1265    }
1266    *bitBufP = bitBuf;
1267    *bitCntP = bitCnt;
1268 }
1269 
stbiw__jpg_DCT(float * d0p,float * d1p,float * d2p,float * d3p,float * d4p,float * d5p,float * d6p,float * d7p)1270 static void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3p, float *d4p, float *d5p, float *d6p, float *d7p) {
1271    float d0 = *d0p, d1 = *d1p, d2 = *d2p, d3 = *d3p, d4 = *d4p, d5 = *d5p, d6 = *d6p, d7 = *d7p;
1272    float z1, z2, z3, z4, z5, z11, z13;
1273 
1274    float tmp0 = d0 + d7;
1275    float tmp7 = d0 - d7;
1276    float tmp1 = d1 + d6;
1277    float tmp6 = d1 - d6;
1278    float tmp2 = d2 + d5;
1279    float tmp5 = d2 - d5;
1280    float tmp3 = d3 + d4;
1281    float tmp4 = d3 - d4;
1282 
1283    // Even part
1284    float tmp10 = tmp0 + tmp3;   // phase 2
1285    float tmp13 = tmp0 - tmp3;
1286    float tmp11 = tmp1 + tmp2;
1287    float tmp12 = tmp1 - tmp2;
1288 
1289    d0 = tmp10 + tmp11;       // phase 3
1290    d4 = tmp10 - tmp11;
1291 
1292    z1 = (tmp12 + tmp13) * 0.707106781f; // c4
1293    d2 = tmp13 + z1;       // phase 5
1294    d6 = tmp13 - z1;
1295 
1296    // Odd part
1297    tmp10 = tmp4 + tmp5;       // phase 2
1298    tmp11 = tmp5 + tmp6;
1299    tmp12 = tmp6 + tmp7;
1300 
1301    // The rotator is modified from fig 4-8 to avoid extra negations.
1302    z5 = (tmp10 - tmp12) * 0.382683433f; // c6
1303    z2 = tmp10 * 0.541196100f + z5; // c2-c6
1304    z4 = tmp12 * 1.306562965f + z5; // c2+c6
1305    z3 = tmp11 * 0.707106781f; // c4
1306 
1307    z11 = tmp7 + z3;      // phase 5
1308    z13 = tmp7 - z3;
1309 
1310    *d5p = z13 + z2;         // phase 6
1311    *d3p = z13 - z2;
1312    *d1p = z11 + z4;
1313    *d7p = z11 - z4;
1314 
1315    *d0p = d0;  *d2p = d2;  *d4p = d4;  *d6p = d6;
1316 }
1317 
stbiw__jpg_calcBits(int val,unsigned short bits[2])1318 static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) {
1319    int tmp1 = val < 0 ? -val : val;
1320    val = val < 0 ? val-1 : val;
1321    bits[1] = 1;
1322    while(tmp1 >>= 1) {
1323       ++bits[1];
1324    }
1325    bits[0] = val & ((1<<bits[1])-1);
1326 }
1327 
stbiw__jpg_processDU(stbi__write_context * s,int * bitBuf,int * bitCnt,float * CDU,int du_stride,float * fdtbl,int DC,const unsigned short HTDC[256][2],const unsigned short HTAC[256][2])1328 static int stbiw__jpg_processDU(stbi__write_context *s, int *bitBuf, int *bitCnt, float *CDU, int du_stride, float *fdtbl, int DC, const unsigned short HTDC[256][2], const unsigned short HTAC[256][2]) {
1329    const unsigned short EOB[2] = { HTAC[0x00][0], HTAC[0x00][1] };
1330    const unsigned short M16zeroes[2] = { HTAC[0xF0][0], HTAC[0xF0][1] };
1331    int dataOff, i, j, n, diff, end0pos, x, y;
1332    int DU[64];
1333 
1334    // DCT rows
1335    for(dataOff=0, n=du_stride*8; dataOff<n; dataOff+=du_stride) {
1336       stbiw__jpg_DCT(&CDU[dataOff], &CDU[dataOff+1], &CDU[dataOff+2], &CDU[dataOff+3], &CDU[dataOff+4], &CDU[dataOff+5], &CDU[dataOff+6], &CDU[dataOff+7]);
1337    }
1338    // DCT columns
1339    for(dataOff=0; dataOff<8; ++dataOff) {
1340       stbiw__jpg_DCT(&CDU[dataOff], &CDU[dataOff+du_stride], &CDU[dataOff+du_stride*2], &CDU[dataOff+du_stride*3], &CDU[dataOff+du_stride*4],
1341                      &CDU[dataOff+du_stride*5], &CDU[dataOff+du_stride*6], &CDU[dataOff+du_stride*7]);
1342    }
1343    // Quantize/descale/zigzag the coefficients
1344    for(y = 0, j=0; y < 8; ++y) {
1345       for(x = 0; x < 8; ++x,++j) {
1346          float v;
1347          i = y*du_stride+x;
1348          v = CDU[i]*fdtbl[j];
1349          // DU[stbiw__jpg_ZigZag[j]] = (int)(v < 0 ? ceilf(v - 0.5f) : floorf(v + 0.5f));
1350          // ceilf() and floorf() are C99, not C89, but I /think/ they're not needed here anyway?
1351          DU[stbiw__jpg_ZigZag[j]] = (int)(v < 0 ? v - 0.5f : v + 0.5f);
1352       }
1353    }
1354 
1355    // Encode DC
1356    diff = DU[0] - DC;
1357    if (diff == 0) {
1358       stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTDC[0]);
1359    } else {
1360       unsigned short bits[2];
1361       stbiw__jpg_calcBits(diff, bits);
1362       stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTDC[bits[1]]);
1363       stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits);
1364    }
1365    // Encode ACs
1366    end0pos = 63;
1367    for(; (end0pos>0)&&(DU[end0pos]==0); --end0pos) {
1368    }
1369    // end0pos = first element in reverse order !=0
1370    if(end0pos == 0) {
1371       stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB);
1372       return DU[0];
1373    }
1374    for(i = 1; i <= end0pos; ++i) {
1375       int startpos = i;
1376       int nrzeroes;
1377       unsigned short bits[2];
1378       for (; DU[i]==0 && i<=end0pos; ++i) {
1379       }
1380       nrzeroes = i-startpos;
1381       if ( nrzeroes >= 16 ) {
1382          int lng = nrzeroes>>4;
1383          int nrmarker;
1384          for (nrmarker=1; nrmarker <= lng; ++nrmarker)
1385             stbiw__jpg_writeBits(s, bitBuf, bitCnt, M16zeroes);
1386          nrzeroes &= 15;
1387       }
1388       stbiw__jpg_calcBits(DU[i], bits);
1389       stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTAC[(nrzeroes<<4)+bits[1]]);
1390       stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits);
1391    }
1392    if(end0pos != 63) {
1393       stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB);
1394    }
1395    return DU[0];
1396 }
1397 
stbi_write_jpg_core(stbi__write_context * s,int width,int height,int comp,const void * data,int quality)1398 static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, int comp, const void* data, int quality) {
1399    // Constants that don't pollute global namespace
1400    static const unsigned char std_dc_luminance_nrcodes[] = {0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0};
1401    static const unsigned char std_dc_luminance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11};
1402    static const unsigned char std_ac_luminance_nrcodes[] = {0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d};
1403    static const unsigned char std_ac_luminance_values[] = {
1404       0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
1405       0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
1406       0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
1407       0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
1408       0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
1409       0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
1410       0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa
1411    };
1412    static const unsigned char std_dc_chrominance_nrcodes[] = {0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0};
1413    static const unsigned char std_dc_chrominance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11};
1414    static const unsigned char std_ac_chrominance_nrcodes[] = {0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77};
1415    static const unsigned char std_ac_chrominance_values[] = {
1416       0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
1417       0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
1418       0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
1419       0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
1420       0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
1421       0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
1422       0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa
1423    };
1424    // Huffman tables
1425    static const unsigned short YDC_HT[256][2] = { {0,2},{2,3},{3,3},{4,3},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9}};
1426    static const unsigned short UVDC_HT[256][2] = { {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9},{1022,10},{2046,11}};
1427    static const unsigned short YAC_HT[256][2] = {
1428       {10,4},{0,2},{1,2},{4,3},{11,4},{26,5},{120,7},{248,8},{1014,10},{65410,16},{65411,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1429       {12,4},{27,5},{121,7},{502,9},{2038,11},{65412,16},{65413,16},{65414,16},{65415,16},{65416,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1430       {28,5},{249,8},{1015,10},{4084,12},{65417,16},{65418,16},{65419,16},{65420,16},{65421,16},{65422,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1431       {58,6},{503,9},{4085,12},{65423,16},{65424,16},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1432       {59,6},{1016,10},{65430,16},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1433       {122,7},{2039,11},{65438,16},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1434       {123,7},{4086,12},{65446,16},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1435       {250,8},{4087,12},{65454,16},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1436       {504,9},{32704,15},{65462,16},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1437       {505,9},{65470,16},{65471,16},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1438       {506,9},{65479,16},{65480,16},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1439       {1017,10},{65488,16},{65489,16},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1440       {1018,10},{65497,16},{65498,16},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1441       {2040,11},{65506,16},{65507,16},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1442       {65515,16},{65516,16},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{0,0},{0,0},{0,0},{0,0},{0,0},
1443       {2041,11},{65525,16},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0}
1444    };
1445    static const unsigned short UVAC_HT[256][2] = {
1446       {0,2},{1,2},{4,3},{10,4},{24,5},{25,5},{56,6},{120,7},{500,9},{1014,10},{4084,12},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1447       {11,4},{57,6},{246,8},{501,9},{2038,11},{4085,12},{65416,16},{65417,16},{65418,16},{65419,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1448       {26,5},{247,8},{1015,10},{4086,12},{32706,15},{65420,16},{65421,16},{65422,16},{65423,16},{65424,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1449       {27,5},{248,8},{1016,10},{4087,12},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{65430,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1450       {58,6},{502,9},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{65438,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1451       {59,6},{1017,10},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{65446,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1452       {121,7},{2039,11},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{65454,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1453       {122,7},{2040,11},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{65462,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1454       {249,8},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{65470,16},{65471,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1455       {503,9},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{65479,16},{65480,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1456       {504,9},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{65488,16},{65489,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1457       {505,9},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{65497,16},{65498,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1458       {506,9},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{65506,16},{65507,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1459       {2041,11},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{65515,16},{65516,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
1460       {16352,14},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{65525,16},{0,0},{0,0},{0,0},{0,0},{0,0},
1461       {1018,10},{32707,15},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0}
1462    };
1463    static const int YQT[] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,
1464                              37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99};
1465    static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,
1466                               99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99};
1467    static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f,
1468                                  1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f };
1469 
1470    int row, col, i, k, subsample;
1471    float fdtbl_Y[64], fdtbl_UV[64];
1472    unsigned char YTable[64], UVTable[64];
1473 
1474    if(!data || !width || !height || comp > 4 || comp < 1) {
1475       return 0;
1476    }
1477 
1478    quality = quality ? quality : 90;
1479    subsample = quality <= 90 ? 1 : 0;
1480    quality = quality < 1 ? 1 : quality > 100 ? 100 : quality;
1481    quality = quality < 50 ? 5000 / quality : 200 - quality * 2;
1482 
1483    for(i = 0; i < 64; ++i) {
1484       int uvti, yti = (YQT[i]*quality+50)/100;
1485       YTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (yti < 1 ? 1 : yti > 255 ? 255 : yti);
1486       uvti = (UVQT[i]*quality+50)/100;
1487       UVTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (uvti < 1 ? 1 : uvti > 255 ? 255 : uvti);
1488    }
1489 
1490    for(row = 0, k = 0; row < 8; ++row) {
1491       for(col = 0; col < 8; ++col, ++k) {
1492          fdtbl_Y[k]  = 1 / (YTable [stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]);
1493          fdtbl_UV[k] = 1 / (UVTable[stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]);
1494       }
1495    }
1496 
1497    // Write Headers
1498    {
1499       static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 };
1500       static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 };
1501       const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width),
1502                                       3,1,(unsigned char)(subsample?0x22:0x11),0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 };
1503       s->func(s->context, (void*)head0, sizeof(head0));
1504       s->func(s->context, (void*)YTable, sizeof(YTable));
1505       stbiw__putc(s, 1);
1506       s->func(s->context, UVTable, sizeof(UVTable));
1507       s->func(s->context, (void*)head1, sizeof(head1));
1508       s->func(s->context, (void*)(std_dc_luminance_nrcodes+1), sizeof(std_dc_luminance_nrcodes)-1);
1509       s->func(s->context, (void*)std_dc_luminance_values, sizeof(std_dc_luminance_values));
1510       stbiw__putc(s, 0x10); // HTYACinfo
1511       s->func(s->context, (void*)(std_ac_luminance_nrcodes+1), sizeof(std_ac_luminance_nrcodes)-1);
1512       s->func(s->context, (void*)std_ac_luminance_values, sizeof(std_ac_luminance_values));
1513       stbiw__putc(s, 1); // HTUDCinfo
1514       s->func(s->context, (void*)(std_dc_chrominance_nrcodes+1), sizeof(std_dc_chrominance_nrcodes)-1);
1515       s->func(s->context, (void*)std_dc_chrominance_values, sizeof(std_dc_chrominance_values));
1516       stbiw__putc(s, 0x11); // HTUACinfo
1517       s->func(s->context, (void*)(std_ac_chrominance_nrcodes+1), sizeof(std_ac_chrominance_nrcodes)-1);
1518       s->func(s->context, (void*)std_ac_chrominance_values, sizeof(std_ac_chrominance_values));
1519       s->func(s->context, (void*)head2, sizeof(head2));
1520    }
1521 
1522    // Encode 8x8 macroblocks
1523    {
1524       static const unsigned short fillBits[] = {0x7F, 7};
1525       int DCY=0, DCU=0, DCV=0;
1526       int bitBuf=0, bitCnt=0;
1527       // comp == 2 is grey+alpha (alpha is ignored)
1528       int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0;
1529       const unsigned char *dataR = (const unsigned char *)data;
1530       const unsigned char *dataG = dataR + ofsG;
1531       const unsigned char *dataB = dataR + ofsB;
1532       int x, y, pos;
1533       if(subsample) {
1534          for(y = 0; y < height; y += 16) {
1535             for(x = 0; x < width; x += 16) {
1536                float Y[256], U[256], V[256];
1537                for(row = y, pos = 0; row < y+16; ++row) {
1538                   // row >= height => use last input row
1539                   int clamped_row = (row < height) ? row : height - 1;
1540                   int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp;
1541                   for(col = x; col < x+16; ++col, ++pos) {
1542                      // if col >= width => use pixel from last input column
1543                      int p = base_p + ((col < width) ? col : (width-1))*comp;
1544                      float r = dataR[p], g = dataG[p], b = dataB[p];
1545                      Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128;
1546                      U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b;
1547                      V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b;
1548                   }
1549                }
1550                DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+0,   16, fdtbl_Y, DCY, YDC_HT, YAC_HT);
1551                DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+8,   16, fdtbl_Y, DCY, YDC_HT, YAC_HT);
1552                DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+128, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT);
1553                DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+136, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT);
1554 
1555                // subsample U,V
1556                {
1557                   float subU[64], subV[64];
1558                   int yy, xx;
1559                   for(yy = 0, pos = 0; yy < 8; ++yy) {
1560                      for(xx = 0; xx < 8; ++xx, ++pos) {
1561                         int j = yy*32+xx*2;
1562                         subU[pos] = (U[j+0] + U[j+1] + U[j+16] + U[j+17]) * 0.25f;
1563                         subV[pos] = (V[j+0] + V[j+1] + V[j+16] + V[j+17]) * 0.25f;
1564                      }
1565                   }
1566                   DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subU, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
1567                   DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subV, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
1568                }
1569             }
1570          }
1571       } else {
1572          for(y = 0; y < height; y += 8) {
1573             for(x = 0; x < width; x += 8) {
1574                float Y[64], U[64], V[64];
1575                for(row = y, pos = 0; row < y+8; ++row) {
1576                   // row >= height => use last input row
1577                   int clamped_row = (row < height) ? row : height - 1;
1578                   int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp;
1579                   for(col = x; col < x+8; ++col, ++pos) {
1580                      // if col >= width => use pixel from last input column
1581                      int p = base_p + ((col < width) ? col : (width-1))*comp;
1582                      float r = dataR[p], g = dataG[p], b = dataB[p];
1583                      Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128;
1584                      U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b;
1585                      V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b;
1586                   }
1587                }
1588 
1589                DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y, 8, fdtbl_Y,  DCY, YDC_HT, YAC_HT);
1590                DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, U, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
1591                DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, V, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
1592             }
1593          }
1594       }
1595 
1596       // Do the bit alignment of the EOI marker
1597       stbiw__jpg_writeBits(s, &bitBuf, &bitCnt, fillBits);
1598    }
1599 
1600    // EOI
1601    stbiw__putc(s, 0xFF);
1602    stbiw__putc(s, 0xD9);
1603 
1604    return 1;
1605 }
1606 
stbi_write_jpg_to_func(stbi_write_func * func,void * context,int x,int y,int comp,const void * data,int quality)1607 STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality)
1608 {
1609    stbi__write_context s = { 0 };
1610    stbi__start_write_callbacks(&s, func, context);
1611    return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality);
1612 }
1613 
1614 
1615 #ifndef STBI_WRITE_NO_STDIO
stbi_write_jpg(char const * filename,int x,int y,int comp,const void * data,int quality)1616 STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality)
1617 {
1618    stbi__write_context s = { 0 };
1619    if (stbi__start_write_file(&s,filename)) {
1620       int r = stbi_write_jpg_core(&s, x, y, comp, data, quality);
1621       stbi__end_write_file(&s);
1622       return r;
1623    } else
1624       return 0;
1625 }
1626 #endif
1627 
1628 #endif // STB_IMAGE_WRITE_IMPLEMENTATION
1629 
1630 /* Revision history
1631       1.16  (2021-07-11)
1632              make Deflate code emit uncompressed blocks when it would otherwise expand
1633              support writing BMPs with alpha channel
1634       1.15  (2020-07-13) unknown
1635       1.14  (2020-02-02) updated JPEG writer to downsample chroma channels
1636       1.13
1637       1.12
1638       1.11  (2019-08-11)
1639 
1640       1.10  (2019-02-07)
1641              support utf8 filenames in Windows; fix warnings and platform ifdefs
1642       1.09  (2018-02-11)
1643              fix typo in zlib quality API, improve STB_I_W_STATIC in C++
1644       1.08  (2018-01-29)
1645              add stbi__flip_vertically_on_write, external zlib, zlib quality, choose PNG filter
1646       1.07  (2017-07-24)
1647              doc fix
1648       1.06 (2017-07-23)
1649              writing JPEG (using Jon Olick's code)
1650       1.05   ???
1651       1.04 (2017-03-03)
1652              monochrome BMP expansion
1653       1.03   ???
1654       1.02 (2016-04-02)
1655              avoid allocating large structures on the stack
1656       1.01 (2016-01-16)
1657              STBIW_REALLOC_SIZED: support allocators with no realloc support
1658              avoid race-condition in crc initialization
1659              minor compile issues
1660       1.00 (2015-09-14)
1661              installable file IO function
1662       0.99 (2015-09-13)
1663              warning fixes; TGA rle support
1664       0.98 (2015-04-08)
1665              added STBIW_MALLOC, STBIW_ASSERT etc
1666       0.97 (2015-01-18)
1667              fixed HDR asserts, rewrote HDR rle logic
1668       0.96 (2015-01-17)
1669              add HDR output
1670              fix monochrome BMP
1671       0.95 (2014-08-17)
1672              add monochrome TGA output
1673       0.94 (2014-05-31)
1674              rename private functions to avoid conflicts with stb_image.h
1675       0.93 (2014-05-27)
1676              warning fixes
1677       0.92 (2010-08-01)
1678              casts to unsigned char to fix warnings
1679       0.91 (2010-07-17)
1680              first public release
1681       0.90   first internal release
1682 */
1683 
1684 /*
1685 ------------------------------------------------------------------------------
1686 This software is available under 2 licenses -- choose whichever you prefer.
1687 ------------------------------------------------------------------------------
1688 ALTERNATIVE A - MIT License
1689 Copyright (c) 2017 Sean Barrett
1690 Permission is hereby granted, free of charge, to any person obtaining a copy of
1691 this software and associated documentation files (the "Software"), to deal in
1692 the Software without restriction, including without limitation the rights to
1693 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
1694 of the Software, and to permit persons to whom the Software is furnished to do
1695 so, subject to the following conditions:
1696 The above copyright notice and this permission notice shall be included in all
1697 copies or substantial portions of the Software.
1698 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1699 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1700 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1701 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1702 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1703 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1704 SOFTWARE.
1705 ------------------------------------------------------------------------------
1706 ALTERNATIVE B - Public Domain (www.unlicense.org)
1707 This is free and unencumbered software released into the public domain.
1708 Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
1709 software, either in source code form or as a compiled binary, for any purpose,
1710 commercial or non-commercial, and by any means.
1711 In jurisdictions that recognize copyright laws, the author or authors of this
1712 software dedicate any and all copyright interest in the software to the public
1713 domain. We make this dedication for the benefit of the public at large and to
1714 the detriment of our heirs and successors. We intend this dedication to be an
1715 overt act of relinquishment in perpetuity of all present and future rights to
1716 this software under copyright law.
1717 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1718 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1719 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1720 AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
1721 ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
1722 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1723 ------------------------------------------------------------------------------
1724 */
1725