xgb-window: add comparison with correct blending
This commit is contained in:
		@@ -4,6 +4,7 @@ import (
 | 
			
		||||
	"github.com/BurntSushi/xgb"
 | 
			
		||||
	"github.com/BurntSushi/xgb/xproto"
 | 
			
		||||
	"log"
 | 
			
		||||
	"math"
 | 
			
		||||
	"math/rand"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -73,6 +74,17 @@ func main() {
 | 
			
		||||
	_ = xproto.CreateGC(X, cid, xproto.Drawable(wid),
 | 
			
		||||
		xproto.GcGraphicsExposures, []uint32{0})
 | 
			
		||||
 | 
			
		||||
	blend := func(a, b uint32, ratio, gamma float64) uint32 {
 | 
			
		||||
		iratio := 1 - ratio
 | 
			
		||||
 | 
			
		||||
		fa := math.Pow(float64(a)/255, gamma)
 | 
			
		||||
		fb := math.Pow(float64(b)/255, gamma)
 | 
			
		||||
 | 
			
		||||
		return uint32(math.Pow(ratio*fa+iratio*fb, 1/gamma)*255) & 0xff
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO: We could show some text just like we intend to with xgb-xrender.go.
 | 
			
		||||
 | 
			
		||||
	var w, h uint16
 | 
			
		||||
	var start, end uint32 = 0xabcdef, 0x32ab54
 | 
			
		||||
	gradient := func() {
 | 
			
		||||
@@ -86,17 +98,28 @@ func main() {
 | 
			
		||||
 | 
			
		||||
		for y := low; y < high; y++ {
 | 
			
		||||
			ratio := float64(y-low) / (float64(high) - float64(low))
 | 
			
		||||
			iratio := 1 - ratio
 | 
			
		||||
 | 
			
		||||
			rR := uint32(ratio*float64(ra)+iratio*float64(rb)) & 0xff
 | 
			
		||||
			gG := uint32(ratio*float64(ga)+iratio*float64(gb)) & 0xff
 | 
			
		||||
			bB := uint32(ratio*float64(ba)+iratio*float64(bb)) & 0xff
 | 
			
		||||
			rR := blend(ra, rb, ratio, 2.2)
 | 
			
		||||
			gG := blend(ga, gb, ratio, 2.2)
 | 
			
		||||
			bB := blend(ba, bb, ratio, 2.2)
 | 
			
		||||
 | 
			
		||||
			_ = xproto.ChangeGC(X, cid, xproto.GcForeground,
 | 
			
		||||
				[]uint32{0xff000000 | rR<<16 | gG<<8 | bB})
 | 
			
		||||
			_ = xproto.PolyLine(X, xproto.CoordModeOrigin, xproto.Drawable(wid),
 | 
			
		||||
				cid, []xproto.Point{
 | 
			
		||||
					{X: 50, Y: int16(y)},
 | 
			
		||||
					{X: int16(w / 2), Y: int16(y)},
 | 
			
		||||
				})
 | 
			
		||||
 | 
			
		||||
			rR = blend(ra, rb, ratio, 1)
 | 
			
		||||
			gG = blend(ga, gb, ratio, 1)
 | 
			
		||||
			bB = blend(ba, bb, ratio, 1)
 | 
			
		||||
 | 
			
		||||
			_ = xproto.ChangeGC(X, cid, xproto.GcForeground,
 | 
			
		||||
				[]uint32{0xff000000 | rR<<16 | gG<<8 | bB})
 | 
			
		||||
			_ = xproto.PolyLine(X, xproto.CoordModeOrigin, xproto.Drawable(wid),
 | 
			
		||||
				cid, []xproto.Point{
 | 
			
		||||
					{X: int16(w / 2), Y: int16(y)},
 | 
			
		||||
					{X: int16(w - 50), Y: int16(y)},
 | 
			
		||||
				})
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user