From 5261c1eef2710fc9ea719b49075b4e168952cb5c Mon Sep 17 00:00:00 2001 From: Nic Barker Date: Thu, 26 Dec 2024 13:46:21 +1300 Subject: [PATCH] Convert clay measure text hash map size to runtime variable --- clay.h | 17 ++++++++++------- .../raylib-sidebar-scrolling-container/main.c | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/clay.h b/clay.h index da8f73f..04c6f06 100644 --- a/clay.h +++ b/clay.h @@ -479,6 +479,7 @@ Clay_RenderCommand * Clay_RenderCommandArray_Get(Clay_RenderCommandArray* array, void Clay_SetDebugModeEnabled(bool enabled); void Clay_SetCullingEnabled(bool enabled); void Clay_SetMaxElementCount(uint32_t maxElementCount); +void Clay_SetMeasureTextCacheSize(uint32_t measureTextCacheSize); // Internal API functions required by macros void Clay__OpenElement(); @@ -518,10 +519,6 @@ extern uint32_t Clay__debugViewWidth; #define CLAY__TEXT_MEASURE_HASH_BUCKET_COUNT 16 #endif -#ifndef CLAY_MEASURE_TEXT_CACHE_SIZE -#define CLAY_MEASURE_TEXT_CACHE_SIZE Clay__maxElementCount * 2 -#endif - #ifndef CLAY__NULL #define CLAY__NULL 0 #endif @@ -532,6 +529,7 @@ extern uint32_t Clay__debugViewWidth; bool Clay__warningsEnabled = true; uint32_t Clay__maxElementCount = 128; +uint32_t Clay__measureTextCacheSize = 128; Clay_ErrorHandler Clay__errorHandler = CLAY__INIT(Clay_ErrorHandler) { .errorHandlerFunction = Clay__Noop }; void Clay__Noop() {}; @@ -1653,7 +1651,7 @@ Clay__MeasureTextCacheItem *Clay__MeasureTextCached(Clay_String *text, Clay_Text if (!Clay__booleanWarnings.maxTextMeasureCacheExceeded) { Clay__errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { .errorType = CLAY_ERROR_TYPE_TEXT_MEASUREMENT_CAPACITY_EXCEEDED, - .errorText = CLAY_STRING("Clay has run out of space in it's internal text measurement cache. Try increasing CLAY_MEASURE_TEXT_CACHE_SIZE."), + .errorText = CLAY_STRING("Clay has run out of space in it's internal text measurement cache. Try using Clay_SetMeasureTextCacheSize() (default 16384, with 1 unit storing 1 measured word)."), .userData = Clay__errorHandler.userData }); Clay__booleanWarnings.maxTextMeasureCacheExceeded = true; } @@ -2034,9 +2032,9 @@ void Clay__InitializePersistentMemory(Clay_Arena *arena) { Clay__layoutElementsHashMap = Clay__int32_tArray_Allocate_Arena(Clay__maxElementCount, arena); Clay__measureTextHashMapInternal = Clay__MeasureTextCacheItemArray_Allocate_Arena(Clay__maxElementCount, arena); Clay__measureTextHashMapInternalFreeList = Clay__int32_tArray_Allocate_Arena(Clay__maxElementCount, arena); - Clay__measuredWordsFreeList = Clay__int32_tArray_Allocate_Arena(CLAY_MEASURE_TEXT_CACHE_SIZE, arena); + Clay__measuredWordsFreeList = Clay__int32_tArray_Allocate_Arena(Clay__measureTextCacheSize, arena); Clay__measureTextHashMap = Clay__int32_tArray_Allocate_Arena(Clay__maxElementCount, arena); - Clay__measuredWords = Clay__MeasuredWordArray_Allocate_Arena(CLAY_MEASURE_TEXT_CACHE_SIZE, arena); + Clay__measuredWords = Clay__MeasuredWordArray_Allocate_Arena(Clay__measureTextCacheSize, arena); Clay__pointerOverIds = Clay__ElementIdArray_Allocate_Arena(Clay__maxElementCount, arena); Clay__debugElementData = Clay__DebugElementDataArray_Allocate_Arena(Clay__maxElementCount, arena); Clay__arenaResetOffset = arena->nextAllocation; @@ -3836,6 +3834,11 @@ void Clay_SetMaxElementCount(uint32_t maxElementCount) { Clay__maxElementCount = maxElementCount; } +CLAY_WASM_EXPORT("Clay_SetMeasureTextCacheSize") +void Clay_SetMeasureTextCacheSize(uint32_t measureTextCacheSize) { + Clay__measureTextCacheSize = measureTextCacheSize; +} + #endif //CLAY_IMPLEMENTATION /* diff --git a/examples/raylib-sidebar-scrolling-container/main.c b/examples/raylib-sidebar-scrolling-container/main.c index 61b9481..fd7e0ae 100644 --- a/examples/raylib-sidebar-scrolling-container/main.c +++ b/examples/raylib-sidebar-scrolling-container/main.c @@ -202,8 +202,17 @@ void UpdateDrawFrame(void) //---------------------------------------------------------------------------------- } +bool reinitializeClay = false; + void HandleClayErrors(Clay_ErrorData errorData) { printf("%s", errorData.errorText.chars); + if (errorData.errorType == CLAY_ERROR_TYPE_ELEMENTS_CAPACITY_EXCEEDED) { + reinitializeClay = true; + Clay_SetMaxElementCount(Clay__maxElementCount * 2); + } else if (errorData.errorType == CLAY_ERROR_TYPE_TEXT_MEASUREMENT_CAPACITY_EXCEEDED) { + reinitializeClay = true; + Clay_SetMeasureTextCacheSize(Clay__measureTextCacheSize * 2); + } } int main(void) { @@ -230,6 +239,13 @@ int main(void) { // Main game loop while (!WindowShouldClose()) // Detect window close button or ESC key { + if (reinitializeClay) { + Clay_SetMaxElementCount(8192); + totalMemorySize = Clay_MinMemorySize(); + clayMemory = (Clay_Arena) { .label = CLAY_STRING("Clay Memory Arena"), .memory = malloc(totalMemorySize), .capacity = totalMemorySize }; + Clay_Initialize(clayMemory, (Clay_Dimensions) { (float)GetScreenWidth(), (float)GetScreenHeight() }, (Clay_ErrorHandler) { HandleClayErrors }); + reinitializeClay = false; + } UpdateDrawFrame(); } return 0;