Redesign image API to be format agnostic #40
			
				
			
		
		
		
	|  | @ -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. |  | ||||||
|  * w:	        The width of the PNG data. |  | ||||||
|  * h:	        The height of the PNG data. |  | ||||||
|  * bgra:		Whether the data is in BGRA8 format. Otherwise will assume RBGA8. |  | ||||||
|  * data:	The raw color data. |  * data:	The raw color data. | ||||||
|  |  * w:		The width of the color data. | ||||||
|  |  * h:		The height of the color data. | ||||||
|  |  * len:		Filled with the length of PNG data in bytes. | ||||||
|  */ |  */ | ||||||
| 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: */ | ||||||
|  |  | ||||||
							
								
								
									
										592
									
								
								src/stb_image.h
								
								
								
								
							
							
						
						
									
										592
									
								
								src/stb_image.h
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue