xgb-window: add comparison with correct blending
This commit is contained in:
parent
0f7fcca7ce
commit
44b01ccb17
|
@ -4,6 +4,7 @@ import (
|
||||||
"github.com/BurntSushi/xgb"
|
"github.com/BurntSushi/xgb"
|
||||||
"github.com/BurntSushi/xgb/xproto"
|
"github.com/BurntSushi/xgb/xproto"
|
||||||
"log"
|
"log"
|
||||||
|
"math"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -73,6 +74,17 @@ func main() {
|
||||||
_ = xproto.CreateGC(X, cid, xproto.Drawable(wid),
|
_ = xproto.CreateGC(X, cid, xproto.Drawable(wid),
|
||||||
xproto.GcGraphicsExposures, []uint32{0})
|
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 w, h uint16
|
||||||
var start, end uint32 = 0xabcdef, 0x32ab54
|
var start, end uint32 = 0xabcdef, 0x32ab54
|
||||||
gradient := func() {
|
gradient := func() {
|
||||||
|
@ -86,17 +98,28 @@ func main() {
|
||||||
|
|
||||||
for y := low; y < high; y++ {
|
for y := low; y < high; y++ {
|
||||||
ratio := float64(y-low) / (float64(high) - float64(low))
|
ratio := float64(y-low) / (float64(high) - float64(low))
|
||||||
iratio := 1 - ratio
|
|
||||||
|
|
||||||
rR := uint32(ratio*float64(ra)+iratio*float64(rb)) & 0xff
|
rR := blend(ra, rb, ratio, 2.2)
|
||||||
gG := uint32(ratio*float64(ga)+iratio*float64(gb)) & 0xff
|
gG := blend(ga, gb, ratio, 2.2)
|
||||||
bB := uint32(ratio*float64(ba)+iratio*float64(bb)) & 0xff
|
bB := blend(ba, bb, ratio, 2.2)
|
||||||
|
|
||||||
_ = xproto.ChangeGC(X, cid, xproto.GcForeground,
|
_ = xproto.ChangeGC(X, cid, xproto.GcForeground,
|
||||||
[]uint32{0xff000000 | rR<<16 | gG<<8 | bB})
|
[]uint32{0xff000000 | rR<<16 | gG<<8 | bB})
|
||||||
_ = xproto.PolyLine(X, xproto.CoordModeOrigin, xproto.Drawable(wid),
|
_ = xproto.PolyLine(X, xproto.CoordModeOrigin, xproto.Drawable(wid),
|
||||||
cid, []xproto.Point{
|
cid, []xproto.Point{
|
||||||
{X: 50, Y: int16(y)},
|
{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)},
|
{X: int16(w - 50), Y: int16(y)},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue