|
|
@ -21,7 +21,7 @@ |
|
|
|
avoid problematic images and only need the trivial interface |
|
|
|
avoid problematic images and only need the trivial interface |
|
|
|
|
|
|
|
|
|
|
|
JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) |
|
|
|
JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) |
|
|
|
PNG 1/2/4/8-bit-per-channel (16 bpc not supported) |
|
|
|
PNG 1/2/4/8/16-bit-per-channel |
|
|
|
|
|
|
|
|
|
|
|
TGA (not sure what subset, if a subset) |
|
|
|
TGA (not sure what subset, if a subset) |
|
|
|
BMP non-1bpp, non-RLE |
|
|
|
BMP non-1bpp, non-RLE |
|
|
@ -42,110 +42,13 @@ |
|
|
|
Full documentation under "DOCUMENTATION" below. |
|
|
|
Full documentation under "DOCUMENTATION" below. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Revision 2.00 release notes: |
|
|
|
LICENSE |
|
|
|
|
|
|
|
|
|
|
|
- Progressive JPEG is now supported. |
|
|
|
See end of file for license information. |
|
|
|
|
|
|
|
|
|
|
|
- PPM and PGM binary formats are now supported, thanks to Ken Miller. |
|
|
|
RECENT REVISION HISTORY: |
|
|
|
|
|
|
|
|
|
|
|
- x86 platforms now make use of SSE2 SIMD instructions for |
|
|
|
2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD |
|
|
|
JPEG decoding, and ARM platforms can use NEON SIMD if requested. |
|
|
|
|
|
|
|
This work was done by Fabian "ryg" Giesen. SSE2 is used by |
|
|
|
|
|
|
|
default, but NEON must be enabled explicitly; see docs. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
With other JPEG optimizations included in this version, we see |
|
|
|
|
|
|
|
2x speedup on a JPEG on an x86 machine, and a 1.5x speedup |
|
|
|
|
|
|
|
on a JPEG on an ARM machine, relative to previous versions of this |
|
|
|
|
|
|
|
library. The same results will not obtain for all JPGs and for all |
|
|
|
|
|
|
|
x86/ARM machines. (Note that progressive JPEGs are significantly |
|
|
|
|
|
|
|
slower to decode than regular JPEGs.) This doesn't mean that this |
|
|
|
|
|
|
|
is the fastest JPEG decoder in the land; rather, it brings it |
|
|
|
|
|
|
|
closer to parity with standard libraries. If you want the fastest |
|
|
|
|
|
|
|
decode, look elsewhere. (See "Philosophy" section of docs below.) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
See final bullet items below for more info on SIMD. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Added STBI_MALLOC, STBI_REALLOC, and STBI_FREE macros for replacing |
|
|
|
|
|
|
|
the memory allocator. Unlike other STBI libraries, these macros don't |
|
|
|
|
|
|
|
support a context parameter, so if you need to pass a context in to |
|
|
|
|
|
|
|
the allocator, you'll have to store it in a global or a thread-local |
|
|
|
|
|
|
|
variable. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Split existing STBI_NO_HDR flag into two flags, STBI_NO_HDR and |
|
|
|
|
|
|
|
STBI_NO_LINEAR. |
|
|
|
|
|
|
|
STBI_NO_HDR: suppress implementation of .hdr reader format |
|
|
|
|
|
|
|
STBI_NO_LINEAR: suppress high-dynamic-range light-linear float API |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- You can suppress implementation of any of the decoders to reduce |
|
|
|
|
|
|
|
your code footprint by #defining one or more of the following |
|
|
|
|
|
|
|
symbols before creating the implementation. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
STBI_NO_JPEG |
|
|
|
|
|
|
|
STBI_NO_PNG |
|
|
|
|
|
|
|
STBI_NO_BMP |
|
|
|
|
|
|
|
STBI_NO_PSD |
|
|
|
|
|
|
|
STBI_NO_TGA |
|
|
|
|
|
|
|
STBI_NO_GIF |
|
|
|
|
|
|
|
STBI_NO_HDR |
|
|
|
|
|
|
|
STBI_NO_PIC |
|
|
|
|
|
|
|
STBI_NO_PNM (.ppm and .pgm) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- You can request *only* certain decoders and suppress all other ones |
|
|
|
|
|
|
|
(this will be more forward-compatible, as addition of new decoders |
|
|
|
|
|
|
|
doesn't require you to disable them explicitly): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
STBI_ONLY_JPEG |
|
|
|
|
|
|
|
STBI_ONLY_PNG |
|
|
|
|
|
|
|
STBI_ONLY_BMP |
|
|
|
|
|
|
|
STBI_ONLY_PSD |
|
|
|
|
|
|
|
STBI_ONLY_TGA |
|
|
|
|
|
|
|
STBI_ONLY_GIF |
|
|
|
|
|
|
|
STBI_ONLY_HDR |
|
|
|
|
|
|
|
STBI_ONLY_PIC |
|
|
|
|
|
|
|
STBI_ONLY_PNM (.ppm and .pgm) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note that you can define multiples of these, and you will get all |
|
|
|
|
|
|
|
of them ("only x" and "only y" is interpreted to mean "only x&y"). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still |
|
|
|
|
|
|
|
want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Compilation of all SIMD code can be suppressed with |
|
|
|
|
|
|
|
#define STBI_NO_SIMD |
|
|
|
|
|
|
|
It should not be necessary to disable SIMD unless you have issues |
|
|
|
|
|
|
|
compiling (e.g. using an x86 compiler which doesn't support SSE |
|
|
|
|
|
|
|
intrinsics or that doesn't support the method used to detect |
|
|
|
|
|
|
|
SSE2 support at run-time), and even those can be reported as |
|
|
|
|
|
|
|
bugs so I can refine the built-in compile-time checking to be |
|
|
|
|
|
|
|
smarter. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- The old STBI_SIMD system which allowed installing a user-defined |
|
|
|
|
|
|
|
IDCT etc. has been removed. If you need this, don't upgrade. My |
|
|
|
|
|
|
|
assumption is that almost nobody was doing this, and those who |
|
|
|
|
|
|
|
were will find the built-in SIMD more satisfactory anyway. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- RGB values computed for JPEG images are slightly different from |
|
|
|
|
|
|
|
previous versions of stb_image. (This is due to using less |
|
|
|
|
|
|
|
integer precision in SIMD.) The C code has been adjusted so |
|
|
|
|
|
|
|
that the same RGB values will be computed regardless of whether |
|
|
|
|
|
|
|
SIMD support is available, so your app should always produce |
|
|
|
|
|
|
|
consistent results. But these results are slightly different from |
|
|
|
|
|
|
|
previous versions. (Specifically, about 3% of available YCbCr values |
|
|
|
|
|
|
|
will compute different RGB results from pre-1.49 versions by +-1; |
|
|
|
|
|
|
|
most of the deviating values are one smaller in the G channel.) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- If you must produce consistent results with previous versions of |
|
|
|
|
|
|
|
stb_image, #define STBI_JPEG_OLD and you will get the same results |
|
|
|
|
|
|
|
you used to; however, you will not get the SIMD speedups for |
|
|
|
|
|
|
|
the YCbCr-to-RGB conversion step (although you should still see |
|
|
|
|
|
|
|
significant JPEG speedup from the other changes). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Please note that STBI_JPEG_OLD is a temporary feature; it will be |
|
|
|
|
|
|
|
removed in future versions of the library. It is only intended for |
|
|
|
|
|
|
|
near-term back-compatibility use. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Latest revision history: |
|
|
|
|
|
|
|
2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes |
|
|
|
2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes |
|
|
|
2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes |
|
|
|
2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes |
|
|
|
2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 |
|
|
|
2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 |
|
|
@ -194,11 +97,6 @@ |
|
|
|
Philipp Wiesemann Josh Tobin github:rlyeh github:grim210@github |
|
|
|
Philipp Wiesemann Josh Tobin github:rlyeh github:grim210@github |
|
|
|
Blazej Dariusz Roszkowski github:sammyhw |
|
|
|
Blazej Dariusz Roszkowski github:sammyhw |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LICENSE |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
See end of file for licensing information. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
#ifndef STBI_INCLUDE_STB_IMAGE_H |
|
|
|
#ifndef STBI_INCLUDE_STB_IMAGE_H |
|
|
@ -272,13 +170,13 @@ LICENSE |
|
|
|
// and for best performance I may provide less-easy-to-use APIs that give higher
|
|
|
|
// and for best performance I may provide less-easy-to-use APIs that give higher
|
|
|
|
// performance, in addition to the easy to use ones. Nevertheless, it's important
|
|
|
|
// performance, in addition to the easy to use ones. Nevertheless, it's important
|
|
|
|
// to keep in mind that from the standpoint of you, a client of this library,
|
|
|
|
// to keep in mind that from the standpoint of you, a client of this library,
|
|
|
|
// all you care about is #1 and #3, and stb libraries do not emphasize #3 above all.
|
|
|
|
// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all.
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// Some secondary priorities arise directly from the first two, some of which
|
|
|
|
// Some secondary priorities arise directly from the first two, some of which
|
|
|
|
// make more explicit reasons why performance can't be emphasized.
|
|
|
|
// make more explicit reasons why performance can't be emphasized.
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// - Portable ("ease of use")
|
|
|
|
// - Portable ("ease of use")
|
|
|
|
// - Small footprint ("easy to maintain")
|
|
|
|
// - Small source code footprint ("easy to maintain")
|
|
|
|
// - No dependencies ("ease of use")
|
|
|
|
// - No dependencies ("ease of use")
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// ===========================================================================
|
|
|
|
// ===========================================================================
|
|
|
@ -310,13 +208,6 @@ LICENSE |
|
|
|
// (at least this is true for iOS and Android). Therefore, the NEON support is
|
|
|
|
// (at least this is true for iOS and Android). Therefore, the NEON support is
|
|
|
|
// toggled by a build flag: define STBI_NEON to get NEON loops.
|
|
|
|
// toggled by a build flag: define STBI_NEON to get NEON loops.
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// The output of the JPEG decoder is slightly different from versions where
|
|
|
|
|
|
|
|
// SIMD support was introduced (that is, for versions before 1.49). The
|
|
|
|
|
|
|
|
// difference is only +-1 in the 8-bit RGB channels, and only on a small
|
|
|
|
|
|
|
|
// fraction of pixels. You can force the pre-1.49 behavior by defining
|
|
|
|
|
|
|
|
// STBI_JPEG_OLD, but this will disable some of the SIMD decoding path
|
|
|
|
|
|
|
|
// and hence cost some performance.
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// If for some reason you do not want to use any of SIMD code, or if
|
|
|
|
// If for some reason you do not want to use any of SIMD code, or if
|
|
|
|
// you have issues compiling it, you can disable it entirely by
|
|
|
|
// you have issues compiling it, you can disable it entirely by
|
|
|
|
// defining STBI_NO_SIMD.
|
|
|
|
// defining STBI_NO_SIMD.
|
|
|
@ -372,6 +263,41 @@ LICENSE |
|
|
|
// says there's premultiplied data (currently only happens in iPhone images,
|
|
|
|
// says there's premultiplied data (currently only happens in iPhone images,
|
|
|
|
// and only if iPhone convert-to-rgb processing is on).
|
|
|
|
// and only if iPhone convert-to-rgb processing is on).
|
|
|
|
//
|
|
|
|
//
|
|
|
|
|
|
|
|
// ===========================================================================
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// ADDITIONAL CONFIGURATION
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// - You can suppress implementation of any of the decoders to reduce
|
|
|
|
|
|
|
|
// your code footprint by #defining one or more of the following
|
|
|
|
|
|
|
|
// symbols before creating the implementation.
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// STBI_NO_JPEG
|
|
|
|
|
|
|
|
// STBI_NO_PNG
|
|
|
|
|
|
|
|
// STBI_NO_BMP
|
|
|
|
|
|
|
|
// STBI_NO_PSD
|
|
|
|
|
|
|
|
// STBI_NO_TGA
|
|
|
|
|
|
|
|
// STBI_NO_GIF
|
|
|
|
|
|
|
|
// STBI_NO_HDR
|
|
|
|
|
|
|
|
// STBI_NO_PIC
|
|
|
|
|
|
|
|
// STBI_NO_PNM (.ppm and .pgm)
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// - You can request *only* certain decoders and suppress all other ones
|
|
|
|
|
|
|
|
// (this will be more forward-compatible, as addition of new decoders
|
|
|
|
|
|
|
|
// doesn't require you to disable them explicitly):
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// STBI_ONLY_JPEG
|
|
|
|
|
|
|
|
// STBI_ONLY_PNG
|
|
|
|
|
|
|
|
// STBI_ONLY_BMP
|
|
|
|
|
|
|
|
// STBI_ONLY_PSD
|
|
|
|
|
|
|
|
// STBI_ONLY_TGA
|
|
|
|
|
|
|
|
// STBI_ONLY_GIF
|
|
|
|
|
|
|
|
// STBI_ONLY_HDR
|
|
|
|
|
|
|
|
// STBI_ONLY_PIC
|
|
|
|
|
|
|
|
// STBI_ONLY_PNM (.ppm and .pgm)
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still
|
|
|
|
|
|
|
|
// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef STBI_NO_STDIO |
|
|
|
#ifndef STBI_NO_STDIO |
|
|
@ -3345,38 +3271,9 @@ static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_ |
|
|
|
return out; |
|
|
|
return out; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#ifdef STBI_JPEG_OLD |
|
|
|
|
|
|
|
// this is the same YCbCr-to-RGB calculation that stb_image has used
|
|
|
|
|
|
|
|
// historically before the algorithm changes in 1.49
|
|
|
|
|
|
|
|
#define float2fixed(x) ((int) ((x) * 65536 + 0.5)) |
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
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; } |
|
|
|
|
|
|
|
out[0] = (stbi_uc)r; |
|
|
|
|
|
|
|
out[1] = (stbi_uc)g; |
|
|
|
|
|
|
|
out[2] = (stbi_uc)b; |
|
|
|
|
|
|
|
out[3] = 255; |
|
|
|
|
|
|
|
out += step; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
// this is a reduced-precision calculation of YCbCr-to-RGB introduced
|
|
|
|
// this is a reduced-precision calculation of YCbCr-to-RGB introduced
|
|
|
|
// to make sure the code produces the same results in both SIMD and scalar
|
|
|
|
// to make sure the code produces the same results in both SIMD and scalar
|
|
|
|
#define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) |
|
|
|
#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) |
|
|
|
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) |
|
|
|
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) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int i; |
|
|
|
int i; |
|
|
@ -3385,9 +3282,9 @@ static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc |
|
|
|
int r,g,b; |
|
|
|
int r,g,b; |
|
|
|
int cr = pcr[i] - 128; |
|
|
|
int cr = pcr[i] - 128; |
|
|
|
int cb = pcb[i] - 128; |
|
|
|
int cb = pcb[i] - 128; |
|
|
|
r = y_fixed + cr* float2fixed(1.40200f); |
|
|
|
r = y_fixed + cr* stbi__float2fixed(1.40200f); |
|
|
|
g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); |
|
|
|
g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); |
|
|
|
b = y_fixed + cb* float2fixed(1.77200f); |
|
|
|
b = y_fixed + cb* stbi__float2fixed(1.77200f); |
|
|
|
r >>= 20; |
|
|
|
r >>= 20; |
|
|
|
g >>= 20; |
|
|
|
g >>= 20; |
|
|
|
b >>= 20; |
|
|
|
b >>= 20; |
|
|
@ -3401,7 +3298,6 @@ static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc |
|
|
|
out += step; |
|
|
|
out += step; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(STBI_SSE2) || defined(STBI_NEON) |
|
|
|
#if defined(STBI_SSE2) || defined(STBI_NEON) |
|
|
|
static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) |
|
|
|
static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) |
|
|
@ -3520,9 +3416,9 @@ static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc cons |
|
|
|
int r,g,b; |
|
|
|
int r,g,b; |
|
|
|
int cr = pcr[i] - 128; |
|
|
|
int cr = pcr[i] - 128; |
|
|
|
int cb = pcb[i] - 128; |
|
|
|
int cb = pcb[i] - 128; |
|
|
|
r = y_fixed + cr* float2fixed(1.40200f); |
|
|
|
r = y_fixed + cr* stbi__float2fixed(1.40200f); |
|
|
|
g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); |
|
|
|
g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); |
|
|
|
b = y_fixed + cb* float2fixed(1.77200f); |
|
|
|
b = y_fixed + cb* stbi__float2fixed(1.77200f); |
|
|
|
r >>= 20; |
|
|
|
r >>= 20; |
|
|
|
g >>= 20; |
|
|
|
g >>= 20; |
|
|
|
b >>= 20; |
|
|
|
b >>= 20; |
|
|
@ -3548,18 +3444,14 @@ static void stbi__setup_jpeg(stbi__jpeg *j) |
|
|
|
#ifdef STBI_SSE2 |
|
|
|
#ifdef STBI_SSE2 |
|
|
|
if (stbi__sse2_available()) { |
|
|
|
if (stbi__sse2_available()) { |
|
|
|
j->idct_block_kernel = stbi__idct_simd; |
|
|
|
j->idct_block_kernel = stbi__idct_simd; |
|
|
|
#ifndef STBI_JPEG_OLD |
|
|
|
|
|
|
|
j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; |
|
|
|
j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; |
|
|
|
#endif |
|
|
|
|
|
|
|
j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; |
|
|
|
j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#ifdef STBI_NEON |
|
|
|
#ifdef STBI_NEON |
|
|
|
j->idct_block_kernel = stbi__idct_simd; |
|
|
|
j->idct_block_kernel = stbi__idct_simd; |
|
|
|
#ifndef STBI_JPEG_OLD |
|
|
|
|
|
|
|
j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; |
|
|
|
j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; |
|
|
|
#endif |
|
|
|
|
|
|
|
j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; |
|
|
|
j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|