forked from eden-emu/eden
		
	
		
			
	
	
		
			773 lines
		
	
	
	
		
			36 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			773 lines
		
	
	
	
		
			36 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|   | // SPDX-FileCopyrightText: stb http://nothings.org/stb
 | ||
|  | // SPDX-License-Identifier: MIT
 | ||
|  | 
 | ||
|  | /* stb_image - v2.28 - public domain image loader - http://nothings.org/stb
 | ||
|  |                                   no warranty implied; use at your own risk | ||
|  | 
 | ||
|  |    Do this: | ||
|  |       #define STB_IMAGE_IMPLEMENTATION
 | ||
|  |    before you include this file in *one* C or C++ file to create the implementation. | ||
|  | 
 | ||
|  |    // i.e. it should look like this:
 | ||
|  |    #include ...
 | ||
|  |    #include ...
 | ||
|  |    #include ...
 | ||
|  |    #define STB_IMAGE_IMPLEMENTATION
 | ||
|  |    #include "stb_image.h"
 | ||
|  | 
 | ||
|  |    You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. | ||
|  |    And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free | ||
|  | 
 | ||
|  | 
 | ||
|  |    QUICK NOTES: | ||
|  |       Primarily of interest to game developers and other people who can | ||
|  |           avoid problematic images and only need the trivial interface | ||
|  | 
 | ||
|  |       JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) | ||
|  |       PNG 1/2/4/8/16-bit-per-channel | ||
|  | 
 | ||
|  |       TGA (not sure what subset, if a subset) | ||
|  |       BMP non-1bpp, non-RLE | ||
|  |       PSD (composited view only, no extra channels, 8/16 bit-per-channel) | ||
|  | 
 | ||
|  |       GIF (*comp always reports as 4-channel) | ||
|  |       HDR (radiance rgbE format) | ||
|  |       PIC (Softimage PIC) | ||
|  |       PNM (PPM and PGM binary only) | ||
|  | 
 | ||
|  |       Animated GIF still needs a proper API, but here's one way to do it: | ||
|  |           http://gist.github.com/urraka/685d9a6340b26b830d49
 | ||
|  | 
 | ||
|  |       - decode from memory or through FILE (define STBI_NO_STDIO to remove code) | ||
|  |       - decode from arbitrary I/O callbacks | ||
|  |       - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) | ||
|  | 
 | ||
|  |    Full documentation under "DOCUMENTATION" below. | ||
|  | 
 | ||
|  | 
 | ||
|  | LICENSE | ||
|  | 
 | ||
|  |   See end of file for license information. | ||
|  | 
 | ||
|  | RECENT REVISION HISTORY: | ||
|  | 
 | ||
|  |       2.28  (2023-01-29) many error fixes, security errors, just tons of stuff | ||
|  |       2.27  (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes | ||
|  |       2.26  (2020-07-13) many minor fixes | ||
|  |       2.25  (2020-02-02) fix warnings | ||
|  |       2.24  (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically | ||
|  |       2.23  (2019-08-11) fix clang static analysis warning | ||
|  |       2.22  (2019-03-04) gif fixes, fix warnings | ||
|  |       2.21  (2019-02-25) fix typo in comment | ||
|  |       2.20  (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs | ||
|  |       2.19  (2018-02-11) fix warning | ||
|  |       2.18  (2018-01-30) fix warnings | ||
|  |       2.17  (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings | ||
|  |       2.16  (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes | ||
|  |       2.15  (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC | ||
|  |       2.14  (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs | ||
|  |       2.13  (2016-12-04) experimental 16-bit API, only for PNG so far; fixes | ||
|  |       2.12  (2016-04-02) fix typo in 2.11 PSD fix that caused crashes | ||
|  |       2.11  (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 | ||
|  |                          RGB-format JPEG; remove white matting in PSD; | ||
|  |                          allocate large structures on the stack; | ||
|  |                          correct channel count for PNG & BMP | ||
|  |       2.10  (2016-01-22) avoid warning introduced in 2.09 | ||
|  |       2.09  (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED | ||
|  | 
 | ||
|  |    See end of file for full revision history. | ||
|  | 
 | ||
|  | 
 | ||
|  |  ============================    Contributors    ========================= | ||
|  | 
 | ||
|  |  Image formats                          Extensions, features | ||
|  |     Sean Barrett (jpeg, png, bmp)          Jetro Lauha (stbi_info) | ||
|  |     Nicolas Schulz (hdr, psd)              Martin "SpartanJ" Golini (stbi_info) | ||
|  |     Jonathan Dummer (tga)                  James "moose2000" Brown (iPhone PNG) | ||
|  |     Jean-Marc Lienher (gif)                Ben "Disch" Wenger (io callbacks) | ||
|  |     Tom Seddon (pic)                       Omar Cornut (1/2/4-bit PNG) | ||
|  |     Thatcher Ulrich (psd)                  Nicolas Guillemot (vertical flip) | ||
|  |     Ken Miller (pgm, ppm)                  Richard Mitton (16-bit PSD) | ||
|  |     github:urraka (animated gif)           Junggon Kim (PNM comments) | ||
|  |     Christopher Forseth (animated gif)     Daniel Gibson (16-bit TGA) | ||
|  |                                            socks-the-fox (16-bit PNG) | ||
|  |                                            Jeremy Sawicki (handle all ImageNet JPGs) | ||
|  |  Optimizations & bugfixes                  Mikhail Morozov (1-bit BMP) | ||
|  |     Fabian "ryg" Giesen                    Anael Seghezzi (is-16-bit query) | ||
|  |     Arseny Kapoulkine                      Simon Breuss (16-bit PNM) | ||
|  |     John-Mark Allen | ||
|  |     Carmelo J Fdez-Aguera | ||
|  | 
 | ||
|  |  Bug & warning fixes | ||
|  |     Marc LeBlanc            David Woo          Guillaume George     Martins Mozeiko | ||
|  |     Christpher Lloyd        Jerry Jansson      Joseph Thomson       Blazej Dariusz Roszkowski | ||
|  |     Phil Jordan                                Dave Moore           Roy Eltham | ||
|  |     Hayaki Saito            Nathan Reed        Won Chun | ||
|  |     Luke Graham             Johan Duparc       Nick Verigakis       the Horde3D community | ||
|  |     Thomas Ruf              Ronny Chevalier                         github:rlyeh | ||
|  |     Janez Zemva             John Bartholomew   Michal Cichon        github:romigrou | ||
|  |     Jonathan Blow           Ken Hamada         Tero Hanninen        github:svdijk | ||
|  |     Eugene Golushkov        Laurent Gomila     Cort Stratton        github:snagar | ||
|  |     Aruelien Pocheville     Sergio Gonzalez    Thibault Reuille     github:Zelex | ||
|  |     Cass Everitt            Ryamond Barbiero                        github:grim210 | ||
|  |     Paul Du Bois            Engin Manap        Aldo Culquicondor    github:sammyhw | ||
|  |     Philipp Wiesemann       Dale Weiler        Oriol Ferrer Mesia   github:phprus | ||
|  |     Josh Tobin              Neil Bickford      Matthew Gregan       github:poppolopoppo | ||
|  |     Julian Raschke          Gregory Mullen     Christian Floisand   github:darealshinji | ||
|  |     Baldur Karlsson         Kevin Schmidt      JR Smith             github:Michaelangel007 | ||
|  |                             Brad Weinberger    Matvey Cherevko      github:mosra | ||
|  |     Luca Sas                Alexander Veselov  Zack Middleton       [reserved] | ||
|  |     Ryan C. Gordon          [reserved]                              [reserved] | ||
|  |                      DO NOT ADD YOUR NAME HERE | ||
|  | 
 | ||
|  |                      Jacko Dirks | ||
|  | 
 | ||
|  |   To add your name to the credits, pick a random blank space in the middle and fill it. | ||
|  |   80% of merge conflicts on stb PRs are due to people adding their name at the end | ||
|  |   of the credits. | ||
|  | */ | ||
|  | 
 | ||
