diff options
| -rw-r--r-- | prototypes/xgb-xrender.go | 54 | 
1 files changed, 23 insertions, 31 deletions
| diff --git a/prototypes/xgb-xrender.go b/prototypes/xgb-xrender.go index 6e07b4e..5fbdf36 100644 --- a/prototypes/xgb-xrender.go +++ b/prototypes/xgb-xrender.go @@ -11,6 +11,7 @@ import (  	"golang.org/x/image/font/gofont/goregular"  	"golang.org/x/image/math/fixed"  	"image" +	"image/draw"  	"log"  	"math/rand"  ) @@ -223,33 +224,13 @@ func main() {  		log.Fatalln(err)  	} -	c := freetype.NewContext() -	c.SetDPI(96) // TODO: Take this from the screen or monitor. -	c.SetFont(f) -	c.SetFontSize(9) -	c.SetSrc(image.White) -	c.SetHinting(font.HintingFull) -	// TODO: Seems like we want to use NRGBA. Or RGBA if the A is always 1. -	// Or implement our own image.Image for direct gamma-corrected RGB! -	nrgb := image.NewRGBA(image.Rect(0, 0, 36, 36)) -	c.SetClip(nrgb.Bounds()) -	c.SetDst(nrgb) - -	bounds := f.Bounds(c.PointToFixed(9 /* FIXME: Duplication. */)) -	log.Println("+%v", bounds) - -	// FIXME: Duplication. -	opts := truetype.Options{ -		Size: 9, -		DPI:  96, +	opts := &truetype.Options{ +		Size:    9, +		DPI:     96, // TODO: Take this from the screen or monitor. +		Hinting: font.HintingFull,  	} +	face := truetype.NewFace(f, opts) -	// TODO: Seems this satisfies the sfnt interface, DrawString just adds -	// kerning and DrawMask on top. -	face := truetype.NewFace(f, &opts) -	_ = face - -	// TODO: Figure out a way to load glyphs into XRender.  	var rgbFormat render.Pictformat  	for _, pf := range pformats.Formats {  		// Hopefully. Might want to check ARGB/BGRA. @@ -268,17 +249,28 @@ func main() {  	// NOTE: A depth of 24 will not work, the server always rejects it.  	_ = render.CreateGlyphSet(X, gsid, rgbFormat) +	//bounds := f.Bounds(c.PointToFixed(opts.Size)) +	//log.Println("+%v", bounds) + +	// TODO: Seems like we want to use NRGBA. Or RGBA if the A is always 1. +	// Or implement our own image.Image for direct gamma-corrected RGB! +	nrgb := image.NewRGBA(image.Rect(0, 0, 36, 36)) +	//nrgb.Bounds() +  	for r := rune(32); r < 128; r++ { +		dr, mask, maskp, advance, ok := face.Glyph( +			fixed.P(0, 18) /* subpixel destination location */, r) +		if !ok { +			log.Println("skip") +			continue +		} +  		for i := 0; i < len(nrgb.Pix); i++ {  			nrgb.Pix[i] = 0  		} -		advance, err := c.DrawString(string(r), fixed.P(18, 18)) -		_, _ = advance, err -		if err != nil { -			log.Println("skip") -			continue -		} +		draw.Draw(nrgb, dr, mask, maskp, draw.Src) +		_ = advance  		_ = render.AddGlyphs(X, gsid, 1, []uint32{uint32(r)},  			[]render.Glyphinfo{{ | 
