stb_image.h 160.8 KB
Newer Older
1
/* stb_image - v1.48 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c
2 3 4 5 6 7 8
   when you control the images you're loading
                                     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.

S
Sean Barrett 已提交
9 10
   #define STBI_ASSERT(x) to avoid using assert.h.

11 12 13 14 15
   QUICK NOTES:
      Primarily of interest to game developers and other people who can
          avoid problematic images and only need the trivial interface

      JPEG baseline (no JPEG progressive)
O
ocornut 已提交
16
      PNG 1/2/4/8-bit-per-channel (16 bpc not supported)
17 18 19 20 21 22 23 24 25

      TGA (not sure what subset, if a subset)
      BMP non-1bpp, non-RLE
      PSD (composited view only, no extra channels)

      GIF (*comp always reports as 4-channel)
      HDR (radiance rgbE format)
      PIC (Softimage PIC)

26 27
      - decode from memory or through FILE (define STBI_NO_STDIO to remove code)
      - decode from arbitrary I/O callbacks
28 29 30
      - overridable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD)

   Latest revisions:
31
      1.48 (2014-12-14) fix incorrectly-named assert()
32 33 34
      1.47 (2014-12-14) 1/2/4-bit PNG support (both grayscale and paletted)
                        optimize PNG
                        fix bug in interlaced PNG with user-specified channel count
35
      1.46 (2014-08-26) fix broken tRNS chunk in non-paletted PNG
36
      1.45 (2014-08-16) workaround MSVC-ARM internal compiler error by wrapping malloc
S
Sean Barrett 已提交
37
      1.44 (2014-08-07) warnings
S
Sean Barrett 已提交
38
      1.43 (2014-07-15) fix MSVC-only bug in 1.42
S
Sean Barrett 已提交
39
      1.42 (2014-07-09) no _CRT_SECURE_NO_WARNINGS; error-path fixes; STBI_ASSERT
40
      1.41 (2014-06-25) fix search&replace that messed up comments/error messages
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

   See end of file for full revision history.

   TODO:
      stbi_info support for BMP,PSD,HDR,PIC


 ============================    Contributors    =========================
              
 Image formats                                Bug fixes & warning fixes
    Sean Barrett (jpeg, png, bmp)                Marc LeBlanc
    Nicolas Schulz (hdr, psd)                    Christpher Lloyd
    Jonathan Dummer (tga)                        Dave Moore
    Jean-Marc Lienher (gif)                      Won Chun
    Tom Seddon (pic)                             the Horde3D community
    Thatcher Ulrich (psd)                        Janez Zemva
                                                 Jonathan Blow
                                                 Laurent Gomila
 Extensions, features                            Aruelien Pocheville
    Jetro Lauha (stbi_info)                      Ryamond Barbiero
    James "moose2000" Brown (iPhone PNG)         David Woo
    Ben "Disch" Wenger (io callbacks)            Roy Eltham
    Martin "SpartanJ" Golini                     Luke Graham
64
    Omar Cornut (1/2/4-bit png)                  Thomas Ruf
65 66 67 68 69
                                                 John Bartholomew
 Optimizations & bugfixes                        Ken Hamada
    Fabian "ryg" Giesen                          Cort Stratton
    Arseny Kapoulkine                            Blazej Dariusz Roszkowski
                                                 Thibault Reuille
S
Sean Barrett 已提交
70 71
                                                 Paul Du Bois
                                                 Guillaume George
72
                                                 Jerry Jansson
S
Sean Barrett 已提交
73 74 75
  If your name should be here but                Hayaki Saito
  isn't, let Sean know.                          Johan Duparc
                                                 Ronny Chevalier
76
                                                 Michal Cichon
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
*/

#ifndef STBI_INCLUDE_STB_IMAGE_H
#define STBI_INCLUDE_STB_IMAGE_H

// Limitations:
//    - no jpeg progressive support
//    - non-HDR formats support 8-bit samples only (jpeg, png)
//    - no delayed line count (jpeg) -- IJG doesn't support either
//    - no 1-bit BMP
//    - GIF always returns *comp=4
//
// Basic usage (see HDR discussion below):
//    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 *comp    -- outputs # of image components in image file
//    int req_comp -- 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. 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 'req_comp' if req_comp is non-zero, or *comp otherwise.
// If req_comp is non-zero, *comp has the number of components that _would_
// have been output otherwise. E.g. if you set req_comp to 4, you will always
// get RGBA output, but you can check *comp to easily see if it's opaque.
//
// 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, *comp 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.
//
// ===========================================================================
//
// iPhone PNG support:
//
// By default we convert iphone-formatted PNGs back to RGB; nominally they
// would silently load as BGR, except the existing code should have just
// failed on such iPhone PNGs. But you can disable this conversion by
// by calling stbi_convert_iphone_png_to_rgb(0), in which case
// you will always just get the native iphone "format" through.
//
// 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).
//
// ===========================================================================
//
// HDR image support   (disable by defining STBI_NO_HDR)
//
// stb_image now supports loading HDR images in general, and currently
// the Radiance .HDR file format, although the support is provided
// generically. 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);
//
// ===========================================================================
//
// 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),
S
Sean Barrett 已提交
193
// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end).
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243


#ifndef STBI_NO_STDIO
#include <stdio.h>
#endif // STBI_NO_STDIO

#define STBI_VERSION 1

enum
{
   STBI_default = 0, // only used for req_comp

   STBI_grey       = 1,
   STBI_grey_alpha = 2,
   STBI_rgb        = 3,
   STBI_rgb_alpha  = 4
};

typedef unsigned char stbi_uc;

#ifdef __cplusplus
extern "C" {
#endif

#ifdef STB_IMAGE_STATIC
#define STBIDEF static
#else
#define STBIDEF extern
#endif

//////////////////////////////////////////////////////////////////////////////
//
// PRIMARY API - works on images of any type
//

//
// load image by filename, open file, or memory buffer
//

STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);

#ifndef STBI_NO_STDIO
STBIDEF stbi_uc *stbi_load            (char const *filename,     int *x, int *y, int *comp, int req_comp);
STBIDEF stbi_uc *stbi_load_from_file  (FILE *f,                  int *x, int *y, int *comp, int req_comp);
// for stbi_load_from_file, file pointer is left pointing immediately after image
#endif

typedef struct
{
   int      (*read)  (void *user,char *data,int size);   // fill 'data' with 'size' bytes.  return number of bytes actually read 
S
Sean Barrett 已提交
244
   void     (*skip)  (void *user,int n);                 // skip the next 'n' bytes, or 'unget' the last -n bytes if negative
245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
   int      (*eof)   (void *user);                       // returns nonzero if we are at end of file/data
} stbi_io_callbacks;

STBIDEF stbi_uc *stbi_load_from_callbacks  (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp);

#ifndef STBI_NO_HDR
   STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);

   #ifndef STBI_NO_STDIO
   STBIDEF float *stbi_loadf            (char const *filename,   int *x, int *y, int *comp, int req_comp);
   STBIDEF float *stbi_loadf_from_file  (FILE *f,                int *x, int *y, int *comp, int req_comp);
   #endif
   
   STBIDEF float *stbi_loadf_from_callbacks  (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp);

   STBIDEF void   stbi_hdr_to_ldr_gamma(float gamma);
   STBIDEF void   stbi_hdr_to_ldr_scale(float scale);

   STBIDEF void   stbi_ldr_to_hdr_gamma(float gamma);
   STBIDEF void   stbi_ldr_to_hdr_scale(float scale);
#endif // STBI_NO_HDR

// stbi_is_hdr is always defined
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
// NOT 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);

#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);

#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);


// 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);


// define faster low-level operations (typically SIMD support)
#ifdef STBI_SIMD
typedef void (*stbi_idct_8x8)(stbi_uc *out, int out_stride, short data[64], unsigned short *dequantize);
// compute an integer IDCT on "input"
//     input[x] = data[x] * dequantize[x]
//     write results to 'out': 64 samples, each run of 8 spaced by 'out_stride'
//                             CLAMP results to 0..255
typedef void (*stbi_YCbCr_to_RGB_run)(stbi_uc *output, stbi_uc const  *y, stbi_uc const *cb, stbi_uc const *cr, int count, int step);
// compute a conversion from YCbCr to RGB
//     'count' pixels
//     write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B
//     y: Y input channel
//     cb: Cb input channel; scale/biased to be 0..255
//     cr: Cr input channel; scale/biased to be 0..255

STBIDEF void stbi_install_idct(stbi_idct_8x8 func);
STBIDEF void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func);
#endif // STBI_SIMD


#ifdef __cplusplus
}
#endif

//
//
////   end header file   /////////////////////////////////////////////////////
#endif // STBI_INCLUDE_STB_IMAGE_H

#ifdef STB_IMAGE_IMPLEMENTATION

#ifndef STBI_NO_HDR
#include <math.h>  // ldexp
#include <string.h> // strcmp, strtok
#endif

#ifndef STBI_NO_STDIO
#include <stdio.h>
#endif
#include <stdlib.h>
356
#include <string.h>
S
Sean Barrett 已提交
357
#ifndef STBI_ASSERT
358
#include <assert.h>
S
Sean Barrett 已提交
359 360
#define STBI_ASSERT(x) assert(x)
#endif
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408
#include <stdarg.h>
#include <stddef.h> // ptrdiff_t on osx

#ifndef _MSC_VER
   #ifdef __cplusplus
   #define stbi_inline inline
   #else
   #define stbi_inline
   #endif
#else
   #define stbi_inline __forceinline
#endif


#ifdef _MSC_VER
typedef unsigned short stbi__uint16;
typedef   signed short stbi__int16;
typedef unsigned int   stbi__uint32;
typedef   signed int   stbi__int32;
#else
#include <stdint.h>
typedef uint16_t stbi__uint16;
typedef int16_t  stbi__int16;
typedef uint32_t stbi__uint32;
typedef int32_t  stbi__int32;
#endif

// should produce compiler error if size is wrong
typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];

#ifdef _MSC_VER
#define STBI_NOTUSED(v)  (void)(v)
#else
#define STBI_NOTUSED(v)  (void)sizeof(v)
#endif

#ifdef _MSC_VER
#define STBI_HAS_LROTL
#endif

#ifdef STBI_HAS_LROTL
   #define stbi_lrot(x,y)  _lrotl(x,y)
#else
   #define stbi_lrot(x,y)  (((x) << (y)) | ((x) >> (32 - (y))))
#endif

///////////////////////////////////////////////
//
S
Sean Barrett 已提交
409
//  stbi__context struct and start_xxx functions
410

S
Sean Barrett 已提交
411
// stbi__context structure is our basic context used by all images, so it
412 413 414 415 416 417 418 419 420 421 422
// contains all the IO context, plus some basic image information
typedef struct
{
   stbi__uint32 img_x, img_y;
   int img_n, img_out_n;
   
   stbi_io_callbacks io;
   void *io_user_data;

   int read_from_callbacks;
   int buflen;
423
   stbi_uc buffer_start[128];
424

425 426
   stbi_uc *img_buffer, *img_buffer_end;
   stbi_uc *img_buffer_original;
S
Sean Barrett 已提交
427
} stbi__context;
428 429


S
Sean Barrett 已提交
430
static void stbi__refill_buffer(stbi__context *s);
431

432
// initialize a memory-decode context
433
static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len)
434 435 436
{
   s->io.read = NULL;
   s->read_from_callbacks = 0;
437 438
   s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
   s->img_buffer_end = (stbi_uc *) buffer+len;
439 440 441
}

// initialize a callback-based context
S
Sean Barrett 已提交
442
static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user)
443 444 445 446 447 448
{
   s->io = *c;
   s->io_user_data = user;
   s->buflen = sizeof(s->buffer_start);
   s->read_from_callbacks = 1;
   s->img_buffer_original = s->buffer_start;
S
Sean Barrett 已提交
449
   stbi__refill_buffer(s);
450 451 452 453
}

#ifndef STBI_NO_STDIO

454
static int stbi__stdio_read(void *user, char *data, int size)
455 456 457 458
{
   return (int) fread(data,1,size,(FILE*) user);
}

459
static void stbi__stdio_skip(void *user, int n)
460 461 462 463
{
   fseek((FILE*) user, n, SEEK_CUR);
}

464
static int stbi__stdio_eof(void *user)
465 466 467 468
{
   return feof((FILE*) user);
}

469
static stbi_io_callbacks stbi__stdio_callbacks =
470
{
471 472 473
   stbi__stdio_read,
   stbi__stdio_skip,
   stbi__stdio_eof,
474 475
};

476
static void stbi__start_file(stbi__context *s, FILE *f)
477
{
478
   stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f);
479 480
}

S
Sean Barrett 已提交
481
//static void stop_file(stbi__context *s) { }
482 483 484

#endif // !STBI_NO_STDIO

485
static void stbi__rewind(stbi__context *s)
486 487 488 489 490 491 492
{
   // conceptually rewind SHOULD rewind to the beginning of the stream,
   // but we just rewind to the beginning of the initial buffer, because
   // we only use it after doing 'test', which only ever looks at at most 92 bytes
   s->img_buffer = s->img_buffer_original;
}

S
Sean Barrett 已提交
493 494 495 496 497 498 499 500 501 502 503 504 505
static int      stbi__jpeg_test(stbi__context *s);
static stbi_uc *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
static int      stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);
static int      stbi__png_test(stbi__context *s);
static stbi_uc *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
static int      stbi__png_info(stbi__context *s, int *x, int *y, int *comp);
static int      stbi__bmp_test(stbi__context *s);
static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
static int      stbi__tga_test(stbi__context *s);
static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
static int      stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);
static int      stbi__psd_test(stbi__context *s);
static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
506
#ifndef STBI_NO_HDR
S
Sean Barrett 已提交
507 508
static int      stbi__hdr_test(stbi__context *s);
static float   *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
509
#endif
S
Sean Barrett 已提交
510 511 512 513 514
static int      stbi__pic_test(stbi__context *s);
static stbi_uc *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
static int      stbi__gif_test(stbi__context *s);
static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
static int      stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);
515 516 517


// this is not threadsafe
518
static const char *stbi__g_failure_reason;
519 520 521

STBIDEF const char *stbi_failure_reason(void)
{
522
   return stbi__g_failure_reason;
523 524
}

S
Sean Barrett 已提交
525
static int stbi__err(const char *str)
526
{
527
   stbi__g_failure_reason = str;
528 529 530
   return 0;
}

531 532 533 534 535
static void *stbi__malloc(size_t size)
{
    return malloc(size);
}

S
Sean Barrett 已提交
536 537 538
// stbi__err - error
// stbi__errpf - error returning pointer to float
// stbi__errpuc - error returning pointer to unsigned char
539 540

#ifdef STBI_NO_FAILURE_STRINGS
S
Sean Barrett 已提交
541
   #define stbi__err(x,y)  0
542
#elif defined(STBI_FAILURE_USERMSG)
S
Sean Barrett 已提交
543
   #define stbi__err(x,y)  stbi__err(y)
544
#else
S
Sean Barrett 已提交
545
   #define stbi__err(x,y)  stbi__err(x)
546 547
#endif

S
Sean Barrett 已提交
548 549
#define stbi__errpf(x,y)   ((float *) (stbi__err(x,y)?NULL:NULL))
#define stbi__errpuc(x,y)  ((unsigned char *) (stbi__err(x,y)?NULL:NULL))
550 551 552 553 554 555 556

STBIDEF void stbi_image_free(void *retval_from_stbi_load)
{
   free(retval_from_stbi_load);
}

#ifndef STBI_NO_HDR
557 558
static float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);
static stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp);
559 560
#endif

S
Sean Barrett 已提交
561
static unsigned char *stbi_load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
562
{
S
Sean Barrett 已提交
563 564 565 566 567 568
   if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp);
   if (stbi__png_test(s))  return stbi__png_load(s,x,y,comp,req_comp);
   if (stbi__bmp_test(s))  return stbi__bmp_load(s,x,y,comp,req_comp);
   if (stbi__gif_test(s))  return stbi__gif_load(s,x,y,comp,req_comp);
   if (stbi__psd_test(s))  return stbi__psd_load(s,x,y,comp,req_comp);
   if (stbi__pic_test(s))  return stbi__pic_load(s,x,y,comp,req_comp);
569 570

   #ifndef STBI_NO_HDR
S
Sean Barrett 已提交
571 572
   if (stbi__hdr_test(s)) {
      float *hdr = stbi__hdr_load(s, x,y,comp,req_comp);
573
      return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
574 575 576 577
   }
   #endif

   // test tga last because it's a crappy test!
S
Sean Barrett 已提交
578 579 580
   if (stbi__tga_test(s))
      return stbi__tga_load(s,x,y,comp,req_comp);
   return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt");
581 582 583
}

#ifndef STBI_NO_STDIO
S
Sean Barrett 已提交
584

585
static FILE *stbi__fopen(char const *filename, char const *mode)
S
Sean Barrett 已提交
586 587
{
   FILE *f;
588
#if defined(_MSC_VER) && _MSC_VER >= 1400
589
   if (0 != fopen_s(&f, filename, mode))
S
Sean Barrett 已提交
590 591
      f=0;
#else
592
   f = fopen(filename, mode);
S
Sean Barrett 已提交
593 594 595 596 597
#endif
   return f;
}


598 599
STBIDEF unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
{
S
Sean Barrett 已提交
600
   FILE *f = stbi__fopen(filename, "rb");
601
   unsigned char *result;
S
Sean Barrett 已提交
602
   if (!f) return stbi__errpuc("can't fopen", "Unable to open file");
603 604 605 606 607 608 609 610
   result = stbi_load_from_file(f,x,y,comp,req_comp);
   fclose(f);
   return result;
}

STBIDEF unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
{
   unsigned char *result;
S
Sean Barrett 已提交
611
   stbi__context s;
612
   stbi__start_file(&s,f);
613 614 615 616 617 618 619 620 621 622 623
   result = stbi_load_main(&s,x,y,comp,req_comp);
   if (result) {
      // need to 'unget' all the characters in the IO buffer
      fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
   }
   return result;
}
#endif //!STBI_NO_STDIO

STBIDEF unsigned char *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
{
S
Sean Barrett 已提交
624 625
   stbi__context s;
   stbi__start_mem(&s,buffer,len);
626 627 628
   return stbi_load_main(&s,x,y,comp,req_comp);
}

629
STBIDEF unsigned char *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
630
{
S
Sean Barrett 已提交
631 632
   stbi__context s;
   stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
633 634 635 636 637
   return stbi_load_main(&s,x,y,comp,req_comp);
}

#ifndef STBI_NO_HDR

638
static float *stbi_loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
639 640 641
{
   unsigned char *data;
   #ifndef STBI_NO_HDR
S
Sean Barrett 已提交
642 643
   if (stbi__hdr_test(s))
      return stbi__hdr_load(s,x,y,comp,req_comp);
644 645 646
   #endif
   data = stbi_load_main(s, x, y, comp, req_comp);
   if (data)
647
      return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
S
Sean Barrett 已提交
648
   return stbi__errpf("unknown image type", "Image not of any known type, or corrupt");
649 650
}

651
STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
652
{
S
Sean Barrett 已提交
653 654
   stbi__context s;
   stbi__start_mem(&s,buffer,len);
655 656 657
   return stbi_loadf_main(&s,x,y,comp,req_comp);
}

658
STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
659
{
S
Sean Barrett 已提交
660 661
   stbi__context s;
   stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
662 663 664 665
   return stbi_loadf_main(&s,x,y,comp,req_comp);
}

#ifndef STBI_NO_STDIO
666
STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
667 668
{
   float *result;
S
Sean Barrett 已提交
669
   FILE *f = stbi__fopen(filename, "rb");
S
Sean Barrett 已提交
670
   if (!f) return stbi__errpf("can't fopen", "Unable to open file");
671 672 673 674 675
   result = stbi_loadf_from_file(f,x,y,comp,req_comp);
   fclose(f);
   return result;
}

676
STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
677
{
S
Sean Barrett 已提交
678
   stbi__context s;
679
   stbi__start_file(&s,f);
680 681 682 683 684 685 686 687 688 689 690 691 692
   return stbi_loadf_main(&s,x,y,comp,req_comp);
}
#endif // !STBI_NO_STDIO

#endif // !STBI_NO_HDR

// these is-hdr-or-not is defined independent of whether STBI_NO_HDR is
// defined, for API simplicity; if STBI_NO_HDR is defined, it always
// reports false!

int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
{
   #ifndef STBI_NO_HDR
S
Sean Barrett 已提交
693 694 695
   stbi__context s;
   stbi__start_mem(&s,buffer,len);
   return stbi__hdr_test(&s);
696 697 698 699 700 701 702 703 704 705
   #else
   STBI_NOTUSED(buffer);
   STBI_NOTUSED(len);
   return 0;
   #endif
}

