doodle/pkg/drawtool/text_tool.go
Noah Petherbridge 77297fd60d Text Tool and Pan Tool
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.
2022-03-05 15:34:20 -08:00

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
}