Documentation
¶
Overview ¶
Package clay is a Go port of the C layout library [Clay](https://github.com/nicbarker/clay).
Example ¶
package main
import (
"image"
"image/color"
"unsafe"
"github.com/TotallyGamerJet/clay"
"github.com/TotallyGamerJet/clay/examples/fonts"
"github.com/TotallyGamerJet/clay/examples/videodemo"
"github.com/TotallyGamerJet/clay/renderers/software"
"golang.org/x/image/draw"
"golang.org/x/image/font"
"golang.org/x/image/font/opentype"
)
func handleClayError(errorData clay.ErrorData) {
panic(errorData)
}
const (
winWidth, winHeight = 640, 480
fontSize = 16
)
func main() {
totalMemorySize := clay.MinMemorySize()
memory := make([]byte, totalMemorySize)
arena := clay.CreateArenaWithCapacityAndMemory(memory)
clay.Initialize(arena, clay.Dimensions{Width: winWidth, Height: winHeight}, clay.ErrorHandler{ErrorHandlerFunction: handleClayError})
parsedFont, err := opentype.Parse(fonts.RobotoRegularTTF)
if err != nil {
panic(err)
}
face, err := opentype.NewFace(parsedFont, &opentype.FaceOptions{
Size: fontSize,
DPI: 72, // Standard screen DPI
Hinting: font.HintingFull,
})
faces := []font.Face{
videodemo.FontIdBody16: face,
}
clay.SetMeasureTextFunction(software.MeasureText, unsafe.Pointer(&faces))
var img image.Image = videodemo.SquirrelImage
demoData := videodemo.Initialize(unsafe.Pointer(&img))
window := image.NewRGBA(image.Rect(0, 0, winWidth, winHeight))
draw.Draw(window, window.Bounds(), image.NewUniform(color.RGBA{A: 255}), image.Point{}, draw.Src)
cmds := videodemo.CreateLayout(&demoData)
if err := software.ClayRender(window, cmds, faces); err != nil {
panic(err)
}
software.PrintPlaygroundImage(window)
}
Output: IMAGE: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
Index ¶
- Constants
- func BeginLayout()
- func ElementIdArray_Set(array *ElementIdArray, index int32, value ElementId)
- func GetMaxElementCount() int32
- func GetMaxMeasureTextCacheWordCount() int32
- func Hovered() bool
- func IsDebugModeEnabled() bool
- func LayoutElementArray_Set(array *LayoutElementArray, index int32, value LayoutElement)
- func MinMemorySize() uint32
- func OnHover(...)
- func PointerOver(elementId ElementId) bool
- func RenderCommandArray_Set(array *RenderCommandArray, index int32, value RenderCommand)
- func ResetMeasureTextCache()
- func SetCullingEnabled(enabled bool)
- func SetCurrentContext(context *Context)
- func SetDebugModeEnabled(enabled bool)
- func SetExternalScrollHandlingEnabled(enabled bool)
- func SetLayoutDimensions(dimensions Dimensions)
- func SetMaxElementCount(maxElementCount int32)
- func SetMaxMeasureTextCacheWordCount(maxMeasureTextCacheWordCount int32)
- func SetMeasureTextFunction(...)
- func SetPointerState(position Vector2, isPointerDown bool)
- func SetQueryScrollOffsetFunction(...)
- func Text(text string, config *TextElementConfig)
- func UI(id ...ElementId) func(decl ElementDeclaration, children func())
- func UpdateScrollContainers(enableDragScrolling bool, scrollDelta Vector2, deltaTime float32)
- type Arena
- type AspectRatioElementConfig
- type BooleanWarnings
- type BorderElementConfig
- type BorderRenderData
- type BorderWidth
- type BoundingBox
- type ChildAlignment
- type ClipElementConfig
- type ClipRenderData
- type Color
- type Context
- type CornerRadius
- type CustomElementConfig
- type CustomRenderData
- type Dimensions
- type ElementConfig
- type ElementConfigUnion
- type ElementData
- type ElementDeclaration
- type ElementId
- func ElementIdArraySlice_Get(slice *ElementIdArraySlice, index int32) *ElementId
- func ElementIdArray_Add(array *ElementIdArray, item ElementId) *ElementId
- func ElementIdArray_Get(array *ElementIdArray, index int32) *ElementId
- func ElementIdArray_GetValue(array *ElementIdArray, index int32) ElementId
- func ElementIdArray_RemoveSwapback(array *ElementIdArray, index int32) ElementId
- func GetElementId(idString string) ElementId
- func GetElementIdWithIndex(idString string, index uint32) ElementId
- func ID(label string) ElementId
- func IDI(label string, index uint32) ElementId
- type ElementIdArray
- type ElementIdArraySlice
- type ErrorData
- type ErrorHandler
- type ErrorType
- type FloatingAttachPointType
- type FloatingAttachPoints
- type FloatingAttachToElement
- type FloatingClipToElement
- type FloatingElementConfig
- type ImageElementConfig
- type ImageRenderData
- type LayoutAlignmentX
- type LayoutAlignmentY
- type LayoutConfig
- type LayoutDirection
- type LayoutElement
- func LayoutElementArraySlice_Get(slice *LayoutElementArraySlice, index int32) *LayoutElement
- func LayoutElementArray_Add(array *LayoutElementArray, item LayoutElement) *LayoutElement
- func LayoutElementArray_Get(array *LayoutElementArray, index int32) *LayoutElement
- func LayoutElementArray_GetValue(array *LayoutElementArray, index int32) LayoutElement
- func LayoutElementArray_RemoveSwapback(array *LayoutElementArray, index int32) LayoutElement
- type LayoutElementArray
- type LayoutElementArraySlice
- type LayoutElementHashMapItem
- type Padding
- type PointerCaptureMode
- type PointerData
- type PointerDataInteractionState
- type RectangleRenderData
- type RenderCommand
- func RenderCommandArraySlice_Get(slice *RenderCommandArraySlice, index int32) *RenderCommand
- func RenderCommandArray_Add(array *RenderCommandArray, item RenderCommand) *RenderCommand
- func RenderCommandArray_Get(array *RenderCommandArray, index int32) *RenderCommand
- func RenderCommandArray_GetValue(array *RenderCommandArray, index int32) RenderCommand
- func RenderCommandArray_RemoveSwapback(array *RenderCommandArray, index int32) RenderCommand
- type RenderCommandArray
- type RenderCommandArraySlice
- type RenderCommandType
- type RenderData
- type ScrollContainerData
- type ScrollRenderData
- type SharedElementConfig
- type Sizing
- type SizingAxis
- type SizingMinMax
- type String
- type StringSlice
- type TextAlignment
- type TextElementConfig
- type TextElementConfigWrapMode
- type TextRenderData
- type Vector2
Examples ¶
Constants ¶
View Source
const ( LEFT_TO_RIGHT = LayoutDirection(iota) TOP_TO_BOTTOM )
View Source
const ( ALIGN_X_LEFT = LayoutAlignmentX(iota) ALIGN_X_RIGHT ALIGN_X_CENTER )
View Source
const ( ALIGN_Y_TOP = LayoutAlignmentY(iota) ALIGN_Y_BOTTOM ALIGN_Y_CENTER )
View Source
const ( TEXT_WRAP_WORDS = TextElementConfigWrapMode(iota) TEXT_WRAP_NEWLINES TEXT_WRAP_NONE )
View Source
const ( TEXT_ALIGN_LEFT = TextAlignment(iota) TEXT_ALIGN_CENTER TEXT_ALIGN_RIGHT )
View Source
const ( ATTACH_POINT_LEFT_TOP = FloatingAttachPointType(iota) ATTACH_POINT_LEFT_CENTER ATTACH_POINT_LEFT_BOTTOM ATTACH_POINT_CENTER_TOP ATTACH_POINT_CENTER_CENTER ATTACH_POINT_CENTER_BOTTOM ATTACH_POINT_RIGHT_TOP ATTACH_POINT_RIGHT_CENTER ATTACH_POINT_RIGHT_BOTTOM )
View Source
const ( POINTER_CAPTURE_MODE_CAPTURE = PointerCaptureMode(iota) POINTER_CAPTURE_MODE_PASSTHROUGH )
View Source
const ( ATTACH_TO_NONE = FloatingAttachToElement(iota) ATTACH_TO_PARENT ATTACH_TO_ELEMENT_WITH_ID ATTACH_TO_ROOT )
View Source
const ( CLIP_TO_NONE = FloatingClipToElement(iota) CLIP_TO_ATTACHED_PARENT )
View Source
const ( RENDER_COMMAND_TYPE_NONE = RenderCommandType(iota) RENDER_COMMAND_TYPE_RECTANGLE RENDER_COMMAND_TYPE_BORDER RENDER_COMMAND_TYPE_TEXT RENDER_COMMAND_TYPE_IMAGE RENDER_COMMAND_TYPE_SCISSOR_START RENDER_COMMAND_TYPE_SCISSOR_END RENDER_COMMAND_TYPE_CUSTOM )
View Source
const ( POINTER_DATA_PRESSED_THIS_FRAME = PointerDataInteractionState(iota) POINTER_DATA_PRESSED POINTER_DATA_RELEASED_THIS_FRAME POINTER_DATA_RELEASED )
View Source
const ( ERROR_TYPE_TEXT_MEASUREMENT_FUNCTION_NOT_PROVIDED = ErrorType(iota) ERROR_TYPE_ARENA_CAPACITY_EXCEEDED ERROR_TYPE_ELEMENTS_CAPACITY_EXCEEDED ERROR_TYPE_TEXT_MEASUREMENT_CAPACITY_EXCEEDED ERROR_TYPE_DUPLICATE_ID ERROR_TYPE_FLOATING_CONTAINER_PARENT_NOT_FOUND ERROR_TYPE_PERCENTAGE_OVER_1 ERROR_TYPE_INTERNAL_ERROR ERROR_TYPE_UNBALANCED_OPEN_CLOSE )
Variables ¶
This section is empty.
Functions ¶
func BeginLayout ¶
func BeginLayout()
func ElementIdArray_Set ¶ added in v0.0.6
func ElementIdArray_Set(array *ElementIdArray, index int32, value ElementId)
func GetMaxElementCount ¶
func GetMaxElementCount() int32
func GetMaxMeasureTextCacheWordCount ¶
func GetMaxMeasureTextCacheWordCount() int32
func IsDebugModeEnabled ¶
func IsDebugModeEnabled() bool
func LayoutElementArray_Set ¶
func LayoutElementArray_Set(array *LayoutElementArray, index int32, value LayoutElement)
func MinMemorySize ¶
func MinMemorySize() uint32
func OnHover ¶
func OnHover(onHoverFunction func(elementId ElementId, pointerInfo PointerData, userData unsafe.Pointer), userData any)
func PointerOver ¶
func RenderCommandArray_Set ¶
func RenderCommandArray_Set(array *RenderCommandArray, index int32, value RenderCommand)
func ResetMeasureTextCache ¶
func ResetMeasureTextCache()
func SetCullingEnabled ¶
func SetCullingEnabled(enabled bool)
func SetCurrentContext ¶
func SetCurrentContext(context *Context)
func SetDebugModeEnabled ¶
func SetDebugModeEnabled(enabled bool)
func SetExternalScrollHandlingEnabled ¶
func SetExternalScrollHandlingEnabled(enabled bool)
func SetLayoutDimensions ¶
func SetLayoutDimensions(dimensions Dimensions)
func SetMaxElementCount ¶
func SetMaxElementCount(maxElementCount int32)
func SetMaxMeasureTextCacheWordCount ¶
func SetMaxMeasureTextCacheWordCount(maxMeasureTextCacheWordCount int32)
func SetMeasureTextFunction ¶
func SetMeasureTextFunction(measureTextFunction func(text StringSlice, config *TextElementConfig, userData unsafe.Pointer) Dimensions, userData any)
func SetPointerState ¶
func Text ¶
func Text(text string, config *TextElementConfig)
func UI ¶
func UI(id ...ElementId) func(decl ElementDeclaration, children func())
func UpdateScrollContainers ¶
Types ¶
type Arena ¶
type AspectRatioElementConfig ¶ added in v0.0.6
type AspectRatioElementConfig struct {
AspectRatio float32
}
var AspectRatioElementConfig_DEFAULT AspectRatioElementConfig = AspectRatioElementConfig{}
type BooleanWarnings ¶
type BorderElementConfig ¶
type BorderElementConfig struct {
Color Color
Width BorderWidth
}
var BorderElementConfig_DEFAULT BorderElementConfig = BorderElementConfig{}
type BorderRenderData ¶
type BorderRenderData struct {
Color Color
CornerRadius CornerRadius
Width BorderWidth
}
type BorderWidth ¶
type BorderWidth struct {
Left uint16
Right uint16
Top uint16
Bottom uint16
BetweenChildren uint16
}
func BorderAll ¶
func BorderAll(width uint16) BorderWidth
func BorderOutside ¶
func BorderOutside(width uint16) BorderWidth
type ChildAlignment ¶
type ChildAlignment struct {
X LayoutAlignmentX
Y LayoutAlignmentY
}
type ClipElementConfig ¶ added in v0.0.5
var ClipElementConfig_DEFAULT ClipElementConfig = ClipElementConfig{Horizontal: false}
type ClipRenderData ¶ added in v0.0.5
type ClipRenderData ScrollRenderData
type Context ¶
type Context struct {
AspectRatioElementIndexes __int32_tArray
AspectRatioElementConfigs __AspectRatioElementConfigArray
ClipElementConfigs __ClipElementConfigArray
// contains filtered or unexported fields
}
func GetCurrentContext ¶
func GetCurrentContext() *Context
func Initialize ¶
func Initialize(arena Arena, layoutDimensions Dimensions, errorHandler ErrorHandler) *Context
type CornerRadius ¶
type CornerRadius struct {
TopLeft float32
TopRight float32
BottomLeft float32
BottomRight float32
}
func CornerRadiusAll ¶
func CornerRadiusAll(radius float32) CornerRadius
type CustomElementConfig ¶
type CustomElementConfig struct {
CustomData any
}
var CustomElementConfig_DEFAULT CustomElementConfig = CustomElementConfig{}
type CustomRenderData ¶
type CustomRenderData struct {
BackgroundColor Color
CornerRadius CornerRadius
CustomData any
}
type Dimensions ¶
type ElementConfig ¶
type ElementConfig struct {
Type __ElementConfigType
Config ElementConfigUnion
}
var ElementConfig_DEFAULT ElementConfig = ElementConfig{}
type ElementConfigUnion ¶
type ElementConfigUnion struct {
// union
TextElementConfig *TextElementConfig
AspectRatioElementConfig *AspectRatioElementConfig
ImageElementConfig *ImageElementConfig
FloatingElementConfig *FloatingElementConfig
CustomElementConfig *CustomElementConfig
ClipElementConfig *ClipElementConfig
BorderElementConfig *BorderElementConfig
}
type ElementData ¶
type ElementData struct {
BoundingBox BoundingBox
Found bool
}
func GetElementData ¶
func GetElementData(id ElementId) ElementData
type ElementDeclaration ¶
type ElementDeclaration struct {
Layout LayoutConfig
BackgroundColor Color
CornerRadius CornerRadius
AspectRatio AspectRatioElementConfig
Image ImageElementConfig
Floating FloatingElementConfig
Custom CustomElementConfig
Clip ClipElementConfig
Border BorderElementConfig
UserData any
}
type ElementId ¶
func ElementIdArraySlice_Get ¶ added in v0.0.6
func ElementIdArraySlice_Get(slice *ElementIdArraySlice, index int32) *ElementId
func ElementIdArray_Add ¶ added in v0.0.6
func ElementIdArray_Add(array *ElementIdArray, item ElementId) *ElementId
func ElementIdArray_Get ¶ added in v0.0.6
func ElementIdArray_Get(array *ElementIdArray, index int32) *ElementId
func ElementIdArray_GetValue ¶ added in v0.0.6
func ElementIdArray_GetValue(array *ElementIdArray, index int32) ElementId
func ElementIdArray_RemoveSwapback ¶ added in v0.0.6
func ElementIdArray_RemoveSwapback(array *ElementIdArray, index int32) ElementId
func GetElementId ¶
func GetElementIdWithIndex ¶
type ElementIdArray ¶ added in v0.0.6
func ElementIdArray_Allocate_Arena ¶ added in v0.0.6
func ElementIdArray_Allocate_Arena(capacity int32, arena *Arena) ElementIdArray
func GetPointerOverIds ¶ added in v0.0.6
func GetPointerOverIds() ElementIdArray
type ElementIdArraySlice ¶ added in v0.0.6
type ErrorHandler ¶
type FloatingAttachPointType ¶
type FloatingAttachPointType int32
type FloatingAttachPoints ¶
type FloatingAttachPoints struct {
Element FloatingAttachPointType
Parent FloatingAttachPointType
}
type FloatingAttachToElement ¶
type FloatingAttachToElement int32
type FloatingClipToElement ¶ added in v0.0.6
type FloatingClipToElement int32
type FloatingElementConfig ¶
type FloatingElementConfig struct {
Offset Vector2
Expand Dimensions
ParentId uint32
ZIndex int16
AttachPoints FloatingAttachPoints
PointerCaptureMode PointerCaptureMode
AttachTo FloatingAttachToElement
ClipTo FloatingClipToElement
}
var FloatingElementConfig_DEFAULT FloatingElementConfig = FloatingElementConfig{}
type ImageElementConfig ¶
type ImageElementConfig struct {
ImageData any
}
var ImageElementConfig_DEFAULT ImageElementConfig = ImageElementConfig{}
type ImageRenderData ¶
type ImageRenderData struct {
BackgroundColor Color
CornerRadius CornerRadius
ImageData any
}
type LayoutAlignmentX ¶
type LayoutAlignmentX int32
type LayoutAlignmentY ¶
type LayoutAlignmentY int32
type LayoutConfig ¶
type LayoutConfig struct {
Sizing Sizing
Padding Padding
ChildGap uint16
ChildAlignment ChildAlignment
LayoutDirection LayoutDirection
}
var (
LAYOUT_DEFAULT LayoutConfig = LayoutConfig{}
)
var LayoutConfig_DEFAULT LayoutConfig = LayoutConfig{}
type LayoutDirection ¶
type LayoutDirection int32
type LayoutElement ¶
type LayoutElement struct {
ChildrenOrTextContent struct {
// union
Children __LayoutElementChildren
TextElementData *__TextElementData
}
Dimensions Dimensions
MinDimensions Dimensions
LayoutConfig *LayoutConfig
ElementConfigs __ElementConfigArraySlice
Id uint32
FloatingChildrenCount uint16
}
var LayoutElement_DEFAULT LayoutElement = LayoutElement{}
func LayoutElementArraySlice_Get ¶
func LayoutElementArraySlice_Get(slice *LayoutElementArraySlice, index int32) *LayoutElement
func LayoutElementArray_Add ¶
func LayoutElementArray_Add(array *LayoutElementArray, item LayoutElement) *LayoutElement
func LayoutElementArray_Get ¶
func LayoutElementArray_Get(array *LayoutElementArray, index int32) *LayoutElement
func LayoutElementArray_GetValue ¶
func LayoutElementArray_GetValue(array *LayoutElementArray, index int32) LayoutElement
func LayoutElementArray_RemoveSwapback ¶
func LayoutElementArray_RemoveSwapback(array *LayoutElementArray, index int32) LayoutElement
type LayoutElementArray ¶
type LayoutElementArray struct {
Capacity int32
Length int32
InternalArray *LayoutElement
}
func LayoutElementArray_Allocate_Arena ¶
func LayoutElementArray_Allocate_Arena(capacity int32, arena *Arena) LayoutElementArray
type LayoutElementArraySlice ¶
type LayoutElementArraySlice struct {
Length int32
InternalArray *LayoutElement
}
type LayoutElementHashMapItem ¶
type LayoutElementHashMapItem struct {
BoundingBox BoundingBox
ElementId ElementId
LayoutElement *LayoutElement
OnHoverFunction func(elementId ElementId, pointerInfo PointerData, userData unsafe.Pointer)
HoverFunctionUserData any
NextIndex int32
Generation uint32
DebugData *__DebugElementData
}
var LayoutElementHashMapItem_DEFAULT LayoutElementHashMapItem = LayoutElementHashMapItem{}
type Padding ¶
func PaddingAll ¶
type PointerCaptureMode ¶
type PointerCaptureMode int32
type PointerData ¶
type PointerData struct {
Position Vector2
State PointerDataInteractionState
}
type PointerDataInteractionState ¶
type PointerDataInteractionState int32
type RectangleRenderData ¶
type RectangleRenderData struct {
BackgroundColor Color
CornerRadius CornerRadius
}
type RenderCommand ¶
type RenderCommand struct {
BoundingBox BoundingBox
RenderData RenderData
UserData any
Id uint32
ZIndex int16
CommandType RenderCommandType
}
var RenderCommand_DEFAULT RenderCommand = RenderCommand{}
func RenderCommandArraySlice_Get ¶
func RenderCommandArraySlice_Get(slice *RenderCommandArraySlice, index int32) *RenderCommand
func RenderCommandArray_Add ¶
func RenderCommandArray_Add(array *RenderCommandArray, item RenderCommand) *RenderCommand
func RenderCommandArray_Get ¶
func RenderCommandArray_Get(array *RenderCommandArray, index int32) *RenderCommand
func RenderCommandArray_GetValue ¶
func RenderCommandArray_GetValue(array *RenderCommandArray, index int32) RenderCommand
func RenderCommandArray_RemoveSwapback ¶
func RenderCommandArray_RemoveSwapback(array *RenderCommandArray, index int32) RenderCommand
type RenderCommandArray ¶
type RenderCommandArray struct {
Capacity int32
Length int32
InternalArray *RenderCommand
}
func EndLayout ¶
func EndLayout() RenderCommandArray
func RenderCommandArray_Allocate_Arena ¶
func RenderCommandArray_Allocate_Arena(capacity int32, arena *Arena) RenderCommandArray
func (*RenderCommandArray) Iter ¶
func (r *RenderCommandArray) Iter() iter.Seq[RenderCommand]
type RenderCommandArraySlice ¶
type RenderCommandArraySlice struct {
Length int32
InternalArray *RenderCommand
}
type RenderCommandType ¶
type RenderCommandType int32
type RenderData ¶
type RenderData struct {
// union
Rectangle RectangleRenderData
Text TextRenderData
Image ImageRenderData
Custom CustomRenderData
Border BorderRenderData
Clip ClipRenderData
}
type ScrollContainerData ¶
type ScrollContainerData struct {
ScrollPosition *Vector2
ScrollContainerDimensions Dimensions
ContentDimensions Dimensions
Config ClipElementConfig
Found bool
}
func GetScrollContainerData ¶
func GetScrollContainerData(id ElementId) ScrollContainerData
type ScrollRenderData ¶
type Sizing ¶
type Sizing struct {
Width SizingAxis
Height SizingAxis
}
type SizingAxis ¶
type SizingAxis struct {
Size struct {
// union
MinMax SizingMinMax
Percent float32
}
Type __SizingType
}
func SizingFit ¶ added in v0.0.2
func SizingFit(min, max float32) SizingAxis
func SizingFixed ¶
func SizingFixed(sz float32) SizingAxis
func SizingGrow ¶
func SizingGrow(sz float32) SizingAxis
func SizingPercent ¶ added in v0.0.2
func SizingPercent(percentOfParent float32) SizingAxis
type SizingMinMax ¶
type StringSlice ¶
func (StringSlice) String ¶
func (s StringSlice) String() string
type TextAlignment ¶
type TextAlignment int32
type TextElementConfig ¶
type TextElementConfig struct {
UserData any
TextColor Color
FontId uint16
FontSize uint16
LetterSpacing uint16
LineHeight uint16
WrapMode TextElementConfigWrapMode
TextAlignment TextAlignment
}
var TextElementConfig_DEFAULT TextElementConfig = TextElementConfig{}
func TextConfig ¶
func TextConfig(config TextElementConfig) *TextElementConfig
type TextElementConfigWrapMode ¶
type TextElementConfigWrapMode int32
type TextRenderData ¶
Click to show internal directories.
Click to hide internal directories.