wm/vend/xgbutil/_examples/draw-text/main.go

92 lines
2.3 KiB
Go

// Example draw-text shows how to draw text to an xgraphics.Image type.
package main
import (
"image"
"log"
"os"
"github.com/jezek/xgbutil"
"github.com/jezek/xgbutil/xevent"
"github.com/jezek/xgbutil/xgraphics"
)
var (
// The geometry of the canvas to draw text on.
canvasWidth, canvasHeight = 600, 100
// The background color of the canvas.
bg = xgraphics.BGRA{B: 0xff, G: 0x66, R: 0x33, A: 0xff}
// The path to the font used to draw text.
fontPath = "/usr/share/fonts/TTF/FreeMonoBold.ttf"
// The color of the text.
fg = xgraphics.BGRA{B: 0xff, G: 0xff, R: 0xff, A: 0xff}
// The size of the text.
size = 20.0
// The text to draw.
msg = "This is some text drawn by xgraphics!"
)
func main() {
X, err := xgbutil.NewConn()
if err != nil {
log.Fatal(err)
}
// Load some font. You may need to change the path depending upon your
// system configuration.
fontReader, err := os.Open(fontPath)
if err != nil {
log.Fatal(err)
}
// Now parse the font.
font, err := xgraphics.ParseFont(fontReader)
if err != nil {
log.Fatal(err)
}
// Create some canvas.
ximg := xgraphics.New(X, image.Rect(0, 0, canvasWidth, canvasHeight))
ximg.For(func(x, y int) xgraphics.BGRA {
return bg
})
// Now write the text.
_, _, err = ximg.Text(10, 10, fg, size, font, msg)
if err != nil {
log.Fatal(err)
}
// Compute extents of first line of text.
_, firsth := xgraphics.Extents(font, size, msg)
// Now show the image in its own window.
win := ximg.XShowExtra("Drawing text using xgraphics", true)
// Now draw some more text below the above and demonstrate how to update
// only the region we've updated.
_, _, err = ximg.Text(10, 10+firsth, fg, size, font, "Some more text.")
if err != nil {
log.Fatal(err)
}
// Now compute extents of the second line of text, so we know which region
// to update.
secw, sech := xgraphics.Extents(font, size, "Some more text.")
// Now repaint on the region that we drew text on. Then update the screen.
bounds := image.Rect(10, 10+firsth, 10+secw, 10+firsth+sech)
ximg.SubImage(bounds).(*xgraphics.Image).XDraw()
ximg.XPaint(win.Id)
// All we really need to do is block, which could be achieved using
// 'select{}'. Invoking the main event loop however, will emit error
// message if anything went seriously wrong above.
xevent.Main(X)
}