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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 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; + } } } }