Redesign image API to be format agnostic #40
			
				
			
		
		
		
	|  | @ -44,115 +44,45 @@ | |||
| extern "C" { | ||||
| #endif /* __cplusplus */ | ||||
| 
 | ||||
| /* Decodes PNG 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_FreePNG after use! | ||||
|  */ | ||||
| REFRESHAPI uint8_t* Refresh_Image_LoadPNGFromFile( | ||||
| 	char const *filename, | ||||
| 	int32_t *w, | ||||
| 	int32_t *h, | ||||
| 	int32_t *numChannels | ||||
| ); | ||||
| /* Image Read API */ | ||||
| 
 | ||||
| /* Decodes PNG data into raw RGBA8 texture data.
 | ||||
| /* Decodes image 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. | ||||
|  * len:			Filled with the length of pixel data in bytes. | ||||
|  * | ||||
|  * 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( | ||||
| 	uint8_t *buffer, | ||||
| REFRESHAPI uint8_t* Refresh_Image_Load( | ||||
| 	uint8_t *bufferPtr, | ||||
| 	int32_t bufferLength, | ||||
| 	int32_t *w, | ||||
| 	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. | ||||
|  */ | ||||
| REFRESHAPI void Refresh_Image_FreePNG(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); | ||||
| REFRESHAPI void Refresh_Image_Free(uint8_t *mem); | ||||
| 
 | ||||
| /* 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. | ||||
|  * 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( | ||||
| 	char const *filename, | ||||
| 	const char* filename, | ||||
| 	uint8_t* data, | ||||
| 	int32_t w, | ||||
| 	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 | ||||
| 	int32_t h | ||||
| ); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
|  |  | |||
|  | @ -9639,7 +9639,6 @@ static void VULKAN_INTERNAL_CleanCommandBuffer( | |||
| 	uint32_t i; | ||||
| 	VulkanUniformBuffer *uniformBuffer; | ||||
| 	DescriptorSetData *descriptorSetData; | ||||
| 	VkResult result; | ||||
| 
 | ||||
| 	/* Bound uniform buffers are now available */ | ||||
| 
 | ||||
|  | @ -10599,7 +10598,7 @@ static uint8_t VULKAN_INTERNAL_CreateLogicalDevice( | |||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| static void VULKAN_INTERNAL_LoadEntryPoints() | ||||
| static void VULKAN_INTERNAL_LoadEntryPoints(void) | ||||
| { | ||||
| 	/* Load Vulkan entry points */ | ||||
| 	if (SDL_Vulkan_LoadLibrary(NULL) < 0) | ||||
|  |  | |||
|  | @ -76,6 +76,7 @@ | |||
| 
 | ||||
| /* These are per the Texture2D.FromStream spec */ | ||||
| #define STBI_ONLY_PNG | ||||
| #define STBI_ONLY_QOI | ||||
| 
 | ||||
| /* These are per the Texture2D.SaveAs* spec */ | ||||
| #define STBIW_ONLY_PNG | ||||
|  | @ -146,12 +147,6 @@ SDL_SIMDRealloc(void *mem, const size_t len) | |||
| #endif | ||||
| #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_TIME | ||||
| #define MINIZ_SDL_MALLOC | ||||
|  | @ -191,110 +186,73 @@ static unsigned char* dgibson_stbi_zlib_compress( | |||
| 
 | ||||
| /* Image Read API */ | ||||
| 
 | ||||
| uint8_t* Refresh_Image_LoadPNGFromFile( | ||||
| 	char const *filename, | ||||
| 	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, | ||||
| uint8_t* Refresh_Image_Load( | ||||
| 	uint8_t *bufferPtr, | ||||
| 	int32_t bufferLength, | ||||
| 	int32_t *w, | ||||
| 	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; | ||||
| 
 | ||||
| void Refresh_Image_FreePNG(uint8_t *mem) | ||||
| 	result = stbi_load_from_memory( | ||||
| 		bufferPtr, | ||||
| 		bufferLength, | ||||
| 		w, | ||||
| 		h, | ||||
| 		&format, | ||||
| 		STBI_rgb_alpha | ||||
| 	); | ||||
| 
 | ||||
| 	if (result == NULL) | ||||
| 	{ | ||||
| 	stbi_image_free(mem); | ||||
| 		SDL_LogWarn(SDL_LOG_CATEGORY_ERROR, "Image loading failed: %s", stbi_failure_reason()); | ||||
| 	} | ||||
| 
 | ||||
| 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) | ||||
| 	/* 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) | ||||
| 	{ | ||||
| 	QOI_FREE(mem); | ||||
| 		if (pixels[3] == 0) | ||||
| 		{ | ||||
| 			pixels[0] = 0; | ||||
| 			pixels[1] = 1; | ||||
| 			pixels[2] = 2; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return result; | ||||
| } | ||||
| 
 | ||||
| void Refresh_Image_Free(uint8_t *mem) | ||||
| { | ||||
| 	SDL_SIMDFree(mem); | ||||
| } | ||||
| 
 | ||||
| /* Image Write API */ | ||||
| 
 | ||||
| void Refresh_Image_SavePNG( | ||||
| 	const char* filename, | ||||
| 	uint8_t* data, | ||||
| 	int32_t w, | ||||
| 	int32_t h, | ||||
| 	uint8_t bgra, | ||||
| 	uint8_t *data | ||||
| 	int32_t h | ||||
| ) { | ||||
| 	uint32_t i; | ||||
| 	uint8_t *bgraData; | ||||
| 
 | ||||
| 	if (bgra) | ||||
| 	{ | ||||
| 		bgraData = SDL_malloc(w * h * 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); | ||||
| 	stbi_write_png( | ||||
| 		filename, | ||||
| 		w, | ||||
| 		h, | ||||
| 		4, | ||||
| 		data, | ||||
| 		w * 4 | ||||
| 	); | ||||
| } | ||||
| 
 | ||||
| /* 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