|  | #ifndef STBI_INCLUDE_STB_IMAGE_H
 | ||
|  | #define STBI_INCLUDE_STB_IMAGE_H
 | ||
|  | 
 | ||
|  | // DOCUMENTATION
 | ||
|  | //
 | ||
|  | // Limitations:
 | ||
|  | //    - no 12-bit-per-channel JPEG
 | ||
|  | //    - no JPEGs with arithmetic coding
 | ||
|  | //    - GIF always returns *comp=4
 | ||
|  | //
 | ||
|  | // Basic usage (see HDR discussion below for HDR usage):
 | ||
|  | //    int x,y,n;
 | ||
|  | //    unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
 | ||
|  | //    // ... process data if not NULL ...
 | ||
|  | //    // ... x = width, y = height, n = # 8-bit components per pixel ...
 | ||
|  | //    // ... replace '0' with '1'..'4' to force that many components per pixel
 | ||
|  | //    // ... but 'n' will always be the number that it would have been if you said 0
 | ||
|  | //    stbi_image_free(data);
 | ||
|  | //
 | ||
|  | // Standard parameters:
 | ||
|  | //    int *x                 -- outputs image width in pixels
 | ||
|  | //    int *y                 -- outputs image height in pixels
 | ||
|  | //    int *channels_in_file  -- outputs # of image components in image file
 | ||
|  | //    int desired_channels   -- if non-zero, # of image components requested in result
 | ||
|  | //
 | ||
|  | // The return value from an image loader is an 'unsigned char *' which points
 | ||
|  | // to the pixel data, or NULL on an allocation failure or if the image is
 | ||
|  | // corrupt or invalid. The pixel data consists of *y scanlines of *x pixels,
 | ||
|  | // with each pixel consisting of N interleaved 8-bit components; the first
 | ||
|  | // pixel pointed to is top-left-most in the image. There is no padding between
 | ||
|  | // image scanlines or between pixels, regardless of format. The number of
 | ||
|  | // components N is 'desired_channels' if desired_channels is non-zero, or
 | ||
|  | // *channels_in_file otherwise. If desired_channels is non-zero,
 | ||
|  | // *channels_in_file has the number of components that _would_ have been
 | ||
|  | // output otherwise. E.g. if you set desired_channels to 4, you will always
 | ||
|  | // get RGBA output, but you can check *channels_in_file to see if it's trivially
 | ||
|  | // opaque because e.g. there were only 3 channels in the source image.
 | ||
|  | //
 | ||
|  | // An output image with N components has the following components interleaved
 | ||
|  | // in this order in each pixel:
 | ||
