Two new tools added to the Level Editor: * Pan Tool: left-click to scroll the level around safely. * Text Tool: write text onto your level. Features of the Text Tool: * Can choose from the game's built-in fonts, size and enter the message you want to write. * The mouse cursor previews the text when hovered over the level. * Click to "stamp" the text onto your level. The currently selected color swatch will be used to color the text in. * Adds two new fonts: Azulian.ttf and Rive.ttf that can be selected in the Text Tool. Some implementation notes: * Added package native/engine_sdl.go that handles the lower-level SDL2_TTF logic to rasterize the text into a black&white image. * WASM not supported yet (if the game even still built for WASM); native/engine_wasm.go stubs out the TextToImage() call with a "not supported" error just in case. Other changes: * New Toolbar icons: they are 24x24 instead of 32x32 to make more room for more tools. * The toolbar now shows two buttons per row for a more densely packed layout. For very narrow screen widths (< 600px) the default Vertical Toolbar layout will use one-button-per-row to not eat too much screen real estate. * In the Horizontal Toolbars layout there are 2 buttons per column.
57 lines
1.3 KiB
Go
57 lines
1.3 KiB
Go
package drawtool
|
|
|
|
import (
|
|
"git.kirsle.net/apps/doodle/pkg/native"
|
|
"git.kirsle.net/go/render"
|
|
"git.kirsle.net/go/ui"
|
|
)
|
|
|
|
// TextSettings holds currently selected Text Tool settings.
|
|
type TextSettings struct {
|
|
Font string // like 'DejaVuSans.ttf'
|
|
Size int
|
|
Message string
|
|
Label *ui.Label // cached label texture
|
|
}
|
|
|
|
// Currently active settings (global variable)
|
|
var TT TextSettings
|
|
|
|
// IsZero checks if the TextSettings are populated.
|
|
func (tt TextSettings) IsZero() bool {
|
|
return tt.Font == "" && tt.Size == 0 && tt.Message == ""
|
|
}
|
|
|
|
// ToStroke converts a TextSettings configuration into a Freehand
|
|
// Stroke, coloring in all of the pixels.
|
|
func (tt TextSettings) ToStroke(e render.Engine, color render.Color, at render.Point) (*Stroke, error) {
|
|
stroke := NewStroke(Freehand, color)
|
|
|
|
// Render the text to a Go image so we can get the colors from
|
|
// it uniformly.
|
|
img, err := native.TextToImage(e, tt.Label.Font)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Pull all its pixels.
|
|
var (
|
|
max = img.Bounds().Max
|
|
x = 0
|
|
y = 0
|
|
)
|
|
for x = 0; x < max.X; x++ {
|
|
for y = 0; y < max.Y; y++ {
|
|
hue := img.At(x, y)
|
|
r, g, b, _ := hue.RGBA()
|
|
if r == 65535 && g == r && b == r {
|
|
continue
|
|
}
|
|
|
|
stroke.Points = append(stroke.Points, render.NewPoint(x+at.X, y+at.Y))
|
|
}
|
|
}
|
|
|
|
return stroke, nil
|
|
}
|