#ifndef STBI_NO_STDIO
STBIDEF int      stbi_is_hdr          (char const *filename)
{
S
Sean Barrett 已提交
706
   FILE *f = stbi__fopen(filename, "rb");
707 708 709 710 711 712 713 714 715 716 717
   int result=0;
   if (f) {
      result = stbi_is_hdr_from_file(f);
      fclose(f);
   }
   return result;
}

STBIDEF int      stbi_is_hdr_from_file(FILE *f)
{
   #ifndef STBI_NO_HDR
S
Sean Barrett 已提交
718
   stbi__context s;
719
   stbi__start_file(&s,f);
S
Sean Barrett 已提交
720
   return stbi__hdr_test(&s);
721 722 723 724 725 726 727 728 729
   #else
   return 0;
   #endif
}
#endif // !STBI_NO_STDIO

STBIDEF int      stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
{
   #ifndef STBI_NO_HDR
S
Sean Barrett 已提交
730 731 732
   stbi__context s;
   stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
   return stbi__hdr_test(&s);
733 734 735 736 737 738
   #else
   return 0;
   #endif
}

#ifndef STBI_NO_HDR
739 740
static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
741

742 743
void   stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }
void   stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }
744

745 746
void   stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }
void   stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }
747 748 749 750 751 752 753 754 755 756 757 758 759 760 761
#endif


//////////////////////////////////////////////////////////////////////////////
//
// Common code used by all image loaders
//

enum
{
   SCAN_load=0,
   SCAN_type,
   SCAN_header
};

S
Sean Barrett 已提交
762
static void stbi__refill_buffer(stbi__context *s)
763 764 765 766
{
   int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen);
   if (n == 0) {
      // at end of file, treat same as if from memory, but need to handle case
T
Tero Hänninen 已提交
767
      // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file
768 769 770 771 772 773 774 775 776 777
      s->read_from_callbacks = 0;
      s->img_buffer = s->buffer_start;
      s->img_buffer_end = s->buffer_start+1;
      *s->img_buffer = 0;
   } else {
      s->img_buffer = s->buffer_start;
      s->img_buffer_end = s->buffer_start + n;
   }
}

778
stbi_inline static stbi_uc stbi__get8(stbi__context *s)
779 780 781 782
{
   if (s->img_buffer < s->img_buffer_end)
      return *s->img_buffer++;
   if (s->read_from_callbacks) {
S
Sean Barrett 已提交
783
      stbi__refill_buffer(s);
784 785 786 787 788
      return *s->img_buffer++;
   }
   return 0;
}

789
stbi_inline static int stbi__at_eof(stbi__context *s)
790 791 792 793 794 795 796 797 798 799 800
{
   if (s->io.read) {
      if (!(s->io.eof)(s->io_user_data)) return 0;
      // if feof() is true, check if buffer = end
      // special case: we've only got the special 0 character at the end
      if (s->read_from_callbacks == 0) return 1;
   }

   return s->img_buffer >= s->img_buffer_end;   
}

801
static void stbi__skip(stbi__context *s, int n)
802 803 804 805 806
{
   if (s->io.read) {
      int blen = (int) (s->img_buffer_end - s->img_buffer);
      if (blen < n) {
         s->img_buffer = s->img_buffer_end;
S
Sean Barrett 已提交
807
         (s->io.skip)(s->io_user_data, n - blen);
808 809 810 811 812 813
         return;
      }
   }
   s->img_buffer += n;
}

814
static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)
815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837
{
   if (s->io.read) {
      int blen = (int) (s->img_buffer_end - s->img_buffer);
      if (blen < n) {
         int res, count;

         memcpy(buffer, s->img_buffer, blen);
         
         count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen);
         res = (count == (n-blen));
         s->img_buffer = s->img_buffer_end;
         return res;
      }
   }

   if (s->img_buffer+n <= s->img_buffer_end) {
      memcpy(buffer, s->img_buffer, n);
      s->img_buffer += n;
      return 1;
   } else
      return 0;
}

838
static int stbi__get16be(stbi__context *s)
839
{
840 841
   int z = stbi__get8(s);
   return (z << 8) + stbi__get8(s);
842 843
}

844
static stbi__uint32 stbi__get32be(stbi__context *s)
845
{
846 847
   stbi__uint32 z = stbi__get16be(s);
   return (z << 16) + stbi__get16be(s);
848 849
}

850
static int stbi__get16le(stbi__context *s)
851
{
852 853
   int z = stbi__get8(s);
   return z + (stbi__get8(s) << 8);
854 855
}

856
static stbi__uint32 stbi__get32le(stbi__context *s)
857
{
858 859
   stbi__uint32 z = stbi__get16le(s);
   return z + (stbi__get16le(s) << 16);
860 861 862 863 864
}

//////////////////////////////////////////////////////////////////////////////
//
//  generic converter from built-in img_n to req_comp
T
Tero Hänninen 已提交
865
//    individual types do this automatically as much as possible (e.g. jpeg
866 867 868 869 870 871 872
//    does all cases internally since it needs to colorspace convert anyway,
//    and it never has alpha, so very few cases ). png can automatically
//    interleave an alpha=255 channel, but falls back to this for other cases
//
//  assume data buffer is malloced, so malloc a new one and free that one
//  only failure mode is malloc failing

873
static stbi_uc stbi__compute_y(int r, int g, int b)
874
{
875
   return (stbi_uc) (((r*77) + (g*150) +  (29*b)) >> 8);
876 877
}

878
static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)
879 880 881 882 883
{
   int i,j;
   unsigned char *good;

   if (req_comp == img_n) return data;
S
Sean Barrett 已提交
884
   STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
885

886
   good = (unsigned char *) stbi__malloc(req_comp * x * y);
887 888
   if (good == NULL) {
      free(data);
S
Sean Barrett 已提交
889
      return stbi__errpuc("outofmem", "Out of memory");
890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907
   }

   for (j=0; j < (int) y; ++j) {
      unsigned char *src  = data + j * x * img_n   ;
      unsigned char *dest = good + j * x * req_comp;

      #define COMBO(a,b)  ((a)*8+(b))
      #define CASE(a,b)   case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
      // convert source image with img_n components to one with req_comp components;
      // avoid switch per pixel, so use switch per scanline and massive macros
      switch (COMBO(img_n, req_comp)) {
         CASE(1,2) dest[0]=src[0], dest[1]=255; break;
         CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break;
         CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break;
         CASE(2,1) dest[0]=src[0]; break;
         CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break;
         CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break;
         CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break;
908 909 910 911
         CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
         CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break;
         CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
         CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break;
912
         CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break;
S
Sean Barrett 已提交
913
         default: STBI_ASSERT(0);
914 915 916 917 918 919 920 921 922
      }
      #undef CASE
   }

   free(data);
   return good;
}

#ifndef STBI_NO_HDR
923
static float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
924 925
{
   int i,k,n;
926
   float *output = (float *) stbi__malloc(x * y * comp * sizeof(float));
S
Sean Barrett 已提交
927
   if (output == NULL) { free(data); return stbi__errpf("outofmem", "Out of memory"); }
928 929 930 931
   // compute number of non-alpha components
   if (comp & 1) n = comp; else n = comp-1;
   for (i=0; i < x*y; ++i) {
      for (k=0; k < n; ++k) {
932
         output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
933 934 935 936 937 938 939
      }
      if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
   }
   free(data);
   return output;
}

940 941
#define stbi__float2int(x)   ((int) (x))
static stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp)
942 943
{
   int i,k,n;
944
   stbi_uc *output = (stbi_uc *) stbi__malloc(x * y * comp);
S
Sean Barrett 已提交
945
   if (output == NULL) { free(data); return stbi__errpuc("outofmem", "Out of memory"); }
946 947 948 949
   // compute number of non-alpha components
   if (comp & 1) n = comp; else n = comp-1;
   for (i=0; i < x*y; ++i) {
      for (k=0; k < n; ++k) {
950
         float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
951 952
         if (z < 0) z = 0;
         if (z > 255) z = 255;
953
         output[i*comp + k] = (stbi_uc) stbi__float2int(z);
954 955 956 957 958
      }
      if (k < comp) {
         float z = data[i*comp+k] * 255 + 0.5f;
         if (z < 0) z = 0;
         if (z > 255) z = 255;
959
         output[i*comp + k] = (stbi_uc) stbi__float2int(z);
960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998
      }
   }
   free(data);
   return output;
}
#endif

//////////////////////////////////////////////////////////////////////////////
//
//  "baseline" JPEG/JFIF decoder (not actually fully baseline implementation)
//
//    simple implementation
//      - channel subsampling of at most 2 in each dimension
//      - doesn't support delayed output of y-dimension
//      - simple interface (only one output format: 8-bit interleaved RGB)
//      - doesn't try to recover corrupt jpegs
//      - doesn't allow partial loading, loading multiple at once
//      - still fast on x86 (copying globals into locals doesn't help x86)
//      - allocates lots of intermediate memory (full size of all components)
//        - non-interleaved case requires this anyway
//        - allows good upsampling (see next)
//    high-quality
//      - upsampled channels are bilinearly interpolated, even across blocks
//      - quality integer IDCT derived from IJG's 'slow'
//    performance
//      - fast huffman; reasonable integer IDCT
//      - uses a lot of intermediate memory, could cache poorly
//      - load http://nothings.org/remote/anemones.jpg 3 times on 2.8Ghz P4
//          stb_jpeg:   1.34 seconds (MSVC6, default release build)
//          stb_jpeg:   1.06 seconds (MSVC6, processor = Pentium Pro)
//          IJL11.dll:  1.08 seconds (compiled by intel)
//          IJG 1998:   0.98 seconds (MSVC6, makefile provided by IJG)
//          IJG 1998:   0.95 seconds (MSVC6, makefile + proc=PPro)

// huffman decoding acceleration
#define FAST_BITS   9  // larger handles more cases; smaller stomps less cache

typedef struct
{
999
   stbi_uc  fast[1 << FAST_BITS];
1000 1001
   // weirdly, repacking this into AoS is a 10% speed loss, instead of a win
   stbi__uint16 code[256];
1002 1003
   stbi_uc  values[256];
   stbi_uc  size[257];
1004 1005
   unsigned int maxcode[18];
   int    delta[17];   // old 'firstsymbol' - old 'firstcode'
1006
} stbi__huffman;
1007 1008 1009 1010 1011 1012

typedef struct
{
   #ifdef STBI_SIMD
   unsigned short dequant2[4][64];
   #endif
S
Sean Barrett 已提交
1013
   stbi__context *s;
1014 1015
   stbi__huffman huff_dc[4];
   stbi__huffman huff_ac[4];
1016
   stbi_uc dequant[4][64];
1017
   stbi__int16 fast_ac[4][1 << FAST_BITS];
1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033

// sizes for components, interleaved MCUs
   int img_h_max, img_v_max;
   int img_mcu_x, img_mcu_y;
   int img_mcu_w, img_mcu_h;

// definition of jpeg image component
   struct
   {
      int id;
      int h,v;
      int tq;
      int hd,ha;
      int dc_pred;

      int x,y,w2,h2;
1034
      stbi_uc *data;
1035
      void *raw_data;
1036
      stbi_uc *linebuf;
1037 1038 1039 1040 1041 1042 1043 1044 1045
   } img_comp[4];

   stbi__uint32         code_buffer; // jpeg entropy-coded buffer
   int            code_bits;   // number of valid bits
   unsigned char  marker;      // marker seen while filling entropy buffer
   int            nomore;      // flag if we saw a marker so must stop

   int scan_n, order[4];
   int restart_interval, todo;
1046
} stbi__jpeg;
1047

1048
static int stbi__build_huffman(stbi__huffman *h, int *count)
1049 1050 1051 1052 1053
{
   int i,j,k=0,code;
   // build size list for each symbol (from JPEG spec)
   for (i=0; i < 16; ++i)
      for (j=0; j < count[i]; ++j)
1054
         h->size[k++] = (stbi_uc) (i+1);
1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065
   h->size[k] = 0;

   // compute actual symbols (from jpeg spec)
   code = 0;
   k = 0;
   for(j=1; j <= 16; ++j) {
      // compute delta to add to code to compute symbol id
      h->delta[j] = k - code;
      if (h->size[k] == j) {
         while (h->size[k] == j)
            h->code[k++] = (stbi__uint16) (code++);
S
Sean Barrett 已提交
1066
         if (code-1 >= (1 << j)) return stbi__err("bad code lengths","Corrupt JPEG");
1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081
      }
      // compute largest code + 1 for this size, preshifted as needed later
      h->maxcode[j] = code << (16-j);
      code <<= 1;
   }
   h->maxcode[j] = 0xffffffff;

   // build non-spec acceleration table; 255 is flag for not-accelerated
   memset(h->fast, 255, 1 << FAST_BITS);
   for (i=0; i < k; ++i) {
      int s = h->size[i];
      if (s <= FAST_BITS) {
         int c = h->code[i] << (FAST_BITS-s);
         int m = 1 << (FAST_BITS-s);
         for (j=0; j < m; ++j) {
1082
            h->fast[c+j] = (stbi_uc) i;
1083 1084 1085 1086 1087 1088
         }
      }
   }
   return 1;
}

1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115
// build a table that decodes both magnitude and value of small ACs in
// one go.
static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
{
   int i;
   for (i=0; i < (1 << FAST_BITS); ++i) {
      stbi_uc fast = h->fast[i];
      fast_ac[i] = 0;
      if (fast < 255) {
         int rs = h->values[fast];
         int run = (rs >> 4) & 15;
         int magbits = rs & 15;
         int len = h->size[fast];

         if (magbits && len + magbits <= FAST_BITS) {
            // magnitude code followed by receive_extend code
            int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
            int m = 1 << (magbits - 1);
            if (k < m) k += (-1 << magbits) + 1;
            // if the result is small enough, we can fit it in fast_ac table
            if (k >= -128 && k <= 127)
               fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits));
         }
      }
   }
}

1116
static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
1117 1118
{
   do {
1119
      int b = j->nomore ? 0 : stbi__get8(j->s);
1120
      if (b == 0xff) {
1121
         int c = stbi__get8(j->s);
1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133
         if (c != 0) {
            j->marker = (unsigned char) c;
            j->nomore = 1;
            return;
         }
      }
      j->code_buffer |= b << (24 - j->code_bits);
      j->code_bits += 8;
   } while (j->code_bits <= 24);
}

// (1 << n) - 1
1134
static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
1135

1136
// decode a jpeg huffman value from the bitstream
1137
stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
1138 1139 1140 1141
{
   unsigned int temp;
   int c,k;

1142
   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176

   // look at the top FAST_BITS and determine what symbol ID it is,
   // if the code is <= FAST_BITS
   c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
   k = h->fast[c];
   if (k < 255) {
      int s = h->size[k];
      if (s > j->code_bits)
         return -1;
      j->code_buffer <<= s;
      j->code_bits -= s;
      return h->values[k];
   }

   // naive test is to shift the code_buffer down so k bits are
   // valid, then test against maxcode. To speed this up, we've
   // preshifted maxcode left so that it has (16-k) 0s at the
   // end; in other words, regardless of the number of bits, it
   // wants to be compared against something shifted to have 16;
   // that way we don't need to shift inside the loop.
   temp = j->code_buffer >> 16;
   for (k=FAST_BITS+1 ; ; ++k)
      if (temp < h->maxcode[k])
         break;
   if (k == 17) {
      // error! code not found
      j->code_bits -= 16;
      return -1;
   }

   if (k > j->code_bits)
      return -1;

   // convert the huffman code to the symbol id
1177
   c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
S
Sean Barrett 已提交
1178
   STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
1179 1180 1181 1182 1183 1184 1185

   // convert the id to a symbol
   j->code_bits -= k;
   j->code_buffer <<= k;
   return h->values[c];
}

1186 1187 1188
// bias[n] = (-1<<n) + 1
static int const stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};

1189 1190
// combined JPEG 'receive' and JPEG 'extend', since baseline
// always extends everything it receives.
1191
stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)
1192 1193
{
   unsigned int k;
1194
   int sgn;
1195
   if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1196

1197
   sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB
1198
   k = stbi_lrot(j->code_buffer, n);
1199 1200
   j->code_buffer = k & ~stbi__bmask[n];
   k &= stbi__bmask[n];
1201
   j->code_bits -= n;
1202
   return k + (stbi__jbias[n] & ~sgn);
1203 1204 1205 1206
}

// given a value that's at position X in the zigzag stream,
// where does it appear in the 8x8 matrix coded as row-major?
1207
static stbi_uc stbi__jpeg_dezigzag[64+15] =
1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221
{
    0,  1,  8, 16,  9,  2,  3, 10,
   17, 24, 32, 25, 18, 11,  4,  5,
   12, 19, 26, 33, 40, 48, 41, 34,
   27, 20, 13,  6,  7, 14, 21, 28,
   35, 42, 49, 56, 57, 50, 43, 36,
   29, 22, 15, 23, 30, 37, 44, 51,
   58, 59, 52, 45, 38, 31, 39, 46,
   53, 60, 61, 54, 47, 55, 62, 63,
   // let corrupt input sample past end
   63, 63, 63, 63, 63, 63, 63, 63,
   63, 63, 63, 63, 63, 63, 63
};

1222
// decode one 64-entry block--
1223
static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b)
1224 1225
{
   int diff,dc,k;
1226 1227 1228 1229
   int t;

   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
   t = stbi__jpeg_huff_decode(j, hdc);
S
Sean Barrett 已提交
1230
   if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG");
1231 1232 1233 1234

   // 0 all the ac values now so we can do it 32-bits at a time
   memset(data,0,64*sizeof(data[0]));

1235
   diff = t ? stbi__extend_receive(j, t) : 0;
1236 1237 1238 1239
   dc = j->img_comp[b].dc_pred + diff;
   j->img_comp[b].dc_pred = dc;
   data[0] = (short) dc;

1240
   // decode AC components, see JPEG spec
1241 1242
   k = 1;
   do {
1243 1244 1245 1246 1247 1248 1249 1250 1251
      int c,r,s;
      if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
      c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
      r = fac[c];
      if (r) { // fast-AC path
         k += (r >> 4) & 15; // run
         s = r & 15; // combined length
         j->code_buffer <<= s;
         j->code_bits -= s;
1252
         // decode into unzigzag'd location
1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266
         data[stbi__jpeg_dezigzag[k++]] = (short) (r >> 8);
      } else {
         int rs = stbi__jpeg_huff_decode(j, hac);
         if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
         s = rs & 15;
         r = rs >> 4;
         if (s == 0) {
            if (rs != 0xf0) break; // end block
            k += 16;
         } else {
            k += r;
            // decode into unzigzag'd location
            data[stbi__jpeg_dezigzag[k++]] = (short) stbi__extend_receive(j,s);
         }
1267 1268 1269 1270 1271
      }
   } while (k < 64);
   return 1;
}

1272
// take a -128..127 value and stbi__clamp it and convert to 0..255
1273
stbi_inline static stbi_uc stbi__clamp(int x)
1274 1275 1276 1277 1278 1279
{
   // trick to use a single test to catch both cases
   if ((unsigned int) x > 255) {
      if (x < 0) return 0;
      if (x > 255) return 255;
   }
1280
   return (stbi_uc) x;
1281 1282
}

1283 1284
#define stbi__f2f(x)  (int) (((x) * 4096 + 0.5))
#define stbi__fsh(x)  ((x) << 12)
1285 1286

// derived from jidctint -- DCT_ISLOW
1287
#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7)       \
1288 1289 1290
   int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
   p2 = s2;                                    \
   p3 = s6;                                    \
1291 1292 1293
   p1 = (p2+p3) * stbi__f2f(0.5411961f);             \
   t2 = p1 + p3*stbi__f2f(-1.847759065f);            \
   t3 = p1 + p2*stbi__f2f( 0.765366865f);            \
1294 1295
   p2 = s0;                                    \
   p3 = s4;                                    \
1296 1297
   t0 = stbi__fsh(p2+p3);                            \
   t1 = stbi__fsh(p2-p3);                            \
1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309
   x0 = t0+t3;                                 \
   x3 = t0-t3;                                 \
   x1 = t1+t2;                                 \
   x2 = t1-t2;                                 \
   t0 = s7;                                    \
   t1 = s5;                                    \
   t2 = s3;                                    \
   t3 = s1;                                    \
   p3 = t0+t2;                                 \
   p4 = t1+t3;                                 \
   p1 = t0+t3;                                 \
   p2 = t1+t2;                                 \
1310 1311 1312 1313 1314 1315 1316 1317 1318
   p5 = (p3+p4)*stbi__f2f( 1.175875602f);            \
   t0 = t0*stbi__f2f( 0.298631336f);                 \
   t1 = t1*stbi__f2f( 2.053119869f);                 \
   t2 = t2*stbi__f2f( 3.072711026f);                 \
   t3 = t3*stbi__f2f( 1.501321110f);                 \
   p1 = p5 + p1*stbi__f2f(-0.899976223f);            \
   p2 = p5 + p2*stbi__f2f(-2.562915447f);            \
   p3 = p3*stbi__f2f(-1.961570560f);                 \
   p4 = p4*stbi__f2f(-0.390180644f);                 \