|  | //
 | ||
|  | //     N=#comp     components
 | ||
|  | //       1           grey
 | ||
|  | //       2           grey, alpha
 | ||
|  | //       3           red, green, blue
 | ||
|  | //       4           red, green, blue, alpha
 | ||
|  | //
 | ||
|  | // If image loading fails for any reason, the return value will be NULL,
 | ||
|  | // and *x, *y, *channels_in_file will be unchanged. The function
 | ||
|  | // stbi_failure_reason() can be queried for an extremely brief, end-user
 | ||
|  | // unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS
 | ||
|  | // to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly
 | ||
|  | // more user-friendly ones.
 | ||
|  | //
 | ||
|  | // Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.
 | ||
|  | //
 | ||
|  | // To query the width, height and component count of an image without having to
 | ||
|  | // decode the full file, you can use the stbi_info family of functions:
 | ||
|  | //
 | ||
|  | //   int x,y,n,ok;
 | ||
|  | //   ok = stbi_info(filename, &x, &y, &n);
 | ||
|  | //   // returns ok=1 and sets x, y, n if image is a supported format,
 | ||
|  | //   // 0 otherwise.
 | ||
|  | //
 | ||
|  | // Note that stb_image pervasively uses ints in its public API for sizes,
 | ||
|  | // including sizes of memory buffers. This is now part of the API and thus
 | ||
|  | // hard to change without causing breakage. As a result, the various image
 | ||
|  | // loaders all have certain limits on image size; these differ somewhat
 | ||
|  | // by format but generally boil down to either just under 2GB or just under
 | ||
|  | // 1GB. When the decoded image would be larger than this, stb_image decoding
 | ||
|  | // will fail.
 | ||
|  | //
 | ||
|  | // Additionally, stb_image will reject image files that have any of their
 | ||
|  | // dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS,
 | ||
|  | // which defaults to 2**24 = 16777216 pixels. Due to the above memory limit,
 | ||
|  | // the only way to have an image with such dimensions load correctly
 | ||
|  | // is for it to have a rather extreme aspect ratio. Either way, the
 | ||
|  | // assumption here is that such larger images are likely to be malformed
 | ||
|  | // or malicious. If you do need to load an image with individual dimensions
 | ||
|  | // larger than that, and it still fits in the overall size limit, you can
 | ||
|  | // #define STBI_MAX_DIMENSIONS on your own to be something larger.
 | ||
|  | //
 | ||
|  | // ===========================================================================
 | ||
|  | //
 | ||
|  | // UNICODE:
 | ||
|  | //
 | ||
|  | //   If compiling for Windows and you wish to use Unicode filenames, compile
 | ||
|  | //   with
 | ||
|  | //       #define STBI_WINDOWS_UTF8
 | ||
|  | //   and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert
 | ||
|  | //   Windows wchar_t filenames to utf8.
 | ||
|  | //
 | ||
|  | // ===========================================================================
 | ||
|  | //
 | ||
|  | // Philosophy
 | ||
|  | //
 | ||
|  | // stb libraries are designed with the following priorities:
 | ||
|  | //
 | ||
|  | //    1. easy to use
 | ||
|  | //    2. easy to maintain
 | ||
|  | //    3. good performance
 | ||
|  | //
 | ||
|  | // Sometimes I let "good performance" creep up in priority over "easy to maintain",
 | ||
|  | // and for best performance I may provide less-easy-to-use APIs that give higher
 | ||
|  | // performance, in addition to the easy-to-use ones. Nevertheless, it's important
 | ||
|  | // to keep in mind that from the standpoint of you, a client of this library,
 | ||
|  | // all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all.
 | ||
|  | //
 | ||
|  | // Some secondary priorities arise directly from the first two, some of which
 | ||
|  | // provide more explicit reasons why performance can't be emphasized.
 | ||
|  | //
 | ||
|  | //    - Portable ("ease of use")
 | ||
|  | //    - Small source code footprint ("easy to maintain")
 | ||
|  | //    - No dependencies ("ease of use")
 | ||
|  | //
 | ||
|  | // ===========================================================================
 | ||
|  | //
 | ||
|  | // I/O callbacks
 | ||
|  | //
 | ||
|  | // I/O callbacks allow you to read from arbitrary sources, like packaged
 | ||
|  | // files or some other source. Data read from callbacks are processed
 | ||
|  | // through a small internal buffer (currently 128 bytes) to try to reduce
 | ||
|  | // overhead.
 | ||
|  | //
 | ||
|  | // The three functions you must define are "read" (reads some bytes of data),
 | ||
|  | // "skip" (skips some bytes of data), "eof" (reports if the stream is at the end).
 | ||
|  | //
 | ||
|  | // ===========================================================================
 | ||
|  | //
 | ||
|  | // SIMD support
 | ||
|  | //
 | ||
|  | // The JPEG decoder will try to automatically use SIMD kernels on x86 when
 | ||
|  | // supported by the compiler. For ARM Neon support, you must explicitly
 | ||
|  | // request it.
 | ||
|  | //
 | ||
|  | // (The old do-it-yourself SIMD API is no longer supported in the current
 | ||
|  | // code.)
 | ||
|  | //
 | ||
|  | // On x86, SSE2 will automatically be used when available based on a run-time
 | ||
