windows unicode: don't malloc buffers, add explicit STBI_WINDOWS_UTF8 #define
This commit is contained in:
parent
ae773aa438
commit
f82dbd638c
90
stb_image.h
90
stb_image.h
@ -99,7 +99,7 @@ RECENT REVISION HISTORY:
|
|||||||
Aldo Culquicondor Philipp Wiesemann Dale Weiler github:sammyhw
|
Aldo Culquicondor Philipp Wiesemann Dale Weiler github:sammyhw
|
||||||
Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:phprus
|
Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:phprus
|
||||||
Julian Raschke Gregory Mullen Baldur Karlsson github:poppolopoppo
|
Julian Raschke Gregory Mullen Baldur Karlsson github:poppolopoppo
|
||||||
Christian Floisand Kevin Schmidt github:darealshinji
|
Christian Floisand Kevin Schmidt JR Smith github:darealshinji
|
||||||
Blazej Dariusz Roszkowski github:Michaelangel007
|
Blazej Dariusz Roszkowski github:Michaelangel007
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -161,6 +161,16 @@ RECENT REVISION HISTORY:
|
|||||||
//
|
//
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
//
|
//
|
||||||
|
// UNICODE:
|
||||||
|
//
|
||||||
|
// If compiling for Windows and you wish to use Unicode filenames, compile
|
||||||
|
// with
|
||||||
|
// #define STBI_WINDOWS_UTF8
|
||||||
|
// and pass utf8-encoded filenames. Call stbiw_convert_wchar_to_utf8 to convert
|
||||||
|
// Windows wchar_t filenames to utf8.
|
||||||
|
//
|
||||||
|
// ===========================================================================
|
||||||
|
//
|
||||||
// Philosophy
|
// Philosophy
|
||||||
//
|
//
|
||||||
// stb libraries are designed with the following priorities:
|
// stb libraries are designed with the following priorities:
|
||||||
@ -171,12 +181,12 @@ RECENT REVISION HISTORY:
|
|||||||
//
|
//
|
||||||
// Sometimes I let "good performance" creep up in priority over "easy to maintain",
|
// Sometimes I let "good performance" creep up in priority over "easy to maintain",
|
||||||
// and for best performance I may provide less-easy-to-use APIs that give higher
|
// 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.
|
// provide more explicit reasons why performance can't be emphasized.
|
||||||
//
|
//
|
||||||
// - Portable ("ease of use")
|
// - Portable ("ease of use")
|
||||||
// - Small source code footprint ("easy to maintain")
|
// - Small source code footprint ("easy to maintain")
|
||||||
@ -219,11 +229,10 @@ RECENT REVISION HISTORY:
|
|||||||
//
|
//
|
||||||
// HDR image support (disable by defining STBI_NO_HDR)
|
// HDR image support (disable by defining STBI_NO_HDR)
|
||||||
//
|
//
|
||||||
// stb_image now supports loading HDR images in general, and currently
|
// stb_image supports loading HDR images in general, and currently the Radiance
|
||||||
// the Radiance .HDR file format, although the support is provided
|
// .HDR file format specifically. You can still load any file through the existing
|
||||||
// generically. You can still load any file through the existing interface;
|
// interface; if you attempt to load an HDR file, it will be automatically remapped
|
||||||
// if you attempt to load an HDR file, it will be automatically remapped to
|
// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
|
||||||
// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
|
|
||||||
// both of these constants can be reconfigured through this interface:
|
// both of these constants can be reconfigured through this interface:
|
||||||
//
|
//
|
||||||
// stbi_hdr_to_ldr_gamma(2.2f);
|
// stbi_hdr_to_ldr_gamma(2.2f);
|
||||||
@ -257,7 +266,7 @@ RECENT REVISION HISTORY:
|
|||||||
//
|
//
|
||||||
// By default we convert iphone-formatted PNGs back to RGB, even though
|
// By default we convert iphone-formatted PNGs back to RGB, even though
|
||||||
// they are internally encoded differently. You can disable this conversion
|
// they are internally encoded differently. You can disable this conversion
|
||||||
// by by calling stbi_convert_iphone_png_to_rgb(0), in which case
|
// by calling stbi_convert_iphone_png_to_rgb(0), in which case
|
||||||
// you will always just get the native iphone "format" through (which
|
// you will always just get the native iphone "format" through (which
|
||||||
// is BGR stored in RGB).
|
// is BGR stored in RGB).
|
||||||
//
|
//
|
||||||
@ -319,6 +328,7 @@ enum
|
|||||||
STBI_rgb_alpha = 4
|
STBI_rgb_alpha = 4
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
typedef unsigned char stbi_uc;
|
typedef unsigned char stbi_uc;
|
||||||
typedef unsigned short stbi_us;
|
typedef unsigned short stbi_us;
|
||||||
|
|
||||||
@ -355,10 +365,6 @@ typedef struct
|
|||||||
|
|
||||||
STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels);
|
STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels);
|
||||||
STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels);
|
STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels);
|
||||||
#ifndef STBI_NO_GIF
|
|
||||||
STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef STBI_NO_STDIO
|
#ifndef STBI_NO_STDIO
|
||||||
STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
|
STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
|
||||||
@ -366,6 +372,14 @@ STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in
|
|||||||
// for stbi_load_from_file, file pointer is left pointing immediately after image
|
// for stbi_load_from_file, file pointer is left pointing immediately after image
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_GIF
|
||||||
|
STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef STBI_WINDOWS_UTF8
|
||||||
|
STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input);
|
||||||
|
#endif
|
||||||
|
|
||||||
////////////////////////////////////
|
////////////////////////////////////
|
||||||
//
|
//
|
||||||
// 16-bits-per-channel interface
|
// 16-bits-per-channel interface
|
||||||
@ -525,6 +539,12 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const ch
|
|||||||
#define STBI_ASSERT(x) assert(x)
|
#define STBI_ASSERT(x) assert(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define STBI_EXTERN extern "C"
|
||||||
|
#else
|
||||||
|
#define STBI_EXTERN extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifndef _MSC_VER
|
#ifndef _MSC_VER
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@ -1143,40 +1163,40 @@ static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, in
|
|||||||
|
|
||||||
#ifndef STBI_NO_STDIO
|
#ifndef STBI_NO_STDIO
|
||||||
|
|
||||||
char* stbi_convert_wchar_to_utf8(wchar_t* input) {
|
#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
|
||||||
#ifdef _WINDOWS_
|
STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide);
|
||||||
int outputSizeNeeded = WideCharToMultiByte(CP_UTF8, 0, &input[0], wcslen(input), NULL, 0, NULL, NULL);
|
STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default);
|
||||||
char* temp = (char*)STBI_MALLOC(outputSizeNeeded);
|
#endif
|
||||||
int error = WideCharToMultiByte(65001, 0, input, -1, temp, outputSizeNeeded, NULL, NULL);
|
|
||||||
temp[outputSizeNeeded] = '\0';
|
#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
|
||||||
return temp;
|
STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input)
|
||||||
#else
|
{
|
||||||
return NULL;
|
return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, bufferlen, NULL, NULL);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static FILE *stbi__fopen(char const *filename, char const *mode)
|
static FILE *stbi__fopen(char const *filename, char const *mode)
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
|
||||||
#ifdef UNICODE
|
wchar_t wMode[64];
|
||||||
int filenameLength = MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0);
|
wchar_t wFilename[1024];
|
||||||
wchar_t* wFilename = (wchar_t*)stbi__malloc(filenameLength * sizeof(wchar_t));
|
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)))
|
||||||
MultiByteToWideChar(CP_UTF8, 0, filename, -1, wFilename, filenameLength);
|
return 0;
|
||||||
|
|
||||||
int modeLength = MultiByteToWideChar(CP_UTF8, 0, mode, -1, NULL, 0);
|
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)))
|
||||||
wchar_t* wMode = (wchar_t*)stbi__malloc(modeLength * sizeof(wchar_t));
|
return 0;
|
||||||
MultiByteToWideChar(CP_UTF8, 0, mode, -1, wMode, modeLength);
|
|
||||||
|
|
||||||
|
#if _MSC_VER >= 1400
|
||||||
if (0 != _wfopen_s(&f, wFilename, wMode))
|
if (0 != _wfopen_s(&f, wFilename, wMode))
|
||||||
f = 0;
|
f = 0;
|
||||||
|
|
||||||
STBI_FREE(wFilename);
|
|
||||||
STBI_FREE(wMode);
|
|
||||||
#else
|
#else
|
||||||
|
f = _wfopen(wFilename, wMode);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(_MSC_VER) && _MSC_VER >= 1400
|
||||||
if (0 != fopen_s(&f, filename, mode))
|
if (0 != fopen_s(&f, filename, mode))
|
||||||
f=0;
|
f=0;
|
||||||
#endif
|
|
||||||
#else
|
#else
|
||||||
f = fopen(filename, mode);
|
f = fopen(filename, mode);
|
||||||
#endif
|
#endif
|
||||||
|
@ -17,8 +17,7 @@
|
|||||||
|
|
||||||
ABOUT:
|
ABOUT:
|
||||||
|
|
||||||
This header file is a library for writing images to C stdio. It could be
|
This header file is a library for writing images to C stdio or a callback.
|
||||||
adapted to write to memory or a general streaming interface; let me know.
|
|
||||||
|
|
||||||
The PNG output is not optimal; it is 20-50% larger than the file
|
The PNG output is not optimal; it is 20-50% larger than the file
|
||||||
written by a decent optimizing implementation; though providing a custom
|
written by a decent optimizing implementation; though providing a custom
|
||||||
@ -38,6 +37,14 @@ BUILDING:
|
|||||||
The returned data will be freed with STBIW_FREE() (free() by default),
|
The returned data will be freed with STBIW_FREE() (free() by default),
|
||||||
so it must be heap allocated with STBIW_MALLOC() (malloc() by default),
|
so it must be heap allocated with STBIW_MALLOC() (malloc() by default),
|
||||||
|
|
||||||
|
UNICODE:
|
||||||
|
|
||||||
|
If compiling for Windows and you wish to use Unicode filenames, compile
|
||||||
|
with
|
||||||
|
#define STBIW_WINDOWS_UTF8
|
||||||
|
and pass utf8-encoded filenames. Call stbiw_convert_wchar_to_utf8 to convert
|
||||||
|
Windows wchar_t filenames to utf8.
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
|
|
||||||
There are five functions, one for each image file format:
|
There are five functions, one for each image file format:
|
||||||
@ -148,6 +155,8 @@ LICENSE
|
|||||||
#ifndef INCLUDE_STB_IMAGE_WRITE_H
|
#ifndef INCLUDE_STB_IMAGE_WRITE_H
|
||||||
#define INCLUDE_STB_IMAGE_WRITE_H
|
#define INCLUDE_STB_IMAGE_WRITE_H
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
// if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline'
|
// if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline'
|
||||||
#ifndef STBIWDEF
|
#ifndef STBIWDEF
|
||||||
#ifdef STB_IMAGE_WRITE_STATIC
|
#ifdef STB_IMAGE_WRITE_STATIC
|
||||||
@ -173,6 +182,10 @@ STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const
|
|||||||
STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data);
|
STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data);
|
||||||
STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data);
|
STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data);
|
||||||
STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality);
|
STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality);
|
||||||
|
|
||||||
|
#ifdef STBI_WINDOWS_UTF8
|
||||||
|
STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef void stbi_write_func(void *context, void *data, int size);
|
typedef void stbi_write_func(void *context, void *data, int size);
|
||||||
@ -275,24 +288,52 @@ static void stbi__stdio_write(void *context, void *data, int size)
|
|||||||
fwrite(data,1,size,(FILE*) context);
|
fwrite(data,1,size,(FILE*) context);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stbi__start_write_file(stbi__write_context *s, const char *filename)
|
#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define STBIW_EXTERN extern "C"
|
||||||
|
#else
|
||||||
|
#define STBIW_EXTERN extern
|
||||||
|
#endif
|
||||||
|
STBIW_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide);
|
||||||
|
STBIW_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default);
|
||||||
|
|
||||||
|
STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input)
|
||||||
|
{
|
||||||
|
return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, bufferlen, NULL, NULL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static FILE *stbiw__fopen(char const *filename, char const *mode)
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
#ifdef STBI_MSC_SECURE_CRT
|
#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
|
||||||
#ifdef UNICODE
|
wchar_t wMode[64];
|
||||||
int filenameLength = MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0);
|
wchar_t wFilename[1024];
|
||||||
wchar_t* wFilename = (wchar_t*)STBIW_MALLOC(filenameLength * sizeof(wchar_t));
|
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)))
|
||||||
MultiByteToWideChar(CP_UTF8, 0, filename, -1, wFilename, filenameLength);
|
return 0;
|
||||||
|
|
||||||
if (0 != _wfopen_s(&f, wFilename, L"wb"))
|
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)))
|
||||||
f = NULL;
|
return 0;
|
||||||
|
|
||||||
|
#if _MSC_VER >= 1400
|
||||||
|
if (0 != _wfopen_s(&f, wFilename, wMode))
|
||||||
|
f = 0;
|
||||||
#else
|
#else
|
||||||
if (fopen_s(&f, filename, "wb"))
|
f = _wfopen(wFilename, wMode);
|
||||||
f = NULL;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#elif defined(_MSC_VER) && _MSC_VER >= 1400
|
||||||
|
if (0 != fopen_s(&f, filename, mode))
|
||||||
|
f=0;
|
||||||
#else
|
#else
|
||||||
f = fopen(filename, "wb");
|
f = fopen(filename, mode);
|
||||||
#endif
|
#endif
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int stbi__start_write_file(stbi__write_context *s, const char *filename)
|
||||||
|
{
|
||||||
|
FILE *f = stbiw__fopen(filename, "wb");
|
||||||
stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f);
|
stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f);
|
||||||
return f != NULL;
|
return f != NULL;
|
||||||
}
|
}
|
||||||
@ -1120,23 +1161,8 @@ STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const
|
|||||||
int len;
|
int len;
|
||||||
unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len);
|
unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len);
|
||||||
if (png == NULL) return 0;
|
if (png == NULL) return 0;
|
||||||
#ifdef STBI_MSC_SECURE_CRT
|
|
||||||
#ifdef UNICODE
|
f = stbiw__fopen(filename, "wb");
|
||||||
int filenameLength = MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0);
|
|
||||||
wchar_t* wFilename = (wchar_t*)STBIW_MALLOC(filenameLength * sizeof(wchar_t));
|
|
||||||
MultiByteToWideChar(CP_UTF8, 0, filename, -1, wFilename, filenameLength);
|
|
||||||
|
|
||||||
if (0 != _wfopen_s(&f, wFilename, L"wb"))
|
|
||||||
f = NULL;
|
|
||||||
|
|
||||||
STBIW_FREE(wFilename);
|
|
||||||
#else
|
|
||||||
if (fopen_s(&f, filename, "wb"))
|
|
||||||
f = NULL;
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
f = fopen(filename, "wb");
|
|
||||||
#endif
|
|
||||||
if (!f) { STBIW_FREE(png); return 0; }
|
if (!f) { STBIW_FREE(png); return 0; }
|
||||||
fwrite(png, 1, len, f);
|
fwrite(png, 1, len, f);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
@ -1145,18 +1171,6 @@ STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char* stbiw_convert_wchar_to_utf8(wchar_t* input) {
|
|
||||||
#ifdef _WINDOWS_
|
|
||||||
int outputSizeNeeded = WideCharToMultiByte(CP_UTF8, 0, &input[0], wcslen(input), NULL, 0, NULL, NULL);
|
|
||||||
char* temp = (char*)STBIW_MALLOC(outputSizeNeeded);
|
|
||||||
int error = WideCharToMultiByte(65001, 0, input, -1, temp, outputSizeNeeded, NULL, NULL);
|
|
||||||
temp[outputSizeNeeded] = '\0';
|
|
||||||
return temp;
|
|
||||||
#else
|
|
||||||
return NULL;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes)
|
STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#define STBI_WINDOWS_UTF8
|
||||||
|
|
||||||
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
||||||
#include "stb_image_write.h"
|
#include "stb_image_write.h"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user