1319 1320 1321 1322 1323 1324 1325 1326
   t3 += p1+p4;                                \
   t2 += p2+p3;                                \
   t1 += p2+p4;                                \
   t0 += p1+p3;

#ifdef STBI_SIMD
typedef unsigned short stbi_dequantize_t;
#else
1327
typedef stbi_uc stbi_dequantize_t;
1328 1329 1330
#endif

// .344 seconds on 3*anemones.jpg
1331
static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64], stbi_dequantize_t *dequantize)
1332 1333 1334
{
   int i,val[64],*v=val;
   stbi_dequantize_t *dq = dequantize;
1335
   stbi_uc *o;
1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349
   short *d = data;

   // columns
   for (i=0; i < 8; ++i,++d,++dq, ++v) {
      // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing
      if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
           && d[40]==0 && d[48]==0 && d[56]==0) {
         //    no shortcut                 0     seconds
         //    (1|2|3|4|5|6|7)==0          0     seconds
         //    all separate               -0.047 seconds
         //    1 && 2|3 && 4|5 && 6|7:    -0.047 seconds
         int dcterm = d[0] * dq[0] << 2;
         v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
      } else {
1350
         STBI__IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24],
1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367
                 d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56])
         // constants scaled things up by 1<<12; let's bring them back
         // down, but keep 2 extra bits of precision
         x0 += 512; x1 += 512; x2 += 512; x3 += 512;
         v[ 0] = (x0+t3) >> 10;
         v[56] = (x0-t3) >> 10;
         v[ 8] = (x1+t2) >> 10;
         v[48] = (x1-t2) >> 10;
         v[16] = (x2+t1) >> 10;
         v[40] = (x2-t1) >> 10;
         v[24] = (x3+t0) >> 10;
         v[32] = (x3-t0) >> 10;
      }
   }

   for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
      // no fast case since the first 1D IDCT spread components out
1368
      STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380
      // constants scaled things up by 1<<12, plus we had 1<<2 from first
      // loop, plus horizontal and vertical each scale by sqrt(8) so together
      // we've got an extra 1<<3, so 1<<17 total we need to remove.
      // so we want to round that, which means adding 0.5 * 1<<17,
      // aka 65536. Also, we'll end up with -128 to 127 that we want
      // to encode as 0..255 by adding 128, so we'll add that before the shift
      x0 += 65536 + (128<<17);
      x1 += 65536 + (128<<17);
      x2 += 65536 + (128<<17);
      x3 += 65536 + (128<<17);
      // tried computing the shifts into temps, or'ing the temps to see
      // if any were out of range, but that was slower
1381 1382 1383 1384 1385 1386 1387 1388
      o[0] = stbi__clamp((x0+t3) >> 17);
      o[7] = stbi__clamp((x0-t3) >> 17);
      o[1] = stbi__clamp((x1+t2) >> 17);
      o[6] = stbi__clamp((x1-t2) >> 17);
      o[2] = stbi__clamp((x2+t1) >> 17);
      o[5] = stbi__clamp((x2-t1) >> 17);
      o[3] = stbi__clamp((x3+t0) >> 17);
      o[4] = stbi__clamp((x3-t0) >> 17);
1389 1390 1391 1392
   }
}

#ifdef STBI_SIMD
1393
static stbi_idct_8x8 stbi__idct_installed = stbi__idct_block;
1394 1395 1396

STBIDEF void stbi_install_idct(stbi_idct_8x8 func)
{
1397
   stbi__idct_installed = func;
1398 1399 1400
}
#endif

1401
#define STBI__MARKER_none  0xff
1402 1403 1404
// if there's a pending marker from the entropy stream, return that
// otherwise, fetch from the stream and get a marker. if there's no
// marker, return 0xff, which is never a valid marker value
1405
static stbi_uc stbi__get_marker(stbi__jpeg *j)
1406
{
1407
   stbi_uc x;
1408
   if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }
1409
   x = stbi__get8(j->s);
1410
   if (x != 0xff) return STBI__MARKER_none;
1411
   while (x == 0xff)
1412
      x = stbi__get8(j->s);
1413 1414 1415 1416 1417
   return x;
}

// in each scan, we'll have scan_n components, and the order
// of the components is specified by order[]
1418
#define STBI__RESTART(x)     ((x) >= 0xd0 && (x) <= 0xd7)
1419

1420
// after a restart interval, stbi__jpeg_reset the entropy decoder and
1421
// the dc prediction
1422
static void stbi__jpeg_reset(stbi__jpeg *j)
1423 1424 1425 1426 1427
{
   j->code_bits = 0;
   j->code_buffer = 0;
   j->nomore = 0;
   j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
1428
   j->marker = STBI__MARKER_none;
1429 1430 1431 1432 1433
   j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
   // no more than 1<<31 MCUs if no restart_interal? that's plenty safe,
   // since we don't even allow 1<<30 pixels
}

1434
static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
1435
{
1436
   stbi__jpeg_reset(z);
1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451
   if (z->scan_n == 1) {
      int i,j;
      #ifdef STBI_SIMD
      __declspec(align(16))
      #endif
      short data[64];
      int n = z->order[0];
      // non-interleaved data, we just need to process one block at a time,
      // in trivial scanline order
      // number of blocks to do just depends on how many actual "pixels" this
      // component has, independent of interleaved MCU blocking and such
      int w = (z->img_comp[n].x+7) >> 3;
      int h = (z->img_comp[n].y+7) >> 3;
      for (j=0; j < h; ++j) {
         for (i=0; i < w; ++i) {
1452 1453
            int ha = z->img_comp[n].ha;
            if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n)) return 0;
1454
            #ifdef STBI_SIMD
1455
            stbi__idct_installed(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]);
1456
            #else
1457
            stbi__idct_block(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]);
1458 1459 1460
            #endif
            // every data block is an MCU, so countdown the restart interval
            if (--z->todo <= 0) {
1461
               if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
1462 1463
               // if it's NOT a restart, then just bail, so we get corrupt data
               // rather than no data
1464 1465
               if (!STBI__RESTART(z->marker)) return 1;
               stbi__jpeg_reset(z);
1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482
            }
         }
      }
   } else { // interleaved!
      int i,j,k,x,y;
      short data[64];
      for (j=0; j < z->img_mcu_y; ++j) {
         for (i=0; i < z->img_mcu_x; ++i) {
            // scan an interleaved mcu... process scan_n components in order
            for (k=0; k < z->scan_n; ++k) {
               int n = z->order[k];
               // scan out an mcu's worth of this component; that's just determined
               // by the basic H and V specified for the component
               for (y=0; y < z->img_comp[n].v; ++y) {
                  for (x=0; x < z->img_comp[n].h; ++x) {
                     int x2 = (i*z->img_comp[n].h + x)*8;
                     int y2 = (j*z->img_comp[n].v + y)*8;
1483 1484
                     int ha = z->img_comp[n].ha;
                     if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n)) return 0;
1485
                     #ifdef STBI_SIMD
1486
                     stbi__idct_installed(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]);
1487
                     #else
1488
                     stbi__idct_block(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]);
1489 1490 1491 1492 1493 1494 1495
                     #endif
                  }
               }
            }
            // after all interleaved components, that's an interleaved MCU,
            // so now count down the restart interval
            if (--z->todo <= 0) {
1496
               if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
1497 1498
               // if it's NOT a restart, then just bail, so we get corrupt data
               // rather than no data
1499 1500
               if (!STBI__RESTART(z->marker)) return 1;
               stbi__jpeg_reset(z);
1501 1502 1503 1504 1505 1506 1507
            }
         }
      }
   }
   return 1;
}

1508
static int stbi__process_marker(stbi__jpeg *z, int m)
1509 1510 1511
{
   int L;
   switch (m) {
1512
      case STBI__MARKER_none: // no marker found
S
Sean Barrett 已提交
1513
         return stbi__err("expected marker","Corrupt JPEG");
1514

1515
      case 0xC2: // stbi__SOF - progressive
S
Sean Barrett 已提交
1516
         return stbi__err("progressive jpeg","JPEG format not supported (progressive)");
1517 1518

      case 0xDD: // DRI - specify restart interval
1519 1520
         if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG");
         z->restart_interval = stbi__get16be(z->s);
1521 1522 1523
         return 1;

      case 0xDB: // DQT - define quantization table
1524
         L = stbi__get16be(z->s)-2;
1525
         while (L > 0) {
1526
            int q = stbi__get8(z->s);
1527 1528
            int p = q >> 4;
            int t = q & 15,i;
S
Sean Barrett 已提交
1529 1530
            if (p != 0) return stbi__err("bad DQT type","Corrupt JPEG");
            if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG");
1531
            for (i=0; i < 64; ++i)
1532
               z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s);
1533 1534 1535 1536 1537 1538 1539 1540 1541
            #ifdef STBI_SIMD
            for (i=0; i < 64; ++i)
               z->dequant2[t][i] = z->dequant[t][i];
            #endif
            L -= 65;
         }
         return L==0;

      case 0xC4: // DHT - define huffman table
1542
         L = stbi__get16be(z->s)-2;
1543
         while (L > 0) {
1544
            stbi_uc *v;
1545
            int sizes[16],i,n=0;
1546
            int q = stbi__get8(z->s);
1547 1548
            int tc = q >> 4;
            int th = q & 15;
S
Sean Barrett 已提交
1549
            if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG");
1550
            for (i=0; i < 16; ++i) {
1551
               sizes[i] = stbi__get8(z->s);
1552 1553 1554 1555
               n += sizes[i];
            }
            L -= 17;
            if (tc == 0) {
1556
               if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0;
1557 1558
               v = z->huff_dc[th].values;
            } else {
1559
               if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0;
1560 1561 1562
               v = z->huff_ac[th].values;
            }
            for (i=0; i < n; ++i)
1563
               v[i] = stbi__get8(z->s);
1564 1565
            if (tc != 0)
               stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
1566 1567 1568 1569 1570 1571
            L -= n;
         }
         return L==0;
   }
   // check for comment block or APP blocks
   if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
1572
      stbi__skip(z->s, stbi__get16be(z->s)-2);
1573 1574 1575 1576 1577
      return 1;
   }
   return 0;
}

1578 1579
// after we see stbi__SOS
static int stbi__process_scan_header(stbi__jpeg *z)
1580 1581
{
   int i;
1582 1583 1584 1585
   int Ls = stbi__get16be(z->s);
   z->scan_n = stbi__get8(z->s);
   if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad stbi__SOS component count","Corrupt JPEG");
   if (Ls != 6+2*z->scan_n) return stbi__err("bad stbi__SOS len","Corrupt JPEG");
1586
   for (i=0; i < z->scan_n; ++i) {
1587 1588
      int id = stbi__get8(z->s), which;
      int q = stbi__get8(z->s);
1589 1590 1591 1592
      for (which = 0; which < z->s->img_n; ++which)
         if (z->img_comp[which].id == id)
            break;
      if (which == z->s->img_n) return 0;
S
Sean Barrett 已提交
1593 1594
      z->img_comp[which].hd = q >> 4;   if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG");
      z->img_comp[which].ha = q & 15;   if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG");
1595 1596
      z->order[i] = which;
   }
1597 1598 1599
   if (stbi__get8(z->s) != 0) return stbi__err("bad stbi__SOS","Corrupt JPEG");
   stbi__get8(z->s); // should be 63, but might be 0
   if (stbi__get8(z->s) != 0) return stbi__err("bad stbi__SOS","Corrupt JPEG");
1600 1601 1602 1603

   return 1;
}

1604
static int stbi__process_frame_header(stbi__jpeg *z, int scan)
1605
{
S
Sean Barrett 已提交
1606
   stbi__context *s = z->s;
1607
   int Lf,p,i,q, h_max=1,v_max=1,c;
1608 1609 1610 1611 1612
   Lf = stbi__get16be(s);         if (Lf < 11) return stbi__err("bad stbi__SOF len","Corrupt JPEG"); // JPEG
   p  = stbi__get8(s);          if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline
   s->img_y = stbi__get16be(s);   if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG
   s->img_x = stbi__get16be(s);   if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires
   c = stbi__get8(s);
S
Sean Barrett 已提交
1613
   if (c != 3 && c != 1) return stbi__err("bad component count","Corrupt JPEG");    // JFIF requires
1614 1615 1616 1617 1618 1619
   s->img_n = c;
   for (i=0; i < c; ++i) {
      z->img_comp[i].data = NULL;
      z->img_comp[i].linebuf = NULL;
   }

1620
   if (Lf != 8+3*s->img_n) return stbi__err("bad stbi__SOF len","Corrupt JPEG");
1621 1622

   for (i=0; i < s->img_n; ++i) {
1623
      z->img_comp[i].id = stbi__get8(s);
1624 1625
      if (z->img_comp[i].id != i+1)   // JFIF requires
         if (z->img_comp[i].id != i)  // some version of jpegtran outputs non-JFIF-compliant files!
S
Sean Barrett 已提交
1626
            return stbi__err("bad component ID","Corrupt JPEG");
1627
      q = stbi__get8(s);
S
Sean Barrett 已提交
1628 1629
      z->img_comp[i].h = (q >> 4);  if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG");
      z->img_comp[i].v = q & 15;    if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG");
1630
      z->img_comp[i].tq = stbi__get8(s);  if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG");
1631 1632 1633 1634
   }

   if (scan != SCAN_load) return 1;

1635
   if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode");
1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650

   for (i=0; i < s->img_n; ++i) {
      if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
      if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
   }

   // compute interleaved mcu info
   z->img_h_max = h_max;
   z->img_v_max = v_max;
   z->img_mcu_w = h_max * 8;
   z->img_mcu_h = v_max * 8;
   z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
   z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;

   for (i=0; i < s->img_n; ++i) {
T
Tero Hänninen 已提交
1651
      // number of effective pixels (e.g. for non-interleaved MCU)
1652 1653
      z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
      z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
1654
      // to simplify generation, we'll allocate enough memory to decode
1655
      // the bogus oversized data from using interleaved MCUs and their
T
Tero Hänninen 已提交
1656
      // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't
1657 1658 1659
      // discard the extra data until colorspace conversion
      z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
      z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
1660
      z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15);
1661 1662 1663 1664 1665
      if (z->img_comp[i].raw_data == NULL) {
         for(--i; i >= 0; --i) {
            free(z->img_comp[i].raw_data);
            z->img_comp[i].data = NULL;
         }
S
Sean Barrett 已提交
1666
         return stbi__err("outofmem", "Out of memory");
1667 1668
      }
      // align blocks for installable-idct using mmx/sse
1669
      z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
1670 1671 1672 1673 1674 1675
      z->img_comp[i].linebuf = NULL;
   }

   return 1;
}

T
Tero Hänninen 已提交
1676
// use comparisons since in some cases we handle more than one case (e.g. stbi__SOF)
1677 1678 1679 1680 1681
#define stbi__DNL(x)         ((x) == 0xdc)
#define stbi__SOI(x)         ((x) == 0xd8)
#define stbi__EOI(x)         ((x) == 0xd9)
#define stbi__SOF(x)         ((x) == 0xc0 || (x) == 0xc1)
#define stbi__SOS(x)         ((x) == 0xda)
1682

1683
static int decode_jpeg_header(stbi__jpeg *z, int scan)
1684 1685
{
   int m;
1686 1687 1688
   z->marker = STBI__MARKER_none; // initialize cached marker to empty
   m = stbi__get_marker(z);
   if (!stbi__SOI(m)) return stbi__err("no stbi__SOI","Corrupt JPEG");
1689
   if (scan == SCAN_type) return 1;
1690 1691 1692 1693 1694
   m = stbi__get_marker(z);
   while (!stbi__SOF(m)) {
      if (!stbi__process_marker(z,m)) return 0;
      m = stbi__get_marker(z);
      while (m == STBI__MARKER_none) {
1695
         // some files have extra padding after their blocks, so ok, we'll scan
1696 1697
         if (stbi__at_eof(z->s)) return stbi__err("no stbi__SOF", "Corrupt JPEG");
         m = stbi__get_marker(z);
1698 1699
      }
   }
1700
   if (!stbi__process_frame_header(z, scan)) return 0;
1701 1702 1703
   return 1;
}

1704
static int decode_jpeg_image(stbi__jpeg *j)
1705 1706 1707 1708
{
   int m;
   j->restart_interval = 0;
   if (!decode_jpeg_header(j, SCAN_load)) return 0;
1709 1710 1711 1712 1713 1714
   m = stbi__get_marker(j);
   while (!stbi__EOI(m)) {
      if (stbi__SOS(m)) {
         if (!stbi__process_scan_header(j)) return 0;
         if (!stbi__parse_entropy_coded_data(j)) return 0;
         if (j->marker == STBI__MARKER_none ) {
1715
            // handle 0s at the end of image data from IP Kamera 9060
1716 1717
            while (!stbi__at_eof(j->s)) {
               int x = stbi__get8(j->s);
1718
               if (x == 255) {
1719
                  j->marker = stbi__get8(j->s);
1720 1721 1722 1723 1724
                  break;
               } else if (x != 0) {
                  return 0;
               }
            }
1725
            // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0
1726 1727
         }
      } else {
1728
         if (!stbi__process_marker(j, m)) return 0;
1729
      }
1730
      m = stbi__get_marker(j);
1731 1732 1733 1734 1735 1736
   }
   return 1;
}

// static jfif-centered resampling (across block boundaries)

1737
typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,
1738 1739
                                    int w, int hs);

1740
#define stbi__div4(x) ((stbi_uc) ((x) >> 2))
1741

1742
static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
1743 1744 1745 1746 1747 1748 1749 1750
{
   STBI_NOTUSED(out);
   STBI_NOTUSED(in_far);
   STBI_NOTUSED(w);
   STBI_NOTUSED(hs);
   return in_near;
}

1751
static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
1752 1753 1754 1755 1756
{
   // need to generate two samples vertically for every one in input
   int i;
   STBI_NOTUSED(hs);
   for (i=0; i < w; ++i)
1757
      out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
1758 1759 1760
   return out;
}

1761
static stbi_uc*  stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
1762 1763 1764
{
   // need to generate two samples horizontally for every one in input
   int i;
1765
   stbi_uc *input = in_near;
1766 1767 1768 1769 1770 1771 1772 1773

   if (w == 1) {
      // if only one sample, can't do any interpolation
      out[0] = out[1] = input[0];
      return out;
   }

   out[0] = input[0];
1774
   out[1] = stbi__div4(input[0]*3 + input[1] + 2);
1775 1776
   for (i=1; i < w-1; ++i) {
      int n = 3*input[i]+2;
1777 1778
      out[i*2+0] = stbi__div4(n+input[i-1]);
      out[i*2+1] = stbi__div4(n+input[i+1]);
1779
   }
1780
   out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
1781 1782 1783 1784 1785 1786 1787 1788
   out[i*2+1] = input[w-1];

   STBI_NOTUSED(in_far);
   STBI_NOTUSED(hs);

   return out;
}

1789
#define stbi__div16(x) ((stbi_uc) ((x) >> 4))
1790

1791
static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
1792 1793 1794 1795
{
   // need to generate 2x2 samples for every one in input
   int i,t0,t1;
   if (w == 1) {
1796
      out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
1797 1798 1799 1800
      return out;
   }

   t1 = 3*in_near[0] + in_far[0];
1801
   out[0] = stbi__div4(t1+2);
1802 1803 1804
   for (i=1; i < w; ++i) {
      t0 = t1;
      t1 = 3*in_near[i]+in_far[i];
1805 1806
      out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
      out[i*2  ] = stbi__div16(3*t1 + t0 + 8);
1807
   }
1808
   out[w*2-1] = stbi__div4(t1+2);
1809 1810 1811 1812 1813 1814

   STBI_NOTUSED(hs);

   return out;
}

1815
static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829
{
   // resample with nearest-neighbor
   int i,j;
   STBI_NOTUSED(in_far);
   for (i=0; i < w; ++i)
      for (j=0; j < hs; ++j)
         out[i*hs+j] = in_near[i];
   return out;
}

#define float2fixed(x)  ((int) ((x) * 65536 + 0.5))

// 0.38 seconds on 3*anemones.jpg   (0.25 with processor = Pro)
// VC6 without processor=Pro is generating multiple LEAs per multiply!
1830
static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step)
1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846
{
   int i;
   for (i=0; i < count; ++i) {
      int y_fixed = (y[i] << 16) + 32768; // rounding
      int r,g,b;
      int cr = pcr[i] - 128;
      int cb = pcb[i] - 128;
      r = y_fixed + cr*float2fixed(1.40200f);
      g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);
      b = y_fixed                            + cb*float2fixed(1.77200f);
      r >>= 16;
      g >>= 16;
      b >>= 16;
      if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
      if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
      if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
1847 1848 1849
      out[0] = (stbi_uc)r;
      out[1] = (stbi_uc)g;
      out[2] = (stbi_uc)b;
1850 1851 1852 1853 1854 1855
      out[3] = 255;
      out += step;
   }
}

