Redesign image API to be format agnostic (#40)
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
3f5fe1ff67
commit
74909b49c3
|
@ -44,115 +44,45 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
/* Decodes PNG data into raw RGBA8 texture data.
|
/* Image Read API */
|
||||||
*
|
|
||||||
* w: Filled with the width of the image.
|
|
||||||
* h: Filled with the height of the image.
|
|
||||||
* numChannels: Filled with the number of channels in the image.
|
|
||||||
*
|
|
||||||
* Returns a block of memory suitable for use with Refresh_SetTextureData2D.
|
|
||||||
* Be sure to free the memory with Refresh_Image_FreePNG after use!
|
|
||||||
*/
|
|
||||||
REFRESHAPI uint8_t* Refresh_Image_LoadPNGFromFile(
|
|
||||||
char const *filename,
|
|
||||||
int32_t *w,
|
|
||||||
int32_t *h,
|
|
||||||
int32_t *numChannels
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Decodes PNG data into raw RGBA8 texture data.
|
/* Decodes image data into raw RGBA8 texture data.
|
||||||
*
|
*
|
||||||
* w: Filled with the width of the image.
|
* w: Filled with the width of the image.
|
||||||
* h: Filled with the height of the image.
|
* h: Filled with the height of the image.
|
||||||
* numChannels: Filled with the number of channels in the image.
|
* len: Filled with the length of pixel data in bytes.
|
||||||
*
|
*
|
||||||
* Returns a block of memory suitable for use with Refresh_SetTextureData2D.
|
* Returns a block of memory suitable for use with Refresh_SetTextureData2D.
|
||||||
* Be sure to free the memory with Refresh_Image_FreePNG after use!
|
* Be sure to free the memory with Refresh_Image_Free after use!
|
||||||
*/
|
*/
|
||||||
REFRESHAPI uint8_t* Refresh_Image_LoadPNGFromMemory(
|
REFRESHAPI uint8_t* Refresh_Image_Load(
|
||||||
uint8_t *buffer,
|
uint8_t *bufferPtr,
|
||||||
int32_t bufferLength,
|
int32_t bufferLength,
|
||||||
int32_t *w,
|
int32_t *w,
|
||||||
int32_t *h,
|
int32_t *h,
|
||||||
int32_t *numChannels
|
int32_t *len
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Frees memory returned by Refresh_Image_LoadPNG functions. (Do NOT free the memory yourself!)
|
/* Frees memory returned by Refresh_Image_Load. Do NOT free the memory yourself!
|
||||||
*
|
*
|
||||||
* mem: A pointer previously returned by Refresh_Image_LoadPNG.
|
* mem: A pointer previously returned by Refresh_Image_LoadPNG.
|
||||||
*/
|
*/
|
||||||
REFRESHAPI void Refresh_Image_FreePNG(uint8_t *mem);
|
REFRESHAPI void Refresh_Image_Free(uint8_t *mem);
|
||||||
|
|
||||||
/* Decodes QOI data into raw RGBA8 texture data.
|
|
||||||
*
|
|
||||||
* w: Filled with the width of the image.
|
|
||||||
* h: Filled with the height of the image.
|
|
||||||
* numChannels: Filled with the number of channels in the image.
|
|
||||||
*
|
|
||||||
* Returns a block of memory suitable for use with Refresh_SetTextureData2D.
|
|
||||||
* Be sure to free the memory with Refresh_Image_FreeQOI after use!
|
|
||||||
*/
|
|
||||||
REFRESHAPI uint8_t* Refresh_Image_LoadQOIFromFile(
|
|
||||||
char const *filename,
|
|
||||||
int32_t *w,
|
|
||||||
int32_t *h,
|
|
||||||
int32_t *numChannels
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Decodes QOI data into raw RGBA8 texture data.
|
|
||||||
*
|
|
||||||
* bufferLength: The length of the input buffer to be decoded.
|
|
||||||
* w: Filled with the width of the image.
|
|
||||||
* h: Filled with the height of the image.
|
|
||||||
* numChannels: Filled with the number of channels in the image.
|
|
||||||
*
|
|
||||||
* Returns a block of memory suitable for use with Refresh_SetTextureData2D.
|
|
||||||
* Be sure to free the memory with Refresh_Image_FreeQOI after use!
|
|
||||||
*/
|
|
||||||
REFRESHAPI uint8_t* Refresh_Image_LoadQOIFromMemory(
|
|
||||||
uint8_t *buffer,
|
|
||||||
int32_t bufferLength,
|
|
||||||
int32_t *w,
|
|
||||||
int32_t *h,
|
|
||||||
int32_t *numChannels
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Frees memory returned by Refresh_Image_LoadQOI functions. (Do NOT free the memory yourself!)
|
|
||||||
*
|
|
||||||
* mem: A pointer previously returned by Refresh_Image_LoadQOI.
|
|
||||||
*/
|
|
||||||
REFRESHAPI void Refresh_Image_FreeQOI(uint8_t *mem);
|
|
||||||
|
|
||||||
/* Image Write API */
|
/* Image Write API */
|
||||||
|
|
||||||
/* Encodes 32-bit color data into PNG data.
|
/* Returns a buffer of PNG encoded from RGBA8 color data.
|
||||||
*
|
*
|
||||||
* filename: The filename that the image will be written to.
|
* data: The raw color data.
|
||||||
* w: The width of the PNG data.
|
* w: The width of the color data.
|
||||||
* h: The height of the PNG data.
|
* h: The height of the color data.
|
||||||
* bgra: Whether the data is in BGRA8 format. Otherwise will assume RBGA8.
|
* len: Filled with the length of PNG data in bytes.
|
||||||
* data: The raw color data.
|
|
||||||
*/
|
*/
|
||||||
REFRESHAPI void Refresh_Image_SavePNG(
|
REFRESHAPI void Refresh_Image_SavePNG(
|
||||||
char const *filename,
|
const char* filename,
|
||||||
|
uint8_t* data,
|
||||||
int32_t w,
|
int32_t w,
|
||||||
int32_t h,
|
int32_t h
|
||||||
uint8_t bgra,
|
|
||||||
uint8_t *data
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Encodes 32-bit color data into PNG data.
|
|
||||||
*
|
|
||||||
* filename: The filename that the image will be written to.
|
|
||||||
* w: The width of the PNG data.
|
|
||||||
* h: The height of the PNG data.
|
|
||||||
* data: The raw color data.
|
|
||||||
*/
|
|
||||||
REFRESHAPI void Refresh_Image_SaveQOI(
|
|
||||||
char const *filename,
|
|
||||||
int32_t w,
|
|
||||||
int32_t h,
|
|
||||||
uint8_t *data
|
|
||||||
);
|
);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -9639,7 +9639,6 @@ static void VULKAN_INTERNAL_CleanCommandBuffer(
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
VulkanUniformBuffer *uniformBuffer;
|
VulkanUniformBuffer *uniformBuffer;
|
||||||
DescriptorSetData *descriptorSetData;
|
DescriptorSetData *descriptorSetData;
|
||||||
VkResult result;
|
|
||||||
|
|
||||||
/* Bound uniform buffers are now available */
|
/* Bound uniform buffers are now available */
|
||||||
|
|
||||||
|
@ -10599,7 +10598,7 @@ static uint8_t VULKAN_INTERNAL_CreateLogicalDevice(
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VULKAN_INTERNAL_LoadEntryPoints()
|
static void VULKAN_INTERNAL_LoadEntryPoints(void)
|
||||||
{
|
{
|
||||||
/* Load Vulkan entry points */
|
/* Load Vulkan entry points */
|
||||||
if (SDL_Vulkan_LoadLibrary(NULL) < 0)
|
if (SDL_Vulkan_LoadLibrary(NULL) < 0)
|
||||||
|
|
|
@ -76,6 +76,7 @@
|
||||||
|
|
||||||
/* These are per the Texture2D.FromStream spec */
|
/* These are per the Texture2D.FromStream spec */
|
||||||
#define STBI_ONLY_PNG
|
#define STBI_ONLY_PNG
|
||||||
|
#define STBI_ONLY_QOI
|
||||||
|
|
||||||
/* These are per the Texture2D.SaveAs* spec */
|
/* These are per the Texture2D.SaveAs* spec */
|
||||||
#define STBIW_ONLY_PNG
|
#define STBIW_ONLY_PNG
|
||||||
|
@ -146,12 +147,6 @@ SDL_SIMDRealloc(void *mem, const size_t len)
|
||||||
#endif
|
#endif
|
||||||
#include "stb_image.h"
|
#include "stb_image.h"
|
||||||
|
|
||||||
#define QOI_IMPLEMENTATION
|
|
||||||
#define QOI_MALLOC SDL_SIMDAlloc
|
|
||||||
#define QOI_FREE SDL_SIMDFree
|
|
||||||
#define QOI_ZEROARR SDL_zero
|
|
||||||
#include "qoi.h"
|
|
||||||
|
|
||||||
#define MINIZ_NO_STDIO
|
#define MINIZ_NO_STDIO
|
||||||
#define MINIZ_NO_TIME
|
#define MINIZ_NO_TIME
|
||||||
#define MINIZ_SDL_MALLOC
|
#define MINIZ_SDL_MALLOC
|
||||||
|
@ -191,110 +186,73 @@ static unsigned char* dgibson_stbi_zlib_compress(
|
||||||
|
|
||||||
/* Image Read API */
|
/* Image Read API */
|
||||||
|
|
||||||
uint8_t* Refresh_Image_LoadPNGFromFile(
|
uint8_t* Refresh_Image_Load(
|
||||||
char const *filename,
|
uint8_t *bufferPtr,
|
||||||
int32_t *w,
|
|
||||||
int32_t *h,
|
|
||||||
int32_t *numChannels
|
|
||||||
) {
|
|
||||||
return stbi_load(filename, w, h, numChannels, STBI_rgb_alpha);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t* Refresh_Image_LoadPNGFromMemory(
|
|
||||||
uint8_t *buffer,
|
|
||||||
int32_t bufferLength,
|
int32_t bufferLength,
|
||||||
int32_t *w,
|
int32_t *w,
|
||||||
int32_t *h,
|
int32_t *h,
|
||||||
int32_t *numChannels
|
int32_t *len
|
||||||
) {
|
) {
|
||||||
return stbi_load_from_memory(buffer, bufferLength, w, h, numChannels, STBI_rgb_alpha);
|
uint8_t* result;
|
||||||
|
uint8_t* pixels;
|
||||||
|
int32_t format;
|
||||||
|
int32_t i;
|
||||||
|
|
||||||
|
result = stbi_load_from_memory(
|
||||||
|
bufferPtr,
|
||||||
|
bufferLength,
|
||||||
|
w,
|
||||||
|
h,
|
||||||
|
&format,
|
||||||
|
STBI_rgb_alpha
|
||||||
|
);
|
||||||
|
|
||||||
|
if (result == NULL)
|
||||||
|
{
|
||||||
|
SDL_LogWarn(SDL_LOG_CATEGORY_ERROR, "Image loading failed: %s", stbi_failure_reason());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ensure that the alpha pixels are... well, actual alpha.
|
||||||
|
* You think this looks stupid, but be assured: Your paint program is
|
||||||
|
* almost certainly even stupider.
|
||||||
|
* -flibit
|
||||||
|
*/
|
||||||
|
pixels = result;
|
||||||
|
*len = (*w) * (*h) *4;
|
||||||
|
for (i = 0; i < *len; i += 4, pixels += 4)
|
||||||
|
{
|
||||||
|
if (pixels[3] == 0)
|
||||||
|
{
|
||||||
|
pixels[0] = 0;
|
||||||
|
pixels[1] = 1;
|
||||||
|
pixels[2] = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Refresh_Image_FreePNG(uint8_t *mem)
|
void Refresh_Image_Free(uint8_t *mem)
|
||||||
{
|
{
|
||||||
stbi_image_free(mem);
|
SDL_SIMDFree(mem);
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *Refresh_Image_LoadQOIFromFile(
|
|
||||||
char const *filename,
|
|
||||||
int32_t *w,
|
|
||||||
int32_t *h,
|
|
||||||
int32_t *numChannels
|
|
||||||
) {
|
|
||||||
qoi_desc desc;
|
|
||||||
uint8_t *pixels = qoi_read(filename, &desc, 0);
|
|
||||||
*w = desc.width;
|
|
||||||
*h = desc.height;
|
|
||||||
*numChannels = desc.channels;
|
|
||||||
return pixels;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t* Refresh_Image_LoadQOIFromMemory(
|
|
||||||
uint8_t *buffer,
|
|
||||||
int32_t bufferLength,
|
|
||||||
int32_t *w,
|
|
||||||
int32_t *h,
|
|
||||||
int32_t *numChannels
|
|
||||||
) {
|
|
||||||
qoi_desc desc;
|
|
||||||
uint8_t *pixels = qoi_decode(buffer, bufferLength, &desc, 0);
|
|
||||||
*w = desc.width;
|
|
||||||
*h = desc.height;
|
|
||||||
*numChannels = desc.channels;
|
|
||||||
return pixels;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Refresh_Image_FreeQOI(uint8_t *mem)
|
|
||||||
{
|
|
||||||
QOI_FREE(mem);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Image Write API */
|
/* Image Write API */
|
||||||
|
|
||||||
void Refresh_Image_SavePNG(
|
void Refresh_Image_SavePNG(
|
||||||
const char *filename,
|
const char* filename,
|
||||||
|
uint8_t* data,
|
||||||
int32_t w,
|
int32_t w,
|
||||||
int32_t h,
|
int32_t h
|
||||||
uint8_t bgra,
|
|
||||||
uint8_t *data
|
|
||||||
) {
|
) {
|
||||||
uint32_t i;
|
stbi_write_png(
|
||||||
uint8_t *bgraData;
|
filename,
|
||||||
|
w,
|
||||||
if (bgra)
|
h,
|
||||||
{
|
4,
|
||||||
bgraData = SDL_malloc(w * h * 4);
|
data,
|
||||||
|
w * 4
|
||||||
for (i = 0; i < w * h * 4; i += 4)
|
);
|
||||||
{
|
|
||||||
bgraData[i] = data[i + 2];
|
|
||||||
bgraData[i + 1] = data[i + 1];
|
|
||||||
bgraData[i + 2] = data[i];
|
|
||||||
bgraData[i + 3] = data[i + 3];
|
|
||||||
}
|
|
||||||
|
|
||||||
stbi_write_png(filename, w, h, 4, bgraData, w * 4);
|
|
||||||
|
|
||||||
SDL_free(bgraData);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
stbi_write_png(filename, w, h, 4, data, w * 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Refresh_Image_SaveQOI(
|
|
||||||
char const *filename,
|
|
||||||
int32_t w,
|
|
||||||
int32_t h,
|
|
||||||
uint8_t *data
|
|
||||||
) {
|
|
||||||
qoi_desc desc;
|
|
||||||
desc.width = w;
|
|
||||||
desc.height = h;
|
|
||||||
desc.channels = 4;
|
|
||||||
desc.colorspace = QOI_LINEAR;
|
|
||||||
qoi_write(filename, data, &desc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim: set noexpandtab shiftwidth=8 tabstop=8: */
|
/* vim: set noexpandtab shiftwidth=8 tabstop=8: */
|
||||||
|
|
598
src/stb_image.h
598
src/stb_image.h
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue