clay

package module
v0.0.8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 26, 2025 License: MIT Imports: 5 Imported by: 0

README

clay

GoDoc

This is a Go port of the C layout library (Clay).

Goals

  • Be entirely Go (no Cgo)
  • Idiomatic Go public API
  • No unsafe in the public API
  • Be fast

Renderers

Clay includes multiple prebuilt renderers:

Generate clay.go

Everything in clay.go is generated from the main project's clay.h file using CxGo. Just run the command below to regenerate it.

go tool cxgo

License

This project is governed by the MIT license. See LICENSE for full description.

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

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 Hovered

func Hovered() bool

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 PointerOver(elementId ElementId) bool

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 SetPointerState(position Vector2, isPointerDown bool)

func SetQueryScrollOffsetFunction

func SetQueryScrollOffsetFunction(queryScrollOffsetFunction func(elementId uint32, userData unsafe.Pointer) Vector2, userData any)

func Text

func Text(text string, config *TextElementConfig)

func UI

func UI(id ...ElementId) func(decl ElementDeclaration, children func())

func UpdateScrollContainers

func UpdateScrollContainers(enableDragScrolling bool, scrollDelta Vector2, deltaTime float32)

Types

type Arena

type Arena struct {
	NextAllocation uint64
	Capacity       uint64
	Memory         *byte
}

func CreateArenaWithCapacityAndMemory

func CreateArenaWithCapacityAndMemory(memory []byte) Arena

type AspectRatioElementConfig added in v0.0.6

type AspectRatioElementConfig struct {
	AspectRatio float32
}
var AspectRatioElementConfig_DEFAULT AspectRatioElementConfig = AspectRatioElementConfig{}

type BooleanWarnings

type BooleanWarnings struct {
	MaxElementsExceeded           bool
	MaxRenderCommandsExceeded     bool
	MaxTextMeasureCacheExceeded   bool
	TextMeasurementFunctionNotSet bool
}

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 BoundingBox

type BoundingBox struct {
	X      float32
	Y      float32
	Width  float32
	Height float32
}

type ChildAlignment

type ChildAlignment struct {
	X LayoutAlignmentX
	Y LayoutAlignmentY
}

type ClipElementConfig added in v0.0.5

type ClipElementConfig struct {
	Horizontal  bool
	Vertical    bool
	ChildOffset Vector2
}
var ClipElementConfig_DEFAULT ClipElementConfig = ClipElementConfig{Horizontal: false}

type ClipRenderData added in v0.0.5

type ClipRenderData ScrollRenderData

type Color

type Color struct {
	R float32
	G float32
	B float32
	A float32
}

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 Dimensions struct {
	Width  float32
	Height float32
}

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
	SharedElementConfig      *SharedElementConfig
}

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

type ElementId struct {
	Id       uint32
	Offset   uint32
	BaseId   uint32
	StringId String
}
var ElementId_DEFAULT ElementId = 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 GetElementId(idString string) ElementId

func GetElementIdWithIndex

func GetElementIdWithIndex(idString string, index uint32) ElementId

func ID

func ID(label string) ElementId

func IDI added in v0.0.8

func IDI(label string, index uint32) ElementId

type ElementIdArray added in v0.0.6

type ElementIdArray struct {
	Capacity      int32
	Length        int32
	InternalArray *ElementId
}

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 ElementIdArraySlice struct {
	Length        int32
	InternalArray *ElementId
}

type ErrorData

type ErrorData struct {
	ErrorType ErrorType
	ErrorText String
	UserData  any
}

func (ErrorData) Error

func (e ErrorData) Error() string

type ErrorHandler

type ErrorHandler struct {
	ErrorHandlerFunction func(errorText ErrorData)
	UserData             any
}

type ErrorType

type ErrorType int32

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

type Padding struct {
	Left   uint16
	Right  uint16
	Top    uint16
	Bottom uint16
}

func PaddingAll

func PaddingAll(padding uint16) Padding

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

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 ScrollRenderData struct {
	Horizontal bool
	Vertical   bool
}

type SharedElementConfig

type SharedElementConfig struct {
	BackgroundColor Color
	CornerRadius    CornerRadius
	UserData        any
}
var SharedElementConfig_DEFAULT SharedElementConfig = SharedElementConfig{}

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 SizingMinMax struct {
	Min float32
	Max float32
}

type String

type String struct {
	IsStaticallyAllocated bool
	Length                int32
	Chars                 *byte
}
var String_DEFAULT String = String{IsStaticallyAllocated: false}

func (String) String

func (s String) String() string

type StringSlice

type StringSlice struct {
	Length    int32
	Chars     *byte
	BaseChars *byte
}

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

type TextRenderData struct {
	StringContents StringSlice
	TextColor      Color
	FontId         uint16
	FontSize       uint16
	LetterSpacing  uint16
	LineHeight     uint16
}

type Vector2

type Vector2 struct {
	X float32
	Y float32
}

func GetScrollOffset added in v0.0.5

func GetScrollOffset() Vector2

Directories

Path Synopsis
examples
ebitengine command
sdl2 command
sdl3 command
software command
renderers

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL