From 5a079a2d114f96d4847d1ee305d5b7c16eeec50e Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Sat, 27 Dec 2025 12:03:39 -0800 Subject: Initial commit --- contrib/SDL-3.2.8/src/video/SDL_stb.c | 121 ++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 contrib/SDL-3.2.8/src/video/SDL_stb.c (limited to 'contrib/SDL-3.2.8/src/video/SDL_stb.c') diff --git a/contrib/SDL-3.2.8/src/video/SDL_stb.c b/contrib/SDL-3.2.8/src/video/SDL_stb.c new file mode 100644 index 0000000..934c1ad --- /dev/null +++ b/contrib/SDL-3.2.8/src/video/SDL_stb.c @@ -0,0 +1,121 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga + + 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 +} -- cgit v1.2.3