From be99977da635ddd49c03490f4a6c7e37b714339e Mon Sep 17 00:00:00 2001 From: Stowy Date: Thu, 9 Jan 2025 23:51:58 +0100 Subject: [PATCH] Added linux bindings --- bindings/jai/.gitignore | 1 + bindings/jai/clay-jai/generate.jai | 38 +- bindings/jai/clay-jai/linux.jai | 711 ++++++++++++++++++ bindings/jai/clay-jai/linux/clay.a | Bin 0 -> 273726 bytes bindings/jai/clay-jai/module.jai | 10 +- .../introducing_clay_video_demo/main.jai | 3 +- 6 files changed, 751 insertions(+), 12 deletions(-) create mode 100644 bindings/jai/clay-jai/linux.jai create mode 100644 bindings/jai/clay-jai/linux/clay.a diff --git a/bindings/jai/.gitignore b/bindings/jai/.gitignore index b70d1fb..7e0a8cf 100644 --- a/bindings/jai/.gitignore +++ b/bindings/jai/.gitignore @@ -2,3 +2,4 @@ main.exe main.pdb main.rdi +main \ No newline at end of file diff --git a/bindings/jai/clay-jai/generate.jai b/bindings/jai/clay-jai/generate.jai index 5373558..3bceba4 100644 --- a/bindings/jai/clay-jai/generate.jai +++ b/bindings/jai/clay-jai/generate.jai @@ -18,12 +18,14 @@ DECLARATIONS_TO_OMIT :: string.[ ]; #if AT_COMPILE_TIME { - #run,stallable { - Compiler.set_build_options_dc(.{do_output=false}); - options := Compiler.get_build_options(); - args := options.compile_time_command_line; - if !generate_bindings(args, options.minimum_os_version) { - Compiler.compiler_set_workspace_status(.FAILED); + #if !#exists(JAILS_DIAGNOSTICS_BUILD) { + #run,stallable { + Compiler.set_build_options_dc(.{do_output=false}); + options := Compiler.get_build_options(); + args := options.compile_time_command_line; + if !generate_bindings(args, options.minimum_os_version) { + Compiler.compiler_set_workspace_status(.FAILED); + } } } } else { @@ -50,6 +52,7 @@ generate_bindings :: (args: [] string, minimum_os_version: type_of(Compiler.Buil success := true; #if OS == .WINDOWS { + // TODO try to use BuildCpp module again File.make_directory_if_it_does_not_exist("windows", true); command := ifx compile_debug { @@ -67,9 +70,15 @@ generate_bindings :: (args: [] string, minimum_os_version: type_of(Compiler.Buil command = Process.break_command_into_strings("llvm-ar -rcs windows/clay.lib clay.o"); result = Process.run_command(..command, capture_and_return_output=true, print_captured_output=true); if result.exit_code != 0 then return false; + } else #if OS == .LINUX { + File.make_directory_if_it_does_not_exist("linux", true); + + could_build := BuildCpp.build_cpp_static_lib("linux/clay", "source/clay.c", + debug = compile_debug, + ); + assert(could_build); } else { // TODO MacOS - // TODO Linux assert(false); } @@ -80,11 +89,16 @@ generate_bindings :: (args: [] string, minimum_os_version: type_of(Compiler.Buil output_filename: string; options: Generator.Generate_Bindings_Options; { + write_string("Generating bindings...\n"); + using options; #if OS == .WINDOWS { array_add(*libpaths, "windows"); output_filename = "windows.jai"; + } else #if OS == .LINUX { + array_add(*libpaths, "linux"); + output_filename = "linux.jai"; } else { assert(false); } @@ -113,7 +127,15 @@ clay_visitor :: (decl: *Generator.Declaration, parent_decl: *Generator.Declarati return .STOP; } + // We don't want the align and wrapper strucs + if String.begins_with(decl.name, "Clay__Align") || String.ends_with(decl.name, "Wrapper") { + decl.decl_flags |= .OMIT_FROM_OUTPUT; + return .STOP; + } + if String.begins_with(decl.name, "Clay__") { + // The way bindings generator strip prefixes mean that something like `Clay__Foo` will be turned to `Foo` + // but what we want is `_Foo` decl.output_name = String.slice(decl.name, 5, decl.name.count - 5); } } @@ -131,10 +153,10 @@ FileUtils :: #import "File_Utilities"; BuildCpp :: #import "BuildCpp"; Process :: #import "Process"; String :: #import "String"; -WindowsResources :: #import "Windows_Resources"; #if OS == .WINDOWS { Windows :: #import "Windows"; + WindowsResources :: #import "Windows_Resources"; getenv :: Windows.getenv; } else { Posix :: #import "POSIX"; diff --git a/bindings/jai/clay-jai/linux.jai b/bindings/jai/clay-jai/linux.jai new file mode 100644 index 0000000..f96617d --- /dev/null +++ b/bindings/jai/clay-jai/linux.jai @@ -0,0 +1,711 @@ +// +// This file was auto-generated using the following command: +// +// jai generate.jai - -compile +// + + + +// Utility Structs ------------------------- +// Note: Clay_String is not guaranteed to be null terminated. It may be if created from a literal C string, +// but it is also used to represent slices. +String :: struct { + length: s32; + chars: *u8; +} + +_StringArray :: struct { + capacity: s32; + length: s32; + internalArray: *String; +} + +Context :: struct {} + +Arena :: struct { + nextAllocation: u64; + capacity: u64; + memory: *u8; +} + +Dimensions :: struct { + width: float; + height: float; +} + +Color :: struct { + r: float; + g: float; + b: float; + a: float; +} + +BoundingBox :: struct { + x: float; + y: float; + width: float; + height: float; +} + +// baseId + offset = id +ElementId :: struct { + id: u32; + offset: u32; + baseId: u32; + stringId: String; +} + +CornerRadius :: struct { + topLeft: float; + topRight: float; + bottomLeft: float; + bottomRight: float; +} + +LayoutDirection :: enum u8 { + LEFT_TO_RIGHT :: 0; + TOP_TO_BOTTOM :: 1; + CLAY_LEFT_TO_RIGHT :: LEFT_TO_RIGHT; + CLAY_TOP_TO_BOTTOM :: TOP_TO_BOTTOM; +} + +LayoutAlignmentX :: enum u8 { + LEFT :: 0; + RIGHT :: 1; + CENTER :: 2; + CLAY_ALIGN_X_LEFT :: LEFT; + CLAY_ALIGN_X_RIGHT :: RIGHT; + CLAY_ALIGN_X_CENTER :: CENTER; +} + +LayoutAlignmentY :: enum u8 { + TOP :: 0; + BOTTOM :: 1; + CENTER :: 2; + CLAY_ALIGN_Y_TOP :: TOP; + CLAY_ALIGN_Y_BOTTOM :: BOTTOM; + CLAY_ALIGN_Y_CENTER :: CENTER; +} + +_SizingType :: enum u8 { + FIT :: 0; + GROW :: 1; + PERCENT :: 2; + FIXED :: 3; + CLAY__SIZING_TYPE_FIT :: FIT; + CLAY__SIZING_TYPE_GROW :: GROW; + CLAY__SIZING_TYPE_PERCENT :: PERCENT; + CLAY__SIZING_TYPE_FIXED :: FIXED; +} + +ChildAlignment :: struct { + x: LayoutAlignmentX; + y: LayoutAlignmentY; +} + +SizingMinMax :: struct { + min: float; + max: float; +} + +SizingAxis :: struct { + size: union { + minMax: SizingMinMax; + percent: float; + }; + type: _SizingType; +} + +Sizing :: struct { + width: SizingAxis; + height: SizingAxis; +} + +Padding :: struct { + x: u16; + y: u16; +} + +LayoutConfig :: struct { + sizing: Sizing; + padding: Padding; + childGap: u16; + childAlignment: ChildAlignment; + layoutDirection: LayoutDirection; +} + +CLAY_LAYOUT_DEFAULT: LayoutConfig #elsewhere clay; + +// Rectangle +// NOTE: Not declared in the typedef as an ifdef inside macro arguments is UB +RectangleElementConfig :: struct { + color: Color; + cornerRadius: CornerRadius; +} + +// Text +TextElementConfigWrapMode :: enum u32 { + WORDS :: 0; + NEWLINES :: 1; + NONE :: 2; + CLAY_TEXT_WRAP_WORDS :: WORDS; + CLAY_TEXT_WRAP_NEWLINES :: NEWLINES; + CLAY_TEXT_WRAP_NONE :: NONE; +} + +TextElementConfig :: struct { + textColor: Color; + fontId: u16; + fontSize: u16; + letterSpacing: u16; + lineHeight: u16; + wrapMode: TextElementConfigWrapMode; +} + +// Image +ImageElementConfig :: struct { + imageData: *void; + sourceDimensions: Dimensions; +} + +FloatingAttachPointType :: enum u8 { + LEFT_TOP :: 0; + LEFT_CENTER :: 1; + LEFT_BOTTOM :: 2; + CENTER_TOP :: 3; + CENTER_CENTER :: 4; + CENTER_BOTTOM :: 5; + RIGHT_TOP :: 6; + RIGHT_CENTER :: 7; + RIGHT_BOTTOM :: 8; + CLAY_ATTACH_POINT_LEFT_TOP :: LEFT_TOP; + CLAY_ATTACH_POINT_LEFT_CENTER :: LEFT_CENTER; + CLAY_ATTACH_POINT_LEFT_BOTTOM :: LEFT_BOTTOM; + CLAY_ATTACH_POINT_CENTER_TOP :: CENTER_TOP; + CLAY_ATTACH_POINT_CENTER_CENTER :: CENTER_CENTER; + CLAY_ATTACH_POINT_CENTER_BOTTOM :: CENTER_BOTTOM; + CLAY_ATTACH_POINT_RIGHT_TOP :: RIGHT_TOP; + CLAY_ATTACH_POINT_RIGHT_CENTER :: RIGHT_CENTER; + CLAY_ATTACH_POINT_RIGHT_BOTTOM :: RIGHT_BOTTOM; +} + +FloatingAttachPoints :: struct { + element: FloatingAttachPointType; + parent: FloatingAttachPointType; +} + +PointerCaptureMode :: enum u32 { + CAPTURE :: 0; + PASSTHROUGH :: 1; + CLAY_POINTER_CAPTURE_MODE_CAPTURE :: CAPTURE; + CLAY_POINTER_CAPTURE_MODE_PASSTHROUGH :: PASSTHROUGH; +} + +FloatingElementConfig :: struct { + offset: Vector2; + expand: Dimensions; + zIndex: u16; + parentId: u32; + attachment: FloatingAttachPoints; + pointerCaptureMode: PointerCaptureMode; +} + +// Custom +CustomElementConfig :: struct { + customData: *void; +} + +// Scroll +ScrollElementConfig :: struct { + horizontal: bool; + vertical: bool; +} + +ElementConfigUnion :: union { + rectangleElementConfig: *RectangleElementConfig; + textElementConfig: *TextElementConfig; + imageElementConfig: *ImageElementConfig; + floatingElementConfig: *FloatingElementConfig; + customElementConfig: *CustomElementConfig; + scrollElementConfig: *ScrollElementConfig; + borderElementConfig: *BorderElementConfig; +} + +ElementConfig :: struct { + type: ElementConfigType; + config: ElementConfigUnion; +} + +// Miscellaneous Structs & Enums --------------------------------- +ScrollContainerData :: struct { + // Note: This is a pointer to the real internal scroll position, mutating it may cause a change in final layout. + // Intended for use with external functionality that modifies scroll position, such as scroll bars or auto scrolling. + scrollPosition: *Vector2; + scrollContainerDimensions: Dimensions; + contentDimensions: Dimensions; + config: ScrollElementConfig; + found: bool; +} + +RenderCommandType :: enum u8 { + NONE :: 0; + RECTANGLE :: 1; + BORDER :: 2; + TEXT :: 3; + IMAGE :: 4; + SCISSOR_START :: 5; + SCISSOR_END :: 6; + CUSTOM :: 7; + CLAY_RENDER_COMMAND_TYPE_NONE :: NONE; + CLAY_RENDER_COMMAND_TYPE_RECTANGLE :: RECTANGLE; + CLAY_RENDER_COMMAND_TYPE_BORDER :: BORDER; + CLAY_RENDER_COMMAND_TYPE_TEXT :: TEXT; + CLAY_RENDER_COMMAND_TYPE_IMAGE :: IMAGE; + CLAY_RENDER_COMMAND_TYPE_SCISSOR_START :: SCISSOR_START; + CLAY_RENDER_COMMAND_TYPE_SCISSOR_END :: SCISSOR_END; + CLAY_RENDER_COMMAND_TYPE_CUSTOM :: CUSTOM; +} + +RenderCommand :: struct { + boundingBox: BoundingBox; + config: ElementConfigUnion; + text: String; // TODO I wish there was a way to avoid having to have this on every render command + id: u32; + commandType: RenderCommandType; +} + +RenderCommandArray :: struct { + capacity: s32; + length: s32; + internalArray: *RenderCommand; +} + +PointerDataInteractionState :: enum u32 { + PRESSED_THIS_FRAME :: 0; + PRESSED :: 1; + RELEASED_THIS_FRAME :: 2; + RELEASED :: 3; + CLAY_POINTER_DATA_PRESSED_THIS_FRAME :: PRESSED_THIS_FRAME; + CLAY_POINTER_DATA_PRESSED :: PRESSED; + CLAY_POINTER_DATA_RELEASED_THIS_FRAME :: RELEASED_THIS_FRAME; + CLAY_POINTER_DATA_RELEASED :: RELEASED; +} + +PointerData :: struct { + position: Vector2; + state: PointerDataInteractionState; +} + +ErrorType :: enum u32 { + TEXT_MEASUREMENT_FUNCTION_NOT_PROVIDED :: 0; + ARENA_CAPACITY_EXCEEDED :: 1; + ELEMENTS_CAPACITY_EXCEEDED :: 2; + TEXT_MEASUREMENT_CAPACITY_EXCEEDED :: 3; + DUPLICATE_ID :: 4; + FLOATING_CONTAINER_PARENT_NOT_FOUND :: 5; + INTERNAL_ERROR :: 6; + CLAY_ERROR_TYPE_TEXT_MEASUREMENT_FUNCTION_NOT_PROVIDED :: TEXT_MEASUREMENT_FUNCTION_NOT_PROVIDED; + CLAY_ERROR_TYPE_ARENA_CAPACITY_EXCEEDED :: ARENA_CAPACITY_EXCEEDED; + CLAY_ERROR_TYPE_ELEMENTS_CAPACITY_EXCEEDED :: ELEMENTS_CAPACITY_EXCEEDED; + CLAY_ERROR_TYPE_TEXT_MEASUREMENT_CAPACITY_EXCEEDED :: TEXT_MEASUREMENT_CAPACITY_EXCEEDED; + CLAY_ERROR_TYPE_DUPLICATE_ID :: DUPLICATE_ID; + CLAY_ERROR_TYPE_FLOATING_CONTAINER_PARENT_NOT_FOUND :: FLOATING_CONTAINER_PARENT_NOT_FOUND; + CLAY_ERROR_TYPE_INTERNAL_ERROR :: INTERNAL_ERROR; +} + +ErrorData :: struct { + errorType: ErrorType; + errorText: String; + userData: u64; +} + +ErrorHandler :: struct { + errorHandlerFunction: #type (errorText: ErrorData) -> void #c_call; + userData: u64; +} + +// Function Forward Declarations --------------------------------- +// Public API functions --- +MinMemorySize :: () -> u32 #foreign clay "Clay_MinMemorySize"; +CreateArenaWithCapacityAndMemory :: (capacity: u32, offset: *void) -> Arena #foreign clay "Clay_CreateArenaWithCapacityAndMemory"; +SetPointerState :: (position: Vector2, pointerDown: bool) -> void #foreign clay "Clay_SetPointerState"; +Initialize :: (arena: Arena, layoutDimensions: Dimensions, errorHandler: ErrorHandler) -> *Context #foreign clay "Clay_Initialize"; +GetCurrentContext :: () -> *Context #foreign clay "Clay_GetCurrentContext"; +SetCurrentContext :: (_context: *Context) -> void #foreign clay "Clay_SetCurrentContext"; +UpdateScrollContainers :: (enableDragScrolling: bool, scrollDelta: Vector2, deltaTime: float) -> void #foreign clay "Clay_UpdateScrollContainers"; +SetLayoutDimensions :: (dimensions: Dimensions) -> void #foreign clay "Clay_SetLayoutDimensions"; +BeginLayout :: () -> void #foreign clay "Clay_BeginLayout"; +EndLayout :: () -> RenderCommandArray #foreign clay "Clay_EndLayout"; +GetElementId :: (idString: String) -> ElementId #foreign clay "Clay_GetElementId"; +GetElementIdWithIndex :: (idString: String, index: u32) -> ElementId #foreign clay "Clay_GetElementIdWithIndex"; + +PointerOver :: (elementId: ElementId) -> bool #foreign clay "Clay_PointerOver"; +GetScrollContainerData :: (id: ElementId) -> ScrollContainerData #foreign clay "Clay_GetScrollContainerData"; +SetMeasureTextFunction :: (measureTextFunction: #type (text: *String, config: *TextElementConfig) -> Dimensions #c_call) -> void #foreign clay "Clay_SetMeasureTextFunction"; +SetQueryScrollOffsetFunction :: (queryScrollOffsetFunction: #type (elementId: u32) -> Vector2 #c_call) -> void #foreign clay "Clay_SetQueryScrollOffsetFunction"; +RenderCommandArray_Get :: (array: *RenderCommandArray, index: s32) -> *RenderCommand #foreign clay "Clay_RenderCommandArray_Get"; +SetDebugModeEnabled :: (enabled: bool) -> void #foreign clay "Clay_SetDebugModeEnabled"; +IsDebugModeEnabled :: () -> bool #foreign clay "Clay_IsDebugModeEnabled"; +SetCullingEnabled :: (enabled: bool) -> void #foreign clay "Clay_SetCullingEnabled"; +GetMaxElementCount :: () -> s32 #foreign clay "Clay_GetMaxElementCount"; +SetMaxElementCount :: (maxElementCount: s32) -> void #foreign clay "Clay_SetMaxElementCount"; +GetMaxMeasureTextCacheWordCount :: () -> s32 #foreign clay "Clay_GetMaxMeasureTextCacheWordCount"; +SetMaxMeasureTextCacheWordCount :: (maxMeasureTextCacheWordCount: s32) -> void #foreign clay "Clay_SetMaxMeasureTextCacheWordCount"; + +// Internal API functions required by macros +_OpenElement :: () -> void #foreign clay "Clay__OpenElement"; +_CloseElement :: () -> void #foreign clay "Clay__CloseElement"; +_StoreLayoutConfig :: (config: LayoutConfig) -> *LayoutConfig #foreign clay "Clay__StoreLayoutConfig"; +_ElementPostConfiguration :: () -> void #foreign clay "Clay__ElementPostConfiguration"; +_AttachId :: (id: ElementId) -> void #foreign clay "Clay__AttachId"; +_AttachLayoutConfig :: (config: *LayoutConfig) -> void #foreign clay "Clay__AttachLayoutConfig"; +_AttachElementConfig :: (config: ElementConfigUnion, type: ElementConfigType) -> void #foreign clay "Clay__AttachElementConfig"; +_StoreRectangleElementConfig :: (config: RectangleElementConfig) -> *RectangleElementConfig #foreign clay "Clay__StoreRectangleElementConfig"; +_StoreTextElementConfig :: (config: TextElementConfig) -> *TextElementConfig #foreign clay "Clay__StoreTextElementConfig"; +_StoreImageElementConfig :: (config: ImageElementConfig) -> *ImageElementConfig #foreign clay "Clay__StoreImageElementConfig"; +_StoreFloatingElementConfig :: (config: FloatingElementConfig) -> *FloatingElementConfig #foreign clay "Clay__StoreFloatingElementConfig"; +_StoreCustomElementConfig :: (config: CustomElementConfig) -> *CustomElementConfig #foreign clay "Clay__StoreCustomElementConfig"; +_StoreScrollElementConfig :: (config: ScrollElementConfig) -> *ScrollElementConfig #foreign clay "Clay__StoreScrollElementConfig"; +_StoreBorderElementConfig :: (config: BorderElementConfig) -> *BorderElementConfig #foreign clay "Clay__StoreBorderElementConfig"; +_HashString :: (key: String, offset: u32, seed: u32) -> ElementId #foreign clay "Clay__HashString"; +_OpenTextElement :: (text: String, textConfig: *TextElementConfig) -> void #foreign clay "Clay__OpenTextElement"; +_GetParentElementId :: () -> u32 #foreign clay "Clay__GetParentElementId"; + +_debugViewHighlightColor: Color #elsewhere clay "Clay__debugViewHighlightColor"; +_debugViewWidth: u32 #elsewhere clay "Clay__debugViewWidth"; + +#scope_file + +#import "Basic"; // For assert + +clay :: #library,no_dll "linux/clay"; + +#run { + { + instance: String; + assert(((cast(*void)(*instance.length)) - cast(*void)(*instance)) == 0, "String.length has unexpected offset % instead of 0", ((cast(*void)(*instance.length)) - cast(*void)(*instance))); + assert(size_of(type_of(String.length)) == 4, "String.length has unexpected size % instead of 4", size_of(type_of(String.length))); + assert(((cast(*void)(*instance.chars)) - cast(*void)(*instance)) == 8, "String.chars has unexpected offset % instead of 8", ((cast(*void)(*instance.chars)) - cast(*void)(*instance))); + assert(size_of(type_of(String.chars)) == 8, "String.chars has unexpected size % instead of 8", size_of(type_of(String.chars))); + assert(size_of(String) == 16, "String has size % instead of 16", size_of(String)); + } + + { + instance: _StringArray; + assert(((cast(*void)(*instance.capacity)) - cast(*void)(*instance)) == 0, "_StringArray.capacity has unexpected offset % instead of 0", ((cast(*void)(*instance.capacity)) - cast(*void)(*instance))); + assert(size_of(type_of(_StringArray.capacity)) == 4, "_StringArray.capacity has unexpected size % instead of 4", size_of(type_of(_StringArray.capacity))); + assert(((cast(*void)(*instance.length)) - cast(*void)(*instance)) == 4, "_StringArray.length has unexpected offset % instead of 4", ((cast(*void)(*instance.length)) - cast(*void)(*instance))); + assert(size_of(type_of(_StringArray.length)) == 4, "_StringArray.length has unexpected size % instead of 4", size_of(type_of(_StringArray.length))); + assert(((cast(*void)(*instance.internalArray)) - cast(*void)(*instance)) == 8, "_StringArray.internalArray has unexpected offset % instead of 8", ((cast(*void)(*instance.internalArray)) - cast(*void)(*instance))); + assert(size_of(type_of(_StringArray.internalArray)) == 8, "_StringArray.internalArray has unexpected size % instead of 8", size_of(type_of(_StringArray.internalArray))); + assert(size_of(_StringArray) == 16, "_StringArray has size % instead of 16", size_of(_StringArray)); + } + + { + instance: Arena; + assert(((cast(*void)(*instance.nextAllocation)) - cast(*void)(*instance)) == 0, "Arena.nextAllocation has unexpected offset % instead of 0", ((cast(*void)(*instance.nextAllocation)) - cast(*void)(*instance))); + assert(size_of(type_of(Arena.nextAllocation)) == 8, "Arena.nextAllocation has unexpected size % instead of 8", size_of(type_of(Arena.nextAllocation))); + assert(((cast(*void)(*instance.capacity)) - cast(*void)(*instance)) == 8, "Arena.capacity has unexpected offset % instead of 8", ((cast(*void)(*instance.capacity)) - cast(*void)(*instance))); + assert(size_of(type_of(Arena.capacity)) == 8, "Arena.capacity has unexpected size % instead of 8", size_of(type_of(Arena.capacity))); + assert(((cast(*void)(*instance.memory)) - cast(*void)(*instance)) == 16, "Arena.memory has unexpected offset % instead of 16", ((cast(*void)(*instance.memory)) - cast(*void)(*instance))); + assert(size_of(type_of(Arena.memory)) == 8, "Arena.memory has unexpected size % instead of 8", size_of(type_of(Arena.memory))); + assert(size_of(Arena) == 24, "Arena has size % instead of 24", size_of(Arena)); + } + + { + instance: Dimensions; + assert(((cast(*void)(*instance.width)) - cast(*void)(*instance)) == 0, "Dimensions.width has unexpected offset % instead of 0", ((cast(*void)(*instance.width)) - cast(*void)(*instance))); + assert(size_of(type_of(Dimensions.width)) == 4, "Dimensions.width has unexpected size % instead of 4", size_of(type_of(Dimensions.width))); + assert(((cast(*void)(*instance.height)) - cast(*void)(*instance)) == 4, "Dimensions.height has unexpected offset % instead of 4", ((cast(*void)(*instance.height)) - cast(*void)(*instance))); + assert(size_of(type_of(Dimensions.height)) == 4, "Dimensions.height has unexpected size % instead of 4", size_of(type_of(Dimensions.height))); + assert(size_of(Dimensions) == 8, "Dimensions has size % instead of 8", size_of(Dimensions)); + } + + { + instance: Color; + assert(((cast(*void)(*instance.r)) - cast(*void)(*instance)) == 0, "Color.r has unexpected offset % instead of 0", ((cast(*void)(*instance.r)) - cast(*void)(*instance))); + assert(size_of(type_of(Color.r)) == 4, "Color.r has unexpected size % instead of 4", size_of(type_of(Color.r))); + assert(((cast(*void)(*instance.g)) - cast(*void)(*instance)) == 4, "Color.g has unexpected offset % instead of 4", ((cast(*void)(*instance.g)) - cast(*void)(*instance))); + assert(size_of(type_of(Color.g)) == 4, "Color.g has unexpected size % instead of 4", size_of(type_of(Color.g))); + assert(((cast(*void)(*instance.b)) - cast(*void)(*instance)) == 8, "Color.b has unexpected offset % instead of 8", ((cast(*void)(*instance.b)) - cast(*void)(*instance))); + assert(size_of(type_of(Color.b)) == 4, "Color.b has unexpected size % instead of 4", size_of(type_of(Color.b))); + assert(((cast(*void)(*instance.a)) - cast(*void)(*instance)) == 12, "Color.a has unexpected offset % instead of 12", ((cast(*void)(*instance.a)) - cast(*void)(*instance))); + assert(size_of(type_of(Color.a)) == 4, "Color.a has unexpected size % instead of 4", size_of(type_of(Color.a))); + assert(size_of(Color) == 16, "Color has size % instead of 16", size_of(Color)); + } + + { + instance: BoundingBox; + assert(((cast(*void)(*instance.x)) - cast(*void)(*instance)) == 0, "BoundingBox.x has unexpected offset % instead of 0", ((cast(*void)(*instance.x)) - cast(*void)(*instance))); + assert(size_of(type_of(BoundingBox.x)) == 4, "BoundingBox.x has unexpected size % instead of 4", size_of(type_of(BoundingBox.x))); + assert(((cast(*void)(*instance.y)) - cast(*void)(*instance)) == 4, "BoundingBox.y has unexpected offset % instead of 4", ((cast(*void)(*instance.y)) - cast(*void)(*instance))); + assert(size_of(type_of(BoundingBox.y)) == 4, "BoundingBox.y has unexpected size % instead of 4", size_of(type_of(BoundingBox.y))); + assert(((cast(*void)(*instance.width)) - cast(*void)(*instance)) == 8, "BoundingBox.width has unexpected offset % instead of 8", ((cast(*void)(*instance.width)) - cast(*void)(*instance))); + assert(size_of(type_of(BoundingBox.width)) == 4, "BoundingBox.width has unexpected size % instead of 4", size_of(type_of(BoundingBox.width))); + assert(((cast(*void)(*instance.height)) - cast(*void)(*instance)) == 12, "BoundingBox.height has unexpected offset % instead of 12", ((cast(*void)(*instance.height)) - cast(*void)(*instance))); + assert(size_of(type_of(BoundingBox.height)) == 4, "BoundingBox.height has unexpected size % instead of 4", size_of(type_of(BoundingBox.height))); + assert(size_of(BoundingBox) == 16, "BoundingBox has size % instead of 16", size_of(BoundingBox)); + } + + { + instance: ElementId; + assert(((cast(*void)(*instance.id)) - cast(*void)(*instance)) == 0, "ElementId.id has unexpected offset % instead of 0", ((cast(*void)(*instance.id)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementId.id)) == 4, "ElementId.id has unexpected size % instead of 4", size_of(type_of(ElementId.id))); + assert(((cast(*void)(*instance.offset)) - cast(*void)(*instance)) == 4, "ElementId.offset has unexpected offset % instead of 4", ((cast(*void)(*instance.offset)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementId.offset)) == 4, "ElementId.offset has unexpected size % instead of 4", size_of(type_of(ElementId.offset))); + assert(((cast(*void)(*instance.baseId)) - cast(*void)(*instance)) == 8, "ElementId.baseId has unexpected offset % instead of 8", ((cast(*void)(*instance.baseId)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementId.baseId)) == 4, "ElementId.baseId has unexpected size % instead of 4", size_of(type_of(ElementId.baseId))); + assert(((cast(*void)(*instance.stringId)) - cast(*void)(*instance)) == 16, "ElementId.stringId has unexpected offset % instead of 16", ((cast(*void)(*instance.stringId)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementId.stringId)) == 16, "ElementId.stringId has unexpected size % instead of 16", size_of(type_of(ElementId.stringId))); + assert(size_of(ElementId) == 32, "ElementId has size % instead of 32", size_of(ElementId)); + } + + { + instance: CornerRadius; + assert(((cast(*void)(*instance.topLeft)) - cast(*void)(*instance)) == 0, "CornerRadius.topLeft has unexpected offset % instead of 0", ((cast(*void)(*instance.topLeft)) - cast(*void)(*instance))); + assert(size_of(type_of(CornerRadius.topLeft)) == 4, "CornerRadius.topLeft has unexpected size % instead of 4", size_of(type_of(CornerRadius.topLeft))); + assert(((cast(*void)(*instance.topRight)) - cast(*void)(*instance)) == 4, "CornerRadius.topRight has unexpected offset % instead of 4", ((cast(*void)(*instance.topRight)) - cast(*void)(*instance))); + assert(size_of(type_of(CornerRadius.topRight)) == 4, "CornerRadius.topRight has unexpected size % instead of 4", size_of(type_of(CornerRadius.topRight))); + assert(((cast(*void)(*instance.bottomLeft)) - cast(*void)(*instance)) == 8, "CornerRadius.bottomLeft has unexpected offset % instead of 8", ((cast(*void)(*instance.bottomLeft)) - cast(*void)(*instance))); + assert(size_of(type_of(CornerRadius.bottomLeft)) == 4, "CornerRadius.bottomLeft has unexpected size % instead of 4", size_of(type_of(CornerRadius.bottomLeft))); + assert(((cast(*void)(*instance.bottomRight)) - cast(*void)(*instance)) == 12, "CornerRadius.bottomRight has unexpected offset % instead of 12", ((cast(*void)(*instance.bottomRight)) - cast(*void)(*instance))); + assert(size_of(type_of(CornerRadius.bottomRight)) == 4, "CornerRadius.bottomRight has unexpected size % instead of 4", size_of(type_of(CornerRadius.bottomRight))); + assert(size_of(CornerRadius) == 16, "CornerRadius has size % instead of 16", size_of(CornerRadius)); + } + + { + instance: ChildAlignment; + assert(((cast(*void)(*instance.x)) - cast(*void)(*instance)) == 0, "ChildAlignment.x has unexpected offset % instead of 0", ((cast(*void)(*instance.x)) - cast(*void)(*instance))); + assert(size_of(type_of(ChildAlignment.x)) == 1, "ChildAlignment.x has unexpected size % instead of 1", size_of(type_of(ChildAlignment.x))); + assert(((cast(*void)(*instance.y)) - cast(*void)(*instance)) == 1, "ChildAlignment.y has unexpected offset % instead of 1", ((cast(*void)(*instance.y)) - cast(*void)(*instance))); + assert(size_of(type_of(ChildAlignment.y)) == 1, "ChildAlignment.y has unexpected size % instead of 1", size_of(type_of(ChildAlignment.y))); + assert(size_of(ChildAlignment) == 2, "ChildAlignment has size % instead of 2", size_of(ChildAlignment)); + } + + { + instance: SizingMinMax; + assert(((cast(*void)(*instance.min)) - cast(*void)(*instance)) == 0, "SizingMinMax.min has unexpected offset % instead of 0", ((cast(*void)(*instance.min)) - cast(*void)(*instance))); + assert(size_of(type_of(SizingMinMax.min)) == 4, "SizingMinMax.min has unexpected size % instead of 4", size_of(type_of(SizingMinMax.min))); + assert(((cast(*void)(*instance.max)) - cast(*void)(*instance)) == 4, "SizingMinMax.max has unexpected offset % instead of 4", ((cast(*void)(*instance.max)) - cast(*void)(*instance))); + assert(size_of(type_of(SizingMinMax.max)) == 4, "SizingMinMax.max has unexpected size % instead of 4", size_of(type_of(SizingMinMax.max))); + assert(size_of(SizingMinMax) == 8, "SizingMinMax has size % instead of 8", size_of(SizingMinMax)); + } + + { + instance: SizingAxis; + assert(((cast(*void)(*instance.size)) - cast(*void)(*instance)) == 0, "SizingAxis.size has unexpected offset % instead of 0", ((cast(*void)(*instance.size)) - cast(*void)(*instance))); + assert(size_of(type_of(SizingAxis.size)) == 8, "SizingAxis.size has unexpected size % instead of 8", size_of(type_of(SizingAxis.size))); + assert(((cast(*void)(*instance.type)) - cast(*void)(*instance)) == 8, "SizingAxis.type has unexpected offset % instead of 8", ((cast(*void)(*instance.type)) - cast(*void)(*instance))); + assert(size_of(type_of(SizingAxis.type)) == 1, "SizingAxis.type has unexpected size % instead of 1", size_of(type_of(SizingAxis.type))); + assert(size_of(SizingAxis) == 12, "SizingAxis has size % instead of 12", size_of(SizingAxis)); + } + + { + instance: Sizing; + assert(((cast(*void)(*instance.width)) - cast(*void)(*instance)) == 0, "Sizing.width has unexpected offset % instead of 0", ((cast(*void)(*instance.width)) - cast(*void)(*instance))); + assert(size_of(type_of(Sizing.width)) == 12, "Sizing.width has unexpected size % instead of 12", size_of(type_of(Sizing.width))); + assert(((cast(*void)(*instance.height)) - cast(*void)(*instance)) == 12, "Sizing.height has unexpected offset % instead of 12", ((cast(*void)(*instance.height)) - cast(*void)(*instance))); + assert(size_of(type_of(Sizing.height)) == 12, "Sizing.height has unexpected size % instead of 12", size_of(type_of(Sizing.height))); + assert(size_of(Sizing) == 24, "Sizing has size % instead of 24", size_of(Sizing)); + } + + { + instance: Padding; + assert(((cast(*void)(*instance.x)) - cast(*void)(*instance)) == 0, "Padding.x has unexpected offset % instead of 0", ((cast(*void)(*instance.x)) - cast(*void)(*instance))); + assert(size_of(type_of(Padding.x)) == 2, "Padding.x has unexpected size % instead of 2", size_of(type_of(Padding.x))); + assert(((cast(*void)(*instance.y)) - cast(*void)(*instance)) == 2, "Padding.y has unexpected offset % instead of 2", ((cast(*void)(*instance.y)) - cast(*void)(*instance))); + assert(size_of(type_of(Padding.y)) == 2, "Padding.y has unexpected size % instead of 2", size_of(type_of(Padding.y))); + assert(size_of(Padding) == 4, "Padding has size % instead of 4", size_of(Padding)); + } + + { + instance: LayoutConfig; + assert(((cast(*void)(*instance.sizing)) - cast(*void)(*instance)) == 0, "LayoutConfig.sizing has unexpected offset % instead of 0", ((cast(*void)(*instance.sizing)) - cast(*void)(*instance))); + assert(size_of(type_of(LayoutConfig.sizing)) == 24, "LayoutConfig.sizing has unexpected size % instead of 24", size_of(type_of(LayoutConfig.sizing))); + assert(((cast(*void)(*instance.padding)) - cast(*void)(*instance)) == 24, "LayoutConfig.padding has unexpected offset % instead of 24", ((cast(*void)(*instance.padding)) - cast(*void)(*instance))); + assert(size_of(type_of(LayoutConfig.padding)) == 4, "LayoutConfig.padding has unexpected size % instead of 4", size_of(type_of(LayoutConfig.padding))); + assert(((cast(*void)(*instance.childGap)) - cast(*void)(*instance)) == 28, "LayoutConfig.childGap has unexpected offset % instead of 28", ((cast(*void)(*instance.childGap)) - cast(*void)(*instance))); + assert(size_of(type_of(LayoutConfig.childGap)) == 2, "LayoutConfig.childGap has unexpected size % instead of 2", size_of(type_of(LayoutConfig.childGap))); + assert(((cast(*void)(*instance.childAlignment)) - cast(*void)(*instance)) == 30, "LayoutConfig.childAlignment has unexpected offset % instead of 30", ((cast(*void)(*instance.childAlignment)) - cast(*void)(*instance))); + assert(size_of(type_of(LayoutConfig.childAlignment)) == 2, "LayoutConfig.childAlignment has unexpected size % instead of 2", size_of(type_of(LayoutConfig.childAlignment))); + assert(((cast(*void)(*instance.layoutDirection)) - cast(*void)(*instance)) == 32, "LayoutConfig.layoutDirection has unexpected offset % instead of 32", ((cast(*void)(*instance.layoutDirection)) - cast(*void)(*instance))); + assert(size_of(type_of(LayoutConfig.layoutDirection)) == 1, "LayoutConfig.layoutDirection has unexpected size % instead of 1", size_of(type_of(LayoutConfig.layoutDirection))); + assert(size_of(LayoutConfig) == 36, "LayoutConfig has size % instead of 36", size_of(LayoutConfig)); + } + + { + instance: RectangleElementConfig; + assert(((cast(*void)(*instance.color)) - cast(*void)(*instance)) == 0, "RectangleElementConfig.color has unexpected offset % instead of 0", ((cast(*void)(*instance.color)) - cast(*void)(*instance))); + assert(size_of(type_of(RectangleElementConfig.color)) == 16, "RectangleElementConfig.color has unexpected size % instead of 16", size_of(type_of(RectangleElementConfig.color))); + assert(((cast(*void)(*instance.cornerRadius)) - cast(*void)(*instance)) == 16, "RectangleElementConfig.cornerRadius has unexpected offset % instead of 16", ((cast(*void)(*instance.cornerRadius)) - cast(*void)(*instance))); + assert(size_of(type_of(RectangleElementConfig.cornerRadius)) == 16, "RectangleElementConfig.cornerRadius has unexpected size % instead of 16", size_of(type_of(RectangleElementConfig.cornerRadius))); + assert(size_of(RectangleElementConfig) == 32, "RectangleElementConfig has size % instead of 32", size_of(RectangleElementConfig)); + } + + { + instance: TextElementConfig; + assert(((cast(*void)(*instance.textColor)) - cast(*void)(*instance)) == 0, "TextElementConfig.textColor has unexpected offset % instead of 0", ((cast(*void)(*instance.textColor)) - cast(*void)(*instance))); + assert(size_of(type_of(TextElementConfig.textColor)) == 16, "TextElementConfig.textColor has unexpected size % instead of 16", size_of(type_of(TextElementConfig.textColor))); + assert(((cast(*void)(*instance.fontId)) - cast(*void)(*instance)) == 16, "TextElementConfig.fontId has unexpected offset % instead of 16", ((cast(*void)(*instance.fontId)) - cast(*void)(*instance))); + assert(size_of(type_of(TextElementConfig.fontId)) == 2, "TextElementConfig.fontId has unexpected size % instead of 2", size_of(type_of(TextElementConfig.fontId))); + assert(((cast(*void)(*instance.fontSize)) - cast(*void)(*instance)) == 18, "TextElementConfig.fontSize has unexpected offset % instead of 18", ((cast(*void)(*instance.fontSize)) - cast(*void)(*instance))); + assert(size_of(type_of(TextElementConfig.fontSize)) == 2, "TextElementConfig.fontSize has unexpected size % instead of 2", size_of(type_of(TextElementConfig.fontSize))); + assert(((cast(*void)(*instance.letterSpacing)) - cast(*void)(*instance)) == 20, "TextElementConfig.letterSpacing has unexpected offset % instead of 20", ((cast(*void)(*instance.letterSpacing)) - cast(*void)(*instance))); + assert(size_of(type_of(TextElementConfig.letterSpacing)) == 2, "TextElementConfig.letterSpacing has unexpected size % instead of 2", size_of(type_of(TextElementConfig.letterSpacing))); + assert(((cast(*void)(*instance.lineHeight)) - cast(*void)(*instance)) == 22, "TextElementConfig.lineHeight has unexpected offset % instead of 22", ((cast(*void)(*instance.lineHeight)) - cast(*void)(*instance))); + assert(size_of(type_of(TextElementConfig.lineHeight)) == 2, "TextElementConfig.lineHeight has unexpected size % instead of 2", size_of(type_of(TextElementConfig.lineHeight))); + assert(((cast(*void)(*instance.wrapMode)) - cast(*void)(*instance)) == 24, "TextElementConfig.wrapMode has unexpected offset % instead of 24", ((cast(*void)(*instance.wrapMode)) - cast(*void)(*instance))); + assert(size_of(type_of(TextElementConfig.wrapMode)) == 4, "TextElementConfig.wrapMode has unexpected size % instead of 4", size_of(type_of(TextElementConfig.wrapMode))); + assert(size_of(TextElementConfig) == 28, "TextElementConfig has size % instead of 28", size_of(TextElementConfig)); + } + + { + instance: ImageElementConfig; + assert(((cast(*void)(*instance.imageData)) - cast(*void)(*instance)) == 0, "ImageElementConfig.imageData has unexpected offset % instead of 0", ((cast(*void)(*instance.imageData)) - cast(*void)(*instance))); + assert(size_of(type_of(ImageElementConfig.imageData)) == 8, "ImageElementConfig.imageData has unexpected size % instead of 8", size_of(type_of(ImageElementConfig.imageData))); + assert(((cast(*void)(*instance.sourceDimensions)) - cast(*void)(*instance)) == 8, "ImageElementConfig.sourceDimensions has unexpected offset % instead of 8", ((cast(*void)(*instance.sourceDimensions)) - cast(*void)(*instance))); + assert(size_of(type_of(ImageElementConfig.sourceDimensions)) == 8, "ImageElementConfig.sourceDimensions has unexpected size % instead of 8", size_of(type_of(ImageElementConfig.sourceDimensions))); + assert(size_of(ImageElementConfig) == 16, "ImageElementConfig has size % instead of 16", size_of(ImageElementConfig)); + } + + { + instance: FloatingAttachPoints; + assert(((cast(*void)(*instance.element)) - cast(*void)(*instance)) == 0, "FloatingAttachPoints.element has unexpected offset % instead of 0", ((cast(*void)(*instance.element)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingAttachPoints.element)) == 1, "FloatingAttachPoints.element has unexpected size % instead of 1", size_of(type_of(FloatingAttachPoints.element))); + assert(((cast(*void)(*instance.parent)) - cast(*void)(*instance)) == 1, "FloatingAttachPoints.parent has unexpected offset % instead of 1", ((cast(*void)(*instance.parent)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingAttachPoints.parent)) == 1, "FloatingAttachPoints.parent has unexpected size % instead of 1", size_of(type_of(FloatingAttachPoints.parent))); + assert(size_of(FloatingAttachPoints) == 2, "FloatingAttachPoints has size % instead of 2", size_of(FloatingAttachPoints)); + } + + { + instance: FloatingElementConfig; + assert(((cast(*void)(*instance.offset)) - cast(*void)(*instance)) == 0, "FloatingElementConfig.offset has unexpected offset % instead of 0", ((cast(*void)(*instance.offset)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingElementConfig.offset)) == 8, "FloatingElementConfig.offset has unexpected size % instead of 8", size_of(type_of(FloatingElementConfig.offset))); + assert(((cast(*void)(*instance.expand)) - cast(*void)(*instance)) == 8, "FloatingElementConfig.expand has unexpected offset % instead of 8", ((cast(*void)(*instance.expand)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingElementConfig.expand)) == 8, "FloatingElementConfig.expand has unexpected size % instead of 8", size_of(type_of(FloatingElementConfig.expand))); + assert(((cast(*void)(*instance.zIndex)) - cast(*void)(*instance)) == 16, "FloatingElementConfig.zIndex has unexpected offset % instead of 16", ((cast(*void)(*instance.zIndex)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingElementConfig.zIndex)) == 2, "FloatingElementConfig.zIndex has unexpected size % instead of 2", size_of(type_of(FloatingElementConfig.zIndex))); + assert(((cast(*void)(*instance.parentId)) - cast(*void)(*instance)) == 20, "FloatingElementConfig.parentId has unexpected offset % instead of 20", ((cast(*void)(*instance.parentId)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingElementConfig.parentId)) == 4, "FloatingElementConfig.parentId has unexpected size % instead of 4", size_of(type_of(FloatingElementConfig.parentId))); + assert(((cast(*void)(*instance.attachment)) - cast(*void)(*instance)) == 24, "FloatingElementConfig.attachment has unexpected offset % instead of 24", ((cast(*void)(*instance.attachment)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingElementConfig.attachment)) == 2, "FloatingElementConfig.attachment has unexpected size % instead of 2", size_of(type_of(FloatingElementConfig.attachment))); + assert(((cast(*void)(*instance.pointerCaptureMode)) - cast(*void)(*instance)) == 28, "FloatingElementConfig.pointerCaptureMode has unexpected offset % instead of 28", ((cast(*void)(*instance.pointerCaptureMode)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingElementConfig.pointerCaptureMode)) == 4, "FloatingElementConfig.pointerCaptureMode has unexpected size % instead of 4", size_of(type_of(FloatingElementConfig.pointerCaptureMode))); + assert(size_of(FloatingElementConfig) == 32, "FloatingElementConfig has size % instead of 32", size_of(FloatingElementConfig)); + } + + { + instance: CustomElementConfig; + assert(((cast(*void)(*instance.customData)) - cast(*void)(*instance)) == 0, "CustomElementConfig.customData has unexpected offset % instead of 0", ((cast(*void)(*instance.customData)) - cast(*void)(*instance))); + assert(size_of(type_of(CustomElementConfig.customData)) == 8, "CustomElementConfig.customData has unexpected size % instead of 8", size_of(type_of(CustomElementConfig.customData))); + assert(size_of(CustomElementConfig) == 8, "CustomElementConfig has size % instead of 8", size_of(CustomElementConfig)); + } + + { + instance: ScrollElementConfig; + assert(((cast(*void)(*instance.horizontal)) - cast(*void)(*instance)) == 0, "ScrollElementConfig.horizontal has unexpected offset % instead of 0", ((cast(*void)(*instance.horizontal)) - cast(*void)(*instance))); + assert(size_of(type_of(ScrollElementConfig.horizontal)) == 1, "ScrollElementConfig.horizontal has unexpected size % instead of 1", size_of(type_of(ScrollElementConfig.horizontal))); + assert(((cast(*void)(*instance.vertical)) - cast(*void)(*instance)) == 1, "ScrollElementConfig.vertical has unexpected offset % instead of 1", ((cast(*void)(*instance.vertical)) - cast(*void)(*instance))); + assert(size_of(type_of(ScrollElementConfig.vertical)) == 1, "ScrollElementConfig.vertical has unexpected size % instead of 1", size_of(type_of(ScrollElementConfig.vertical))); + assert(size_of(ScrollElementConfig) == 2, "ScrollElementConfig has size % instead of 2", size_of(ScrollElementConfig)); + } + + { + instance: ElementConfigUnion; + assert(((cast(*void)(*instance.rectangleElementConfig)) - cast(*void)(*instance)) == 0, "ElementConfigUnion.rectangleElementConfig has unexpected offset % instead of 0", ((cast(*void)(*instance.rectangleElementConfig)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfigUnion.rectangleElementConfig)) == 8, "ElementConfigUnion.rectangleElementConfig has unexpected size % instead of 8", size_of(type_of(ElementConfigUnion.rectangleElementConfig))); + assert(((cast(*void)(*instance.textElementConfig)) - cast(*void)(*instance)) == 0, "ElementConfigUnion.textElementConfig has unexpected offset % instead of 0", ((cast(*void)(*instance.textElementConfig)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfigUnion.textElementConfig)) == 8, "ElementConfigUnion.textElementConfig has unexpected size % instead of 8", size_of(type_of(ElementConfigUnion.textElementConfig))); + assert(((cast(*void)(*instance.imageElementConfig)) - cast(*void)(*instance)) == 0, "ElementConfigUnion.imageElementConfig has unexpected offset % instead of 0", ((cast(*void)(*instance.imageElementConfig)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfigUnion.imageElementConfig)) == 8, "ElementConfigUnion.imageElementConfig has unexpected size % instead of 8", size_of(type_of(ElementConfigUnion.imageElementConfig))); + assert(((cast(*void)(*instance.floatingElementConfig)) - cast(*void)(*instance)) == 0, "ElementConfigUnion.floatingElementConfig has unexpected offset % instead of 0", ((cast(*void)(*instance.floatingElementConfig)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfigUnion.floatingElementConfig)) == 8, "ElementConfigUnion.floatingElementConfig has unexpected size % instead of 8", size_of(type_of(ElementConfigUnion.floatingElementConfig))); + assert(((cast(*void)(*instance.customElementConfig)) - cast(*void)(*instance)) == 0, "ElementConfigUnion.customElementConfig has unexpected offset % instead of 0", ((cast(*void)(*instance.customElementConfig)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfigUnion.customElementConfig)) == 8, "ElementConfigUnion.customElementConfig has unexpected size % instead of 8", size_of(type_of(ElementConfigUnion.customElementConfig))); + assert(((cast(*void)(*instance.scrollElementConfig)) - cast(*void)(*instance)) == 0, "ElementConfigUnion.scrollElementConfig has unexpected offset % instead of 0", ((cast(*void)(*instance.scrollElementConfig)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfigUnion.scrollElementConfig)) == 8, "ElementConfigUnion.scrollElementConfig has unexpected size % instead of 8", size_of(type_of(ElementConfigUnion.scrollElementConfig))); + assert(((cast(*void)(*instance.borderElementConfig)) - cast(*void)(*instance)) == 0, "ElementConfigUnion.borderElementConfig has unexpected offset % instead of 0", ((cast(*void)(*instance.borderElementConfig)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfigUnion.borderElementConfig)) == 8, "ElementConfigUnion.borderElementConfig has unexpected size % instead of 8", size_of(type_of(ElementConfigUnion.borderElementConfig))); + assert(size_of(ElementConfigUnion) == 8, "ElementConfigUnion has size % instead of 8", size_of(ElementConfigUnion)); + } + + { + instance: ElementConfig; + assert(((cast(*void)(*instance.type)) - cast(*void)(*instance)) == 0, "ElementConfig.type has unexpected offset % instead of 0", ((cast(*void)(*instance.type)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfig.type)) == 1, "ElementConfig.type has unexpected size % instead of 1", size_of(type_of(ElementConfig.type))); + assert(((cast(*void)(*instance.config)) - cast(*void)(*instance)) == 8, "ElementConfig.config has unexpected offset % instead of 8", ((cast(*void)(*instance.config)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfig.config)) == 8, "ElementConfig.config has unexpected size % instead of 8", size_of(type_of(ElementConfig.config))); + assert(size_of(ElementConfig) == 16, "ElementConfig has size % instead of 16", size_of(ElementConfig)); + } + + { + instance: ScrollContainerData; + assert(((cast(*void)(*instance.scrollPosition)) - cast(*void)(*instance)) == 0, "ScrollContainerData.scrollPosition has unexpected offset % instead of 0", ((cast(*void)(*instance.scrollPosition)) - cast(*void)(*instance))); + assert(size_of(type_of(ScrollContainerData.scrollPosition)) == 8, "ScrollContainerData.scrollPosition has unexpected size % instead of 8", size_of(type_of(ScrollContainerData.scrollPosition))); + assert(((cast(*void)(*instance.scrollContainerDimensions)) - cast(*void)(*instance)) == 8, "ScrollContainerData.scrollContainerDimensions has unexpected offset % instead of 8", ((cast(*void)(*instance.scrollContainerDimensions)) - cast(*void)(*instance))); + assert(size_of(type_of(ScrollContainerData.scrollContainerDimensions)) == 8, "ScrollContainerData.scrollContainerDimensions has unexpected size % instead of 8", size_of(type_of(ScrollContainerData.scrollContainerDimensions))); + assert(((cast(*void)(*instance.contentDimensions)) - cast(*void)(*instance)) == 16, "ScrollContainerData.contentDimensions has unexpected offset % instead of 16", ((cast(*void)(*instance.contentDimensions)) - cast(*void)(*instance))); + assert(size_of(type_of(ScrollContainerData.contentDimensions)) == 8, "ScrollContainerData.contentDimensions has unexpected size % instead of 8", size_of(type_of(ScrollContainerData.contentDimensions))); + assert(((cast(*void)(*instance.config)) - cast(*void)(*instance)) == 24, "ScrollContainerData.config has unexpected offset % instead of 24", ((cast(*void)(*instance.config)) - cast(*void)(*instance))); + assert(size_of(type_of(ScrollContainerData.config)) == 2, "ScrollContainerData.config has unexpected size % instead of 2", size_of(type_of(ScrollContainerData.config))); + assert(((cast(*void)(*instance.found)) - cast(*void)(*instance)) == 26, "ScrollContainerData.found has unexpected offset % instead of 26", ((cast(*void)(*instance.found)) - cast(*void)(*instance))); + assert(size_of(type_of(ScrollContainerData.found)) == 1, "ScrollContainerData.found has unexpected size % instead of 1", size_of(type_of(ScrollContainerData.found))); + assert(size_of(ScrollContainerData) == 32, "ScrollContainerData has size % instead of 32", size_of(ScrollContainerData)); + } + + { + instance: RenderCommand; + assert(((cast(*void)(*instance.boundingBox)) - cast(*void)(*instance)) == 0, "RenderCommand.boundingBox has unexpected offset % instead of 0", ((cast(*void)(*instance.boundingBox)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommand.boundingBox)) == 16, "RenderCommand.boundingBox has unexpected size % instead of 16", size_of(type_of(RenderCommand.boundingBox))); + assert(((cast(*void)(*instance.config)) - cast(*void)(*instance)) == 16, "RenderCommand.config has unexpected offset % instead of 16", ((cast(*void)(*instance.config)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommand.config)) == 8, "RenderCommand.config has unexpected size % instead of 8", size_of(type_of(RenderCommand.config))); + assert(((cast(*void)(*instance.text)) - cast(*void)(*instance)) == 24, "RenderCommand.text has unexpected offset % instead of 24", ((cast(*void)(*instance.text)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommand.text)) == 16, "RenderCommand.text has unexpected size % instead of 16", size_of(type_of(RenderCommand.text))); + assert(((cast(*void)(*instance.id)) - cast(*void)(*instance)) == 40, "RenderCommand.id has unexpected offset % instead of 40", ((cast(*void)(*instance.id)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommand.id)) == 4, "RenderCommand.id has unexpected size % instead of 4", size_of(type_of(RenderCommand.id))); + assert(((cast(*void)(*instance.commandType)) - cast(*void)(*instance)) == 44, "RenderCommand.commandType has unexpected offset % instead of 44", ((cast(*void)(*instance.commandType)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommand.commandType)) == 1, "RenderCommand.commandType has unexpected size % instead of 1", size_of(type_of(RenderCommand.commandType))); + assert(size_of(RenderCommand) == 48, "RenderCommand has size % instead of 48", size_of(RenderCommand)); + } + + { + instance: RenderCommandArray; + assert(((cast(*void)(*instance.capacity)) - cast(*void)(*instance)) == 0, "RenderCommandArray.capacity has unexpected offset % instead of 0", ((cast(*void)(*instance.capacity)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommandArray.capacity)) == 4, "RenderCommandArray.capacity has unexpected size % instead of 4", size_of(type_of(RenderCommandArray.capacity))); + assert(((cast(*void)(*instance.length)) - cast(*void)(*instance)) == 4, "RenderCommandArray.length has unexpected offset % instead of 4", ((cast(*void)(*instance.length)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommandArray.length)) == 4, "RenderCommandArray.length has unexpected size % instead of 4", size_of(type_of(RenderCommandArray.length))); + assert(((cast(*void)(*instance.internalArray)) - cast(*void)(*instance)) == 8, "RenderCommandArray.internalArray has unexpected offset % instead of 8", ((cast(*void)(*instance.internalArray)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommandArray.internalArray)) == 8, "RenderCommandArray.internalArray has unexpected size % instead of 8", size_of(type_of(RenderCommandArray.internalArray))); + assert(size_of(RenderCommandArray) == 16, "RenderCommandArray has size % instead of 16", size_of(RenderCommandArray)); + } + + { + instance: PointerData; + assert(((cast(*void)(*instance.position)) - cast(*void)(*instance)) == 0, "PointerData.position has unexpected offset % instead of 0", ((cast(*void)(*instance.position)) - cast(*void)(*instance))); + assert(size_of(type_of(PointerData.position)) == 8, "PointerData.position has unexpected size % instead of 8", size_of(type_of(PointerData.position))); + assert(((cast(*void)(*instance.state)) - cast(*void)(*instance)) == 8, "PointerData.state has unexpected offset % instead of 8", ((cast(*void)(*instance.state)) - cast(*void)(*instance))); + assert(size_of(type_of(PointerData.state)) == 4, "PointerData.state has unexpected size % instead of 4", size_of(type_of(PointerData.state))); + assert(size_of(PointerData) == 12, "PointerData has size % instead of 12", size_of(PointerData)); + } + + { + instance: ErrorData; + assert(((cast(*void)(*instance.errorType)) - cast(*void)(*instance)) == 0, "ErrorData.errorType has unexpected offset % instead of 0", ((cast(*void)(*instance.errorType)) - cast(*void)(*instance))); + assert(size_of(type_of(ErrorData.errorType)) == 4, "ErrorData.errorType has unexpected size % instead of 4", size_of(type_of(ErrorData.errorType))); + assert(((cast(*void)(*instance.errorText)) - cast(*void)(*instance)) == 8, "ErrorData.errorText has unexpected offset % instead of 8", ((cast(*void)(*instance.errorText)) - cast(*void)(*instance))); + assert(size_of(type_of(ErrorData.errorText)) == 16, "ErrorData.errorText has unexpected size % instead of 16", size_of(type_of(ErrorData.errorText))); + assert(((cast(*void)(*instance.userData)) - cast(*void)(*instance)) == 24, "ErrorData.userData has unexpected offset % instead of 24", ((cast(*void)(*instance.userData)) - cast(*void)(*instance))); + assert(size_of(type_of(ErrorData.userData)) == 8, "ErrorData.userData has unexpected size % instead of 8", size_of(type_of(ErrorData.userData))); + assert(size_of(ErrorData) == 32, "ErrorData has size % instead of 32", size_of(ErrorData)); + } + + { + instance: ErrorHandler; + assert(((cast(*void)(*instance.errorHandlerFunction)) - cast(*void)(*instance)) == 0, "ErrorHandler.errorHandlerFunction has unexpected offset % instead of 0", ((cast(*void)(*instance.errorHandlerFunction)) - cast(*void)(*instance))); + assert(size_of(type_of(ErrorHandler.errorHandlerFunction)) == 8, "ErrorHandler.errorHandlerFunction has unexpected size % instead of 8", size_of(type_of(ErrorHandler.errorHandlerFunction))); + assert(((cast(*void)(*instance.userData)) - cast(*void)(*instance)) == 8, "ErrorHandler.userData has unexpected offset % instead of 8", ((cast(*void)(*instance.userData)) - cast(*void)(*instance))); + assert(size_of(type_of(ErrorHandler.userData)) == 8, "ErrorHandler.userData has unexpected size % instead of 8", size_of(type_of(ErrorHandler.userData))); + assert(size_of(ErrorHandler) == 16, "ErrorHandler has size % instead of 16", size_of(ErrorHandler)); + } +} + diff --git a/bindings/jai/clay-jai/linux/clay.a b/bindings/jai/clay-jai/linux/clay.a new file mode 100644 index 0000000000000000000000000000000000000000..dd2bab1e23c99bde4cf89262c791c9bc2459cce8 GIT binary patch literal 273726 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 literal 0 HcmV?d00001 diff --git a/bindings/jai/clay-jai/module.jai b/bindings/jai/clay-jai/module.jai index 3663b3f..316892a 100644 --- a/bindings/jai/clay-jai/module.jai +++ b/bindings/jai/clay-jai/module.jai @@ -26,6 +26,8 @@ Another option used in these bindings : https://github.com/nick-celestin-zizic/c But I'm not a big fan of that since it's possible to forget the scope braces or to put the children before the element. +TODO This part is wrong... delete it and write the code that works + Another option to consider is to pass a code block to a macro that puts it between the start and the end. UI :: (id: ElementId, layout: LayoutConfig, configs: ..ElementConfig, $code: Code) { @@ -73,7 +75,7 @@ With the downside that it's not obvious why the for is there before reading the Vector2 :: Math.Vector2; -ElementConfigType :: enum s32 { +ElementConfigType :: enum u8 { NONE :: 0; RECTANGLE :: 1; BORDER_CONTAINER :: 2; @@ -94,8 +96,8 @@ ElementConfigType :: enum s32 { // Jai bindings specific types, please don't assume any value in those // a it might change if the enums above overlap with it // TODO Check if these values need to be powers of two - ID :: 256; - LAYOUT :: 257; + ID :: 250; + LAYOUT :: 251; } // This is passed to UI so that we can omit layout @@ -287,6 +289,8 @@ InternalElementConfigArray :: struct { #if OS == .WINDOWS { #load "windows.jai"; +} else #if OS == .LINUX { + #load "linux.jai"; } else { assert(false); } \ No newline at end of file diff --git a/bindings/jai/examples/introducing_clay_video_demo/main.jai b/bindings/jai/examples/introducing_clay_video_demo/main.jai index a3a64db..0de5f1a 100644 --- a/bindings/jai/examples/introducing_clay_video_demo/main.jai +++ b/bindings/jai/examples/introducing_clay_video_demo/main.jai @@ -75,7 +75,8 @@ main :: () { flags := Raylib.ConfigFlags.WINDOW_RESIZABLE | .MSAA_4X_HINT | .VSYNC_HINT; raylib_initialize(1024, 768, "Introducing Clay Demo", flags); - clay_required_memory := Clay.MinMemorySize(); + // For some reason, on linux, this is 8 bytes off ??? + clay_required_memory := Clay.MinMemorySize() + 8; memory := alloc(clay_required_memory); clay_memory := Clay.CreateArenaWithCapacityAndMemory(clay_required_memory, memory); Clay.Initialize(