From 026b7e808a6b30c2948b1b1c4e666c9cbaf4322c Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Thu, 15 Jan 2026 01:03:54 -0800 Subject: [PATCH 1/8] fix drm resources leak (#5494) --- src/platforms/rcore_drm.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/platforms/rcore_drm.c b/src/platforms/rcore_drm.c index a0ae1fa37..b296e0042 100644 --- a/src/platforms/rcore_drm.c +++ b/src/platforms/rcore_drm.c @@ -1161,7 +1161,8 @@ int InitPlatform(void) platform.fd = open("/dev/dri/by-path/platform-gpu-card", O_RDWR); // VideoCore VI (Raspberry Pi 4) if (platform.fd != -1) TRACELOG(LOG_INFO, "DISPLAY: platform-gpu-card opened successfully"); - if ((platform.fd == -1) || (drmModeGetResources(platform.fd) == NULL)) + drmModeRes *res = NULL; + if ((platform.fd == -1) || ((res = drmModeGetResources(platform.fd)) == NULL)) { if (platform.fd != -1) close(platform.fd); TRACELOG(LOG_WARNING, "DISPLAY: Failed to open platform-gpu-card, trying card1"); @@ -1169,7 +1170,7 @@ int InitPlatform(void) if (platform.fd != -1) TRACELOG(LOG_INFO, "DISPLAY: card1 opened successfully"); } - if ((platform.fd == -1) || (drmModeGetResources(platform.fd) == NULL)) + if ((platform.fd == -1) || ((res = drmModeGetResources(platform.fd)) == NULL)) { if (platform.fd != -1) close(platform.fd); TRACELOG(LOG_WARNING, "DISPLAY: Failed to open graphic card1, trying card0"); @@ -1177,7 +1178,7 @@ int InitPlatform(void) if (platform.fd != -1) TRACELOG(LOG_INFO, "DISPLAY: card0 opened successfully"); } - if ((platform.fd == -1) || (drmModeGetResources(platform.fd) == NULL)) + if ((platform.fd == -1) || ((res = drmModeGetResources(platform.fd)) == NULL)) { if (platform.fd != -1) close(platform.fd); TRACELOG(LOG_WARNING, "DISPLAY: Failed to open graphic card0, trying card2"); @@ -1192,7 +1193,6 @@ int InitPlatform(void) return -1; } - drmModeRes *res = drmModeGetResources(platform.fd); if (!res) { TRACELOG(LOG_WARNING, "DISPLAY: Failed get DRM resources"); From a938a7c97a8372e0d4a84addbb1cd1bc3673c44c Mon Sep 17 00:00:00 2001 From: base Date: Thu, 15 Jan 2026 06:08:03 -0300 Subject: [PATCH 2/8] chore: add GetAppDir for wasm returning root VFS (#5495) --- src/rcore.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/rcore.c b/src/rcore.c index dd4123a3b..a393264af 100644 --- a/src/rcore.c +++ b/src/rcore.c @@ -2738,6 +2738,9 @@ const char *GetApplicationDirectory(void) appDir[0] = '.'; appDir[1] = '/'; } + +#elif defined(__wasm__) + appDir[0] = '/'; #endif return appDir; From 0df2fe981b8173db9074688a1f612a3263f96052 Mon Sep 17 00:00:00 2001 From: Ray Date: Thu, 15 Jan 2026 10:42:58 +0100 Subject: [PATCH 3/8] REVIEWED: `ExportFontAsCode()` #5497 --- src/rtext.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/rtext.c b/src/rtext.c index 8085e81c8..45aa19b13 100644 --- a/src/rtext.c +++ b/src/rtext.c @@ -1044,15 +1044,26 @@ bool ExportFontAsCode(Font font, const char *fileName) #define TEXT_BYTES_PER_LINE 20 #endif - #define MAX_FONT_DATA_SIZE 1024*1024 // 1 MB - // Get file name from path char fileNamePascal[256] = { 0 }; strncpy(fileNamePascal, TextToPascal(GetFileNameWithoutExt(fileName)), 256 - 1); + + // Get font atlas image and size, required to estimate code file size + // NOTE: This mechanism is highly coupled to raylib + Image image = LoadImageFromTexture(font.texture); + if (image.format != PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA) TRACELOG(LOG_WARNING, "Font export as code: Font image format is not GRAY+ALPHA!"); + int imageDataSize = GetPixelDataSize(image.width, image.height, image.format); - // NOTE: Text data buffer size is estimated considering image data size in bytes - // and requiring 6 char bytes for every byte: "0x00, " - char *txtData = (char *)RL_CALLOC(MAX_FONT_DATA_SIZE, sizeof(char)); + // Image data is usually GRAYSCALE + ALPHA and can be reduced to GRAYSCALE + //ImageFormat(&image, PIXELFORMAT_UNCOMPRESSED_GRAYSCALE); + + // Estimate text code size + // - Image data is stored as "0x%02x", so it requires at least 4 char per byte, let's use 6 + // - font.recs[] data is stored as "{ %1.0f, %1.0f, %1.0f , %1.0f }", let's reserve 64 per rec + // - font.glyphs[] data is stored as "{ %i, %i, %i, %i, { 0 }},\n", let's reserve 64 per glyph + // - Comments and additional code, let's reserve 32KB + int txtDataSize = imageDataSize*6 + font.glyphCount*64 + font.glyphCount*64 + 32768; + char *txtData = (char *)RL_CALLOC(txtDataSize, sizeof(char)); int byteCount = 0; byteCount += sprintf(txtData + byteCount, "////////////////////////////////////////////////////////////////////////////////////////\n"); @@ -1074,15 +1085,6 @@ bool ExportFontAsCode(Font font, const char *fileName) byteCount += sprintf(txtData + byteCount, "// //\n"); byteCount += sprintf(txtData + byteCount, "////////////////////////////////////////////////////////////////////////////////////////\n\n"); - // Support font export and initialization - // NOTE: This mechanism is highly coupled to raylib - Image image = LoadImageFromTexture(font.texture); - if (image.format != PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA) TRACELOG(LOG_WARNING, "Font export as code: Font image format is not GRAY+ALPHA!"); - int imageDataSize = GetPixelDataSize(image.width, image.height, image.format); - - // Image data is usually GRAYSCALE + ALPHA and can be reduced to GRAYSCALE - //ImageFormat(&image, PIXELFORMAT_UNCOMPRESSED_GRAYSCALE); - #define SUPPORT_COMPRESSED_FONT_ATLAS #if defined(SUPPORT_COMPRESSED_FONT_ATLAS) // WARNING: Data is compressed using raylib CompressData() DEFLATE, @@ -1120,8 +1122,7 @@ bool ExportFontAsCode(Font font, const char *fileName) byteCount += sprintf(txtData + byteCount, "};\n\n"); // Save font glyphs data - // NOTE: Glyphs image data not saved (grayscale pixels), - // it could be generated from image and recs + // NOTE: Glyphs image data not saved (grayscale pixels), it could be generated from image and recs byteCount += sprintf(txtData + byteCount, "// Font glyphs info data\n"); byteCount += sprintf(txtData + byteCount, "// NOTE: No glyphs.image data provided\n"); byteCount += sprintf(txtData + byteCount, "static GlyphInfo fontGlyphs_%s[%i] = {\n", fileNamePascal, font.glyphCount); @@ -1152,8 +1153,8 @@ bool ExportFontAsCode(Font font, const char *fileName) #if defined(SUPPORT_COMPRESSED_FONT_ATLAS) byteCount += sprintf(txtData + byteCount, " UnloadImage(imFont); // Uncompressed data can be unloaded from memory\n\n"); #endif - // We have two possible mechanisms to assign font.recs and font.glyphs data, - // that data is already available as global arrays, we two options to assign that data: + // There are two possible mechanisms to assign font.recs and font.glyphs data, + // that data is already available as global arrays, two options to assign that data: // - 1. Data copy. This option consumes more memory and Font MUST be unloaded by user, requiring additional code // - 2. Data assignment. This option consumes less memory and Font MUST NOT be unloaded by user because data is on protected DATA segment //#define SUPPORT_FONT_DATA_COPY From 439448ad7ccfadd2adb15502e17564d873e4dc92 Mon Sep 17 00:00:00 2001 From: Ray Date: Thu, 15 Jan 2026 10:43:08 +0100 Subject: [PATCH 4/8] Update rcore.c --- src/rcore.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/rcore.c b/src/rcore.c index a393264af..1794637bd 100644 --- a/src/rcore.c +++ b/src/rcore.c @@ -2740,6 +2740,7 @@ const char *GetApplicationDirectory(void) } #elif defined(__wasm__) + appDir[0] = '/'; #endif From 10b94b02adb469e7ce9af169c2d21c13124a82ce Mon Sep 17 00:00:00 2001 From: jscaff Date: Thu, 15 Jan 2026 17:30:13 -0500 Subject: [PATCH 5/8] Fix opengl interop single header library not having it's implementation loaded (#5498) --- examples/others/raylib_opengl_interop.c | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/others/raylib_opengl_interop.c b/examples/others/raylib_opengl_interop.c index 540a623ab..935eb87f8 100644 --- a/examples/others/raylib_opengl_interop.c +++ b/examples/others/raylib_opengl_interop.c @@ -30,6 +30,7 @@ #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_DESKTOP_SDL) #if defined(GRAPHICS_API_OPENGL_ES2) + #define GLAD_GLES2_IMPLEMENTATION #include "glad_gles2.h" // Required for: OpenGL functionality #define glGenVertexArrays glGenVertexArraysOES #define glBindVertexArray glBindVertexArrayOES From 9621c3d395859382f856389c54d81b1c2f9abeee Mon Sep 17 00:00:00 2001 From: jscaff Date: Fri, 16 Jan 2026 03:42:15 -0500 Subject: [PATCH 6/8] Add QNX EGL2.0 Library configuration (#5499) --- cmake/LibraryConfigurations.cmake | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmake/LibraryConfigurations.cmake b/cmake/LibraryConfigurations.cmake index 96abeea93..9b8fbdb25 100644 --- a/cmake/LibraryConfigurations.cmake +++ b/cmake/LibraryConfigurations.cmake @@ -27,6 +27,12 @@ if (${PLATFORM} MATCHES "Desktop") add_definitions(-D_CRT_SECURE_NO_WARNINGS) find_package(OpenGL QUIET) set(LIBS_PRIVATE ${OPENGL_LIBRARIES} winmm) + elseif("${CMAKE_SYSTEM_NAME}" MATCHES "QNX") + set(GRAPHICS "GRAPHICS_API_OPENGL_ES2") + find_library(GLESV2 GLESv2) + find_library(EGL EGL) + set(LIBS_PUBLIC m) + set(LIBS_PRIVATE ${GLESV2} ${EGL} atomic pthread dl) elseif (UNIX) find_library(pthread NAMES pthread) find_package(OpenGL QUIET) From fbed591a6ff2da8b953ac201943799ea6129b6aa Mon Sep 17 00:00:00 2001 From: Ray Date: Sat, 17 Jan 2026 20:15:45 +0100 Subject: [PATCH 7/8] Reviewed example --- examples/audio/audio_spectrum_visualizer.c | 2 +- examples/audio/audio_spectrum_visualizer.png | Bin 15580 -> 15477 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/audio/audio_spectrum_visualizer.c b/examples/audio/audio_spectrum_visualizer.c index f5334c9cc..5cde7e9bd 100644 --- a/examples/audio/audio_spectrum_visualizer.c +++ b/examples/audio/audio_spectrum_visualizer.c @@ -115,7 +115,7 @@ int main(void) .tapbackPos = 0.01f }; - size_t wavCursor = 0; + int wavCursor = 0; const short *wavPCM16 = wav.data; short chunkSamples[AUDIO_STREAM_RING_BUFFER_SIZE] = { 0 }; diff --git a/examples/audio/audio_spectrum_visualizer.png b/examples/audio/audio_spectrum_visualizer.png index c3f1bc8b0acfbc066c241358f06922dcc8133e86..f885927b1b8bbc124c7ac52f0fb41a8f5d958cc2 100644 GIT binary patch literal 15477 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 literal 15580 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 XmXUW`GFsuSWx Date: Sat, 17 Jan 2026 20:15:48 +0100 Subject: [PATCH 8/8] Update models_first_person_maze.c --- examples/models/models_first_person_maze.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/models/models_first_person_maze.c b/examples/models/models_first_person_maze.c index 4c77d6121..13b56f4cd 100644 --- a/examples/models/models_first_person_maze.c +++ b/examples/models/models_first_person_maze.c @@ -84,19 +84,19 @@ int main(void) for (int y = playerCellY - 1; y <= playerCellY + 1; y++) { // Avoid map accessing out of bounds - if ((y < 0) || (y >= cubicmap.height)) continue; - - for (int x = playerCellX - 1; x <= playerCellX + 1; x++) + if ((y >= 0) && (y < cubicmap.height)) { - // Avoid map accessing out of bounds - if ((x < 0) || (x >= cubicmap.width)) continue; - - if ((mapPixels[y*cubicmap.width + x].r == 255) && // Collision: white pixel, only check R channel - (CheckCollisionCircleRec(playerPos, playerRadius, - (Rectangle){ mapPosition.x - 0.5f + x*1.0f, mapPosition.z - 0.5f + y*1.0f, 1.0f, 1.0f }))) + for (int x = playerCellX - 1; x <= playerCellX + 1; x++) { - // Collision detected, reset camera position - camera.position = oldCamPos; + // NOTE: Collision: Only checking R channel for white pixel + if (((x >= 0) && (x < cubicmap.width)) && + (mapPixels[y*cubicmap.width + x].r == 255) && + (CheckCollisionCircleRec(playerPos, playerRadius, + (Rectangle){ mapPosition.x - 0.5f + x*1.0f, mapPosition.z - 0.5f + y*1.0f, 1.0f, 1.0f }))) + { + // Collision detected, reset camera position + camera.position = oldCamPos; + } } } }