#ifdef STBI_SIMD
1856
static stbi_YCbCr_to_RGB_run stbi__YCbCr_installed = stbi__YCbCr_to_RGB_row;
1857 1858 1859

STBIDEF void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func)
{
1860
   stbi__YCbCr_installed = func;
1861 1862 1863 1864 1865
}
#endif


// clean up the temporary component buffers
1866
static void stbi__cleanup_jpeg(stbi__jpeg *j)
1867 1868 1869
{
   int i;
   for (i=0; i < j->s->img_n; ++i) {
1870
      if (j->img_comp[i].raw_data) {
1871
         free(j->img_comp[i].raw_data);
1872
         j->img_comp[i].raw_data = NULL;
1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884
         j->img_comp[i].data = NULL;
      }
      if (j->img_comp[i].linebuf) {
         free(j->img_comp[i].linebuf);
         j->img_comp[i].linebuf = NULL;
      }
   }
}

typedef struct
{
   resample_row_func resample;
1885
   stbi_uc *line0,*line1;
1886 1887 1888 1889
   int hs,vs;   // expansion factor in each axis
   int w_lores; // horizontal pixels pre-expansion 
   int ystep;   // how far through vertical expansion we are
   int ypos;    // which pre-expansion row we're on
1890
} stbi__resample;
1891

1892
static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)
1893 1894
{
   int n, decode_n;
1895 1896
   z->s->img_n = 0; // make stbi__cleanup_jpeg safe

1897
   // validate req_comp
S
Sean Barrett 已提交
1898
   if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
1899 1900

   // load a jpeg image from whichever source
1901
   if (!decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }
1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914

   // determine actual number of components to generate
   n = req_comp ? req_comp : z->s->img_n;

   if (z->s->img_n == 3 && n < 3)
      decode_n = 1;
   else
      decode_n = z->s->img_n;

   // resample and color-convert
   {
      int k;
      unsigned int i,j;
1915 1916
      stbi_uc *output;
      stbi_uc *coutput[4];
1917

1918
      stbi__resample res_comp[4];
1919 1920

      for (k=0; k < decode_n; ++k) {
1921
         stbi__resample *r = &res_comp[k];
1922 1923 1924

         // allocate line buffer big enough for upsampling off the edges
         // with upsample factor of 4
1925
         z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
1926
         if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
1927 1928 1929 1930 1931 1932 1933 1934 1935

         r->hs      = z->img_h_max / z->img_comp[k].h;
         r->vs      = z->img_v_max / z->img_comp[k].v;
         r->ystep   = r->vs >> 1;
         r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
         r->ypos    = 0;
         r->line0   = r->line1 = z->img_comp[k].data;

         if      (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
1936 1937 1938 1939
         else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
         else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
         else if (r->hs == 2 && r->vs == 2) r->resample = stbi__resample_row_hv_2;
         else                               r->resample = stbi__resample_row_generic;
1940 1941 1942
      }

      // can't error after this so, this is safe
1943
      output = (stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1);
1944
      if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
1945 1946 1947

      // now go ahead and resample
      for (j=0; j < z->s->img_y; ++j) {
1948
         stbi_uc *out = output + n * z->s->img_x * j;
1949
         for (k=0; k < decode_n; ++k) {
1950
            stbi__resample *r = &res_comp[k];
1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963
            int y_bot = r->ystep >= (r->vs >> 1);
            coutput[k] = r->resample(z->img_comp[k].linebuf,
                                     y_bot ? r->line1 : r->line0,
                                     y_bot ? r->line0 : r->line1,
                                     r->w_lores, r->hs);
            if (++r->ystep >= r->vs) {
               r->ystep = 0;
               r->line0 = r->line1;
               if (++r->ypos < z->img_comp[k].y)
                  r->line1 += z->img_comp[k].w2;
            }
         }
         if (n >= 3) {
1964
            stbi_uc *y = coutput[0];
1965 1966
            if (z->s->img_n == 3) {
               #ifdef STBI_SIMD
1967
               stbi__YCbCr_installed(out, y, coutput[1], coutput[2], z->s->img_x, n);
1968
               #else
1969
               stbi__YCbCr_to_RGB_row(out, y, coutput[1], coutput[2], z->s->img_x, n);
1970 1971 1972 1973 1974 1975 1976 1977
               #endif
            } else
               for (i=0; i < z->s->img_x; ++i) {
                  out[0] = out[1] = out[2] = y[i];
                  out[3] = 255; // not used if n==3
                  out += n;
               }
         } else {
1978
            stbi_uc *y = coutput[0];
1979 1980 1981 1982 1983 1984
            if (n == 1)
               for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
            else
               for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
         }
      }
1985
      stbi__cleanup_jpeg(z);
1986 1987 1988 1989 1990 1991 1992
      *out_x = z->s->img_x;
      *out_y = z->s->img_y;
      if (comp) *comp  = z->s->img_n; // report original components, not output
      return output;
   }
}

S
Sean Barrett 已提交
1993
static unsigned char *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
1994
{
1995
   stbi__jpeg j;
1996 1997 1998 1999
   j.s = s;
   return load_jpeg_image(&j, x,y,comp,req_comp);
}

S
Sean Barrett 已提交
2000
static int stbi__jpeg_test(stbi__context *s)
2001 2002
{
   int r;
2003
   stbi__jpeg j;
2004 2005
   j.s = s;
   r = decode_jpeg_header(&j, SCAN_type);
2006
   stbi__rewind(s);
2007 2008 2009
   return r;
}

2010
static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)
2011 2012
{
   if (!decode_jpeg_header(j, SCAN_header)) {
2013
      stbi__rewind( j->s );
2014 2015 2016 2017 2018 2019 2020 2021
      return 0;
   }
   if (x) *x = j->s->img_x;
   if (y) *y = j->s->img_y;
   if (comp) *comp = j->s->img_n;
   return 1;
}

S
Sean Barrett 已提交
2022
static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)
2023
{
2024
   stbi__jpeg j;
2025
   j.s = s;
2026
   return stbi__jpeg_info_raw(&j, x, y, comp);
2027 2028
}

2029
// public domain zlib decode    v0.2  Sean Barrett 2006-11-18
2030 2031 2032 2033 2034 2035 2036
//    simple implementation
//      - all input must be provided in an upfront buffer
//      - all output is written to a single output buffer (can malloc/realloc)
//    performance
//      - fast huffman

// fast-way is faster to check than jpeg huffman, but slow way is slower
2037 2038
#define STBI__ZFAST_BITS  9 // accelerate all cases in default tables
#define STBI__ZFAST_MASK  ((1 << STBI__ZFAST_BITS) - 1)
2039 2040 2041 2042 2043

// zlib-style huffman encoding
// (jpegs packs from left, zlib from right, so can't share code)
typedef struct
{
2044
   stbi__uint16 fast[1 << STBI__ZFAST_BITS];
2045 2046 2047
   stbi__uint16 firstcode[16];
   int maxcode[17];
   stbi__uint16 firstsymbol[16];
2048
   stbi_uc  size[288];
2049
   stbi__uint16 value[288]; 
2050
} stbi__zhuffman;
2051

2052
stbi_inline static int stbi__bitreverse16(int n)
2053 2054 2055 2056 2057 2058 2059 2060
{
  n = ((n & 0xAAAA) >>  1) | ((n & 0x5555) << 1);
  n = ((n & 0xCCCC) >>  2) | ((n & 0x3333) << 2);
  n = ((n & 0xF0F0) >>  4) | ((n & 0x0F0F) << 4);
  n = ((n & 0xFF00) >>  8) | ((n & 0x00FF) << 8);
  return n;
}

2061
stbi_inline static int stbi__bit_reverse(int v, int bits)
2062
{
S
Sean Barrett 已提交
2063
   STBI_ASSERT(bits <= 16);
2064
   // to bit reverse n bits, reverse 16 and shift
T
Tero Hänninen 已提交
2065
   // e.g. 11 bits, bit reverse and shift away 5
2066
   return stbi__bitreverse16(v) >> (16-bits);
2067 2068
}

2069
static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num)
2070 2071 2072 2073 2074 2075
{
   int i,k=0;
   int code, next_code[16], sizes[17];

   // DEFLATE spec for generating codes
   memset(sizes, 0, sizeof(sizes));
2076
   memset(z->fast, 0, sizeof(z->fast));
2077 2078 2079 2080
   for (i=0; i < num; ++i) 
      ++sizes[sizelist[i]];
   sizes[0] = 0;
   for (i=1; i < 16; ++i)
S
Sean Barrett 已提交
2081
      STBI_ASSERT(sizes[i] <= (1 << i));
2082 2083 2084 2085 2086 2087 2088
   code = 0;
   for (i=1; i < 16; ++i) {
      next_code[i] = code;
      z->firstcode[i] = (stbi__uint16) code;
      z->firstsymbol[i] = (stbi__uint16) k;
      code = (code + sizes[i]);
      if (sizes[i])
S
Sean Barrett 已提交
2089
         if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt JPEG");
2090 2091 2092 2093 2094 2095 2096 2097 2098
      z->maxcode[i] = code << (16-i); // preshift for inner loop
      code <<= 1;
      k += sizes[i];
   }
   z->maxcode[16] = 0x10000; // sentinel
   for (i=0; i < num; ++i) {
      int s = sizelist[i];
      if (s) {
         int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
2099
         stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
2100 2101
         z->size [c] = (stbi_uc     ) s;
         z->value[c] = (stbi__uint16) i;
2102 2103 2104
         if (s <= STBI__ZFAST_BITS) {
            int k = stbi__bit_reverse(next_code[s],s);
            while (k < (1 << STBI__ZFAST_BITS)) {
2105
               z->fast[k] = fastv;
2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122
               k += (1 << s);
            }
         }
         ++next_code[s];
      }
   }
   return 1;
}

// zlib-from-memory implementation for PNG reading
//    because PNG allows splitting the zlib stream arbitrarily,
//    and it's annoying structurally to have PNG call ZLIB call PNG,
//    we require PNG read all the IDATs and combine them into a single
//    memory buffer

typedef struct
{
2123
   stbi_uc *zbuffer, *zbuffer_end;
2124 2125 2126 2127 2128 2129 2130 2131
   int num_bits;
   stbi__uint32 code_buffer;

   char *zout;
   char *zout_start;
   char *zout_end;
   int   z_expandable;

2132 2133
   stbi__zhuffman z_length, z_distance;
} stbi__zbuf;
2134

2135
stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z)
2136 2137 2138 2139 2140
{
   if (z->zbuffer >= z->zbuffer_end) return 0;
   return *z->zbuffer++;
}

2141
static void stbi__fill_bits(stbi__zbuf *z)
2142 2143
{
   do {
S
Sean Barrett 已提交
2144
      STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
2145
      z->code_buffer |= stbi__zget8(z) << z->num_bits;
2146 2147 2148 2149
      z->num_bits += 8;
   } while (z->num_bits <= 24);
}

2150
stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n)
2151 2152
{
   unsigned int k;
2153
   if (z->num_bits < n) stbi__fill_bits(z);
2154 2155 2156 2157 2158 2159
   k = z->code_buffer & ((1 << n) - 1);
   z->code_buffer >>= n;
   z->num_bits -= n;
   return k;   
}

2160
static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
2161 2162 2163 2164
{
   int b,s,k;
   // not resolved by fast table, so compute it the slow way
   // use jpeg approach, which requires MSbits at top
2165 2166
   k = stbi__bit_reverse(a->code_buffer, 16);
   for (s=STBI__ZFAST_BITS+1; ; ++s)
2167 2168 2169 2170 2171
      if (k < z->maxcode[s])
         break;
   if (s == 16) return -1; // invalid code!
   // code size is s, so:
   b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
S
Sean Barrett 已提交
2172
   STBI_ASSERT(z->size[b] == s);
2173 2174 2175 2176 2177
   a->code_buffer >>= s;
   a->num_bits -= s;
   return z->value[b];
}

2178 2179 2180 2181 2182
stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
{
   int b,s;
   if (a->num_bits < 16) stbi__fill_bits(a);
   b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
2183 2184
   if (b) {
      s = b >> 9;
2185 2186
      a->code_buffer >>= s;
      a->num_bits -= s;
2187
      return b & 511;
2188 2189 2190 2191
   }
   return stbi__zhuffman_decode_slowpath(a, z);
}

2192
static int stbi__zexpand(stbi__zbuf *z, char *zout, int n)  // need to make room for n bytes
2193 2194 2195
{
   char *q;
   int cur, limit;
2196
   z->zout = zout;
S
Sean Barrett 已提交
2197
   if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG");
2198 2199 2200 2201 2202
   cur   = (int) (z->zout     - z->zout_start);
   limit = (int) (z->zout_end - z->zout_start);
   while (cur + n > limit)
      limit *= 2;
   q = (char *) realloc(z->zout_start, limit);
S
Sean Barrett 已提交
2203
   if (q == NULL) return stbi__err("outofmem", "Out of memory");
2204 2205 2206 2207 2208 2209
   z->zout_start = q;
   z->zout       = q + cur;
   z->zout_end   = q + limit;
   return 1;
}

2210
static int stbi__zlength_base[31] = {
2211 2212 2213 2214
   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,0,0 };

2215
static int stbi__zlength_extra[31]= 
2216 2217
{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };

2218
static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
2219 2220
257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};

2221
static int stbi__zdist_extra[32] =
2222 2223
{ 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};

2224
static int stbi__parse_huffman_block(stbi__zbuf *a)
2225
{
2226
   char *zout = a->zout;
2227
   for(;;) {
2228
      int z = stbi__zhuffman_decode(a, &a->z_length);
2229
      if (z < 256) {
S
Sean Barrett 已提交
2230
         if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes
2231 2232 2233 2234 2235
         if (zout >= a->zout_end) {
            if (!stbi__zexpand(a, zout, 1)) return 0;
            zout = a->zout;
         }
         *zout++ = (char) z;
2236
      } else {
2237
         stbi_uc *p;
2238
         int len,dist;
2239 2240 2241 2242
         if (z == 256) {
            a->zout = zout;
            return 1;
         }
2243
         z -= 257;
2244 2245 2246
         len = stbi__zlength_base[z];
         if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
         z = stbi__zhuffman_decode(a, &a->z_distance);
S
Sean Barrett 已提交
2247
         if (z < 0) return stbi__err("bad huffman code","Corrupt PNG");
2248 2249
         dist = stbi__zdist_base[z];
         if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
2250 2251 2252 2253 2254 2255
         if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG");
         if (zout + len > a->zout_end) {
            if (!stbi__zexpand(a, zout, len)) return 0;
            zout = a->zout;
         }
         p = (stbi_uc *) (zout - dist);
2256 2257 2258 2259 2260 2261
         if (dist == 1) { // run of one byte; common in images.
            stbi_uc v = *p;
            do *zout++ = v; while (--len);
         } else {
            do *zout++ = *p++; while (--len);
         }
2262 2263 2264 2265
      }
   }
}

2266
static int stbi__compute_huffman_codes(stbi__zbuf *a)
2267
{
2268
   static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
2269
   stbi__zhuffman z_codelength;
2270 2271
   stbi_uc lencodes[286+32+137];//padding for maximum single op
   stbi_uc codelength_sizes[19];
2272 2273
   int i,n;

2274 2275 2276
   int hlit  = stbi__zreceive(a,5) + 257;
   int hdist = stbi__zreceive(a,5) + 1;
   int hclen = stbi__zreceive(a,4) + 4;
2277 2278 2279

   memset(codelength_sizes, 0, sizeof(codelength_sizes));
   for (i=0; i < hclen; ++i) {
2280
      int s = stbi__zreceive(a,3);
2281
      codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;
2282
   }
2283
   if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;
2284 2285 2286

   n = 0;
   while (n < hlit + hdist) {
2287
      int c = stbi__zhuffman_decode(a, &z_codelength);
S
Sean Barrett 已提交
2288
      STBI_ASSERT(c >= 0 && c < 19);
2289
      if (c < 16)
2290
         lencodes[n++] = (stbi_uc) c;
2291
      else if (c == 16) {
2292
         c = stbi__zreceive(a,2)+3;
2293 2294 2295
         memset(lencodes+n, lencodes[n-1], c);
         n += c;
      } else if (c == 17) {
2296
         c = stbi__zreceive(a,3)+3;
2297 2298 2299
         memset(lencodes+n, 0, c);
         n += c;
      } else {
S
Sean Barrett 已提交
2300
         STBI_ASSERT(c == 18);
2301
         c = stbi__zreceive(a,7)+11;
2302 2303 2304 2305
         memset(lencodes+n, 0, c);
         n += c;
      }
   }
S
Sean Barrett 已提交
2306
   if (n != hlit+hdist) return stbi__err("bad codelengths","Corrupt PNG");
2307 2308
   if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;
   if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;
2309 2310 2311
   return 1;
}

2312
static int stbi__parse_uncomperssed_block(stbi__zbuf *a)
2313
{
2314
   stbi_uc header[4];
2315 2316
   int len,nlen,k;
   if (a->num_bits & 7)
2317
      stbi__zreceive(a, a->num_bits & 7); // discard
2318 2319 2320
   // drain the bit-packed data into header
   k = 0;
   while (a->num_bits > 0) {
2321
      header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check
2322 2323 2324
      a->code_buffer >>= 8;
      a->num_bits -= 8;
   }
S
Sean Barrett 已提交
2325
   STBI_ASSERT(a->num_bits == 0);
2326 2327
   // now fill header the normal way
   while (k < 4)
2328
      header[k++] = stbi__zget8(a);
2329 2330
   len  = header[1] * 256 + header[0];
   nlen = header[3] * 256 + header[2];
S
Sean Barrett 已提交
2331 2332
   if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG");
   if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG");
2333
   if (a->zout + len > a->zout_end)
2334
      if (!stbi__zexpand(a, a->zout, len)) return 0;
2335 2336 2337 2338 2339 2340
   memcpy(a->zout, a->zbuffer, len);
   a->zbuffer += len;
   a->zout += len;
   return 1;
}

2341
static int stbi__parse_zlib_header(stbi__zbuf *a)
2342
{
2343
   int cmf   = stbi__zget8(a);
2344 2345
   int cm    = cmf & 15;
   /* int cinfo = cmf >> 4; */
2346
   int flg   = stbi__zget8(a);
S
Sean Barrett 已提交
2347 2348 2349
   if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec
   if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png
   if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png
2350 2351 2352 2353 2354
   // window = 1 << (8 + cinfo)... but who cares, we fully buffer output
   return 1;
}

// @TODO: should statically initialize these for optimal thread safety
2355
static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32];
2356
static void stbi__init_zdefaults(void)
2357 2358
{
   int i;   // use <= to match clearly with spec
2359 2360 2361 2362
   for (i=0; i <= 143; ++i)     stbi__zdefault_length[i]   = 8;
   for (   ; i <= 255; ++i)     stbi__zdefault_length[i]   = 9;
   for (   ; i <= 279; ++i)     stbi__zdefault_length[i]   = 7;
   for (   ; i <= 287; ++i)     stbi__zdefault_length[i]   = 8;
2363

2364
   for (i=0; i <=  31; ++i)     stbi__zdefault_distance[i] = 5;
2365 2366
}

2367
static int stbi__parse_zlib(stbi__zbuf *a, int parse_header)
2368 2369 2370
{
   int final, type;
   if (parse_header)
2371
      if (!stbi__parse_zlib_header(a)) return 0;
2372 2373 2374
   a->num_bits = 0;
   a->code_buffer = 0;
   do {
2375 2376
      final = stbi__zreceive(a,1);
      type = stbi__zreceive(a,2);
2377
      if (type == 0) {
2378
         if (!stbi__parse_uncomperssed_block(a)) return 0;
2379 2380 2381 2382 2383
      } else if (type == 3) {
         return 0;
      } else {
         if (type == 1) {
            // use fixed code lengths
2384 2385 2386
            if (!stbi__zdefault_distance[31]) stbi__init_zdefaults();
            if (!stbi__zbuild_huffman(&a->z_length  , stbi__zdefault_length  , 288)) return 0;
            if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance,  32)) return 0;
2387
         } else {
2388
            if (!stbi__compute_huffman_codes(a)) return 0;
2389
         }
2390
         if (!stbi__parse_huffman_block(a)) return 0;
2391 2392 2393 2394 2395
      }
   } while (!final);
   return 1;
}

2396
static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header)
2397 2398 2399 2400 2401 2402
{
   a->zout_start = obuf;
   a->zout       = obuf;
   a->zout_end   = obuf + olen;
   a->z_expandable = exp;

2403
   return stbi__parse_zlib(a, parse_header);
2404 2405 2406 2407
}

STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)
{
2408
   stbi__zbuf a;
2409
   char *p = (char *) stbi__malloc(initial_size);
2410
   if (p == NULL) return NULL;
2411 2412
   a.zbuffer = (stbi_uc *) buffer;
   a.zbuffer_end = (stbi_uc *) buffer + len;
2413
   if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428
      if (outlen) *outlen = (int) (a.zout - a.zout_start);
      return a.zout_start;
   } else {
      free(a.zout_start);
      return NULL;
   }
}

STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)
{
   return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
}

STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
{
2429
   stbi__zbuf a;
2430
   char *p = (char *) stbi__malloc(initial_size);
2431
   if (p == NULL) return NULL;
2432 2433
   a.zbuffer = (stbi_uc *) buffer;
   a.zbuffer_end = (stbi_uc *) buffer + len;
2434
   if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
2435 2436 2437 2438 2439 2440 2441 2442 2443 2444
      if (outlen) *outlen = (int) (a.zout - a.zout_start);
      return a.zout_start;
   } else {
      free(a.zout_start);
      return NULL;
   }
}

STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)
{
2445
   stbi__zbuf a;
2446 2447
   a.zbuffer = (stbi_uc *) ibuffer;
   a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
2448
   if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
2449 2450 2451 2452 2453 2454 2455
      return (int) (a.zout - a.zout_start);
   else
      return -1;
}

STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)
{
2456
   stbi__zbuf a;
2457
   char *p = (char *) stbi__malloc(16384);
2458
   if (p == NULL) return NULL;
2459 2460
   a.zbuffer = (stbi_uc *) buffer;
   a.zbuffer_end = (stbi_uc *) buffer+len;
2461
   if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
2462 2463 2464 2465 2466 2467 2468 2469 2470 2471
      if (outlen) *outlen = (int) (a.zout - a.zout_start);
      return a.zout_start;
   } else {
      free(a.zout_start);
      return NULL;
   }
}

STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
{
2472
   stbi__zbuf a;
2473 2474
   a.zbuffer = (stbi_uc *) ibuffer;
   a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
2475
   if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495
      return (int) (a.zout - a.zout_start);
   else
      return -1;
}

// public domain "baseline" PNG decoder   v0.10  Sean Barrett 2006-11-18
//    simple implementation
//      - only 8-bit samples
//      - no CRC checking
//      - allocates lots of intermediate memory
//        - avoids problem of streaming data between subsystems
//        - avoids explicit window management
//    performance
//      - uses stb_zlib, a PD zlib implementation with fast huffman decoding


typedef struct
{
   stbi__uint32 length;
   stbi__uint32 type;
2496
} stbi__pngchunk;
2497

2498
static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
2499
{
2500
   stbi__pngchunk c;
2501 2502
   c.length = stbi__get32be(s);
   c.type   = stbi__get32be(s);
2503 2504 2505
   return c;
}

2506
static int stbi__check_png_header(stbi__context *s)
2507
{
2508
   static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
2509 2510
   int i;
   for (i=0; i < 8; ++i)
2511
      if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG");
2512 2513 2514 2515 2516
   return 1;
}

typedef struct
{
S
Sean Barrett 已提交
2517
   stbi__context *s;
2518
   stbi_uc *idata, *expanded, *out;
2519
} stbi__png;
2520 2521 2522


enum {
2523 2524 2525 2526 2527 2528 2529 2530
   STBI__F_none=0,
   STBI__F_sub=1,
   STBI__F_up=2,
   STBI__F_avg=3,
   STBI__F_paeth=4,
   // synthetic filters used for first scanline to avoid needing a dummy row of 0s
   STBI__F_avg_first,
   STBI__F_paeth_first
2531 2532
};

2533
static stbi_uc first_row_filter[5] =
2534
{
2535 2536 2537 2538 2539
   STBI__F_none,
   STBI__F_sub,
   STBI__F_none,
   STBI__F_avg_first,
   STBI__F_paeth_first
2540 2541
};

2542
static int stbi__paeth(int a, int b, int c)
2543 2544 2545 2546 2547 2548 2549 2550 2551 2552
{
   int p = a + b - c;
   int pa = abs(p-a);
   int pb = abs(p-b);
   int pc = abs(p-c);
   if (pa <= pb && pa <= pc) return a;
   if (pb <= pc) return b;
   return c;
}

2553 2554
#define STBI__BYTECAST(x)  ((stbi_uc) ((x) & 255))  // truncate int to byte without warnings

2555 2556
static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };

2557
// create the png data from post-deflated data
2558
static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color)
2559
{
S
Sean Barrett 已提交
2560
   stbi__context *s = a->s;
2561
   stbi__uint32 i,j,stride = x*out_n;
2562
   stbi__uint32 img_len, img_width_bytes;
2563 2564
   int k;
   int img_n = s->img_n; // copy it into a local for later
O
ocornut 已提交
2565

S
Sean Barrett 已提交
2566
   STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
2567
   a->out = (stbi_uc *) stbi__malloc(x * y * out_n); // extra bytes to write off the end into
S
Sean Barrett 已提交
2568
   if (!a->out) return stbi__err("outofmem", "Out of memory");
O
ocornut 已提交
2569

2570 2571
   img_width_bytes = (((img_n * x * depth) + 7) >> 3);
   img_len = (img_width_bytes + 1) * y;
2572
   if (s->img_x == x && s->img_y == y) {
O
ocornut 已提交
2573
      if (raw_len != img_len) return stbi__err("not enough pixels","Corrupt PNG");
2574
   } else { // interlaced:
O
ocornut 已提交
2575
      if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG");
2576
   }
O
ocornut 已提交
2577

2578
   for (j=0; j < y; ++j) {
2579 2580
      stbi_uc *cur = a->out + stride*j;
      stbi_uc *prior = cur - stride;
2581
      int filter = *raw++;
2582 2583 2584
      int filter_bytes = img_n;
      int width = x;
      if (filter > 4)
2585 2586
         return stbi__err("invalid filter","Corrupt PNG");

2587
      if (depth < 8) {
2588
         STBI_ASSERT(img_width_bytes <= x);
2589 2590 2591
         cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place
         filter_bytes = 1;
         width = img_width_bytes;
2592
      }
2593

2594 2595
      // if first row, use special filter that doesn't sample previous row
      if (j == 0) filter = first_row_filter[filter];
O
ocornut 已提交
2596

2597 2598
      // handle first byte explicitly
      for (k=0; k < filter_bytes; ++k) {
2599
         switch (filter) {
2600 2601 2602 2603 2604 2605 2606
            case STBI__F_none       : cur[k] = raw[k]; break;
            case STBI__F_sub        : cur[k] = raw[k]; break;
            case STBI__F_up         : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
            case STBI__F_avg        : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break;
            case STBI__F_paeth      : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break;
            case STBI__F_avg_first  : cur[k] = raw[k]; break;
            case STBI__F_paeth_first: cur[k] = raw[k]; break;
2607 2608
         }
      }
2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621

      if (depth == 8) {
         if (img_n != out_n)
            cur[img_n] = 255; // first pixel
         raw += img_n;
         cur += out_n;
         prior += out_n;
      } else {
         raw += 1;
         cur += 1;
         prior += 1;
      }

2622
      // this is a little gross, so that we don't switch per-pixel or per-component
2623
      if (depth < 8 || img_n == out_n) {
2624
         int nk = (width - 1)*img_n;
2625 2626
         #define CASE(f) \
             case f:     \
2627
                for (k=0; k < nk; ++k)
2628
         switch (filter) {
2629 2630
            // "none" filter turns into a memcpy here; make that explicit.
            case STBI__F_none:         memcpy(cur, raw, nk); break;
2631 2632 2633 2634 2635 2636
            CASE(STBI__F_sub)          cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); break;
            CASE(STBI__F_up)           cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
            CASE(STBI__F_avg)          cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); break;
            CASE(STBI__F_paeth)        cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); break;
            CASE(STBI__F_avg_first)    cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); break;
            CASE(STBI__F_paeth_first)  cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); break;
2637 2638
         }
         #undef CASE
2639
         raw += nk;
2640
      } else {
S
Sean Barrett 已提交
2641
         STBI_ASSERT(img_n+1 == out_n);
2642 2643
         #define CASE(f) \
             case f:     \
2644
                for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \
2645
                   for (k=0; k < img_n; ++k)
2646
         switch (filter) {
2647 2648 2649 2650 2651 2652 2653
            CASE(STBI__F_none)         cur[k] = raw[k]; break;
            CASE(STBI__F_sub)          cur[k] = STBI__BYTECAST(raw[k] + cur[k-out_n]); break;
            CASE(STBI__F_up)           cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
            CASE(STBI__F_avg)          cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-out_n])>>1)); break;
            CASE(STBI__F_paeth)        cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],prior[k],prior[k-out_n])); break;
            CASE(STBI__F_avg_first)    cur[k] = STBI__BYTECAST(raw[k] + (cur[k-out_n] >> 1)); break;
            CASE(STBI__F_paeth_first)  cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],0,0)); break;
2654 2655 2656 2657
         }
         #undef CASE
      }
   }
2658

2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732
   // we make a separate pass to expand bits to pixels; for performance,
   // this could run two scanlines behind the above code, so it won't
   // intefere with filtering but will still be in the cache.
   if (depth < 8) {
      for (j=0; j < y; ++j) {
         stbi_uc *cur = a->out + stride*j;
         stbi_uc *in  = a->out + stride*j + x*out_n - img_width_bytes;
         // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit
         // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop
         stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range

         // note that the final byte might overshoot and write more data than desired.
         // we can allocate enough data that this never writes out of memory, but it
         // could also overwrite the next scanline. can it overwrite non-empty data
         // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel.
         // so we need to explicitly clamp the final ones

         if (depth == 4) {
            for (k=x*img_n; k >= 2; k-=2, ++in) {
               *cur++ = scale * ((*in >> 4)       );
               *cur++ = scale * ((*in     ) & 0x0f);
            }
            if (k > 0) *cur++ = scale * ((*in >> 4)       );
         } else if (depth == 2) {
            for (k=x*img_n; k >= 4; k-=4, ++in) {
               *cur++ = scale * ((*in >> 6)       );
               *cur++ = scale * ((*in >> 4) & 0x03);
               *cur++ = scale * ((*in >> 2) & 0x03);
               *cur++ = scale * ((*in     ) & 0x03);
            }
            if (k > 0) *cur++ = scale * ((*in >> 6)       );
            if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
            if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
         } else if (depth == 1) {
            for (k=x*img_n; k >= 8; k-=8, ++in) {
               *cur++ = scale * ((*in >> 7)       );
               *cur++ = scale * ((*in >> 6) & 0x01);
               *cur++ = scale * ((*in >> 5) & 0x01);
               *cur++ = scale * ((*in >> 4) & 0x01);
               *cur++ = scale * ((*in >> 3) & 0x01);
               *cur++ = scale * ((*in >> 2) & 0x01);
               *cur++ = scale * ((*in >> 1) & 0x01);
               *cur++ = scale * ((*in     ) & 0x01);
            }
            if (k > 0) *cur++ = scale * ((*in >> 7)       );
            if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
            if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
            if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
            if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
            if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
            if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
         }
         if (img_n != out_n) {
            // insert alpha = 255
            stbi_uc *cur = a->out + stride*j;
            int i;
            if (img_n == 1) {
               for (i=x-1; i >= 0; --i) {
                  cur[i*2+1] = 255;
                  cur[i*2+0] = cur[i];
               }
            } else {
               assert(img_n == 3);
               for (i=x-1; i >= 0; --i) {
                  cur[i*4+3] = 255;
                  cur[i*4+2] = cur[i*3+2];
                  cur[i*4+1] = cur[i*3+1];
                  cur[i*4+0] = cur[i*3+0];
               }
            }
         }
      }
   }

2733 2734 2735
   return 1;
}

2736
static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced)
2737
{
2738
   stbi_uc *final;
2739 2740
   int p;
   if (!interlaced)
2741
      return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
2742 2743

   // de-interlacing
2744
   final = (stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n);
2745 2746 2747 2748 2749 2750 2751 2752 2753 2754
   for (p=0; p < 7; ++p) {
      int xorig[] = { 0,4,0,2,0,1,0 };
      int yorig[] = { 0,0,4,0,2,0,1 };
      int xspc[]  = { 8,8,4,4,2,2,1 };
      int yspc[]  = { 8,8,8,4,4,2,2 };
      int i,j,x,y;
      // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1
      x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
      y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
      if (x && y) {
2755 2756
         stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
         if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
2757 2758 2759
            free(final);
            return 0;
         }
2760 2761 2762 2763 2764
         for (j=0; j < y; ++j) {
            for (i=0; i < x; ++i) {
               int out_y = j*yspc[p]+yorig[p];
               int out_x = i*xspc[p]+xorig[p];
               memcpy(final + out_y*a->s->img_x*out_n + out_x*out_n,
2765
                      a->out + (j*x+i)*out_n, out_n);
2766 2767
            }
         }
2768
         free(a->out);
2769 2770
         image_data += img_len;
         image_data_len -= img_len;
2771 2772 2773 2774 2775 2776 2777
      }
   }
   a->out = final;

   return 1;
}

2778
static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n)
2779
{
S
Sean Barrett 已提交
2780
   stbi__context *s = z->s;
2781
   stbi__uint32 i, pixel_count = s->img_x * s->img_y;
2782
   stbi_uc *p = z->out;
2783 2784 2785

   // compute color-based transparency, assuming we've
   // already got 255 as the alpha value in the output
S
Sean Barrett 已提交
2786
   STBI_ASSERT(out_n == 2 || out_n == 4);
2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802

   if (out_n == 2) {
      for (i=0; i < pixel_count; ++i) {
         p[1] = (p[0] == tc[0] ? 0 : 255);
         p += 2;
      }
   } else {
      for (i=0; i < pixel_count; ++i) {
         if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
            p[3] = 0;
         p += 4;
      }
   }
   return 1;
}

2803
static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n)
2804 2805
{
   stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
2806
   stbi_uc *p, *temp_out, *orig = a->out;
2807

2808
   p = (stbi_uc *) stbi__malloc(pixel_count * pal_img_n);
S
Sean Barrett 已提交
2809
   if (p == NULL) return stbi__err("outofmem", "Out of memory");
2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839

   // between here and free(out) below, exitting would leak
   temp_out = p;

   if (pal_img_n == 3) {
      for (i=0; i < pixel_count; ++i) {
         int n = orig[i]*4;
         p[0] = palette[n  ];
         p[1] = palette[n+1];
         p[2] = palette[n+2];
         p += 3;
      }
   } else {
      for (i=0; i < pixel_count; ++i) {
         int n = orig[i]*4;
         p[0] = palette[n  ];
         p[1] = palette[n+1];
         p[2] = palette[n+2];
         p[3] = palette[n+3];
         p += 4;
      }
   }
   free(a->out);
   a->out = temp_out;

   STBI_NOTUSED(len);

   return 1;
}

2840 2841
static int stbi__unpremultiply_on_load = 0;
static int stbi__de_iphone_flag = 0;
2842

2843
STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
2844
{
2845
   stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
2846
}
2847 2848

STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
2849
{
2850
   stbi__de_iphone_flag = flag_true_if_should_convert;
2851 2852
}

2853
static void stbi__de_iphone(stbi__png *z)
2854
{
S
Sean Barrett 已提交
2855
   stbi__context *s = z->s;
2856
   stbi__uint32 i, pixel_count = s->img_x * s->img_y;
2857
   stbi_uc *p = z->out;
2858 2859 2860

   if (s->img_out_n == 3) {  // convert bgr to rgb
      for (i=0; i < pixel_count; ++i) {
2861
         stbi_uc t = p[0];
2862 2863 2864 2865 2866
         p[0] = p[2];
         p[2] = t;
         p += 3;
      }
   } else {
S
Sean Barrett 已提交
2867
      STBI_ASSERT(s->img_out_n == 4);
2868
      if (stbi__unpremultiply_on_load) {
2869 2870
         // convert bgr to rgb and unpremultiply
         for (i=0; i < pixel_count; ++i) {
2871 2872
            stbi_uc a = p[3];
            stbi_uc t = p[0];
2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885
            if (a) {
               p[0] = p[2] * 255 / a;
               p[1] = p[1] * 255 / a;
               p[2] =  t   * 255 / a;
            } else {
               p[0] = p[2];
               p[2] = t;
            } 
            p += 4;
         }
      } else {
         // convert bgr to rgb
         for (i=0; i < pixel_count; ++i) {
2886
            stbi_uc t = p[0];
2887 2888 2889 2890 2891 2892 2893 2894
            p[0] = p[2];
            p[2] = t;
            p += 4;
         }
      }
   }
}

2895 2896
#define STBI__PNG_TYPE(a,b,c,d)  (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))

2897
static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
2898
{
2899 2900
   stbi_uc palette[1024], pal_img_n=0;
   stbi_uc has_trans=0, tc[3];
2901
   stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
2902
   int first=1,k,interlace=0, color=0, depth=0, is_iphone=0;
S
Sean Barrett 已提交
2903
   stbi__context *s = z->s;
2904 2905 2906 2907 2908

   z->expanded = NULL;
   z->idata = NULL;
   z->out = NULL;

2909
   if (!stbi__check_png_header(s)) return 0;
2910 2911 2912 2913

   if (scan == SCAN_type) return 1;

   for (;;) {
2914
      stbi__pngchunk c = stbi__get_chunk_header(s);
2915
      switch (c.type) {
2916
         case STBI__PNG_TYPE('C','g','B','I'):
2917
            is_iphone = 1;
2918
            stbi__skip(s, c.length);
2919
            break;
2920
         case STBI__PNG_TYPE('I','H','D','R'): {
2921
            int comp,filter;
S
Sean Barrett 已提交
2922
            if (!first) return stbi__err("multiple IHDR","Corrupt PNG");
2923
            first = 0;
S
Sean Barrett 已提交
2924
            if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG");
2925 2926
            s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)");
            s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)");
2927
            depth = stbi__get8(s);  if (depth != 1 && depth != 2 && depth != 4 && depth != 8)  return stbi__err("1/2/4/8-bit only","PNG not supported: 1/2/4/8-bit only");
2928
            color = stbi__get8(s);  if (color > 6)         return stbi__err("bad ctype","Corrupt PNG");
S
Sean Barrett 已提交
2929
            if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG");
2930 2931 2932
            comp  = stbi__get8(s);  if (comp) return stbi__err("bad comp method","Corrupt PNG");
            filter= stbi__get8(s);  if (filter) return stbi__err("bad filter method","Corrupt PNG");
            interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG");
S
Sean Barrett 已提交
2933
            if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG");
2934 2935
            if (!pal_img_n) {
               s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
2936
               if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode");
2937 2938 2939 2940 2941
               if (scan == SCAN_header) return 1;
            } else {
               // if paletted, then pal_n is our final components, and
               // img_n is # components to decompress/filter.
               s->img_n = 1;
S
Sean Barrett 已提交
2942
               if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG");
2943 2944 2945 2946 2947
               // if SCAN_header, have to scan to see if we have a tRNS
            }
            break;
         }

2948
         case STBI__PNG_TYPE('P','L','T','E'):  {
S
Sean Barrett 已提交
2949 2950
            if (first) return stbi__err("first not IHDR", "Corrupt PNG");
            if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG");
2951
            pal_len = c.length / 3;
S
Sean Barrett 已提交
2952
            if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG");
2953
            for (i=0; i < pal_len; ++i) {
2954 2955 2956
               palette[i*4+0] = stbi__get8(s);
               palette[i*4+1] = stbi__get8(s);
               palette[i*4+2] = stbi__get8(s);
2957 2958 2959 2960 2961
               palette[i*4+3] = 255;
            }
            break;
         }

2962
         case STBI__PNG_TYPE('t','R','N','S'): {
S
Sean Barrett 已提交
2963 2964
            if (first) return stbi__err("first not IHDR", "Corrupt PNG");
            if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG");
2965 2966
            if (pal_img_n) {
               if (scan == SCAN_header) { s->img_n = 4; return 1; }
S
Sean Barrett 已提交
2967 2968
               if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG");
               if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG");
2969 2970
               pal_img_n = 4;
               for (i=0; i < c.length; ++i)
2971
                  palette[i*4+3] = stbi__get8(s);
2972
            } else {
S
Sean Barrett 已提交
2973 2974
               if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG");
               if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG");
2975 2976
               has_trans = 1;
               for (k=0; k < s->img_n; ++k)
2977
                  tc[k] = (stbi_uc) (stbi__get16be(s) & 255) * stbi__depth_scale_table[depth]; // non 8-bit images will be larger
2978 2979 2980 2981
            }
            break;
         }

2982
         case STBI__PNG_TYPE('I','D','A','T'): {
S
Sean Barrett 已提交
2983 2984
            if (first) return stbi__err("first not IHDR", "Corrupt PNG");
            if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG");
2985 2986
            if (scan == SCAN_header) { s->img_n = pal_img_n; return 1; }
            if (ioff + c.length > idata_limit) {
2987
               stbi_uc *p;
2988 2989 2990
               if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
               while (ioff + c.length > idata_limit)
                  idata_limit *= 2;
2991
               p = (stbi_uc *) realloc(z->idata, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory");
2992 2993
               z->idata = p;
            }
2994
            if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG");
2995 2996 2997 2998
            ioff += c.length;
            break;
         }

2999
         case STBI__PNG_TYPE('I','E','N','D'): {
3000
            stbi__uint32 raw_len;
S
Sean Barrett 已提交
3001
            if (first) return stbi__err("first not IHDR", "Corrupt PNG");
3002
            if (scan != SCAN_load) return 1;
S
Sean Barrett 已提交
3003
            if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG");
3004 3005 3006
            // initial guess for decoded data size to avoid unnecessary reallocs
            raw_len = s->img_x * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;
            z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone);
3007 3008 3009 3010 3011 3012
            if (z->expanded == NULL) return 0; // zlib should set error
            free(z->idata); z->idata = NULL;
            if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
               s->img_out_n = s->img_n+1;
            else
               s->img_out_n = s->img_n;
3013
            if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, depth, color, interlace)) return 0;
