From 2776965b6652a9477e5fe57af489579f36585378 Mon Sep 17 00:00:00 2001 From: Nic Barker Date: Mon, 20 Jan 2025 11:08:55 +1300 Subject: [PATCH] Convert measureText pointer to value string slice --- clay.h | 23 +++++++++++------- examples/SDL3-simple-demo/main.c | 4 +-- .../build/clay/index.wasm | Bin 167614 -> 167775 bytes renderers/SDL2/clay_renderer_SDL2.c | 6 ++--- renderers/raylib/clay_renderer_raylib.c | 8 +++--- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/clay.h b/clay.h index 23cbef65..50f8585c 100644 --- a/clay.h +++ b/clay.h @@ -191,6 +191,13 @@ CLAY__TYPEDEF(Clay__StringArray, struct { Clay_String *internalArray; }); +CLAY__TYPEDEF(Clay_StringSlice, struct { + int32_t length; + const char *chars; + // The source string / char* that this slice was derived from + const char *baseChars; +}); + typedef struct Clay_Context Clay_Context; CLAY__TYPEDEF(Clay_Arena, struct { @@ -527,7 +534,7 @@ bool Clay_Hovered(void); void Clay_OnHover(void (*onHoverFunction)(Clay_ElementId elementId, Clay_PointerData pointerData, intptr_t userData), intptr_t userData); bool Clay_PointerOver(Clay_ElementId elementId); Clay_ScrollContainerData Clay_GetScrollContainerData(Clay_ElementId id); -void Clay_SetMeasureTextFunction(Clay_Dimensions (*measureTextFunction)(Clay_String *text, Clay_TextElementConfig *config, uintptr_t userData), uintptr_t userData); +void Clay_SetMeasureTextFunction(Clay_Dimensions (*measureTextFunction)(Clay_StringSlice text, Clay_TextElementConfig *config, uintptr_t userData), uintptr_t userData); void Clay_SetQueryScrollOffsetFunction(Clay_Vector2 (*queryScrollOffsetFunction)(uint32_t elementId, uintptr_t userData), uintptr_t userData); Clay_RenderCommand * Clay_RenderCommandArray_Get(Clay_RenderCommandArray* array, int32_t index); void Clay_SetDebugModeEnabled(bool enabled); @@ -1482,10 +1489,10 @@ Clay_String Clay__WriteStringToCharBuffer(Clay__CharArray *buffer, Clay_String s } #ifdef CLAY_WASM - __attribute__((import_module("clay"), import_name("measureTextFunction"))) Clay_Dimensions Clay__MeasureText(Clay_String *text, Clay_TextElementConfig *config, uintptr_t userData); + __attribute__((import_module("clay"), import_name("measureTextFunction"))) Clay_Dimensions Clay__MeasureText(Clay_StringSlice text, Clay_TextElementConfig *config, uintptr_t userData); __attribute__((import_module("clay"), import_name("queryScrollOffsetFunction"))) Clay_Vector2 Clay__QueryScrollOffset(uint32_t elementId, uintptr_t userData); #else - Clay_Dimensions (*Clay__MeasureText)(Clay_String *text, Clay_TextElementConfig *config, uintptr_t userData); + Clay_Dimensions (*Clay__MeasureText)(Clay_StringSlice text, Clay_TextElementConfig *config, uintptr_t userData); Clay_Vector2 (*Clay__QueryScrollOffset)(uint32_t elementId, uintptr_t userData); #endif @@ -1701,7 +1708,7 @@ Clay__MeasureTextCacheItem *Clay__MeasureTextCached(Clay_String *text, Clay_Text float lineWidth = 0; float measuredWidth = 0; float measuredHeight = 0; - float spaceWidth = Clay__MeasureText(&CLAY__SPACECHAR, config, context->mesureTextUserData).width; + float spaceWidth = Clay__MeasureText(CLAY__INIT(Clay_StringSlice) { .length = 1, .chars = CLAY__SPACECHAR.chars, .baseChars = CLAY__SPACECHAR.chars }, config, context->mesureTextUserData).width; Clay__MeasuredWord tempWord = { .next = -1 }; Clay__MeasuredWord *previousWord = &tempWord; while (end < text->length) { @@ -1718,8 +1725,7 @@ Clay__MeasureTextCacheItem *Clay__MeasureTextCached(Clay_String *text, Clay_Text char current = text->chars[end]; if (current == ' ' || current == '\n') { int32_t length = end - start; - Clay_String word = { .length = length, .chars = &text->chars[start] }; - Clay_Dimensions dimensions = Clay__MeasureText(&word, config, context->mesureTextUserData); + Clay_Dimensions dimensions = Clay__MeasureText(CLAY__INIT(Clay_StringSlice) { .length = length, .chars = &text->chars[start], .baseChars = text->chars }, config, context->mesureTextUserData); measuredHeight = CLAY__MAX(measuredHeight, dimensions.height); if (current == ' ') { dimensions.width += spaceWidth; @@ -1741,8 +1747,7 @@ Clay__MeasureTextCacheItem *Clay__MeasureTextCached(Clay_String *text, Clay_Text end++; } if (end - start > 0) { - Clay_String lastWord = { .length = end - start, .chars = &text->chars[start] }; - Clay_Dimensions dimensions = Clay__MeasureText(&lastWord, config, context->mesureTextUserData); + Clay_Dimensions dimensions = Clay__MeasureText(CLAY__INIT(Clay_StringSlice) { .length = end - start, .chars = &text->chars[start], .baseChars = text->chars }, config, context->mesureTextUserData); Clay__AddMeasuredWord(CLAY__INIT(Clay__MeasuredWord) { .startOffset = start, .length = end - start, .width = dimensions.width, .next = -1 }, previousWord); lineWidth += dimensions.width; measuredHeight = CLAY__MAX(measuredHeight, dimensions.height); @@ -3680,7 +3685,7 @@ Clay_Arena Clay_CreateArenaWithCapacityAndMemory(uint32_t capacity, void *offset } #ifndef CLAY_WASM -void Clay_SetMeasureTextFunction(Clay_Dimensions (*measureTextFunction)(Clay_String *text, Clay_TextElementConfig *config, uintptr_t userData), uintptr_t userData) { +void Clay_SetMeasureTextFunction(Clay_Dimensions (*measureTextFunction)(Clay_StringSlice text, Clay_TextElementConfig *config, uintptr_t userData), uintptr_t userData) { Clay_Context* context = Clay_GetCurrentContext(); Clay__MeasureText = measureTextFunction; context->mesureTextUserData = userData; diff --git a/examples/SDL3-simple-demo/main.c b/examples/SDL3-simple-demo/main.c index 4e74ab56..216a222a 100644 --- a/examples/SDL3-simple-demo/main.c +++ b/examples/SDL3-simple-demo/main.c @@ -21,10 +21,8 @@ typedef struct app_state { SDL_Renderer *renderer; } AppState; -static inline Clay_Dimensions SDL_MeasureText(Clay_String *text, Clay_TextElementConfig *config, uintptr_t userData) +static inline Clay_Dimensions SDL_MeasureText(Clay_StringSlice text, Clay_TextElementConfig *config, uintptr_t userData) { - - TTF_Font *font = gFonts[config->fontId]; int width, height; diff --git a/examples/clay-official-website/build/clay/index.wasm b/examples/clay-official-website/build/clay/index.wasm index 1ac9753c7a037871861522ec6c8b651791fa3933..f9ed308fe04f1cf94c88014ff1ab4650250064f3 100755 GIT binary patch delta 1306 zcma)5KWGzS6u*04ttROuX)bM&rU&0$k*1yMl62_MFN@+JibFT4jwwQ&9Q>1DMVAW2 zFJOl%Cprc>RFF!L6C4~mWE2`Pi%_sb2ZbOGzW3cVjhLage1Gn}-|zQ+?|mPhM!!9a zdcPU$@4flMPRElUvkDu$ zjP*xKtOmi4RclOI=5$OHf(@{~qWSajL?N8PG~hJIck_qXRq8DO7$puMWcK z91EjE7#;aMy*UV@bu5e)VYFm@>#P#QbDc+%YGydh!aB2)c;5x8P-rvo$wL-wxICXT#=8KEu*i{Ia}q+oU|{8< zE3fBf^{(8^mGwQjo6G4x<*yva{rJS?YoZ-O^>nIX(gOUzyBIerMd+YF9^uA{6DvZS z4yd;cCANwro|1c@RZwmslxvdUw@kVdnd**WaiSd6&!V}How0f9i>Mai3nB?$G4kl) z_;RBNJ46x_I+C|&izze{#JhvMi$NM6PD*-G_Anm}!R^rzJ%&bL?m6Xw)jZ@^>^^5%k13`p9f6&aeyuuOlkrXE8KFB%G}Of6Y0sTx|+&8H_lN{lGAjS!=O7#A_6 zC0qF%jnt3)*=jfp*rXx#aOe807H(fR)PT4Il~4_M8KSy~I)|u%=W}FvZ$iYz;6k@B zS8!rl>hl-}uuh;@_C^T4f#6)l9#%cU!$vx3+@-JNZL`nl7>{!(zdErHM0wylTTmi}(rf)h9X0{;9lg8%>k delta 1230 zcma)5ziU%b6n^)-wlqIpez!?m8_s)0ObbF?UW#<+%~B^39E5_kt|^5&ib@_anGoxyIbhTesqfgfgbkGFO$= z)6B*+E%u-&f4--nQQ$xhR$@AJgc;ZaJ0=aCbX9p{+0iP%0xY1B1H*|*an+*mWL52s z&4{Wx7%NQd5Y}+f2}tiP0lGlvj2UxbSIv*3*ikpfua_`{R?&q+QjP(%R-KSbatX?Z zB0U@QJS8Q`V%~t0TDGHFK$wVw5*IB!NQ*OwF)s7rnKLrS#IoeVOGcg5Ut93lIV@Q& zl$kpu1LG-67s2C|Ngp zm}$;OfF-&?E_iJ^kLa$oio1Lv+Gy&;3!KJ!UJq2$cO&(xCPtxQiP0$p1 zbAe8&z6*&FDJ~mfnq*K*RkzM9l9E8ndd_s9lgj^splq}#C)l#1Gwu-wfj!d_^dT#v zVH<5_4N``>R12FSbH}k0FRfC`6L#{1+aZh~fontId].font; - char *chars = (char *)calloc(text->length + 1, 1); - memcpy(chars, text->chars, text->length); + char *chars = (char *)calloc(text.length + 1, 1); + memcpy(chars, text.chars, text.length); int width = 0; int height = 0; if (TTF_SizeUTF8(font, chars, &width, &height) < 0) { diff --git a/renderers/raylib/clay_renderer_raylib.c b/renderers/raylib/clay_renderer_raylib.c index 4fc4bd94..177925b4 100644 --- a/renderers/raylib/clay_renderer_raylib.c +++ b/renderers/raylib/clay_renderer_raylib.c @@ -89,7 +89,7 @@ Ray GetScreenToWorldPointWithZDistance(Vector2 position, Camera camera, int scre uint32_t measureCalls = 0; -static inline Clay_Dimensions Raylib_MeasureText(Clay_String *text, Clay_TextElementConfig *config, uintptr_t userData) { +static inline Clay_Dimensions Raylib_MeasureText(Clay_StringSlice text, Clay_TextElementConfig *config, uintptr_t userData) { measureCalls++; // Measure string size for Font Clay_Dimensions textSize = { 0 }; @@ -101,14 +101,14 @@ static inline Clay_Dimensions Raylib_MeasureText(Clay_String *text, Clay_TextEle Font fontToUse = Raylib_fonts[config->fontId].font; float scaleFactor = config->fontSize/(float)fontToUse.baseSize; - for (int i = 0; i < text->length; ++i) + for (int i = 0; i < text.length; ++i) { - if (text->chars[i] == '\n') { + if (text.chars[i] == '\n') { maxTextWidth = fmax(maxTextWidth, lineTextWidth); lineTextWidth = 0; continue; } - int index = text->chars[i] - 32; + int index = text.chars[i] - 32; if (fontToUse.glyphs[index].advanceX != 0) lineTextWidth += fontToUse.glyphs[index].advanceX; else lineTextWidth += (fontToUse.recs[index].width + fontToUse.glyphs[index].offsetX); }