diff --git a/examples/introducing-clay-video-demo/main.c b/examples/introducing-clay-video-demo/main.c index 5456ebc..89dd50f 100644 --- a/examples/introducing-clay-video-demo/main.c +++ b/examples/introducing-clay-video-demo/main.c @@ -50,4 +50,6 @@ int main(void) { Clay_Raylib_Render(renderCommands, fonts); EndDrawing(); } + // This function is new since the video was published + Clay_Raylib_Close(); } diff --git a/examples/raylib-multi-context/main.c b/examples/raylib-multi-context/main.c index b2163ba..dfbc1a3 100644 --- a/examples/raylib-multi-context/main.c +++ b/examples/raylib-multi-context/main.c @@ -72,4 +72,6 @@ int main(void) { Clay_Raylib_Render(renderCommandsBottom, fonts); EndDrawing(); } + + Clay_Raylib_Close(); } diff --git a/examples/raylib-sidebar-scrolling-container/main.c b/examples/raylib-sidebar-scrolling-container/main.c index 4ea1cb7..21f30c5 100644 --- a/examples/raylib-sidebar-scrolling-container/main.c +++ b/examples/raylib-sidebar-scrolling-container/main.c @@ -250,5 +250,6 @@ int main(void) { } UpdateDrawFrame(fonts); } + Clay_Raylib_Close(); return 0; } diff --git a/renderers/raylib/clay_renderer_raylib.c b/renderers/raylib/clay_renderer_raylib.c index 2b370c6..de7857c 100644 --- a/renderers/raylib/clay_renderer_raylib.c +++ b/renderers/raylib/clay_renderer_raylib.c @@ -125,6 +125,21 @@ void Clay_Raylib_Initialize(int width, int height, const char *title, unsigned i // EnableEventWaiting(); } +// A MALLOC'd buffer, that we keep modifying inorder to save from so many Malloc and Free Calls. +// Call Clay_Raylib_Close() to free +static char *temp_render_buffer = NULL; +static int temp_render_buffer_len = 0; + +// Call after closing the window to clean up the render buffer +void Clay_Raylib_Close() +{ + if(temp_render_buffer) free(temp_render_buffer); + temp_render_buffer_len = 0; + + CloseWindow(); +} + + void Clay_Raylib_Render(Clay_RenderCommandArray renderCommands, Font* fonts) { for (int j = 0; j < renderCommands.length; j++) @@ -134,14 +149,23 @@ void Clay_Raylib_Render(Clay_RenderCommandArray renderCommands, Font* fonts) switch (renderCommand->commandType) { case CLAY_RENDER_COMMAND_TYPE_TEXT: { - // Raylib uses standard C strings so isn't compatible with cheap slices, we need to clone the string to append null terminator Clay_TextRenderData *textData = &renderCommand->renderData.text; - char *cloned = (char *)malloc(textData->stringContents.length + 1); - memcpy(cloned, textData->stringContents.chars, textData->stringContents.length); - cloned[textData->stringContents.length] = '\0'; Font fontToUse = fonts[textData->fontId]; - DrawTextEx(fontToUse, cloned, (Vector2){boundingBox.x, boundingBox.y}, (float)textData->fontSize, (float)textData->letterSpacing, CLAY_COLOR_TO_RAYLIB_COLOR(textData->textColor)); - free(cloned); + + int strlen = textData->stringContents.length + 1; + + if(strlen > temp_render_buffer_len) { + // Grow the temp buffer if we need a larger string + if(temp_render_buffer) free(temp_render_buffer); + temp_render_buffer = malloc(strlen); + temp_render_buffer_len = strlen; + } + + // Raylib uses standard C strings so isn't compatible with cheap slices, we need to clone the string to append null terminator + memcpy(temp_render_buffer, textData->stringContents.chars, textData->stringContents.length); + temp_render_buffer[textData->stringContents.length] = '\0'; + DrawTextEx(fontToUse, temp_render_buffer, (Vector2){boundingBox.x, boundingBox.y}, (float)textData->fontSize, (float)textData->letterSpacing, CLAY_COLOR_TO_RAYLIB_COLOR(textData->textColor)); + break; } case CLAY_RENDER_COMMAND_TYPE_IMAGE: {