3014
            if (has_trans)
3015
               if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;
3016
            if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
3017
               stbi__de_iphone(z);
3018 3019 3020 3021 3022
            if (pal_img_n) {
               // pal_img_n == 3 or 4
               s->img_n = pal_img_n; // record the actual colors we had
               s->img_out_n = pal_img_n;
               if (req_comp >= 3) s->img_out_n = req_comp;
3023
               if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
3024 3025 3026 3027 3028 3029 3030 3031
                  return 0;
            }
            free(z->expanded); z->expanded = NULL;
            return 1;
         }

         default:
            // if critical, fail
S
Sean Barrett 已提交
3032
            if (first) return stbi__err("first not IHDR", "Corrupt PNG");
3033 3034 3035
            if ((c.type & (1 << 29)) == 0) {
               #ifndef STBI_NO_FAILURE_STRINGS
               // not threadsafe
3036 3037 3038 3039 3040
               static char invalid_chunk[] = "XXXX PNG chunk not known";
               invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
               invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
               invalid_chunk[2] = STBI__BYTECAST(c.type >>  8);
               invalid_chunk[3] = STBI__BYTECAST(c.type >>  0);
3041
               #endif
3042
               return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type");
3043
            }
3044
            stbi__skip(s, c.length);
3045 3046
            break;
      }
3047
      // end of PNG chunk, read and skip CRC
3048
      stbi__get32be(s);
3049 3050 3051
   }
}

3052
static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp)
3053 3054
{
   unsigned char *result=NULL;
S
Sean Barrett 已提交
3055
   if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
3056
   if (stbi__parse_png_file(p, SCAN_load, req_comp)) {
3057 3058 3059
      result = p->out;
      p->out = NULL;
      if (req_comp && req_comp != p->s->img_out_n) {
3060
         result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
3061 3062 3063 3064 3065
         p->s->img_out_n = req_comp;
         if (result == NULL) return result;
      }
      *x = p->s->img_x;
      *y = p->s->img_y;
3066
      if (n) *n = p->s->img_out_n;
3067 3068 3069 3070 3071 3072 3073 3074
   }
   free(p->out);      p->out      = NULL;
   free(p->expanded); p->expanded = NULL;
   free(p->idata);    p->idata    = NULL;

   return result;
}

S
Sean Barrett 已提交
3075
static unsigned char *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
3076
{
3077
   stbi__png p;
3078
   p.s = s;
3079
   return stbi__do_png(&p, x,y,comp,req_comp);
3080 3081
}

S
Sean Barrett 已提交
3082
static int stbi__png_test(stbi__context *s)
3083 3084
{
   int r;
3085
   r = stbi__check_png_header(s);
3086
   stbi__rewind(s);
3087 3088 3089
   return r;
}

3090
static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)
3091
{
3092
   if (!stbi__parse_png_file(p, SCAN_header, 0)) {
3093
      stbi__rewind( p->s );
3094 3095 3096 3097 3098 3099 3100 3101
      return 0;
   }
   if (x) *x = p->s->img_x;
   if (y) *y = p->s->img_y;
   if (comp) *comp = p->s->img_n;
   return 1;
}

3102
static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)
3103
{
3104
   stbi__png p;
3105
   p.s = s;
3106
   return stbi__png_info_raw(&p, x, y, comp);
3107 3108 3109
}

// Microsoft/Windows BMP image
3110
static int stbi__bmp_test_raw(stbi__context *s)
3111
{
3112
   int r;
3113
   int sz;
3114 3115 3116 3117 3118 3119 3120
   if (stbi__get8(s) != 'B') return 0;
   if (stbi__get8(s) != 'M') return 0;
   stbi__get32le(s); // discard filesize
   stbi__get16le(s); // discard reserved
   stbi__get16le(s); // discard reserved
   stbi__get32le(s); // discard data offset
   sz = stbi__get32le(s);
3121
   r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
3122 3123 3124 3125 3126 3127
   return r;
}

static int stbi__bmp_test(stbi__context *s)
{
   int r = stbi__bmp_test_raw(s);
3128
   stbi__rewind(s);
3129 3130 3131 3132 3133
   return r;
}


// returns 0..31 for the highest set bit
3134
static int stbi__high_bit(unsigned int z)
3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145
{
   int n=0;
   if (z == 0) return -1;
   if (z >= 0x10000) n += 16, z >>= 16;
   if (z >= 0x00100) n +=  8, z >>=  8;
   if (z >= 0x00010) n +=  4, z >>=  4;
   if (z >= 0x00004) n +=  2, z >>=  2;
   if (z >= 0x00002) n +=  1, z >>=  1;
   return n;
}

3146
static int stbi__bitcount(unsigned int a)
3147 3148 3149 3150 3151 3152 3153 3154 3155
{
   a = (a & 0x55555555) + ((a >>  1) & 0x55555555); // max 2
   a = (a & 0x33333333) + ((a >>  2) & 0x33333333); // max 4
   a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
   a = (a + (a >> 8)); // max 16 per 8 bits
   a = (a + (a >> 16)); // max 32 per 8 bits
   return a & 0xff;
}

3156
static int stbi__shiftsigned(int v, int shift, int bits)
3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172
{
   int result;
   int z=0;

   if (shift < 0) v <<= -shift;
   else v >>= shift;
   result = v;

   z = bits;
   while (z < 8) {
      result += v >> z;
      z += bits;
   }
   return result;
}

3173
static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
3174
{
3175
   stbi_uc *out;
3176 3177 3178 3179
   unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0;
   stbi_uc pal[256][4];
   int psize=0,i,j,compress=0,width;
   int bpp, flip_vertically, pad, target, offset, hsz;
3180 3181 3182 3183 3184 3185
   if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP");
   stbi__get32le(s); // discard filesize
   stbi__get16le(s); // discard reserved
   stbi__get16le(s); // discard reserved
   offset = stbi__get32le(s);
   hsz = stbi__get32le(s);
3186
   if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown");
3187
   if (hsz == 12) {
3188 3189
      s->img_x = stbi__get16le(s);
      s->img_y = stbi__get16le(s);
3190
   } else {
3191 3192
      s->img_x = stbi__get32le(s);
      s->img_y = stbi__get32le(s);
3193
   }
3194 3195
   if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP");
   bpp = stbi__get16le(s);
S
Sean Barrett 已提交
3196
   if (bpp == 1) return stbi__errpuc("monochrome", "BMP type not supported: 1-bit");
3197 3198 3199 3200 3201 3202
   flip_vertically = ((int) s->img_y) > 0;
   s->img_y = abs((int) s->img_y);
   if (hsz == 12) {
      if (bpp < 24)
         psize = (offset - 14 - 24) / 3;
   } else {
3203
      compress = stbi__get32le(s);
S
Sean Barrett 已提交
3204
      if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE");
3205 3206 3207 3208 3209
      stbi__get32le(s); // discard sizeof
      stbi__get32le(s); // discard hres
      stbi__get32le(s); // discard vres
      stbi__get32le(s); // discard colorsused
      stbi__get32le(s); // discard max important
3210 3211
      if (hsz == 40 || hsz == 56) {
         if (hsz == 56) {
3212 3213 3214 3215
            stbi__get32le(s);
            stbi__get32le(s);
            stbi__get32le(s);
            stbi__get32le(s);
3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232
         }
         if (bpp == 16 || bpp == 32) {
            mr = mg = mb = 0;
            if (compress == 0) {
               if (bpp == 32) {
                  mr = 0xffu << 16;
                  mg = 0xffu <<  8;
                  mb = 0xffu <<  0;
                  ma = 0xffu << 24;
                  fake_a = 1; // @TODO: check for cases like alpha value is all 0 and switch it to 255
                  STBI_NOTUSED(fake_a);
               } else {
                  mr = 31u << 10;
                  mg = 31u <<  5;
                  mb = 31u <<  0;
               }
            } else if (compress == 3) {
3233 3234 3235
               mr = stbi__get32le(s);
               mg = stbi__get32le(s);
               mb = stbi__get32le(s);
3236 3237 3238
               // not documented, but generated by photoshop and handled by mspaint
               if (mr == mg && mg == mb) {
                  // ?!?!?
S
Sean Barrett 已提交
3239
                  return stbi__errpuc("bad BMP", "bad BMP");
3240 3241
               }
            } else
S
Sean Barrett 已提交
3242
               return stbi__errpuc("bad BMP", "bad BMP");
3243 3244
         }
      } else {
S
Sean Barrett 已提交
3245
         STBI_ASSERT(hsz == 108 || hsz == 124);
3246 3247 3248 3249 3250
         mr = stbi__get32le(s);
         mg = stbi__get32le(s);
         mb = stbi__get32le(s);
         ma = stbi__get32le(s);
         stbi__get32le(s); // discard color space
3251
         for (i=0; i < 12; ++i)
3252
            stbi__get32le(s); // discard color space parameters
3253 3254 3255 3256 3257 3258
         if (hsz == 124) {
            stbi__get32le(s); // discard rendering intent
            stbi__get32le(s); // discard offset of profile data
            stbi__get32le(s); // discard size of profile data
            stbi__get32le(s); // discard reserved
         }
3259 3260 3261 3262 3263
      }
      if (bpp < 16)
         psize = (offset - 14 - hsz) >> 2;
   }
   s->img_n = ma ? 4 : 3;
3264
   if (req_comp && req_comp >= 3) // we can directly decode 3 or 4
3265 3266 3267
      target = req_comp;
   else
      target = s->img_n; // if they want monochrome, we'll post-convert
3268
   out = (stbi_uc *) stbi__malloc(target * s->img_x * s->img_y);
S
Sean Barrett 已提交
3269
   if (!out) return stbi__errpuc("outofmem", "Out of memory");
3270 3271
   if (bpp < 16) {
      int z=0;
S
Sean Barrett 已提交
3272
      if (psize == 0 || psize > 256) { free(out); return stbi__errpuc("invalid", "Corrupt BMP"); }
3273
      for (i=0; i < psize; ++i) {
3274 3275 3276
         pal[i][2] = stbi__get8(s);
         pal[i][1] = stbi__get8(s);
         pal[i][0] = stbi__get8(s);
3277
         if (hsz != 12) stbi__get8(s);
3278 3279
         pal[i][3] = 255;
      }
3280
      stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));
3281 3282
      if (bpp == 4) width = (s->img_x + 1) >> 1;
      else if (bpp == 8) width = s->img_x;
S
Sean Barrett 已提交
3283
      else { free(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); }
3284 3285 3286
      pad = (-width)&3;
      for (j=0; j < (int) s->img_y; ++j) {
         for (i=0; i < (int) s->img_x; i += 2) {
3287
            int v=stbi__get8(s),v2=0;
3288 3289 3290 3291 3292 3293 3294 3295 3296
            if (bpp == 4) {
               v2 = v & 15;
               v >>= 4;
            }
            out[z++] = pal[v][0];
            out[z++] = pal[v][1];
            out[z++] = pal[v][2];
            if (target == 4) out[z++] = 255;
            if (i+1 == (int) s->img_x) break;
3297
            v = (bpp == 8) ? stbi__get8(s) : v2;
3298 3299 3300 3301 3302
            out[z++] = pal[v][0];
            out[z++] = pal[v][1];
            out[z++] = pal[v][2];
            if (target == 4) out[z++] = 255;
         }
3303
         stbi__skip(s, pad);
3304 3305 3306 3307 3308
      }
   } else {
      int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
      int z = 0;
      int easy=0;
3309
      stbi__skip(s, offset - 14 - hsz);
3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320
      if (bpp == 24) width = 3 * s->img_x;
      else if (bpp == 16) width = 2*s->img_x;
      else /* bpp = 32 and pad = 0 */ width=0;
      pad = (-width) & 3;
      if (bpp == 24) {
         easy = 1;
      } else if (bpp == 32) {
         if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
            easy = 2;
      }
      if (!easy) {
S
Sean Barrett 已提交
3321
         if (!mr || !mg || !mb) { free(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }
3322
         // right shift amt to put high bit in position #7
3323 3324 3325 3326
         rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
         gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
         bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
         ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
3327 3328 3329 3330
      }
      for (j=0; j < (int) s->img_y; ++j) {
         if (easy) {
            for (i=0; i < (int) s->img_x; ++i) {
3331 3332 3333 3334
               unsigned char a;
               out[z+2] = stbi__get8(s);
               out[z+1] = stbi__get8(s);
               out[z+0] = stbi__get8(s);
3335
               z += 3;
3336
               a = (easy == 2 ? stbi__get8(s) : 255);
3337
               if (target == 4) out[z++] = a;
3338 3339 3340
            }
         } else {
            for (i=0; i < (int) s->img_x; ++i) {
3341
               stbi__uint32 v = (stbi__uint32) (bpp == 16 ? stbi__get16le(s) : stbi__get32le(s));
3342
               int a;
3343 3344 3345
               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
3346
               a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
3347
               if (target == 4) out[z++] = STBI__BYTECAST(a); 
3348 3349
            }
         }
3350
         stbi__skip(s, pad);
3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364
      }
   }
   if (flip_vertically) {
      stbi_uc t;
      for (j=0; j < (int) s->img_y>>1; ++j) {
         stbi_uc *p1 = out +      j     *s->img_x*target;
         stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
         for (i=0; i < (int) s->img_x*target; ++i) {
            t = p1[i], p1[i] = p2[i], p2[i] = t;
         }
      }
   }

   if (req_comp && req_comp != target) {
3365 3366
      out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
      if (out == NULL) return out; // stbi__convert_format frees input on failure
3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377
   }

   *x = s->img_x;
   *y = s->img_y;
   if (comp) *comp = s->img_n;
   return out;
}

// Targa Truevision - TGA
// by Jonathan Dummer

3378
static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)
3379 3380 3381
{
    int tga_w, tga_h, tga_comp;
    int sz;
3382 3383
    stbi__get8(s);                   // discard Offset
    sz = stbi__get8(s);              // color type
3384
    if( sz > 1 ) {
3385
        stbi__rewind(s);
3386 3387
        return 0;      // only RGB or indexed allowed
    }
3388
    sz = stbi__get8(s);              // image type
3389 3390
    // only RGB or grey allowed, +/- RLE
    if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0;
3391 3392
    stbi__skip(s,9);
    tga_w = stbi__get16le(s);
3393
    if( tga_w < 1 ) {
3394
        stbi__rewind(s);
3395 3396
        return 0;   // test width
    }
3397
    tga_h = stbi__get16le(s);
3398
    if( tga_h < 1 ) {
3399
        stbi__rewind(s);
3400 3401
        return 0;   // test height
    }
3402
    sz = stbi__get8(s);               // bits per pixel
3403 3404
    // only RGB or RGBA or grey allowed
    if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) {
3405
        stbi__rewind(s);
3406 3407 3408 3409 3410 3411 3412 3413 3414
        return 0;
    }
    tga_comp = sz;
    if (x) *x = tga_w;
    if (y) *y = tga_h;
    if (comp) *comp = tga_comp / 8;
    return 1;                   // seems to have passed everything
}

3415
static int stbi__tga_test(stbi__context *s)
3416
{
3417
   int res;
3418
   int sz;
3419 3420
   stbi__get8(s);      //   discard Offset
   sz = stbi__get8(s);   //   color type
3421
   if ( sz > 1 ) return 0;   //   only RGB or indexed allowed
3422
   sz = stbi__get8(s);   //   image type
3423
   if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0;   //   only RGB or grey allowed, +/- RLE
3424 3425 3426 3427 3428 3429 3430 3431
   stbi__get16be(s);      //   discard palette start
   stbi__get16be(s);      //   discard palette length
   stbi__get8(s);         //   discard bits per palette color entry
   stbi__get16be(s);      //   discard x origin
   stbi__get16be(s);      //   discard y origin
   if ( stbi__get16be(s) < 1 ) return 0;      //   test width
   if ( stbi__get16be(s) < 1 ) return 0;      //   test height
   sz = stbi__get8(s);   //   bits per pixel
3432 3433 3434 3435 3436
   if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) )
      res = 0;
   else
      res = 1;
   stbi__rewind(s);
3437 3438 3439
   return res;
}

3440
static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
3441 3442
{
   //   read in the TGA header stuff
3443 3444 3445
   int tga_offset = stbi__get8(s);
   int tga_indexed = stbi__get8(s);
   int tga_image_type = stbi__get8(s);
3446
   int tga_is_RLE = 0;
3447 3448
   int tga_palette_start = stbi__get16le(s);
   int tga_palette_len = stbi__get16le(s);
3449
   int tga_palette_bits = stbi__get8(s);
3450 3451 3452 3453
   int tga_x_origin = stbi__get16le(s);
   int tga_y_origin = stbi__get16le(s);
   int tga_width = stbi__get16le(s);
   int tga_height = stbi__get16le(s);
3454
   int tga_bits_per_pixel = stbi__get8(s);
3455
   int tga_comp = tga_bits_per_pixel / 8;
3456
   int tga_inverted = stbi__get8(s);
3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496
   //   image data
   unsigned char *tga_data;
   unsigned char *tga_palette = NULL;
   int i, j;
   unsigned char raw_data[4];
   int RLE_count = 0;
   int RLE_repeating = 0;
   int read_next_pixel = 1;

   //   do a tiny bit of precessing
   if ( tga_image_type >= 8 )
   {
      tga_image_type -= 8;
      tga_is_RLE = 1;
   }
   /* int tga_alpha_bits = tga_inverted & 15; */
   tga_inverted = 1 - ((tga_inverted >> 5) & 1);

   //   error check
   if ( //(tga_indexed) ||
      (tga_width < 1) || (tga_height < 1) ||
      (tga_image_type < 1) || (tga_image_type > 3) ||
      ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&
      (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))
      )
   {
      return NULL; // we don't report this as a bad TGA because we don't even know if it's TGA
   }

   //   If I'm paletted, then I'll use the number of bits from the palette
   if ( tga_indexed )
   {
      tga_comp = tga_palette_bits / 8;
   }

   //   tga info
   *x = tga_width;
   *y = tga_height;
   if (comp) *comp = tga_comp;

3497
   tga_data = (unsigned char*)stbi__malloc( tga_width * tga_height * tga_comp );
S
Sean Barrett 已提交
3498
   if (!tga_data) return stbi__errpuc("outofmem", "Out of memory");
3499

3500
   // skip to the data's starting position (offset usually = 0)
3501
   stbi__skip(s, tga_offset );
