github.com/Konstantin8105/c4go@v0.0.0-20240505174241-768bb1c65a51/tests/raylib/external/stb_image_write.h (about)

     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  
   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
   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  
   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  
   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  
   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  
   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  
   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  
   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  
   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  
   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  
   394  static void stbiw__putc(stbi__write_context *s, unsigned char c)
   395  {
   396     s->func(s->context, &c, 1);
   397  }
   398  
   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  
   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  
   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  
   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  
   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  
   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  
   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
   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  
   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  
   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
   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  
   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  
   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  
   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  
   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  
   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  
   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  
   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  
   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  
   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  
   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  
   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  
   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  
   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  
  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  
  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  
  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
  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  
  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
  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  
  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  
  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  
  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  
  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  
  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  
  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  
  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
  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  */