|  | // test; if not, the generic C versions are used as a fall-back. On ARM targets,
 | ||
|  | // the typical path is to have separate builds for NEON and non-NEON devices
 | ||
|  | // (at least this is true for iOS and Android). Therefore, the NEON support is
 | ||
|  | // toggled by a build flag: define STBI_NEON to get NEON loops.
 | ||
|  | //
 | ||
|  | // If for some reason you do not want to use any of SIMD code, or if
 | ||
|  | // you have issues compiling it, you can disable it entirely by
 | ||
|  | // defining STBI_NO_SIMD.
 | ||
|  | //
 | ||
|  | // ===========================================================================
 | ||
|  | //
 | ||
|  | // HDR image support   (disable by defining STBI_NO_HDR)
 | ||
|  | //
 | ||
|  | // stb_image supports loading HDR images in general, and currently the Radiance
 | ||
|  | // .HDR file format specifically. You can still load any file through the existing
 | ||
|  | // interface; if you attempt to load an HDR file, it will be automatically remapped
 | ||
|  | // to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
 | ||
|  | // both of these constants can be reconfigured through this interface:
 | ||
|  | //
 | ||
|  | //     stbi_hdr_to_ldr_gamma(2.2f);
 | ||
|  | //     stbi_hdr_to_ldr_scale(1.0f);
 | ||
|  | //
 | ||
|  | // (note, do not use _inverse_ constants; stbi_image will invert them
 | ||
|  | // appropriately).
 | ||
|  | //
 | ||
|  | // Additionally, there is a new, parallel interface for loading files as
 | ||
|  | // (linear) floats to preserve the full dynamic range:
 | ||
|  | //
 | ||
|  | //    float *data = stbi_loadf(filename, &x, &y, &n, 0);
 | ||
|  | //
 | ||
|  | // If you load LDR images through this interface, those images will
 | ||
|  | // be promoted to floating point values, run through the inverse of
 | ||
|  | // constants corresponding to the above:
 | ||
|  | //
 | ||
|  | //     stbi_ldr_to_hdr_scale(1.0f);
 | ||
|  | //     stbi_ldr_to_hdr_gamma(2.2f);
 | ||
|  | //
 | ||
|  | // Finally, given a filename (or an open file or memory block--see header
 | ||
|  | // file for details) containing image data, you can query for the "most
 | ||
|  | // appropriate" interface to use (that is, whether the image is HDR or
 | ||
|  | // not), using:
 | ||
|  | //
 | ||
|  | //     stbi_is_hdr(char *filename);
 | ||
|  | //
 | ||
|  | // ===========================================================================
 | ||
|  | //
 | ||
|  | // iPhone PNG support:
 | ||
|  | //
 | ||
|  | // We optionally support converting iPhone-formatted PNGs (which store
 | ||
|  | // premultiplied BGRA) back to RGB, even though they're internally encoded
 | ||
|  | // differently. To enable this conversion, call
 | ||
|  | // stbi_convert_iphone_png_to_rgb(1).
 | ||
|  | //
 | ||
|  | // Call stbi_set_unpremultiply_on_load(1) as well to force a divide per
 | ||
|  | // pixel to remove any premultiplied alpha *only* if the image file explicitly
 | ||
|  | // says there's premultiplied data (currently only happens in iPhone images,
 | ||
|  | // and only if iPhone convert-to-rgb processing is on).
 | ||
|  | //
 | ||
|  | // ===========================================================================
 | ||
|  | //
 | ||
|  | // ADDITIONAL CONFIGURATION
 | ||
|  | //
 | ||
|  | //  - You can suppress implementation of any of the decoders to reduce
 | ||
|  | //    your code footprint by #defining one or more of the following
 | ||
|  | //    symbols before creating the implementation.
 | ||
|  | //
 | ||
|  | //        STBI_NO_JPEG
 | ||
|  | //        STBI_NO_PNG
 | ||
|  | //        STBI_NO_BMP
 | ||
|  | //        STBI_NO_PSD
 | ||
|  | //        STBI_NO_TGA
 | ||
|  | //        STBI_NO_GIF
 | ||
|  | //        STBI_NO_HDR
 | ||
|  | //        STBI_NO_PIC
 | ||
|  | //        STBI_NO_PNM   (.ppm and .pgm)
 | ||
|  | //
 | ||
|  | //  - You can request *only* certain decoders and suppress all other ones
 | ||
|  | //    (this will be more forward-compatible, as addition of new decoders
 | ||
|  | //    doesn't require you to disable them explicitly):
 | ||
|  | //
 | ||
|  | //        STBI_ONLY_JPEG
 | ||
|  | //        STBI_ONLY_PNG
 | ||
|  | //        STBI_ONLY_BMP
 | ||
|  | //        STBI_ONLY_PSD
 | ||
|  | //        STBI_ONLY_TGA
 | ||
|  | //        STBI_ONLY_GIF
 | ||
|  | //        STBI_ONLY_HDR
 | ||
|  | //        STBI_ONLY_PIC
 | ||
|  | //        STBI_ONLY_PNM   (.ppm and .pgm)
 | ||
|  | //
 | ||
|  | //   - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still
 | ||
|  | //     want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB
 | ||
|  | //
 | ||
|  | //  - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater
 | ||
|  | //    than that size (in either width or height) without further processing.
 | ||
