mirror of
https://github.com/nicbarker/clay.git
synced 2025-05-11 04:48:04 +00:00
Compare commits
5 Commits
109df8dc96
...
19d4ed0233
Author | SHA1 | Date | |
---|---|---|---|
|
19d4ed0233 | ||
|
01d3ab127f | ||
|
326325ffaf | ||
|
e8025cc254 | ||
|
baac1aafb1 |
@ -2,7 +2,7 @@ cp ../../clay.h clay.c;
|
|||||||
# Intel Mac
|
# Intel Mac
|
||||||
clang -c -DCLAY_IMPLEMENTATION -o clay.o -static -target x86_64-apple-darwin clay.c -fPIC && ar r clay-odin/macos/clay.a clay.o;
|
clang -c -DCLAY_IMPLEMENTATION -o clay.o -static -target x86_64-apple-darwin clay.c -fPIC && ar r clay-odin/macos/clay.a clay.o;
|
||||||
# ARM Mac
|
# ARM Mac
|
||||||
clang -c -DCLAY_IMPLEMENTATION -o clay.o -static clay.c -fPIC && ar r clay-odin/macos-arm64/clay.a clay.o;
|
clang -c -DCLAY_IMPLEMENTATION -g -o clay.o -static clay.c -fPIC && ar r clay-odin/macos-arm64/clay.a clay.o;
|
||||||
# x64 Windows
|
# x64 Windows
|
||||||
clang -c -DCLAY_IMPLEMENTATION -o clay-odin/windows/clay.lib -target x86_64-pc-windows-msvc -fuse-ld=llvm-lib -static clay.c;
|
clang -c -DCLAY_IMPLEMENTATION -o clay-odin/windows/clay.lib -target x86_64-pc-windows-msvc -fuse-ld=llvm-lib -static clay.c;
|
||||||
# Linux
|
# Linux
|
||||||
|
@ -22,6 +22,12 @@ String :: struct {
|
|||||||
chars: [^]c.char,
|
chars: [^]c.char,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StringSlice :: struct {
|
||||||
|
length: c.int32_t,
|
||||||
|
chars: [^]c.char,
|
||||||
|
baseChars: [^]c.char,
|
||||||
|
}
|
||||||
|
|
||||||
Vector2 :: [2]c.float
|
Vector2 :: [2]c.float
|
||||||
|
|
||||||
Dimensions :: struct {
|
Dimensions :: struct {
|
||||||
@ -305,7 +311,7 @@ foreign Clay {
|
|||||||
PointerOver :: proc(id: ElementId) -> bool ---
|
PointerOver :: proc(id: ElementId) -> bool ---
|
||||||
GetElementId :: proc(id: String) -> ElementId ---
|
GetElementId :: proc(id: String) -> ElementId ---
|
||||||
GetScrollContainerData :: proc(id: ElementId) -> ScrollContainerData ---
|
GetScrollContainerData :: proc(id: ElementId) -> ScrollContainerData ---
|
||||||
SetMeasureTextFunction :: proc(measureTextFunction: proc "c" (text: ^String, config: ^TextElementConfig) -> Dimensions) ---
|
SetMeasureTextFunction :: proc(measureTextFunction: proc "c" (text: StringSlice, config: ^TextElementConfig, userData: uintptr) -> Dimensions, userData: uintptr) ---
|
||||||
RenderCommandArray_Get :: proc(array: ^ClayArray(RenderCommand), index: i32) -> ^RenderCommand ---
|
RenderCommandArray_Get :: proc(array: ^ClayArray(RenderCommand), index: i32) -> ^RenderCommand ---
|
||||||
SetDebugModeEnabled :: proc(enabled: bool) ---
|
SetDebugModeEnabled :: proc(enabled: bool) ---
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -493,8 +493,8 @@ main :: proc() {
|
|||||||
minMemorySize: u32 = clay.MinMemorySize()
|
minMemorySize: u32 = clay.MinMemorySize()
|
||||||
memory := make([^]u8, minMemorySize)
|
memory := make([^]u8, minMemorySize)
|
||||||
arena: clay.Arena = clay.CreateArenaWithCapacityAndMemory(minMemorySize, memory)
|
arena: clay.Arena = clay.CreateArenaWithCapacityAndMemory(minMemorySize, memory)
|
||||||
clay.SetMeasureTextFunction(measureText)
|
|
||||||
clay.Initialize(arena, {cast(f32)raylib.GetScreenWidth(), cast(f32)raylib.GetScreenHeight()}, { handler = errorHandler })
|
clay.Initialize(arena, {cast(f32)raylib.GetScreenWidth(), cast(f32)raylib.GetScreenHeight()}, { handler = errorHandler })
|
||||||
|
clay.SetMeasureTextFunction(measureText, 0)
|
||||||
|
|
||||||
raylib.SetConfigFlags({.VSYNC_HINT, .WINDOW_RESIZABLE, .WINDOW_HIGHDPI, .MSAA_4X_HINT})
|
raylib.SetConfigFlags({.VSYNC_HINT, .WINDOW_RESIZABLE, .WINDOW_HIGHDPI, .MSAA_4X_HINT})
|
||||||
raylib.InitWindow(windowWidth, windowHeight, "Raylib Odin Example")
|
raylib.InitWindow(windowWidth, windowHeight, "Raylib Odin Example")
|
||||||
|
@ -16,7 +16,7 @@ clayColorToRaylibColor :: proc(color: clay.Color) -> raylib.Color {
|
|||||||
|
|
||||||
raylibFonts := [10]RaylibFont{}
|
raylibFonts := [10]RaylibFont{}
|
||||||
|
|
||||||
measureText :: proc "c" (text: ^clay.String, config: ^clay.TextElementConfig) -> clay.Dimensions {
|
measureText :: proc "c" (text: clay.StringSlice, config: ^clay.TextElementConfig, userData: uintptr) -> clay.Dimensions {
|
||||||
// Measure string size for Font
|
// Measure string size for Font
|
||||||
textSize: clay.Dimensions = {0, 0}
|
textSize: clay.Dimensions = {0, 0}
|
||||||
|
|
||||||
|
41
clay.h
41
clay.h
@ -1,4 +1,4 @@
|
|||||||
// VERSION: 0.11
|
// VERSION: 0.12
|
||||||
|
|
||||||
/*
|
/*
|
||||||
NOTE: In order to use this library you must define
|
NOTE: In order to use this library you must define
|
||||||
@ -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,8 +534,8 @@ 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));
|
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));
|
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);
|
||||||
bool Clay_IsDebugModeEnabled(void);
|
bool Clay_IsDebugModeEnabled(void);
|
||||||
@ -1407,6 +1414,8 @@ struct Clay_Context {
|
|||||||
uint32_t debugSelectedElementId;
|
uint32_t debugSelectedElementId;
|
||||||
uint32_t generation;
|
uint32_t generation;
|
||||||
uintptr_t arenaResetOffset;
|
uintptr_t arenaResetOffset;
|
||||||
|
uintptr_t mesureTextUserData;
|
||||||
|
uintptr_t queryScrollOffsetUserData;
|
||||||
Clay_Arena internalArena;
|
Clay_Arena internalArena;
|
||||||
// Layout Elements / Render Commands
|
// Layout Elements / Render Commands
|
||||||
Clay_LayoutElementArray layoutElements;
|
Clay_LayoutElementArray layoutElements;
|
||||||
@ -1480,11 +1489,11 @@ 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);
|
__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);
|
__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);
|
Clay_Dimensions (*Clay__MeasureText)(Clay_StringSlice text, Clay_TextElementConfig *config, uintptr_t userData);
|
||||||
Clay_Vector2 (*Clay__QueryScrollOffset)(uint32_t elementId);
|
Clay_Vector2 (*Clay__QueryScrollOffset)(uint32_t elementId, uintptr_t userData);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Clay_LayoutElement* Clay__GetOpenLayoutElement(void) {
|
Clay_LayoutElement* Clay__GetOpenLayoutElement(void) {
|
||||||
@ -1699,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).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) {
|
||||||
@ -1716,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);
|
|
||||||
measuredHeight = CLAY__MAX(measuredHeight, dimensions.height);
|
measuredHeight = CLAY__MAX(measuredHeight, dimensions.height);
|
||||||
if (current == ' ') {
|
if (current == ' ') {
|
||||||
dimensions.width += spaceWidth;
|
dimensions.width += spaceWidth;
|
||||||
@ -1739,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);
|
|
||||||
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);
|
||||||
@ -1902,7 +1909,7 @@ void Clay__ElementPostConfiguration(void) {
|
|||||||
scrollOffset = Clay__ScrollContainerDataInternalArray_Add(&context->scrollContainerDatas, CLAY__INIT(Clay__ScrollContainerDataInternal){.layoutElement = openLayoutElement, .scrollOrigin = {-1,-1}, .elementId = openLayoutElement->id, .openThisFrame = true});
|
scrollOffset = Clay__ScrollContainerDataInternalArray_Add(&context->scrollContainerDatas, CLAY__INIT(Clay__ScrollContainerDataInternal){.layoutElement = openLayoutElement, .scrollOrigin = {-1,-1}, .elementId = openLayoutElement->id, .openThisFrame = true});
|
||||||
}
|
}
|
||||||
if (context->externalScrollHandlingEnabled) {
|
if (context->externalScrollHandlingEnabled) {
|
||||||
scrollOffset->scrollPosition = Clay__QueryScrollOffset(scrollOffset->elementId);
|
scrollOffset->scrollPosition = Clay__QueryScrollOffset(scrollOffset->elementId, context->queryScrollOffsetUserData);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3678,11 +3685,15 @@ 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)) {
|
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;
|
Clay__MeasureText = measureTextFunction;
|
||||||
|
context->mesureTextUserData = userData;
|
||||||
}
|
}
|
||||||
void Clay_SetQueryScrollOffsetFunction(Clay_Vector2 (*queryScrollOffsetFunction)(uint32_t elementId)) {
|
void Clay_SetQueryScrollOffsetFunction(Clay_Vector2 (*queryScrollOffsetFunction)(uint32_t elementId, uintptr_t userData), uintptr_t userData) {
|
||||||
|
Clay_Context* context = Clay_GetCurrentContext();
|
||||||
Clay__QueryScrollOffset = queryScrollOffsetFunction;
|
Clay__QueryScrollOffset = queryScrollOffsetFunction;
|
||||||
|
context->queryScrollOffsetUserData = userData;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -299,7 +299,10 @@ int main(int argc, char *argv[]) {
|
|||||||
fprintf(stderr, "Error: could not load font: %s\n", TTF_GetError());
|
fprintf(stderr, "Error: could not load font: %s\n", TTF_GetError());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
SDL2_fonts[FONT_ID_BODY_16] = (SDL2_Font) {
|
|
||||||
|
SDL2_Font fonts[1] = {};
|
||||||
|
|
||||||
|
fonts[FONT_ID_BODY_16] = (SDL2_Font) {
|
||||||
.fontId = FONT_ID_BODY_16,
|
.fontId = FONT_ID_BODY_16,
|
||||||
.font = font,
|
.font = font,
|
||||||
};
|
};
|
||||||
@ -315,12 +318,13 @@ int main(int argc, char *argv[]) {
|
|||||||
uint64_t totalMemorySize = Clay_MinMemorySize();
|
uint64_t totalMemorySize = Clay_MinMemorySize();
|
||||||
Clay_Arena clayMemory = Clay_CreateArenaWithCapacityAndMemory(totalMemorySize, malloc(totalMemorySize));
|
Clay_Arena clayMemory = Clay_CreateArenaWithCapacityAndMemory(totalMemorySize, malloc(totalMemorySize));
|
||||||
|
|
||||||
Clay_SetMeasureTextFunction(SDL2_MeasureText);
|
|
||||||
|
|
||||||
int windowWidth = 0;
|
int windowWidth = 0;
|
||||||
int windowHeight = 0;
|
int windowHeight = 0;
|
||||||
SDL_GetWindowSize(window, &windowWidth, &windowHeight);
|
SDL_GetWindowSize(window, &windowWidth, &windowHeight);
|
||||||
Clay_Initialize(clayMemory, (Clay_Dimensions) { (float)windowWidth, (float)windowHeight }, (Clay_ErrorHandler) { HandleClayErrors });
|
Clay_Initialize(clayMemory, (Clay_Dimensions) { (float)windowWidth, (float)windowHeight }, (Clay_ErrorHandler) { HandleClayErrors });
|
||||||
|
|
||||||
|
Clay_SetMeasureTextFunction(SDL2_MeasureText, (uintptr_t)&fonts);
|
||||||
|
|
||||||
Uint64 NOW = SDL_GetPerformanceCounter();
|
Uint64 NOW = SDL_GetPerformanceCounter();
|
||||||
Uint64 LAST = 0;
|
Uint64 LAST = 0;
|
||||||
double deltaTime = 0;
|
double deltaTime = 0;
|
||||||
@ -361,7 +365,7 @@ int main(int argc, char *argv[]) {
|
|||||||
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
|
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
|
||||||
SDL_RenderClear(renderer);
|
SDL_RenderClear(renderer);
|
||||||
|
|
||||||
Clay_SDL2_Render(renderer, renderCommands);
|
Clay_SDL2_Render(renderer, renderCommands, fonts);
|
||||||
|
|
||||||
SDL_RenderPresent(renderer);
|
SDL_RenderPresent(renderer);
|
||||||
}
|
}
|
||||||
|
@ -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,12 +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)
|
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());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,8 +114,8 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
|
|||||||
|
|
||||||
int width, height;
|
int width, height;
|
||||||
SDL_GetWindowSize(state->window, &width, &height);
|
SDL_GetWindowSize(state->window, &width, &height);
|
||||||
Clay_SetMeasureTextFunction(SDL_MeasureText);
|
|
||||||
Clay_Initialize(clayMemory, (Clay_Dimensions) { (float) width, (float) height }, (Clay_ErrorHandler) { HandleClayErrors });
|
Clay_Initialize(clayMemory, (Clay_Dimensions) { (float) width, (float) height }, (Clay_ErrorHandler) { HandleClayErrors });
|
||||||
|
Clay_SetMeasureTextFunction(SDL_MeasureText, 0);
|
||||||
|
|
||||||
*appstate = state;
|
*appstate = state;
|
||||||
return SDL_APP_CONTINUE;
|
return SDL_APP_CONTINUE;
|
||||||
|
@ -314,7 +314,7 @@
|
|||||||
|
|
||||||
const importObject = {
|
const importObject = {
|
||||||
clay: {
|
clay: {
|
||||||
measureTextFunction: (addressOfDimensions, textToMeasure, addressOfConfig) => {
|
measureTextFunction: (addressOfDimensions, textToMeasure, addressOfConfig, userData) => {
|
||||||
let stringLength = memoryDataView.getUint32(textToMeasure, true);
|
let stringLength = memoryDataView.getUint32(textToMeasure, true);
|
||||||
let pointerToString = memoryDataView.getUint32(textToMeasure + 4, true);
|
let pointerToString = memoryDataView.getUint32(textToMeasure + 4, true);
|
||||||
let textConfig = readStructAtAddress(addressOfConfig, textConfigDefinition);
|
let textConfig = readStructAtAddress(addressOfConfig, textConfigDefinition);
|
||||||
|
Binary file not shown.
@ -314,7 +314,7 @@
|
|||||||
|
|
||||||
const importObject = {
|
const importObject = {
|
||||||
clay: {
|
clay: {
|
||||||
measureTextFunction: (addressOfDimensions, textToMeasure, addressOfConfig) => {
|
measureTextFunction: (addressOfDimensions, textToMeasure, addressOfConfig, userData) => {
|
||||||
let stringLength = memoryDataView.getUint32(textToMeasure, true);
|
let stringLength = memoryDataView.getUint32(textToMeasure, true);
|
||||||
let pointerToString = memoryDataView.getUint32(textToMeasure + 4, true);
|
let pointerToString = memoryDataView.getUint32(textToMeasure + 4, true);
|
||||||
let textConfig = readStructAtAddress(addressOfConfig, textConfigDefinition);
|
let textConfig = readStructAtAddress(addressOfConfig, textConfigDefinition);
|
||||||
|
@ -84,7 +84,7 @@ int main(void) {
|
|||||||
.width = GetScreenWidth(),
|
.width = GetScreenWidth(),
|
||||||
.height = GetScreenHeight()
|
.height = GetScreenHeight()
|
||||||
}, (Clay_ErrorHandler) { HandleClayErrors }); // This final argument is new since the video was published
|
}, (Clay_ErrorHandler) { HandleClayErrors }); // This final argument is new since the video was published
|
||||||
Clay_SetMeasureTextFunction(Raylib_MeasureText);
|
Clay_SetMeasureTextFunction(Raylib_MeasureText, 0);
|
||||||
Raylib_fonts[FONT_ID_BODY_16] = (Raylib_Font) {
|
Raylib_fonts[FONT_ID_BODY_16] = (Raylib_Font) {
|
||||||
.font = LoadFontEx("resources/Roboto-Regular.ttf", 48, 0, 400),
|
.font = LoadFontEx("resources/Roboto-Regular.ttf", 48, 0, 400),
|
||||||
.fontId = FONT_ID_BODY_16
|
.fontId = FONT_ID_BODY_16
|
||||||
@ -141,7 +141,7 @@ int main(void) {
|
|||||||
.height = CLAY_SIZING_FIXED(60),
|
.height = CLAY_SIZING_FIXED(60),
|
||||||
.width = CLAY_SIZING_GROW(0)
|
.width = CLAY_SIZING_GROW(0)
|
||||||
},
|
},
|
||||||
.padding = { 16 },
|
.padding = { 16, 16, 0, 0 },
|
||||||
.childGap = 16,
|
.childGap = 16,
|
||||||
.childAlignment = {
|
.childAlignment = {
|
||||||
.y = CLAY_ALIGN_Y_CENTER
|
.y = CLAY_ALIGN_Y_CENTER
|
||||||
@ -151,7 +151,7 @@ int main(void) {
|
|||||||
// Header buttons go here
|
// Header buttons go here
|
||||||
CLAY(
|
CLAY(
|
||||||
CLAY_ID("FileButton"),
|
CLAY_ID("FileButton"),
|
||||||
CLAY_LAYOUT({ .padding = { 16, 8 }}),
|
CLAY_LAYOUT({ .padding = { 16, 16, 8, 8 }}),
|
||||||
CLAY_RECTANGLE({
|
CLAY_RECTANGLE({
|
||||||
.color = { 140, 140, 140, 255 },
|
.color = { 140, 140, 140, 255 },
|
||||||
.cornerRadius = 5
|
.cornerRadius = 5
|
||||||
@ -177,7 +177,7 @@ int main(void) {
|
|||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
CLAY_LAYOUT({
|
CLAY_LAYOUT({
|
||||||
.padding = {0, 8 }
|
.padding = {0, 0, 8, 8 }
|
||||||
})
|
})
|
||||||
) {
|
) {
|
||||||
CLAY(
|
CLAY(
|
||||||
|
@ -247,7 +247,7 @@ int main(void) {
|
|||||||
.height = GetScreenHeight() / 2
|
.height = GetScreenHeight() / 2
|
||||||
}, (Clay_ErrorHandler) { HandleClayErrors }); // This final argument is new since the video was published
|
}, (Clay_ErrorHandler) { HandleClayErrors }); // This final argument is new since the video was published
|
||||||
|
|
||||||
Clay_SetMeasureTextFunction(Raylib_MeasureText);
|
Clay_SetMeasureTextFunction(Raylib_MeasureText, 0);
|
||||||
Raylib_fonts[FONT_ID_BODY_16] = (Raylib_Font) {
|
Raylib_fonts[FONT_ID_BODY_16] = (Raylib_Font) {
|
||||||
.font = LoadFontEx("resources/Roboto-Regular.ttf", 48, 0, 400),
|
.font = LoadFontEx("resources/Roboto-Regular.ttf", 48, 0, 400),
|
||||||
.fontId = FONT_ID_BODY_16
|
.fontId = FONT_ID_BODY_16
|
||||||
|
@ -218,8 +218,8 @@ void HandleClayErrors(Clay_ErrorData errorData) {
|
|||||||
int main(void) {
|
int main(void) {
|
||||||
uint64_t totalMemorySize = Clay_MinMemorySize();
|
uint64_t totalMemorySize = Clay_MinMemorySize();
|
||||||
Clay_Arena clayMemory = Clay_CreateArenaWithCapacityAndMemory(totalMemorySize, malloc(totalMemorySize));
|
Clay_Arena clayMemory = Clay_CreateArenaWithCapacityAndMemory(totalMemorySize, malloc(totalMemorySize));
|
||||||
Clay_SetMeasureTextFunction(Raylib_MeasureText);
|
|
||||||
Clay_Initialize(clayMemory, (Clay_Dimensions) { (float)GetScreenWidth(), (float)GetScreenHeight() }, (Clay_ErrorHandler) { HandleClayErrors });
|
Clay_Initialize(clayMemory, (Clay_Dimensions) { (float)GetScreenWidth(), (float)GetScreenHeight() }, (Clay_ErrorHandler) { HandleClayErrors });
|
||||||
|
Clay_SetMeasureTextFunction(Raylib_MeasureText, 0);
|
||||||
Clay_Raylib_Initialize(1024, 768, "Clay - Raylib Renderer Example", FLAG_VSYNC_HINT | FLAG_WINDOW_RESIZABLE | FLAG_WINDOW_HIGHDPI | FLAG_MSAA_4X_HINT);
|
Clay_Raylib_Initialize(1024, 768, "Clay - Raylib Renderer Example", FLAG_VSYNC_HINT | FLAG_WINDOW_RESIZABLE | FLAG_WINDOW_HIGHDPI | FLAG_MSAA_4X_HINT);
|
||||||
profilePicture = LoadTextureFromImage(LoadImage("resources/profile-picture.png"));
|
profilePicture = LoadTextureFromImage(LoadImage("resources/profile-picture.png"));
|
||||||
Raylib_fonts[FONT_ID_BODY_24] = (Raylib_Font) {
|
Raylib_fonts[FONT_ID_BODY_24] = (Raylib_Font) {
|
||||||
|
@ -12,13 +12,14 @@ typedef struct
|
|||||||
TTF_Font *font;
|
TTF_Font *font;
|
||||||
} SDL2_Font;
|
} SDL2_Font;
|
||||||
|
|
||||||
static SDL2_Font SDL2_fonts[1];
|
|
||||||
|
|
||||||
static Clay_Dimensions SDL2_MeasureText(Clay_String *text, Clay_TextElementConfig *config)
|
static Clay_Dimensions SDL2_MeasureText(Clay_StringSlice text, Clay_TextElementConfig *config, uintptr_t userData)
|
||||||
{
|
{
|
||||||
TTF_Font *font = SDL2_fonts[config->fontId].font;
|
SDL2_Font *fonts = (SDL2_Font*)userData;
|
||||||
char *chars = (char *)calloc(text->length + 1, 1);
|
|
||||||
memcpy(chars, text->chars, text->length);
|
TTF_Font *font = fonts[config->fontId].font;
|
||||||
|
char *chars = (char *)calloc(text.length + 1, 1);
|
||||||
|
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) {
|
||||||
@ -34,7 +35,7 @@ static Clay_Dimensions SDL2_MeasureText(Clay_String *text, Clay_TextElementConfi
|
|||||||
|
|
||||||
SDL_Rect currentClippingRectangle;
|
SDL_Rect currentClippingRectangle;
|
||||||
|
|
||||||
static void Clay_SDL2_Render(SDL_Renderer *renderer, Clay_RenderCommandArray renderCommands)
|
static void Clay_SDL2_Render(SDL_Renderer *renderer, Clay_RenderCommandArray renderCommands, SDL2_Font *fonts)
|
||||||
{
|
{
|
||||||
for (uint32_t i = 0; i < renderCommands.length; i++)
|
for (uint32_t i = 0; i < renderCommands.length; i++)
|
||||||
{
|
{
|
||||||
@ -60,7 +61,7 @@ static void Clay_SDL2_Render(SDL_Renderer *renderer, Clay_RenderCommandArray ren
|
|||||||
Clay_String text = renderCommand->text;
|
Clay_String text = renderCommand->text;
|
||||||
char *cloned = (char *)calloc(text.length + 1, 1);
|
char *cloned = (char *)calloc(text.length + 1, 1);
|
||||||
memcpy(cloned, text.chars, text.length);
|
memcpy(cloned, text.chars, text.length);
|
||||||
TTF_Font* font = SDL2_fonts[config->fontId].font;
|
TTF_Font* font = fonts[config->fontId].font;
|
||||||
SDL_Surface *surface = TTF_RenderUTF8_Blended(font, cloned, (SDL_Color) {
|
SDL_Surface *surface = TTF_RenderUTF8_Blended(font, cloned, (SDL_Color) {
|
||||||
.r = (Uint8)config->textColor.r,
|
.r = (Uint8)config->textColor.r,
|
||||||
.g = (Uint8)config->textColor.g,
|
.g = (Uint8)config->textColor.g,
|
||||||
|
@ -83,7 +83,7 @@ static inline char *Clay_Cairo__NullTerminate(Clay_String *str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Measure text using cairo's *toy* text API.
|
// Measure text using cairo's *toy* text API.
|
||||||
static inline Clay_Dimensions Clay_Cairo_MeasureText(Clay_String *str, Clay_TextElementConfig *config) {
|
static inline Clay_Dimensions Clay_Cairo_MeasureText(Clay_String *str, Clay_TextElementConfig *config, uintptr_t userData) {
|
||||||
// Edge case: Clay computes the width of a whitespace character
|
// Edge case: Clay computes the width of a whitespace character
|
||||||
// once. Cairo does not factor in whitespaces when computing text
|
// once. Cairo does not factor in whitespaces when computing text
|
||||||
// extents, this edge-case serves as a short-circuit to introduce
|
// extents, this edge-case serves as a short-circuit to introduce
|
||||||
|
@ -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) {
|
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