3502 3503 3504 3505

   if ( !tga_indexed && !tga_is_RLE) {
      for (i=0; i < tga_height; ++i) {
         int y = tga_inverted ? tga_height -i - 1 : i;
3506
         stbi_uc *tga_row = tga_data + y*tga_width*tga_comp;
3507
         stbi__getn(s, tga_row, tga_width * tga_comp);
3508 3509 3510 3511 3512
      }
   } else  {
      //   do I need to load a palette?
      if ( tga_indexed)
      {
3513
         //   any data to skip? (offset usually = 0)
3514
         stbi__skip(s, tga_palette_start );
3515
         //   load the palette
3516
         tga_palette = (unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 );
3517 3518
         if (!tga_palette) {
            free(tga_data);
S
Sean Barrett 已提交
3519
            return stbi__errpuc("outofmem", "Out of memory");
3520
         }
3521
         if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) {
3522 3523
            free(tga_data);
            free(tga_palette);
S
Sean Barrett 已提交
3524
            return stbi__errpuc("bad palette", "Corrupt TGA");
3525 3526 3527 3528 3529
         }
      }
      //   load the data
      for (i=0; i < tga_width * tga_height; ++i)
      {
3530
         //   if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?
3531 3532 3533 3534 3535
         if ( tga_is_RLE )
         {
            if ( RLE_count == 0 )
            {
               //   yep, get the next byte as a RLE command
3536
               int RLE_cmd = stbi__get8(s);
3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554
               RLE_count = 1 + (RLE_cmd & 127);
               RLE_repeating = RLE_cmd >> 7;
               read_next_pixel = 1;
            } else if ( !RLE_repeating )
            {
               read_next_pixel = 1;
            }
         } else
         {
            read_next_pixel = 1;
         }
         //   OK, if I need to read a pixel, do it now
         if ( read_next_pixel )
         {
            //   load however much data we did have
            if ( tga_indexed )
            {
               //   read in 1 byte, then perform the lookup
3555
               int pal_idx = stbi__get8(s);
3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570
               if ( pal_idx >= tga_palette_len )
               {
                  //   invalid index
                  pal_idx = 0;
               }
               pal_idx *= tga_bits_per_pixel / 8;
               for (j = 0; j*8 < tga_bits_per_pixel; ++j)
               {
                  raw_data[j] = tga_palette[pal_idx+j];
               }
            } else
            {
               //   read in the data raw
               for (j = 0; j*8 < tga_bits_per_pixel; ++j)
               {
3571
                  raw_data[j] = stbi__get8(s);
3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589
               }
            }
            //   clear the reading flag for the next pixel
            read_next_pixel = 0;
         } // end of reading a pixel

         // copy data
         for (j = 0; j < tga_comp; ++j)
           tga_data[i*tga_comp+j] = raw_data[j];

         //   in case we're in RLE mode, keep counting down
         --RLE_count;
      }
      //   do I need to invert the image?
      if ( tga_inverted )
      {
         for (j = 0; j*2 < tga_height; ++j)
         {
3590 3591 3592
            int index1 = j * tga_width * tga_comp;
            int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
            for (i = tga_width * tga_comp; i > 0; --i)
3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623
            {
               unsigned char temp = tga_data[index1];
               tga_data[index1] = tga_data[index2];
               tga_data[index2] = temp;
               ++index1;
               ++index2;
            }
         }
      }
      //   clear my palette, if I had one
      if ( tga_palette != NULL )
      {
         free( tga_palette );
      }
   }

   // swap RGB
   if (tga_comp >= 3)
   {
      unsigned char* tga_pixel = tga_data;
      for (i=0; i < tga_width * tga_height; ++i)
      {
         unsigned char temp = tga_pixel[0];
         tga_pixel[0] = tga_pixel[2];
         tga_pixel[2] = temp;
         tga_pixel += tga_comp;
      }
   }

   // convert to target component count
   if (req_comp && req_comp != tga_comp)
3624
      tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636

   //   the things I do to get rid of an error message, and yet keep
   //   Microsoft's C compilers happy... [8^(
   tga_palette_start = tga_palette_len = tga_palette_bits =
         tga_x_origin = tga_y_origin = 0;
   //   OK, done
   return tga_data;
}

// *************************************************************************************************
// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB

S
Sean Barrett 已提交
3637
static int stbi__psd_test(stbi__context *s)
3638
{
3639 3640
   int r = (stbi__get32be(s) == 0x38425053);
   stbi__rewind(s);
3641 3642 3643
   return r;
}

3644
static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
3645 3646 3647 3648 3649
{
   int   pixelCount;
   int channelCount, compression;
   int channel, i, count, len;
   int w,h;
3650
   stbi_uc *out;
3651 3652

   // Check identifier
3653
   if (stbi__get32be(s) != 0x38425053)   // "8BPS"
S
Sean Barrett 已提交
3654
      return stbi__errpuc("not PSD", "Corrupt PSD image");
3655 3656

   // Check file type version.
3657
   if (stbi__get16be(s) != 1)
S
Sean Barrett 已提交
3658
      return stbi__errpuc("wrong version", "Unsupported version of PSD image");
3659 3660

   // Skip 6 reserved bytes.
3661
   stbi__skip(s, 6 );
3662 3663

   // Read the number of channels (R, G, B, A, etc).
3664
   channelCount = stbi__get16be(s);
3665
   if (channelCount < 0 || channelCount > 16)
S
Sean Barrett 已提交
3666
      return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image");
3667 3668

   // Read the rows and columns of the image.
3669 3670
   h = stbi__get32be(s);
   w = stbi__get32be(s);
3671 3672
   
   // Make sure the depth is 8 bits.
3673
   if (stbi__get16be(s) != 8)
S
Sean Barrett 已提交
3674
      return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 bit");
3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685

   // Make sure the color mode is RGB.
   // Valid options are:
   //   0: Bitmap
   //   1: Grayscale
   //   2: Indexed color
   //   3: RGB color
   //   4: CMYK color
   //   7: Multichannel
   //   8: Duotone
   //   9: Lab color
3686
   if (stbi__get16be(s) != 3)
S
Sean Barrett 已提交
3687
      return stbi__errpuc("wrong color format", "PSD is not in RGB color format");
3688 3689

   // Skip the Mode Data.  (It's the palette for indexed color; other info for other modes.)
3690
   stbi__skip(s,stbi__get32be(s) );
3691 3692

   // Skip the image resources.  (resolution, pen tool paths, etc)
3693
   stbi__skip(s, stbi__get32be(s) );
3694 3695

   // Skip the reserved data.
3696
   stbi__skip(s, stbi__get32be(s) );
3697 3698 3699 3700 3701

   // Find out if the data is compressed.
   // Known values:
   //   0: no compression
   //   1: RLE compressed
3702
   compression = stbi__get16be(s);
3703
   if (compression > 1)
S
Sean Barrett 已提交
3704
      return stbi__errpuc("bad compression", "PSD has an unknown compression format");
3705 3706

   // Create the destination image.
3707
   out = (stbi_uc *) stbi__malloc(4 * w*h);
S
Sean Barrett 已提交
3708
   if (!out) return stbi__errpuc("outofmem", "Out of memory");
3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724
   pixelCount = w*h;

   // Initialize the data to zero.
   //memset( out, 0, pixelCount * 4 );
   
   // Finally, the image data.
   if (compression) {
      // RLE as used by .PSD and .TIFF
      // Loop until you get the number of unpacked bytes you are expecting:
      //     Read the next source byte into n.
      //     If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.
      //     Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.
      //     Else if n is 128, noop.
      // Endloop

      // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data,
3725
      // which we're going to just skip.
3726
      stbi__skip(s, h * channelCount * 2 );
3727 3728 3729

      // Read the RLE data by channel.
      for (channel = 0; channel < 4; channel++) {
3730
         stbi_uc *p;
3731 3732 3733 3734 3735 3736 3737 3738 3739
         
         p = out+channel;
         if (channel >= channelCount) {
            // Fill this channel with default data.
            for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4;
         } else {
            // Read the RLE data.
            count = 0;
            while (count < pixelCount) {
3740
               len = stbi__get8(s);
3741 3742 3743 3744 3745 3746 3747
               if (len == 128) {
                  // No-op.
               } else if (len < 128) {
                  // Copy next len+1 bytes literally.
                  len++;
                  count += len;
                  while (len) {
3748
                     *p = stbi__get8(s);
3749 3750 3751 3752
                     p += 4;
                     len--;
                  }
               } else if (len > 128) {
3753
                  stbi_uc   val;
3754 3755 3756 3757
                  // Next -len+1 bytes in the dest are replicated from next source byte.
                  // (Interpret len as a negative 8-bit int.)
                  len ^= 0x0FF;
                  len += 2;
3758
                  val = stbi__get8(s);
3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775
                  count += len;
                  while (len) {
                     *p = val;
                     p += 4;
                     len--;
                  }
               }
            }
         }
      }
      
   } else {
      // We're at the raw image data.  It's each channel in order (Red, Green, Blue, Alpha, ...)
      // where each channel consists of an 8-bit value for each pixel in the image.
      
      // Read the data by channel.
      for (channel = 0; channel < 4; channel++) {
3776
         stbi_uc *p;
3777 3778 3779 3780 3781 3782 3783 3784
         
         p = out + channel;
         if (channel > channelCount) {
            // Fill this channel with default data.
            for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4;
         } else {
            // Read the data.
            for (i = 0; i < pixelCount; i++)
3785
               *p = stbi__get8(s), p += 4;
3786 3787 3788 3789 3790
         }
      }
   }

   if (req_comp && req_comp != 4) {
3791 3792
      out = stbi__convert_format(out, 4, req_comp, w, h);
      if (out == NULL) return out; // stbi__convert_format frees input on failure
3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808
   }

   if (comp) *comp = channelCount;
   *y = h;
   *x = w;
   
   return out;
}

// *************************************************************************************************
// Softimage PIC loader
// by Tom Seddon
//
// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format
// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/

3809
static int stbi__pic_is4(stbi__context *s,const char *str)
3810 3811 3812
{
   int i;
   for (i=0; i<4; ++i)
3813
      if (stbi__get8(s) != (stbi_uc)str[i])
3814 3815 3816 3817 3818
         return 0;

   return 1;
}

3819
static int stbi__pic_test_core(stbi__context *s)
3820 3821 3822
{
   int i;

3823
   if (!stbi__pic_is4(s,"\x53\x80\xF6\x34"))
3824 3825 3826
      return 0;

   for(i=0;i<84;++i)
3827
      stbi__get8(s);
3828

3829
   if (!stbi__pic_is4(s,"PICT"))
3830 3831 3832 3833 3834 3835 3836 3837
      return 0;

   return 1;
}

typedef struct
{
   stbi_uc size,type,channel;
3838
} stbi__pic_packet;
3839

3840
static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest)
3841 3842 3843 3844 3845
{
   int mask=0x80, i;

   for (i=0; i<4; ++i, mask>>=1) {
      if (channel & mask) {
3846
         if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short");
3847
         dest[i]=stbi__get8(s);
3848 3849 3850 3851 3852 3853
      }
   }

   return dest;
}

3854
static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src)
3855 3856 3857 3858 3859 3860 3861 3862
{
   int mask=0x80,i;

   for (i=0;i<4; ++i, mask>>=1)
      if (channel&mask)
         dest[i]=src[i];
}

3863
static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result)
3864 3865
{
   int act_comp=0,num_packets=0,y,chained;
3866
   stbi__pic_packet packets[10];
3867 3868 3869 3870

   // this will (should...) cater for even some bizarre stuff like having data
    // for the same channel in multiple packets.
   do {
3871
      stbi__pic_packet *packet;
3872 3873

      if (num_packets==sizeof(packets)/sizeof(packets[0]))
S
Sean Barrett 已提交
3874
         return stbi__errpuc("bad format","too many packets");
3875 3876 3877

      packet = &packets[num_packets++];

3878
      chained = stbi__get8(s);
3879 3880 3881
      packet->size    = stbi__get8(s);
      packet->type    = stbi__get8(s);
      packet->channel = stbi__get8(s);
3882 3883 3884

      act_comp |= packet->channel;

3885
      if (stbi__at_eof(s))          return stbi__errpuc("bad file","file too short (reading packets)");
S
Sean Barrett 已提交
3886
      if (packet->size != 8)  return stbi__errpuc("bad format","packet isn't 8bpp");
3887 3888 3889 3890 3891 3892 3893 3894
   } while (chained);

   *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?

   for(y=0; y<height; ++y) {
      int packet_idx;

      for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
3895
         stbi__pic_packet *packet = &packets[packet_idx];
3896 3897 3898 3899
         stbi_uc *dest = result+y*width*4;

         switch (packet->type) {
            default:
S
Sean Barrett 已提交
3900
               return stbi__errpuc("bad format","packet has bad compression type");
3901 3902 3903 3904 3905

            case 0: {//uncompressed
               int x;

               for(x=0;x<width;++x, dest+=4)
3906
                  if (!stbi__readval(s,packet->channel,dest))
3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917
                     return 0;
               break;
            }

            case 1://Pure RLE
               {
                  int left=width, i;

                  while (left>0) {
                     stbi_uc count,value[4];

3918
                     count=stbi__get8(s);
3919
                     if (stbi__at_eof(s))   return stbi__errpuc("bad file","file too short (pure read count)");
3920 3921

                     if (count > left)
3922
                        count = (stbi_uc) left;
3923

3924
                     if (!stbi__readval(s,packet->channel,value))  return 0;
3925 3926

                     for(i=0; i<count; ++i,dest+=4)
3927
                        stbi__copyval(packet->channel,dest,value);
3928 3929 3930 3931 3932 3933 3934 3935
                     left -= count;
                  }
               }
               break;

            case 2: {//Mixed RLE
               int left=width;
               while (left>0) {
3936 3937
                  int count = stbi__get8(s), i;
                  if (stbi__at_eof(s))  return stbi__errpuc("bad file","file too short (mixed read count)");
3938 3939 3940 3941 3942 3943

                  if (count >= 128) { // Repeated
                     stbi_uc value[4];
                     int i;

                     if (count==128)
3944
                        count = stbi__get16be(s);
3945 3946 3947
                     else
                        count -= 127;
                     if (count > left)
S
Sean Barrett 已提交
3948
                        return stbi__errpuc("bad file","scanline overrun");
3949

3950
                     if (!stbi__readval(s,packet->channel,value))
3951 3952 3953
                        return 0;

                     for(i=0;i<count;++i, dest += 4)
3954
                        stbi__copyval(packet->channel,dest,value);
3955 3956
                  } else { // Raw
                     ++count;
S
Sean Barrett 已提交
3957
                     if (count>left) return stbi__errpuc("bad file","scanline overrun");
3958 3959

                     for(i=0;i<count;++i, dest+=4)
3960
                        if (!stbi__readval(s,packet->channel,dest))
3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973
                           return 0;
                  }
                  left-=count;
               }
               break;
            }
         }
      }
   }

   return result;
}

3974
static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp)
3975 3976 3977 3978 3979
{
   stbi_uc *result;
   int i, x,y;

   for (i=0; i<92; ++i)
3980
      stbi__get8(s);
3981

3982 3983 3984
   x = stbi__get16be(s);
   y = stbi__get16be(s);
   if (stbi__at_eof(s))  return stbi__errpuc("bad file","file too short (pic header)");
3985
   if ((1 << 28) / x < y) return stbi__errpuc("too large", "Image too large to decode");
3986

S
Sean Barrett 已提交
3987 3988 3989
   stbi__get32be(s); //skip `ratio'
   stbi__get16be(s); //skip `fields'
   stbi__get16be(s); //skip `pad'
3990 3991

   // intermediate buffer is RGBA
3992
   result = (stbi_uc *) stbi__malloc(x*y*4);
3993 3994
   memset(result, 0xff, x*y*4);

3995
   if (!stbi__pic_load_core(s,x,y,comp, result)) {
3996 3997 3998 3999 4000 4001
      free(result);
      result=0;
   }
   *px = x;
   *py = y;
   if (req_comp == 0) req_comp = *comp;
4002
   result=stbi__convert_format(result,4,req_comp,x,y);
4003 4004 4005 4006

   return result;
}

S
Sean Barrett 已提交
4007
static int stbi__pic_test(stbi__context *s)
4008
{
4009 4010
   int r = stbi__pic_test_core(s);
   stbi__rewind(s);
4011 4012 4013 4014 4015
   return r;
}

// *************************************************************************************************
// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb
4016 4017
typedef struct 
{
4018
   stbi__int16 prefix;
4019 4020 4021
   stbi_uc first;
   stbi_uc suffix;
} stbi__gif_lzw;
4022

4023
typedef struct
4024 4025 4026 4027
{
   int w,h;
   stbi_uc *out;                 // output buffer (always 4 components)
   int flags, bgindex, ratio, transparent, eflags;
4028 4029 4030 4031
   stbi_uc  pal[256][4];
   stbi_uc lpal[256][4];
   stbi__gif_lzw codes[4096];
   stbi_uc *color_table;
4032 4033 4034 4035 4036 4037
   int parse, step;
   int lflags;
   int start_x, start_y;
   int max_x, max_y;
   int cur_x, cur_y;
   int line_size;
4038
} stbi__gif;
4039

4040
static int stbi__gif_test_raw(stbi__context *s)
4041 4042
{
   int sz;
4043 4044
   if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;
   sz = stbi__get8(s);
4045
   if (sz != '9' && sz != '7') return 0;
4046
   if (stbi__get8(s) != 'a') return 0;
4047 4048 4049
   return 1;
}

S
Sean Barrett 已提交
4050
static int stbi__gif_test(stbi__context *s)
4051
{
4052 4053
   int r = stbi__gif_test_raw(s);
   stbi__rewind(s);
4054 4055 4056
   return r;
}

4057
static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)
4058 4059 4060
{
   int i;
   for (i=0; i < num_entries; ++i) {
4061 4062 4063
      pal[i][2] = stbi__get8(s);
      pal[i][1] = stbi__get8(s);
      pal[i][0] = stbi__get8(s);
4064 4065 4066 4067
      pal[i][3] = transp ? 0 : 255;
   }   
}

4068
static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)
4069
{
4070
   stbi_uc version;
4071
   if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')
S
Sean Barrett 已提交
4072
      return stbi__err("not GIF", "Corrupt GIF");
4073

4074
   version = stbi__get8(s);
S
Sean Barrett 已提交
4075
   if (version != '7' && version != '9')    return stbi__err("not GIF", "Corrupt GIF");
4076
   if (stbi__get8(s) != 'a')                      return stbi__err("not GIF", "Corrupt GIF");
4077
 
4078
   stbi__g_failure_reason = "";
4079 4080 4081 4082 4083
   g->w = stbi__get16le(s);
   g->h = stbi__get16le(s);
   g->flags = stbi__get8(s);
   g->bgindex = stbi__get8(s);
   g->ratio = stbi__get8(s);
4084 4085 4086 4087 4088 4089 4090
   g->transparent = -1;

   if (comp != 0) *comp = 4;  // can't actually tell whether it's 3 or 4 until we parse the comments

   if (is_info) return 1;

   if (g->flags & 0x80)
4091
      stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
4092 4093 4094 4095

   return 1;
}

4096
static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)
4097
{
4098 4099 4100
   stbi__gif g;   
   if (!stbi__gif_header(s, &g, comp, 1)) {
      stbi__rewind( s );
4101 4102 4103 4104 4105 4106 4107
      return 0;
   }
   if (x) *x = g.w;
   if (y) *y = g.h;
   return 1;
}

4108
static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
4109
{
4110
   stbi_uc *p, *c;
4111

4112
   // recurse to decode the prefixes, since the linked-list is backwards,
4113 4114
   // and working backwards through an interleaved image would be nasty
   if (g->codes[code].prefix >= 0)
4115
      stbi__out_gif_code(g, g->codes[code].prefix);
4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141

   if (g->cur_y >= g->max_y) return;
  
   p = &g->out[g->cur_x + g->cur_y];
   c = &g->color_table[g->codes[code].suffix * 4];

   if (c[3] >= 128) {
      p[0] = c[2];
      p[1] = c[1];
      p[2] = c[0];
      p[3] = c[3];
   }
   g->cur_x += 4;

   if (g->cur_x >= g->max_x) {
      g->cur_x = g->start_x;
      g->cur_y += g->step;

      while (g->cur_y >= g->max_y && g->parse > 0) {
         g->step = (1 << g->parse) * g->line_size;
         g->cur_y = g->start_y + (g->step >> 1);
         --g->parse;
      }
   }
}

4142
static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
4143
{
4144
   stbi_uc lzw_cs;
4145 4146 4147
   stbi__int32 len, code;
   stbi__uint32 first;
   stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
4148
   stbi__gif_lzw *p;
4149

4150
   lzw_cs = stbi__get8(s);
4151 4152 4153 4154 4155 4156 4157 4158
   clear = 1 << lzw_cs;
   first = 1;
   codesize = lzw_cs + 1;
   codemask = (1 << codesize) - 1;
   bits = 0;
   valid_bits = 0;
   for (code = 0; code < clear; code++) {
      g->codes[code].prefix = -1;
4159 4160
      g->codes[code].first = (stbi_uc) code;
      g->codes[code].suffix = (stbi_uc) code;
4161 4162 4163 4164 4165 4166 4167 4168 4169 4170
   }

   // support no starting clear code
   avail = clear+2;
   oldcode = -1;

   len = 0;
   for(;;) {
      if (valid_bits < codesize) {
         if (len == 0) {
4171
            len = stbi__get8(s); // start new block
4172 4173 4174 4175
            if (len == 0) 
               return g->out;
         }
         --len;
4176
         bits |= (stbi__int32) stbi__get8(s) << valid_bits;
4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189
         valid_bits += 8;
      } else {
         stbi__int32 code = bits & codemask;
         bits >>= codesize;
         valid_bits -= codesize;
         // @OPTIMIZE: is there some way we can accelerate the non-clear path?
         if (code == clear) {  // clear code
            codesize = lzw_cs + 1;
            codemask = (1 << codesize) - 1;
            avail = clear + 2;
            oldcode = -1;
            first = 0;
         } else if (code == clear + 1) { // end of stream code
4190 4191 4192
            stbi__skip(s, len);
            while ((len = stbi__get8(s)) > 0)
               stbi__skip(s,len);
4193 4194
            return g->out;
         } else if (code <= avail) {
S
Sean Barrett 已提交
4195
            if (first) return stbi__errpuc("no clear code", "Corrupt GIF");
4196 4197 4198

            if (oldcode >= 0) {
               p = &g->codes[avail++];
S
Sean Barrett 已提交
4199
               if (avail > 4096)        return stbi__errpuc("too many codes", "Corrupt GIF");
4200 4201 4202 4203
               p->prefix = (stbi__int16) oldcode;
               p->first = g->codes[oldcode].first;
               p->suffix = (code == avail) ? p->first : g->codes[code].first;
            } else if (code == avail)
S
Sean Barrett 已提交
4204
               return stbi__errpuc("illegal code in raster", "Corrupt GIF");
4205

4206
            stbi__out_gif_code(g, (stbi__uint16) code);
4207 4208 4209 4210 4211 4212 4213 4214

            if ((avail & codemask) == 0 && avail <= 0x0FFF) {
               codesize++;
               codemask = (1 << codesize) - 1;
            }

            oldcode = code;
         } else {
S
Sean Barrett 已提交
4215
            return stbi__errpuc("illegal code in raster", "Corrupt GIF");
4216 4217 4218 4219 4220
         }
      } 
   }
}