|  | //    This is to let programs in the wild set an upper bound to prevent
 | ||
|  | //    denial-of-service attacks on untrusted data, as one could generate a
 | ||
|  | //    valid image of gigantic dimensions and force stb_image to allocate a
 | ||
|  | //    huge block of memory and spend disproportionate time decoding it. By
 | ||
|  | //    default this is set to (1 << 24), which is 16777216, but that's still
 | ||
|  | //    very big.
 | ||
|  | 
 | ||
|  | #ifndef STBI_NO_STDIO
 | ||
|  | #include <stdio.h>
 | ||
|  | #endif // STBI_NO_STDIO
 | ||
|  | 
 | ||
|  | #define STBI_VERSION 1
 | ||
|  | 
 | ||
|  | enum | ||
|  | { | ||
|  |    STBI_default = 0, // only used for desired_channels
 | ||
|  | 
 | ||
|  |    STBI_grey       = 1, | ||
|  |    STBI_grey_alpha = 2, | ||
|  |    STBI_rgb        = 3, | ||
|  |    STBI_rgb_alpha  = 4 | ||
|  | }; | ||
|  | 
 | ||
|  | #include <stdlib.h>
 | ||
|  | typedef unsigned char stbi_uc; | ||
|  | typedef unsigned short stbi_us; | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | extern "C" { | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #ifndef STBIDEF
 | ||
|  | #ifdef STB_IMAGE_STATIC
 | ||
|  | #define STBIDEF static
 | ||
|  | #else
 | ||
|  | #define STBIDEF extern
 | ||
|  | #endif
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | // PRIMARY API - works on images of any type
 | ||
|  | //
 | ||
|  | 
 | ||
|  | //
 | ||
|  | // load image by filename, open file, or memory buffer
 | ||
|  | //
 | ||
|  | 
 | ||
|  | typedef struct | ||
|  | { | ||
|  |    int      (*read)  (void *user,char *data,int size);   // fill 'data' with 'size' bytes.  return number of bytes actually read
 | ||
|  |    void     (*skip)  (void *user,int n);                 // skip the next 'n' bytes, or 'unget' the last -n bytes if negative
 | ||
|  |    int      (*eof)   (void *user);                       // returns nonzero if we are at end of file/data
 | ||
|  | } stbi_io_callbacks; | ||
|  | 
 | ||
|  | ////////////////////////////////////
 | ||
|  | //
 | ||
|  | // 8-bits-per-channel interface
 | ||
|  | //
 | ||
|  | 
 | ||
|  | STBIDEF stbi_uc *stbi_load_from_memory   (stbi_uc           const *buffer, int len   , int *x, int *y, int *channels_in_file, int desired_channels); | ||
|  | STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk  , void *user, int *x, int *y, int *channels_in_file, int desired_channels); | ||
|  | 
 | ||
|  | #ifndef STBI_NO_STDIO
 | ||
|  | STBIDEF stbi_uc *stbi_load            (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); | ||
|  | STBIDEF stbi_uc *stbi_load_from_file  (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); | ||
|  | // for stbi_load_from_file, file pointer is left pointing immediately after image
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #ifndef STBI_NO_GIF
 | ||
|  | STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #ifdef STBI_WINDOWS_UTF8
 | ||
|  | STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | ////////////////////////////////////
 | ||
|  | //
 | ||
|  | // 16-bits-per-channel interface
 | ||
|  | //
 | ||
|  | 
 | ||
|  | STBIDEF stbi_us *stbi_load_16_from_memory   (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); | ||
|  | STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); | ||
|  | 
 | ||
|  | #ifndef STBI_NO_STDIO
 | ||
|  | STBIDEF stbi_us *stbi_load_16          (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); | ||
|  | STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | ////////////////////////////////////
 | ||
|  | //
 | ||
|  | // float-per-channel interface
 | ||
|  | //
 | ||
|  | #ifndef STBI_NO_LINEAR
 | ||
|  |    STBIDEF float *stbi_loadf_from_memory     (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); | ||
|  |    STBIDEF float *stbi_loadf_from_callbacks  (stbi_io_callbacks const *clbk, void *user, int *x, int *y,  int *channels_in_file, int desired_channels); | ||
|  | 
 | ||
|  |    #ifndef STBI_NO_STDIO
 | ||
|  |    STBIDEF float *stbi_loadf            (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); | ||
|  |    STBIDEF float *stbi_loadf_from_file  (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); | ||
|  |    #endif
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #ifndef STBI_NO_HDR
 | ||
|  |    STBIDEF void   stbi_hdr_to_ldr_gamma(float gamma); | ||
|  |    STBIDEF void   stbi_hdr_to_ldr_scale(float scale); | ||
|  | #endif // STBI_NO_HDR
 | ||
|  | 
 | ||
|  | #ifndef STBI_NO_LINEAR
 | ||
|  |    STBIDEF void   stbi_ldr_to_hdr_gamma(float gamma); | ||
|  |    STBIDEF void   stbi_ldr_to_hdr_scale(float scale); | ||
|  | #endif // STBI_NO_LINEAR
 | ||
|  | 
 | ||
|  | // stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR
 | ||
|  | STBIDEF int    stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); | ||
|  | STBIDEF int    stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); | ||
|  | #ifndef STBI_NO_STDIO
 | ||
