mirror of
https://github.com/nicbarker/clay.git
synced 2025-04-16 03:08:05 +00:00
[Core] Convert measureText pointer to value string slice (#214)
This commit is contained in:
parent
e8025cc254
commit
326325ffaf
23
clay.h
23
clay.h
@ -191,6 +191,13 @@ CLAY__TYPEDEF(Clay__StringArray, struct {
|
|||||||
Clay_String *internalArray;
|
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;
|
typedef struct Clay_Context Clay_Context;
|
||||||
|
|
||||||
CLAY__TYPEDEF(Clay_Arena, struct {
|
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);
|
void Clay_OnHover(void (*onHoverFunction)(Clay_ElementId elementId, Clay_PointerData pointerData, intptr_t userData), intptr_t userData);
|
||||||
bool Clay_PointerOver(Clay_ElementId elementId);
|
bool Clay_PointerOver(Clay_ElementId elementId);
|
||||||
Clay_ScrollContainerData Clay_GetScrollContainerData(Clay_ElementId id);
|
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);
|
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);
|
Clay_RenderCommand * Clay_RenderCommandArray_Get(Clay_RenderCommandArray* array, int32_t index);
|
||||||
void Clay_SetDebugModeEnabled(bool enabled);
|
void Clay_SetDebugModeEnabled(bool enabled);
|
||||||
@ -1482,10 +1489,10 @@ Clay_String Clay__WriteStringToCharBuffer(Clay__CharArray *buffer, Clay_String s
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CLAY_WASM
|
#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);
|
__attribute__((import_module("clay"), import_name("queryScrollOffsetFunction"))) Clay_Vector2 Clay__QueryScrollOffset(uint32_t elementId, uintptr_t userData);
|
||||||
#else
|
#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);
|
Clay_Vector2 (*Clay__QueryScrollOffset)(uint32_t elementId, uintptr_t userData);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1701,7 +1708,7 @@ Clay__MeasureTextCacheItem *Clay__MeasureTextCached(Clay_String *text, Clay_Text
|
|||||||
float lineWidth = 0;
|
float lineWidth = 0;
|
||||||
float measuredWidth = 0;
|
float measuredWidth = 0;
|
||||||
float measuredHeight = 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 tempWord = { .next = -1 };
|
||||||
Clay__MeasuredWord *previousWord = &tempWord;
|
Clay__MeasuredWord *previousWord = &tempWord;
|
||||||
while (end < text->length) {
|
while (end < text->length) {
|
||||||
@ -1718,8 +1725,7 @@ Clay__MeasureTextCacheItem *Clay__MeasureTextCached(Clay_String *text, Clay_Text
|
|||||||
char current = text->chars[end];
|
char current = text->chars[end];
|
||||||
if (current == ' ' || current == '\n') {
|
if (current == ' ' || current == '\n') {
|
||||||
int32_t length = end - start;
|
int32_t length = end - start;
|
||||||
Clay_String word = { .length = length, .chars = &text->chars[start] };
|
Clay_Dimensions dimensions = Clay__MeasureText(CLAY__INIT(Clay_StringSlice) { .length = length, .chars = &text->chars[start], .baseChars = text->chars }, config, context->mesureTextUserData);
|
||||||
Clay_Dimensions dimensions = Clay__MeasureText(&word, config, context->mesureTextUserData);
|
|
||||||
measuredHeight = CLAY__MAX(measuredHeight, dimensions.height);
|
measuredHeight = CLAY__MAX(measuredHeight, dimensions.height);
|
||||||
if (current == ' ') {
|
if (current == ' ') {
|
||||||
dimensions.width += spaceWidth;
|
dimensions.width += spaceWidth;
|
||||||
@ -1741,8 +1747,7 @@ Clay__MeasureTextCacheItem *Clay__MeasureTextCached(Clay_String *text, Clay_Text
|
|||||||
end++;
|
end++;
|
||||||
}
|
}
|
||||||
if (end - start > 0) {
|
if (end - start > 0) {
|
||||||
Clay_String lastWord = { .length = end - start, .chars = &text->chars[start] };
|
Clay_Dimensions dimensions = Clay__MeasureText(CLAY__INIT(Clay_StringSlice) { .length = end - start, .chars = &text->chars[start], .baseChars = text->chars }, config, context->mesureTextUserData);
|
||||||
Clay_Dimensions dimensions = Clay__MeasureText(&lastWord, config, context->mesureTextUserData);
|
|
||||||
Clay__AddMeasuredWord(CLAY__INIT(Clay__MeasuredWord) { .startOffset = start, .length = end - start, .width = dimensions.width, .next = -1 }, previousWord);
|
Clay__AddMeasuredWord(CLAY__INIT(Clay__MeasuredWord) { .startOffset = start, .length = end - start, .width = dimensions.width, .next = -1 }, previousWord);
|
||||||
lineWidth += dimensions.width;
|
lineWidth += dimensions.width;
|
||||||
measuredHeight = CLAY__MAX(measuredHeight, dimensions.height);
|
measuredHeight = CLAY__MAX(measuredHeight, dimensions.height);
|
||||||
@ -3680,7 +3685,7 @@ Clay_Arena Clay_CreateArenaWithCapacityAndMemory(uint32_t capacity, void *offset
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CLAY_WASM
|
#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_Context* context = Clay_GetCurrentContext();
|
||||||
Clay__MeasureText = measureTextFunction;
|
Clay__MeasureText = measureTextFunction;
|
||||||
context->mesureTextUserData = userData;
|
context->mesureTextUserData = userData;
|
||||||
|
@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.27)
|
|||||||
project(clay_examples_sdl3_simple_demo C)
|
project(clay_examples_sdl3_simple_demo C)
|
||||||
set(CMAKE_C_STANDARD 99)
|
set(CMAKE_C_STANDARD 99)
|
||||||
|
|
||||||
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -Wall -Werror")
|
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
|
||||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3")
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3")
|
||||||
|
|
||||||
include(FetchContent)
|
include(FetchContent)
|
||||||
|
@ -21,14 +21,12 @@ typedef struct app_state {
|
|||||||
SDL_Renderer *renderer;
|
SDL_Renderer *renderer;
|
||||||
} AppState;
|
} 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];
|
TTF_Font *font = gFonts[config->fontId];
|
||||||
int width, height;
|
int width, height;
|
||||||
|
|
||||||
if (!TTF_GetStringSize(font, text->chars, text->length, &width, &height)) {
|
if (!TTF_GetStringSize(font, text.chars, text.length, &width, &height)) {
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Failed to measure text: %s", SDL_GetError());
|
SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Failed to measure text: %s", SDL_GetError());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Binary file not shown.
@ -13,13 +13,13 @@ typedef struct
|
|||||||
} SDL2_Font;
|
} SDL2_Font;
|
||||||
|
|
||||||
|
|
||||||
static Clay_Dimensions SDL2_MeasureText(Clay_String *text, Clay_TextElementConfig *config, uintptr_t userData)
|
static Clay_Dimensions SDL2_MeasureText(Clay_StringSlice text, Clay_TextElementConfig *config, uintptr_t userData)
|
||||||
{
|
{
|
||||||
SDL2_Font *fonts = (SDL2_Font*)userData;
|
SDL2_Font *fonts = (SDL2_Font*)userData;
|
||||||
|
|
||||||
TTF_Font *font = fonts[config->fontId].font;
|
TTF_Font *font = fonts[config->fontId].font;
|
||||||
char *chars = (char *)calloc(text->length + 1, 1);
|
char *chars = (char *)calloc(text.length + 1, 1);
|
||||||
memcpy(chars, text->chars, text->length);
|
memcpy(chars, text.chars, text.length);
|
||||||
int width = 0;
|
int width = 0;
|
||||||
int height = 0;
|
int height = 0;
|
||||||
if (TTF_SizeUTF8(font, chars, &width, &height) < 0) {
|
if (TTF_SizeUTF8(font, chars, &width, &height) < 0) {
|
||||||
|
@ -89,7 +89,7 @@ Ray GetScreenToWorldPointWithZDistance(Vector2 position, Camera camera, int scre
|
|||||||
|
|
||||||
uint32_t measureCalls = 0;
|
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++;
|
measureCalls++;
|
||||||
// Measure string size for Font
|
// Measure string size for Font
|
||||||
Clay_Dimensions textSize = { 0 };
|
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;
|
Font fontToUse = Raylib_fonts[config->fontId].font;
|
||||||
float scaleFactor = config->fontSize/(float)fontToUse.baseSize;
|
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);
|
maxTextWidth = fmax(maxTextWidth, lineTextWidth);
|
||||||
lineTextWidth = 0;
|
lineTextWidth = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
int index = text->chars[i] - 32;
|
int index = text.chars[i] - 32;
|
||||||
if (fontToUse.glyphs[index].advanceX != 0) lineTextWidth += fontToUse.glyphs[index].advanceX;
|
if (fontToUse.glyphs[index].advanceX != 0) lineTextWidth += fontToUse.glyphs[index].advanceX;
|
||||||
else lineTextWidth += (fontToUse.recs[index].width + fontToUse.glyphs[index].offsetX);
|
else lineTextWidth += (fontToUse.recs[index].width + fontToUse.glyphs[index].offsetX);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user