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.
182 lines
3.3 KiB
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)
|
|
}
|