mirror of
				https://github.com/thunderbrewhq/thunderbrew
				synced 2025-10-31 00:06:05 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			122 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|   Simple DirectMedia Layer
 | |
|   Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
 | |
| 
 | |
|   This software is provided 'as-is', without any express or implied
 | |
|   warranty.  In no event will the authors be held liable for any damages
 | |
|   arising from the use of this software.
 | |
| 
 | |
|   Permission is granted to anyone to use this software for any purpose,
 | |
|   including commercial applications, and to alter it and redistribute it
 | |
|   freely, subject to the following restrictions:
 | |
| 
 | |
|   1. The origin of this software must not be misrepresented; you must not
 | |
|      claim that you wrote the original software. If you use this software
 | |
|      in a product, an acknowledgment in the product documentation would be
 | |
|      appreciated but is not required.
 | |
|   2. Altered source versions must be plainly marked as such, and must not be
 | |
|      misrepresented as being the original software.
 | |
|   3. This notice may not be removed or altered from any source distribution.
 | |
| */
 | |
| #include "SDL_internal.h"
 | |
| 
 | |
| #include "SDL_stb_c.h"
 | |
| 
 | |
| 
 | |
| // We currently only support JPEG, but we could add other image formats if we wanted
 | |
| #ifdef SDL_HAVE_STB
 | |
| #define malloc SDL_malloc
 | |
| #define realloc SDL_realloc
 | |
| #define free SDL_free
 | |
| #undef memcpy
 | |
| #define memcpy SDL_memcpy
 | |
| #undef memset
 | |
| #define memset SDL_memset
 | |
| #undef strcmp
 | |
| #define strcmp SDL_strcmp
 | |
| #undef strncmp
 | |
| #define strncmp SDL_strncmp
 | |
| #define strtol SDL_strtol
 | |
| 
 | |
| #define abs SDL_abs
 | |
| #define pow SDL_pow
 | |
| #define ldexp SDL_scalbn
 | |
| 
 | |
| #define STB_IMAGE_STATIC
 | |
| #define STBI_NO_THREAD_LOCALS
 | |
| #define STBI_FAILURE_USERMSG
 | |
| #if defined(SDL_NEON_INTRINSICS)
 | |
| #define STBI_NEON
 | |
| #endif
 | |
| #define STBI_ONLY_JPEG
 | |
| #define STBI_NO_GIF
 | |
| #define STBI_NO_PNG
 | |
| #define STBI_NO_HDR
 | |
| #define STBI_NO_LINEAR
 | |
| #define STBI_NO_ZLIB
 | |
| #define STBI_NO_STDIO
 | |
| #define STBI_ASSERT SDL_assert
 | |
| #define STB_IMAGE_IMPLEMENTATION
 | |
| #include "stb_image.h"
 | |
| 
 | |
| #undef memset
 | |
| #endif
 | |
| 
 | |
| #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)
 | |
| {
 | |
|     int w = 0, h = 0, format = 0;
 | |
|     stbi__context s;
 | |
|     stbi__start_mem(&s, src, src_pitch);
 | |
| 
 | |
|     stbi__result_info ri;
 | |
|     SDL_zero(ri);
 | |
|     ri.bits_per_channel = 8;
 | |
|     ri.channel_order = STBI_ORDER_RGB;
 | |
|     ri.num_channels = 0;
 | |
| 
 | |
|     stbi__nv12 nv12;
 | |
|     nv12.w = width;
 | |
|     nv12.h = height;
 | |
|     nv12.pitch = dst_pitch;
 | |
|     nv12.y = (stbi_uc *)dst;
 | |
|     nv12.uv = nv12.y + (nv12.h * nv12.pitch);
 | |
| 
 | |
|     void *pixels = stbi__jpeg_load(&s, &w, &h, &format, 4, &nv12, &ri);
 | |
|     if (!pixels) {
 | |
|         return false;
 | |
|     }
 | |
|     return true;
 | |
| }
 | |
| #endif // SDL_HAVE_STB
 | |
| 
 | |
| bool SDL_ConvertPixels_STB(int width, int height,
 | |
|                            SDL_PixelFormat src_format, SDL_Colorspace src_colorspace, SDL_PropertiesID src_properties, const void *src, int src_pitch,
 | |
|                            SDL_PixelFormat dst_format, SDL_Colorspace dst_colorspace, SDL_PropertiesID dst_properties, void *dst, int dst_pitch)
 | |
| {
 | |
| #ifdef SDL_HAVE_STB
 | |
|     if (src_format == SDL_PIXELFORMAT_MJPG && dst_format == SDL_PIXELFORMAT_NV12) {
 | |
|         return SDL_ConvertPixels_MJPG_to_NV12(width, height, src, src_pitch, dst, dst_pitch);
 | |
|     }
 | |
| 
 | |
|     bool result;
 | |
|     int w = 0, h = 0, format = 0;
 | |
|     int len = (src_format == SDL_PIXELFORMAT_MJPG) ? src_pitch : (height * src_pitch);
 | |
|     void *pixels = stbi_load_from_memory(src, len, &w, &h, &format, 4);
 | |
|     if (!pixels) {
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     if (w == width && h == height) {
 | |
|         result = SDL_ConvertPixelsAndColorspace(w, h, SDL_PIXELFORMAT_RGBA32, SDL_COLORSPACE_SRGB, 0, pixels, width * 4, dst_format, dst_colorspace, dst_properties, dst, dst_pitch);
 | |
|     } else {
 | |
|         result = SDL_SetError("Expected image size %dx%d, actual size %dx%d", width, height, w, h);
 | |
|     }
 | |
|     stbi_image_free(pixels);
 | |
| 
 | |
|     return result;
 | |
| #else
 | |
|     return SDL_SetError("SDL not built with STB image support");
 | |
| #endif
 | |
| }
 | 
