|
@@ -466,6 +466,9 @@ STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);
|
|
|
|
|
|
// flip the image vertically, so the first pixel in the output array is the bottom left
|
|
|
STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip);
|
|
|
+// as above, but only applies to images loaded on the thread that calls the function
|
|
|
+// this function is only available if your compiler supports thread-local variables
|
|
|
+STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip);
|
|
|
|
|
|
// ZLIB client - used by PNG, available for other purposes
|
|
|
|
|
@@ -563,6 +566,17 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const ch
|
|
|
#define stbi_inline __forceinline
|
|
|
#endif
|
|
|
|
|
|
+#ifndef STBI_NO_THREAD_LOCALS
|
|
|
+ #if __cplusplus >= 201103L
|
|
|
+ #define STBI_THREAD_LOCAL thread_local
|
|
|
+ #elif __STDC_VERSION_ >= 201112L
|
|
|
+ #define STBI_THREAD_LOCAL _Thread_local
|
|
|
+ #elif defined(__GNUC__)
|
|
|
+ #define STBI_THREAD_LOCAL __thread
|
|
|
+ #elif _MSC_VER
|
|
|
+ #define STBI_THREAD_LOCAL __declspec(thread)
|
|
|
+#endif
|
|
|
+#endif
|
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
typedef unsigned short stbi__uint16;
|
|
@@ -873,8 +887,11 @@ static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int
|
|
|
static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
|
|
|
#endif
|
|
|
|
|
|
-// this is not threadsafe
|
|
|
-static const char *stbi__g_failure_reason;
|
|
|
+static
|
|
|
+#ifdef STBI_THREAD_LOCAL
|
|
|
+STBI_THREAD_LOCAL
|
|
|
+#endif
|
|
|
+const char *stbi__g_failure_reason;
|
|
|
|
|
|
STBIDEF const char *stbi_failure_reason(void)
|
|
|
{
|
|
@@ -995,13 +1012,29 @@ 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);
|
|
|
#endif
|
|
|
|
|
|
-static int stbi__vertically_flip_on_load = 0;
|
|
|
+static int stbi__vertically_flip_on_load_global = 0;
|
|
|
|
|
|
STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
|
|
|
{
|
|
|
- stbi__vertically_flip_on_load = flag_true_if_should_flip;
|
|
|
+ stbi__vertically_flip_on_load_global = flag_true_if_should_flip;
|
|
|
}
|
|
|
|
|
|
+#ifndef STBI_THREAD_LOCAL
|
|
|
+#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global
|
|
|
+#else
|
|
|
+static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set;
|
|
|
+
|
|
|
+STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip)
|
|
|
+{
|
|
|
+ stbi__vertically_flip_on_load_local = flag_true_if_should_flip;
|
|
|
+ stbi__vertically_flip_on_load_set = 1;
|
|
|
+}
|
|
|
+
|
|
|
+#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \
|
|
|
+ ? stbi__vertically_flip_on_load_local \
|
|
|
+ : stbi__vertically_flip_on_load_global)
|
|
|
+#endif // STBI_THREAD_LOCAL
|
|
|
+
|
|
|
static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)
|
|
|
{
|
|
|
memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields
|