mirror of
				https://github.com/libsdl-org/SDL.git
				synced 2025-10-26 12:27:44 +00:00 
			
		
		
		
	Replace stb_image_write with miniz for SDL_SavePNG()
Fixes https://github.com/libsdl-org/SDL/issues/14219
This commit is contained in:
		| @@ -161,6 +161,7 @@ def find_symbols_in_file(file: pathlib.Path) -> int: | |||||||
|         "src/libm", |         "src/libm", | ||||||
|         "src/hidapi", |         "src/hidapi", | ||||||
|         "src/video/khronos", |         "src/video/khronos", | ||||||
|  |         "src/video/miniz.h", | ||||||
|         "src/video/stb_image.h", |         "src/video/stb_image.h", | ||||||
|         "include/SDL3", |         "include/SDL3", | ||||||
|         "build-scripts/gen_audio_resampler_filter.c", |         "build-scripts/gen_audio_resampler_filter.c", | ||||||
|   | |||||||
| @@ -23,8 +23,8 @@ | |||||||
| #include "SDL_stb_c.h" | #include "SDL_stb_c.h" | ||||||
| #include "SDL_surface_c.h" | #include "SDL_surface_c.h" | ||||||
|  |  | ||||||
| // We currently only support JPEG, but we could add other image formats if we wanted |  | ||||||
| #ifdef SDL_HAVE_STB | #ifdef SDL_HAVE_STB | ||||||
|  | //////////////////////////////////////////////////////////////////////////// | ||||||
| #define malloc SDL_malloc | #define malloc SDL_malloc | ||||||
| #define realloc SDL_realloc | #define realloc SDL_realloc | ||||||
| #define free SDL_free | #define free SDL_free | ||||||
| @@ -58,15 +58,23 @@ | |||||||
| #define STB_IMAGE_IMPLEMENTATION | #define STB_IMAGE_IMPLEMENTATION | ||||||
| #include "stb_image.h" | #include "stb_image.h" | ||||||
|  |  | ||||||
| #undef memcpy | //////////////////////////////////////////////////////////////////////////// | ||||||
| #define STB_IMAGE_WRITE_IMPLEMENTATION | #define MZ_ASSERT(x) SDL_assert(x) | ||||||
| #define STB_IMAGE_WRITE_STATIC | //#undef memcpy | ||||||
| #define STBI_WRITE_NO_STDIO | //#define memcpy SDL_memcpy | ||||||
| #define STBIW_ASSERT SDL_assert | //#undef memset | ||||||
| #include "stb_image_write.h" | //#define memset SDL_memset | ||||||
|  | #if SDL_BYTEORDER == SDL_LIL_ENDIAN | ||||||
|  | #define MINIZ_LITTLE_ENDIAN 1 | ||||||
|  | #else | ||||||
|  | #define MINIZ_LITTLE_ENDIAN 0 | ||||||
|  | #endif | ||||||
|  | #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 0 | ||||||
|  | #define MINIZ_SDL_NOUNUSED | ||||||
|  | #include "miniz.h" | ||||||
|  |  | ||||||
| #undef memset | #undef memset | ||||||
| #endif | #endif // SDL_HAVE_STB | ||||||
|  |  | ||||||
| #ifdef SDL_HAVE_STB | #ifdef SDL_HAVE_STB | ||||||
| static bool SDL_ConvertPixels_MJPG_to_NV12(int width, int height, const void *src, int src_pitch, void *dst, int dst_pitch) | static bool SDL_ConvertPixels_MJPG_to_NV12(int width, int height, const void *src, int src_pitch, void *dst, int dst_pitch) | ||||||
| @@ -372,13 +380,6 @@ SDL_Surface *SDL_LoadPNG(const char *file) | |||||||
|     return SDL_LoadPNG_IO(stream, true); |     return SDL_LoadPNG_IO(stream, true); | ||||||
| } | } | ||||||
|  |  | ||||||
| #ifdef SDL_HAVE_STB |  | ||||||
| static void SDL_STBWriteFunc(void *context, void *data, int size) |  | ||||||
| { |  | ||||||
|     SDL_WriteIO(context, data, size); |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| bool SDL_SavePNG_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio) | bool SDL_SavePNG_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio) | ||||||
| { | { | ||||||
|     bool retval = false; |     bool retval = false; | ||||||
| @@ -403,10 +404,15 @@ bool SDL_SavePNG_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio) | |||||||
|         free_surface = true; |         free_surface = true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (stbi_write_png_to_func(SDL_STBWriteFunc, dst, surface->w, surface->h, 4, surface->pixels, surface->pitch)) { |     size_t size = 0; | ||||||
|  |     void *png = tdefl_write_image_to_png_file_in_memory(surface->pixels, surface->w, surface->h, SDL_BYTESPERPIXEL(surface->format), surface->pitch, &size); | ||||||
|  |     if (png) { | ||||||
|  |         if (SDL_WriteIO(dst, png, size)) { | ||||||
|             retval = true; |             retval = true; | ||||||
|  |         } | ||||||
|  |         mz_free(png); /* calls SDL_free() */ | ||||||
|     } else { |     } else { | ||||||
|         SDL_SetError("Failed to write PNG"); |         SDL_SetError("Failed to convert and save image"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (free_surface) { |     if (free_surface) { | ||||||
|   | |||||||
							
								
								
									
										5054
									
								
								src/video/miniz.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5054
									
								
								src/video/miniz.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user
	 Sam Lantinga
					Sam Lantinga