4221
static void stbi__fill_gif_background(stbi__gif *g)
4222 4223
{
   int i;
4224
   stbi_uc *c = g->pal[g->bgindex];
4225 4226
   // @OPTIMIZE: write a dword at a time
   for (i = 0; i < g->w * g->h * 4; i += 4) {
4227
      stbi_uc *p  = &g->out[i];
4228 4229 4230 4231 4232 4233 4234 4235
      p[0] = c[2];
      p[1] = c[1];
      p[2] = c[0];
      p[3] = c[3];
   }
}

// this function is designed to support animated gifs, although stb_image doesn't support it
4236
static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp)
4237 4238
{
   int i;
4239
   stbi_uc *old_out = 0;
4240 4241

   if (g->out == 0) {
4242
      if (!stbi__gif_header(s, g, comp,0))     return 0; // stbi__g_failure_reason set by stbi__gif_header
4243
      g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h);
S
Sean Barrett 已提交
4244
      if (g->out == 0)                      return stbi__errpuc("outofmem", "Out of memory");
4245
      stbi__fill_gif_background(g);
4246 4247 4248 4249
   } else {
      // animated-gif-only path
      if (((g->eflags & 0x1C) >> 2) == 3) {
         old_out = g->out;
4250
         g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h);
S
Sean Barrett 已提交
4251
         if (g->out == 0)                   return stbi__errpuc("outofmem", "Out of memory");
4252 4253 4254 4255 4256
         memcpy(g->out, old_out, g->w*g->h*4);
      }
   }
    
   for (;;) {
4257
      switch (stbi__get8(s)) {
4258 4259 4260
         case 0x2C: /* Image Descriptor */
         {
            stbi__int32 x, y, w, h;
4261
            stbi_uc *o;
4262

4263 4264 4265 4266
            x = stbi__get16le(s);
            y = stbi__get16le(s);
            w = stbi__get16le(s);
            h = stbi__get16le(s);
4267
            if (((x + w) > (g->w)) || ((y + h) > (g->h)))
S
Sean Barrett 已提交
4268
               return stbi__errpuc("bad Image Descriptor", "Corrupt GIF");
4269 4270 4271 4272 4273 4274 4275 4276 4277

            g->line_size = g->w * 4;
            g->start_x = x * 4;
            g->start_y = y * g->line_size;
            g->max_x   = g->start_x + w * 4;
            g->max_y   = g->start_y + h * g->line_size;
            g->cur_x   = g->start_x;
            g->cur_y   = g->start_y;

4278
            g->lflags = stbi__get8(s);
4279 4280 4281 4282 4283 4284 4285 4286 4287 4288

            if (g->lflags & 0x40) {
               g->step = 8 * g->line_size; // first interlaced spacing
               g->parse = 3;
            } else {
               g->step = g->line_size;
               g->parse = 0;
            }

            if (g->lflags & 0x80) {
4289 4290
               stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
               g->color_table = (stbi_uc *) g->lpal;       
4291
            } else if (g->flags & 0x80) {
4292
               for (i=0; i < 256; ++i)  // @OPTIMIZE: stbi__jpeg_reset only the previous transparent
4293 4294 4295
                  g->pal[i][3] = 255; 
               if (g->transparent >= 0 && (g->eflags & 0x01))
                  g->pal[g->transparent][3] = 0;
4296
               g->color_table = (stbi_uc *) g->pal;
4297
            } else
S
Sean Barrett 已提交
4298
               return stbi__errpuc("missing color table", "Corrupt GIF");
4299
   
4300
            o = stbi__process_gif_raster(s, g);
4301 4302 4303
            if (o == NULL) return NULL;

            if (req_comp && req_comp != 4)
4304
               o = stbi__convert_format(o, 4, req_comp, g->w, g->h);
4305 4306 4307 4308 4309 4310
            return o;
         }

         case 0x21: // Comment Extension.
         {
            int len;
4311 4312
            if (stbi__get8(s) == 0xF9) { // Graphic Control Extension.
               len = stbi__get8(s);
4313
               if (len == 4) {
4314 4315 4316
                  g->eflags = stbi__get8(s);
                  stbi__get16le(s); // delay
                  g->transparent = stbi__get8(s);
4317
               } else {
4318
                  stbi__skip(s, len);
4319 4320 4321
                  break;
               }
            }
4322 4323
            while ((len = stbi__get8(s)) != 0)
               stbi__skip(s, len);
4324 4325 4326 4327
            break;
         }

         case 0x3B: // gif stream termination code
4328
            return (stbi_uc *) s; // using '1' causes warning on some compilers
4329 4330

         default:
S
Sean Barrett 已提交
4331
            return stbi__errpuc("unknown code", "Corrupt GIF");
4332 4333 4334 4335
      }
   }
}

S
Sean Barrett 已提交
4336
static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
4337
{
4338
   stbi_uc *u = 0;
J
johan 已提交
4339 4340
   stbi__gif g;
   memset(&g, 0, sizeof(g));
4341

4342
   u = stbi__gif_load_next(s, &g, comp, req_comp);
4343
   if (u == (stbi_uc *) s) u = 0;  // end of animated gif marker
4344 4345 4346 4347 4348 4349 4350 4351
   if (u) {
      *x = g.w;
      *y = g.h;
   }

   return u;
}

S
Sean Barrett 已提交
4352
static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)
4353
{
4354
   return stbi__gif_info_raw(s,x,y,comp);
4355 4356 4357 4358 4359 4360 4361
}


// *************************************************************************************************
// Radiance RGBE HDR loader
// originally by Nicolas Schulz
#ifndef STBI_NO_HDR
4362
static int stbi__hdr_test_core(stbi__context *s)
4363 4364 4365 4366
{
   const char *signature = "#?RADIANCE\n";
   int i;
   for (i=0; signature[i]; ++i)
4367
      if (stbi__get8(s) != signature[i])
4368 4369 4370 4371
         return 0;
   return 1;
}

S
Sean Barrett 已提交
4372
static int stbi__hdr_test(stbi__context* s)
4373
{
4374 4375
   int r = stbi__hdr_test_core(s);
   stbi__rewind(s);
4376 4377 4378
   return r;
}

4379 4380
#define STBI__HDR_BUFLEN  1024
static char *stbi__hdr_gettoken(stbi__context *z, char *buffer)
4381 4382 4383 4384
{
   int len=0;
   char c = '\0';

4385
   c = (char) stbi__get8(z);
4386

4387
   while (!stbi__at_eof(z) && c != '\n') {
4388
      buffer[len++] = c;
4389
      if (len == STBI__HDR_BUFLEN-1) {
4390
         // flush to end of line
4391
         while (!stbi__at_eof(z) && stbi__get8(z) != '\n')
4392 4393 4394
            ;
         break;
      }
4395
      c = (char) stbi__get8(z);
4396 4397 4398 4399 4400 4401
   }

   buffer[len] = 0;
   return buffer;
}

4402
static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)
4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428
{
   if ( input[3] != 0 ) {
      float f1;
      // Exponent
      f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));
      if (req_comp <= 2)
         output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
      else {
         output[0] = input[0] * f1;
         output[1] = input[1] * f1;
         output[2] = input[2] * f1;
      }
      if (req_comp == 2) output[1] = 1;
      if (req_comp == 4) output[3] = 1;
   } else {
      switch (req_comp) {
         case 4: output[3] = 1; /* fallthrough */
         case 3: output[0] = output[1] = output[2] = 0;
                 break;
         case 2: output[1] = 1; /* fallthrough */
         case 1: output[0] = 0;
                 break;
      }
   }
}

4429
static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
4430
{
4431
   char buffer[STBI__HDR_BUFLEN];
4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442
   char *token;
   int valid = 0;
   int width, height;
   stbi_uc *scanline;
   float *hdr_data;
   int len;
   unsigned char count, value;
   int i, j, k, c1,c2, z;


   // Check identifier
4443
   if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0)
S
Sean Barrett 已提交
4444
      return stbi__errpf("not HDR", "Corrupt HDR image");
4445 4446 4447
   
   // Parse header
   for(;;) {
4448
      token = stbi__hdr_gettoken(s,buffer);
4449 4450 4451 4452
      if (token[0] == 0) break;
      if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
   }

S
Sean Barrett 已提交
4453
   if (!valid)    return stbi__errpf("unsupported format", "Unsupported HDR format");
4454 4455 4456

   // Parse width and height
   // can't use sscanf() if we're not using stdio!
4457
   token = stbi__hdr_gettoken(s,buffer);
S
Sean Barrett 已提交
4458
   if (strncmp(token, "-Y ", 3))  return stbi__errpf("unsupported data layout", "Unsupported HDR format");
4459 4460 4461
   token += 3;
   height = (int) strtol(token, &token, 10);
   while (*token == ' ') ++token;
S
Sean Barrett 已提交
4462
   if (strncmp(token, "+X ", 3))  return stbi__errpf("unsupported data layout", "Unsupported HDR format");
4463 4464 4465 4466 4467 4468
   token += 3;
   width = (int) strtol(token, NULL, 10);

   *x = width;
   *y = height;

4469
   if (comp) *comp = 3;
4470 4471 4472
   if (req_comp == 0) req_comp = 3;

   // Read data
4473
   hdr_data = (float *) stbi__malloc(height * width * req_comp * sizeof(float));
4474 4475 4476 4477 4478 4479 4480 4481 4482

   // Load image data
   // image data is stored as some number of sca
   if ( width < 8 || width >= 32768) {
      // Read flat data
      for (j=0; j < height; ++j) {
         for (i=0; i < width; ++i) {
            stbi_uc rgbe[4];
           main_decode_loop:
4483
            stbi__getn(s, rgbe, 4);
4484
            stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
4485 4486 4487 4488 4489 4490 4491
         }
      }
   } else {
      // Read RLE-encoded data
      scanline = NULL;

      for (j = 0; j < height; ++j) {
4492 4493 4494
         c1 = stbi__get8(s);
         c2 = stbi__get8(s);
         len = stbi__get8(s);
4495 4496 4497
         if (c1 != 2 || c2 != 2 || (len & 0x80)) {
            // not run-length encoded, so we have to actually use THIS data as a decoded
            // pixel (note this can't be a valid pixel--one of RGB must be >= 128)
4498 4499 4500 4501
            stbi_uc rgbe[4];
            rgbe[0] = (stbi_uc) c1;
            rgbe[1] = (stbi_uc) c2;
            rgbe[2] = (stbi_uc) len;
4502
            rgbe[3] = (stbi_uc) stbi__get8(s);
4503
            stbi__hdr_convert(hdr_data, rgbe, req_comp);
4504 4505 4506 4507 4508 4509
            i = 1;
            j = 0;
            free(scanline);
            goto main_decode_loop; // yes, this makes no sense
         }
         len <<= 8;
4510
         len |= stbi__get8(s);
S
Sean Barrett 已提交
4511
         if (len != width) { free(hdr_data); free(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); }
4512
         if (scanline == NULL) scanline = (stbi_uc *) stbi__malloc(width * 4);
4513 4514 4515 4516
            
         for (k = 0; k < 4; ++k) {
            i = 0;
            while (i < width) {
4517
               count = stbi__get8(s);
4518 4519
               if (count > 128) {
                  // Run
4520
                  value = stbi__get8(s);
4521 4522 4523 4524 4525 4526
                  count -= 128;
                  for (z = 0; z < count; ++z)
                     scanline[i++ * 4 + k] = value;
               } else {
                  // Dump
                  for (z = 0; z < count; ++z)
4527
                     scanline[i++ * 4 + k] = stbi__get8(s);
4528 4529 4530 4531
               }
            }
         }
         for (i=0; i < width; ++i)
4532
            stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
4533 4534 4535 4536 4537 4538 4539
      }
      free(scanline);
   }

   return hdr_data;
}

4540
static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)
4541
{
4542
   char buffer[STBI__HDR_BUFLEN];
4543 4544 4545
   char *token;
   int valid = 0;

4546 4547
   if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) {
       stbi__rewind( s );
4548 4549 4550 4551
       return 0;
   }

   for(;;) {
4552
      token = stbi__hdr_gettoken(s,buffer);
4553 4554 4555 4556 4557
      if (token[0] == 0) break;
      if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
   }

   if (!valid) {
4558
       stbi__rewind( s );
4559 4560
       return 0;
   }
4561
   token = stbi__hdr_gettoken(s,buffer);
4562
   if (strncmp(token, "-Y ", 3)) {
4563
       stbi__rewind( s );
4564 4565 4566 4567 4568 4569
       return 0;
   }
   token += 3;
   *y = (int) strtol(token, &token, 10);
   while (*token == ' ') ++token;
   if (strncmp(token, "+X ", 3)) {
4570
       stbi__rewind( s );
4571 4572 4573 4574 4575 4576 4577 4578 4579
       return 0;
   }
   token += 3;
   *x = (int) strtol(token, NULL, 10);
   *comp = 3;
   return 1;
}
#endif // STBI_NO_HDR

4580
static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
4581 4582
{
   int hsz;
4583
   if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') {
4584
       stbi__rewind( s );
4585 4586
       return 0;
   }
4587 4588
   stbi__skip(s,12);
   hsz = stbi__get32le(s);
4589
   if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) {
4590
       stbi__rewind( s );
4591 4592 4593
       return 0;
   }
   if (hsz == 12) {
4594 4595
      *x = stbi__get16le(s);
      *y = stbi__get16le(s);
4596
   } else {
4597 4598
      *x = stbi__get32le(s);
      *y = stbi__get32le(s);
4599
   }
4600
   if (stbi__get16le(s) != 1) {
4601
       stbi__rewind( s );
4602 4603
       return 0;
   }
4604
   *comp = stbi__get16le(s) / 8;
4605 4606 4607
   return 1;
}

4608
static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
4609 4610
{
   int channelCount;
4611
   if (stbi__get32be(s) != 0x38425053) {
4612
       stbi__rewind( s );
4613 4614
       return 0;
   }
4615
   if (stbi__get16be(s) != 1) {
4616
       stbi__rewind( s );
4617 4618
       return 0;
   }
4619 4620
   stbi__skip(s, 6);
   channelCount = stbi__get16be(s);
4621
   if (channelCount < 0 || channelCount > 16) {
4622
       stbi__rewind( s );
4623 4624
       return 0;
   }
4625 4626 4627
   *y = stbi__get32be(s);
   *x = stbi__get32be(s);
   if (stbi__get16be(s) != 8) {
4628
       stbi__rewind( s );
4629 4630
       return 0;
   }
4631
   if (stbi__get16be(s) != 3) {
4632
       stbi__rewind( s );
4633 4634 4635 4636 4637 4638
       return 0;
   }
   *comp = 4;
   return 1;
}

4639
static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)
4640 4641
{
   int act_comp=0,num_packets=0,chained;
4642
   stbi__pic_packet packets[10];
4643

4644
   stbi__skip(s, 92);
4645

4646 4647 4648
   *x = stbi__get16be(s);
   *y = stbi__get16be(s);
   if (stbi__at_eof(s))  return 0;
4649
   if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
4650
       stbi__rewind( s );
4651 4652 4653
       return 0;
   }

4654
   stbi__skip(s, 8);
4655 4656

   do {
4657
      stbi__pic_packet *packet;
4658 4659 4660 4661 4662

      if (num_packets==sizeof(packets)/sizeof(packets[0]))
         return 0;

      packet = &packets[num_packets++];
4663
      chained = stbi__get8(s);
4664 4665 4666
      packet->size    = stbi__get8(s);
      packet->type    = stbi__get8(s);
      packet->channel = stbi__get8(s);
4667 4668
      act_comp |= packet->channel;

4669
      if (stbi__at_eof(s)) {
4670
          stbi__rewind( s );
4671 4672 4673
          return 0;
      }
      if (packet->size != 8) {
4674
          stbi__rewind( s );
4675 4676 4677 4678 4679 4680 4681 4682 4683
          return 0;
      }
   } while (chained);

   *comp = (act_comp & 0x10 ? 4 : 3);

   return 1;
}

4684
static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)
4685
{
S
Sean Barrett 已提交
4686
   if (stbi__jpeg_info(s, x, y, comp))
4687
       return 1;
S
Sean Barrett 已提交
4688
   if (stbi__png_info(s, x, y, comp))
4689
       return 1;
S
Sean Barrett 已提交
4690
   if (stbi__gif_info(s, x, y, comp))
4691
       return 1;
4692
   if (stbi__bmp_info(s, x, y, comp))
4693
       return 1;
4694
   if (stbi__psd_info(s, x, y, comp))
4695
       return 1;
4696
   if (stbi__pic_info(s, x, y, comp))
4697 4698
       return 1;
   #ifndef STBI_NO_HDR
4699
   if (stbi__hdr_info(s, x, y, comp))
4700 4701 4702
       return 1;
   #endif
   // test tga last because it's a crappy test!
S
Sean Barrett 已提交
4703
   if (stbi__tga_info(s, x, y, comp))
4704
       return 1;
S
Sean Barrett 已提交
4705
   return stbi__err("unknown image type", "Image not of any known type, or corrupt");
4706 4707 4708 4709 4710
}

#ifndef STBI_NO_STDIO
STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
{
S
Sean Barrett 已提交
4711
    FILE *f = stbi__fopen(filename, "rb");
4712
    int result;
S
Sean Barrett 已提交
4713
    if (!f) return stbi__err("can't fopen", "Unable to open file");
4714 4715 4716 4717 4718 4719 4720 4721
    result = stbi_info_from_file(f, x, y, comp);
    fclose(f);
    return result;
}

STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
{
   int r;
S
Sean Barrett 已提交
4722
   stbi__context s;
4723
   long pos = ftell(f);
4724 4725
   stbi__start_file(&s, f);
   r = stbi__info_main(&s,x,y,comp);
4726 4727 4728 4729 4730 4731 4732
   fseek(f,pos,SEEK_SET);
   return r;
}
#endif // !STBI_NO_STDIO

STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
{
S
Sean Barrett 已提交
4733 4734
   stbi__context s;
   stbi__start_mem(&s,buffer,len);
4735
   return stbi__info_main(&s,x,y,comp);
4736 4737 4738 4739
}

STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp)
{
S
Sean Barrett 已提交
4740 4741
   stbi__context s;
   stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);
4742
   return stbi__info_main(&s,x,y,comp);
4743 4744 4745 4746 4747 4748
}

#endif // STB_IMAGE_IMPLEMENTATION

/*
   revision history:
4749
      1.48 (2014-12-14) fix incorrectly-named assert()
4750 4751 4752
      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)
4753 4754 4755
      1.46 (2014-08-26)
             fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG
      1.45 (2014-08-16)
4756
             fix MSVC-ARM internal compiler error by wrapping malloc
4757
      1.44 (2014-08-07)
4758
               various warning fixes from Ronny Chevalier
S
Sean Barrett 已提交
4759 4760
      1.43 (2014-07-15)
             fix MSVC-only compiler problem in code changed in 1.42
S
Sean Barrett 已提交
4761 4762 4763 4764
      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
4765 4766
      1.41 (2014-06-25)
             fix search&replace from 1.36 that messed up comments/error messages
S
Sean Barrett 已提交
4767 4768
      1.40 (2014-06-22)
             fix gcc struct-initialization warning
4769 4770 4771 4772
      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)
4773 4774
      1.38 (2014-06-06)
             suppress MSVC warnings on integer casts truncating values
S
Sean Barrett 已提交
4775
             fix accidental rename of 'skip' field of I/O
4776 4777
      1.37 (2014-06-04)
             remove duplicate typedef
4778 4779 4780
      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
4781 4782 4783 4784 4785 4786 4787
      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)
4788
             use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case
4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805
      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)
4806
             cast-to-stbi_uc to fix warnings
4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821
      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
S
Sean Barrett 已提交
4822
             warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva)
4823
      1.21   fix use of 'stbi_uc' in header (reported by jon blow)
4824 4825 4826 4827 4828
      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
4829
      1.16   major bugfix - stbi__convert_format converted one too many pixels
4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846
      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
S
Sean Barrett 已提交
4847
             fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all
4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872
      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   first released version
*/