summaryrefslogtreecommitdiff
path: root/drw
diff options
context:
space:
mode:
Diffstat (limited to 'drw')
-rw-r--r--drw/drw.go44
-rw-r--r--drw/x.go68
2 files changed, 112 insertions, 0 deletions
diff --git a/drw/drw.go b/drw/drw.go
new file mode 100644
index 0000000..a0844c8
--- /dev/null
+++ b/drw/drw.go
@@ -0,0 +1,44 @@
+package drw // import "hhvn.uk/hbspbar/drw"
+
+import (
+ "image"
+
+ "hhvn.uk/hbspbar/config"
+
+ "github.com/jezek/xgbutil/xgraphics"
+ "github.com/BurntSushi/freetype-go/freetype"
+)
+
+func DrawText(i *image.RGBA, x int, col uint32, text string) (int, error) {
+ ft.SetClip(i.Bounds())
+ ft.SetDst(i)
+
+ src := image.NewUniform(int2rgb(col))
+ ft.SetSrc(src)
+
+ pt := freetype.Pt(x, config.FontYPad+
+ int(ft.PointToFix32(config.FontSize)>>8))
+ npt, err := ft.DrawString(text, pt)
+
+ return int(npt.X / 256) - x, err
+}
+
+func TextWidth(text string) (int) {
+ w, _ := xgraphics.Extents(font, config.FontSize, text)
+ return w
+}
+
+func DrawRect(i *image.RGBA, x, y, w, h int, c uint32, fill bool) {
+ col := int2rgb(c)
+
+ var ix, iy int
+
+ for ix = x; ix < x + w; ix++ {
+ for iy = y; iy < y + h; iy++ {
+ if fill || ix == x || ix == x + w - 1 ||
+ iy == y || iy == y + h - 1 {
+ i.Set(ix, iy, col)
+ }
+ }
+ }
+}
diff --git a/drw/x.go b/drw/x.go
new file mode 100644
index 0000000..70b29da
--- /dev/null
+++ b/drw/x.go
@@ -0,0 +1,68 @@
+package drw // import "hhvn.uk/hbspbar/drw"
+
+import (
+ "os"
+ "image/color"
+
+ "hhvn.uk/hbspbar/config"
+ "hhvn.uk/hbspbar/common"
+
+ "github.com/jezek/xgb"
+ "github.com/jezek/xgb/xproto"
+ "github.com/jezek/xgbutil"
+ "github.com/jezek/xgbutil/xgraphics"
+ "github.com/BurntSushi/freetype-go/freetype"
+ "github.com/BurntSushi/freetype-go/freetype/truetype"
+)
+
+var InitErr error
+var X *xgb.Conn
+var XU *xgbutil.XUtil
+var Screen *xproto.ScreenInfo
+
+var font *truetype.Font
+var ft *freetype.Context
+
+func init() {
+ var err error
+
+ X, err = xgb.NewConn()
+ if err != nil {
+ InitErr = err
+ return
+ }
+
+ XU, err = xgbutil.NewConnXgb(X)
+ if err != nil {
+ InitErr = err
+ return
+ }
+
+ setup := xproto.Setup(X)
+ Screen = setup.DefaultScreen(X)
+
+ read, err := os.Open(config.Font)
+ if err != nil {
+ InitErr = common.Perror("os.Open", err)
+ return
+ }
+
+ font, err = xgraphics.ParseFont(read)
+ if err != nil {
+ InitErr = common.Perror("xgraphics.ParseFont", err)
+ return
+ }
+
+ ft = freetype.NewContext()
+ ft.SetDPI(72)
+ ft.SetFont(font)
+ ft.SetFontSize(config.FontSize)
+}
+
+func int2rgb(argb uint32) (color.RGBA) {
+ return color.RGBA{
+ B: uint8( argb & 0x000000ff),
+ G: uint8((argb & 0x0000ff00) >> 8),
+ R: uint8((argb & 0x00ff0000) >> 16),
+ A: uint8((argb & 0xff000000) >> 24) }
+}