You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
NoiseTorch/vendor/github.com/aarzilli/nucular/command/command.go

182 lines
3.3 KiB
Go

package command
import (
"image"
"image/color"
"github.com/aarzilli/nucular/font"
"github.com/aarzilli/nucular/rect"
)
// CommandBuffer is a list of drawing directives.
type Buffer struct {
Clip rect.Rect
Commands []Command
}
var nk_null_rect = rect.Rect{-8192.0, -8192.0, 16384.0, 16384.0}
func (buffer *Buffer) Reset() {
buffer.Clip = nk_null_rect
buffer.Commands = buffer.Commands[:0]
}
// Represents one drawing directive.
type Command struct {
rect.Rect
Kind CommandKind
Line Line
RectFilled RectFilled
TriangleFilled TriangleFilled
CircleFilled CircleFilled
Image Image
Text Text
}
type CommandKind uint8
const (
ScissorCmd CommandKind = iota
LineCmd
RectFilledCmd
TriangleFilledCmd
CircleFilledCmd
ImageCmd
TextCmd
)
type Line struct {
LineThickness uint16
Begin image.Point
End image.Point
Color color.RGBA
}
type RectFilled struct {
Rounding uint16
Color color.RGBA
}
type TriangleFilled struct {
A image.Point
B image.Point
C image.Point
Color color.RGBA
}
type CircleFilled struct {
Color color.RGBA
}
type Text struct {
Face font.Face
Foreground color.RGBA
String string
}
type Image struct {
Img *image.RGBA
}
func (b *Buffer) PushScissor(r rect.Rect) {
b.Clip = r
if len(b.Commands) > 0 && b.Commands[len(b.Commands)-1].Kind == ScissorCmd {
b.Commands[len(b.Commands)-1].Rect = r
return
}
var cmd Command
cmd.Kind = ScissorCmd
cmd.Rect = r
b.Commands = append(b.Commands, cmd)
}
func (b *Buffer) StrokeLine(p0, p1 image.Point, line_thickness int, c color.RGBA) {
var cmd Command
cmd.Kind = LineCmd
cmd.Line.LineThickness = uint16(line_thickness)
cmd.Line.Begin = p0
cmd.Line.End = p1
cmd.Line.Color = c
b.Commands = append(b.Commands, cmd)
}
func (b *Buffer) FillRect(rect rect.Rect, rounding uint16, c color.RGBA) {
if c.A == 0 && len(b.Commands) > 0 {
return
}
if !rect.Intersect(&b.Clip) {
return
}
var cmd Command
cmd.Kind = RectFilledCmd
cmd.RectFilled.Rounding = rounding
cmd.Rect = rect
cmd.RectFilled.Color = c
b.Commands = append(b.Commands, cmd)
}
func (b *Buffer) FillCircle(r rect.Rect, c color.RGBA) {
if c.A == 0 {
return
}
if !r.Intersect(&b.Clip) {
return
}
var cmd Command
cmd.Kind = CircleFilledCmd
cmd.Rect = r
cmd.CircleFilled.Color = c
b.Commands = append(b.Commands, cmd)
}
func (b *Buffer) FillTriangle(p0, p1, p2 image.Point, c color.RGBA) {
if c.A == 0 {
return
}
if !b.Clip.Contains(p0) || !b.Clip.Contains(p1) || !b.Clip.Contains(p2) {
return
}
var cmd Command
cmd.Kind = TriangleFilledCmd
cmd.TriangleFilled.A = p0
cmd.TriangleFilled.B = p1
cmd.TriangleFilled.C = p2
cmd.TriangleFilled.Color = c
b.Commands = append(b.Commands, cmd)
}
func (b *Buffer) DrawText(r rect.Rect, str string, face font.Face, fg color.RGBA) {
if len(str) == 0 || (fg.A == 0) {
return
}
if !r.Intersect(&b.Clip) {
return
}
var cmd Command
cmd.Kind = TextCmd
cmd.Rect = r
cmd.Text.Foreground = fg
cmd.Text.Face = face
cmd.Text.String = str
b.Commands = append(b.Commands, cmd)
}
func (b *Buffer) DrawImage(r rect.Rect, img *image.RGBA) {
if !r.Intersect(&b.Clip) {
return
}
var cmd Command
cmd.Kind = ImageCmd
cmd.Rect = r
cmd.Image.Img = img
b.Commands = append(b.Commands, cmd)
}