|  | STBIDEF int      stbi_is_hdr          (char const *filename); | ||
|  | STBIDEF int      stbi_is_hdr_from_file(FILE *f); | ||
|  | #endif // STBI_NO_STDIO
 | ||
|  | 
 | ||
|  | 
 | ||
|  | // get a VERY brief reason for failure
 | ||
|  | // on most compilers (and ALL modern mainstream compilers) this is threadsafe
 | ||
|  | STBIDEF const char *stbi_failure_reason  (void); | ||
|  | 
 | ||
|  | // free the loaded image -- this is just free()
 | ||
|  | STBIDEF void     stbi_image_free      (void *retval_from_stbi_load); | ||
|  | 
 | ||
|  | // get image dimensions & components without fully decoding
 | ||
|  | STBIDEF int      stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); | ||
|  | STBIDEF int      stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); | ||
|  | STBIDEF int      stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); | ||
|  | STBIDEF int      stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); | ||
|  | 
 | ||
|  | #ifndef STBI_NO_STDIO
 | ||
|  | STBIDEF int      stbi_info               (char const *filename,     int *x, int *y, int *comp); | ||
|  | STBIDEF int      stbi_info_from_file     (FILE *f,                  int *x, int *y, int *comp); | ||
|  | STBIDEF int      stbi_is_16_bit          (char const *filename); | ||
|  | STBIDEF int      stbi_is_16_bit_from_file(FILE *f); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | // for image formats that explicitly notate that they have premultiplied alpha,
 | ||
|  | // we just return the colors as stored in the file. set this flag to force
 | ||
|  | // unpremultiplication. results are undefined if the unpremultiply overflow.
 | ||
|  | STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); | ||
|  | 
 | ||
|  | // indicate whether we should process iphone images back to canonical format,
 | ||
|  | // or just pass them through "as-is"
 | ||
|  | STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); | ||
|  | 
 | ||
|  | // flip the image vertically, so the first pixel in the output array is the bottom left
 | ||
|  | STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); | ||
|  | 
 | ||
|  | // as above, but only applies to images loaded on the thread that calls the function
 | ||
|  | // this function is only available if your compiler supports thread-local variables;
 | ||
|  | // calling it will fail to link if your compiler doesn't
 | ||
|  | STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); | ||
|  | STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); | ||
|  | STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); | ||
|  | 
 | ||
|  | // ZLIB client - used by PNG, available for other purposes
 | ||
|  | 
 | ||
|  | STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); | ||
|  | STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); | ||
|  | STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); | ||
|  | STBIDEF int   stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); | ||
|  | 
 | ||
|  | STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); | ||
|  | STBIDEF int   stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); | ||
|  | 
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | //
 | ||
|  | //
 | ||
|  | ////   end header file   /////////////////////////////////////////////////////
 | ||
|  | #endif // STBI_INCLUDE_STB_IMAGE_H
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |    revision history: | ||
|  |       2.20  (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs | ||
|  |       2.19  (2018-02-11) fix warning | ||
|  |       2.18  (2018-01-30) fix warnings | ||
|  |       2.17  (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug | ||
|  |                          1-bit BMP | ||
|  |                          *_is_16_bit api | ||
|  |                          avoid warnings | ||
|  |       2.16  (2017-07-23) all functions have 16-bit variants; | ||
|  |                          STBI_NO_STDIO works again; | ||
|  |                          compilation fixes; | ||
|  |                          fix rounding in unpremultiply; | ||
|  |                          optimize vertical flip; | ||
|  |                          disable raw_len validation; | ||
|  |                          documentation fixes | ||
|  |       2.15  (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; | ||
|  |                          warning fixes; disable run-time SSE detection on gcc; | ||
|  |                          uniform handling of optional "return" values; | ||
|  |                          thread-safe initialization of zlib tables | ||
|  |       2.14  (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs | ||
|  |       2.13  (2016-11-29) add 16-bit API, only supported for PNG right now | ||
|  |       2.12  (2016-04-02) fix typo in 2.11 PSD fix that caused crashes | ||
|  |       2.11  (2016-04-02) allocate large structures on the stack | ||
|  |                          remove white matting for transparent PSD | ||
|  |                          fix reported channel count for PNG & BMP | ||
|  |                          re-enable SSE2 in non-gcc 64-bit | ||
|  |                          support RGB-formatted JPEG | ||
|  |                          read 16-bit PNGs (only as 8-bit) | ||
|  |       2.10  (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED | ||
|  |       2.09  (2016-01-16) allow comments in PNM files | ||
|  |                          16-bit-per-pixel TGA (not bit-per-component) | ||
|  |                          info() for TGA could break due to .hdr handling | ||
|  |                          info() for BMP to shares code instead of sloppy parse | ||
|  |                          can use STBI_REALLOC_SIZED if allocator doesn't support realloc | ||
|  |                          code cleanup | ||
|  |       2.08  (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA | ||
|  |       2.07  (2015-09-13) fix compiler warnings | ||
|  |                          partial animated GIF support | ||
|  |                          limited 16-bpc PSD support | ||
|  |                          #ifdef unused functions
 | ||
|  |                          bug with < 92 byte PIC,PNM,HDR,TGA | ||
|  |       2.06  (2015-04-19) fix bug where PSD returns wrong '*comp' value | ||
|  |       2.05  (2015-04-19) fix bug in progressive JPEG handling, fix warning | ||
|  |       2.04  (2015-04-15) try to re-enable SIMD on MinGW 64-bit | ||
|  |       2.03  (2015-04-12) extra corruption checking (mmozeiko) | ||
|  |                          stbi_set_flip_vertically_on_load (nguillemot) | ||
|  |                          fix NEON support; fix mingw support | ||
|  |       2.02  (2015-01-19) fix incorrect assert, fix warning | ||
|  |       2.01  (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 | ||
|  |       2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG | ||
|  |       2.00  (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) | ||
|  |                          progressive JPEG (stb) | ||
|  |                          PGM/PPM support (Ken Miller) | ||
|  |                          STBI_MALLOC,STBI_REALLOC,STBI_FREE | ||
|  |                          GIF bugfix -- seemingly never worked | ||
|  |                          STBI_NO_*, STBI_ONLY_* | ||
|  |       1.48  (2014-12-14) fix incorrectly-named assert() | ||
|  |       1.47  (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) | ||
|  |                          optimize PNG (ryg) | ||
|  |                          fix bug in interlaced PNG with user-specified channel count (stb) | ||
|  |       1.46  (2014-08-26) | ||
|  |               fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG | ||
|  |       1.45  (2014-08-16) | ||
|  |               fix MSVC-ARM internal compiler error by wrapping malloc | ||
|  |       1.44  (2014-08-07) | ||
|  |               various warning fixes from Ronny Chevalier | ||
|  |       1.43  (2014-07-15) | ||
|  |               fix MSVC-only compiler problem in code changed in 1.42 | ||
|  |       1.42  (2014-07-09) | ||
|  |               don't define _CRT_SECURE_NO_WARNINGS (affects user code) | ||
|  |               fixes to stbi__cleanup_jpeg path | ||
|  |               added STBI_ASSERT to avoid requiring assert.h | ||
|  |       1.41  (2014-06-25) | ||
|  |               fix search&replace from 1.36 that messed up comments/error messages | ||
|  |       1.40  (2014-06-22) | ||
|  |               fix gcc struct-initialization warning | ||
|  |       1.39  (2014-06-15) | ||
|  |               fix to TGA optimization when req_comp != number of components in TGA; | ||
|  |               fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) | ||
|  |               add support for BMP version 5 (more ignored fields) | ||
|  |       1.38  (2014-06-06) | ||
|  |               suppress MSVC warnings on integer casts truncating values | ||
|  |               fix accidental rename of 'skip' field of I/O | ||
|  |       1.37  (2014-06-04) | ||
|  |               remove duplicate typedef | ||
|  |       1.36  (2014-06-03) | ||
|  |               convert to header file single-file library | ||
|  |               if de-iphone isn't set, load iphone images color-swapped instead of returning NULL | ||
|  |       1.35  (2014-05-27) | ||
|  |               various warnings | ||
|  |               fix broken STBI_SIMD path | ||
|  |               fix bug where stbi_load_from_file no longer left file pointer in correct place | ||
|  |               fix broken non-easy path for 32-bit BMP (possibly never used) | ||
|  |               TGA optimization by Arseny Kapoulkine | ||
|  |       1.34  (unknown) | ||
|  |               use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case | ||
|  |       1.33  (2011-07-14) | ||
|  |               make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements | ||
|  |       1.32  (2011-07-13) | ||
|  |               support for "info" function for all supported filetypes (SpartanJ) | ||
|  |       1.31  (2011-06-20) | ||
|  |               a few more leak fixes, bug in PNG handling (SpartanJ) | ||
|  |       1.30  (2011-06-11) | ||
|  |               added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) | ||
|  |               removed deprecated format-specific test/load functions | ||
|  |               removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway | ||
|  |               error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) | ||
|  |               fix inefficiency in decoding 32-bit BMP (David Woo) | ||
|  |       1.29  (2010-08-16) | ||
|  |               various warning fixes from Aurelien Pocheville | ||
|  |       1.28  (2010-08-01) | ||
|  |               fix bug in GIF palette transparency (SpartanJ) | ||
|  |       1.27  (2010-08-01) | ||
|  |               cast-to-stbi_uc to fix warnings | ||
|  |       1.26  (2010-07-24) | ||
|  |               fix bug in file buffering for PNG reported by SpartanJ | ||
|  |       1.25  (2010-07-17) | ||
|  |               refix trans_data warning (Won Chun) | ||
|  |       1.24  (2010-07-12) | ||
|  |               perf improvements reading from files on platforms with lock-heavy fgetc() | ||
|  |               minor perf improvements for jpeg | ||
|  |               deprecated type-specific functions so we'll get feedback if they're needed | ||
|  |               attempt to fix trans_data warning (Won Chun) | ||
|  |       1.23    fixed bug in iPhone support | ||
|  |       1.22  (2010-07-10) | ||
|  |               removed image *writing* support | ||
|  |               stbi_info support from Jetro Lauha | ||
|  |               GIF support from Jean-Marc Lienher | ||
|  |               iPhone PNG-extensions from James Brown | ||
|  |               warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) | ||
|  |       1.21    fix use of 'stbi_uc' in header (reported by jon blow) | ||
|  |       1.20    added support for Softimage PIC, by Tom Seddon | ||
|  |       1.19    bug in interlaced PNG corruption check (found by ryg) | ||
|  |       1.18  (2008-08-02) | ||
|  |               fix a threading bug (local mutable static) | ||
|  |       1.17    support interlaced PNG | ||
|  |       1.16    major bugfix - stbi__convert_format converted one too many pixels | ||
|  |       1.15    initialize some fields for thread safety | ||
|  |       1.14    fix threadsafe conversion bug | ||
|  |               header-file-only version (#define STBI_HEADER_FILE_ONLY before including) | ||
|  |       1.13    threadsafe | ||
|  |       1.12    const qualifiers in the API | ||
|  |       1.11    Support installable IDCT, colorspace conversion routines | ||
|  |       1.10    Fixes for 64-bit (don't use "unsigned long") | ||
|  |               optimized upsampling by Fabian "ryg" Giesen | ||
|  |       1.09    Fix format-conversion for PSD code (bad global variables!) | ||
|  |       1.08    Thatcher Ulrich's PSD code integrated by Nicolas Schulz | ||
|  |       1.07    attempt to fix C++ warning/errors again | ||
|  |       1.06    attempt to fix C++ warning/errors again | ||
|  |       1.05    fix TGA loading to return correct *comp and use good luminance calc | ||
|  |       1.04    default float alpha is 1, not 255; use 'void *' for stbi_image_free | ||
|  |       1.03    bugfixes to STBI_NO_STDIO, STBI_NO_HDR | ||
|  |       1.02    support for (subset of) HDR files, float interface for preferred access to them | ||
|  |       1.01    fix bug: possible bug in handling right-side up bmps... not sure | ||
|  |               fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all | ||
|  |       1.00    interface to zlib that skips zlib header | ||
|  |       0.99    correct handling of alpha in palette | ||
|  |       0.98    TGA loader by lonesock; dynamically add loaders (untested) | ||
|  |       0.97    jpeg errors on too large a file; also catch another malloc failure | ||
|  |       0.96    fix detection of invalid v value - particleman@mollyrocket forum | ||
|  |       0.95    during header scan, seek to markers in case of padding | ||
|  |       0.94    STBI_NO_STDIO to disable stdio usage; rename all #defines the same | ||
|  |       0.93    handle jpegtran output; verbose errors | ||
|  |       0.92    read 4,8,16,24,32-bit BMP files of several formats | ||
|  |       0.91    output 24-bit Windows 3.0 BMP files | ||
|  |       0.90    fix a few more warnings; bump version number to approach 1.0 | ||
|  |       0.61    bugfixes due to Marc LeBlanc, Christopher Lloyd | ||
|  |       0.60    fix compiling as c++ | ||
|  |       0.59    fix warnings: merge Dave Moore's -Wall fixes | ||
|  |       0.58    fix bug: zlib uncompressed mode len/nlen was wrong endian | ||
|  |       0.57    fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available | ||
|  |       0.56    fix bug: zlib uncompressed mode len vs. nlen | ||
|  |       0.55    fix bug: restart_interval not initialized to 0 | ||
|  |       0.54    allow NULL for 'int *comp' | ||
|  |       0.53    fix bug in png 3->4; speedup png decoding | ||
|  |       0.52    png handles req_comp=3,4 directly; minor cleanup; jpeg comments | ||
|  |       0.51    obey req_comp requests, 1-component jpegs return as 1-component, | ||
|  |               on 'test' only check type, not whether we support this variant | ||
|  |       0.50  (2006-11-19) | ||
|  |               first released version | ||
|  | */ | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  | ------------------------------------------------------------------------------ | ||
|  | This software is available under 2 licenses -- choose whichever you prefer. | ||
|  | ------------------------------------------------------------------------------ | ||
|  | ALTERNATIVE A - MIT License | ||
|  | Copyright (c) 2017 Sean Barrett | ||
|  | Permission is hereby granted, free of charge, to any person obtaining a copy of | ||
|  | this software and associated documentation files (the "Software"), to deal in | ||
|  | the Software without restriction, including without limitation the rights to | ||
|  | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies | ||
|  | of the Software, and to permit persons to whom the Software is furnished to do | ||
|  | so, subject to the following conditions: | ||
|  | The above copyright notice and this permission notice shall be included in all | ||
|  | copies or substantial portions of the Software. | ||
|  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
|  | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
|  | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
|  | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
|  | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
|  | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
|  | SOFTWARE. | ||
|  | ------------------------------------------------------------------------------ | ||
|  | ALTERNATIVE B - Public Domain (www.unlicense.org) | ||
|  | This is free and unencumbered software released into the public domain. | ||
|  | Anyone is free to copy, modify, publish, use, compile, sell, or distribute this | ||
|  | software, either in source code form or as a compiled binary, for any purpose, | ||
|  | commercial or non-commercial, and by any means. | ||
|  | In jurisdictions that recognize copyright laws, the author or authors of this | ||
|  | software dedicate any and all copyright interest in the software to the public | ||
|  | domain. We make this dedication for the benefit of the public at large and to | ||
|  | the detriment of our heirs and successors. We intend this dedication to be an | ||
|  | overt act of relinquishment in perpetuity of all present and future rights to | ||
|  | this software under copyright law. | ||
|  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
|  | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
|  | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
|  | AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||
|  | ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | ||
|  | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
|  | ------------------------------------------------------------------------------ | ||
|  | */ |