diff --git a/app/headless/backend_test.go b/app/headless/backend_test.go index 0a2bf7cf..5c7d6425 100644 --- a/app/headless/backend_test.go +++ b/app/headless/backend_test.go @@ -107,7 +107,7 @@ func TestFramebuffers(t *testing.T) { fbo1 := newFBO(t, b, sz) fbo2 := newFBO(t, b, sz) var ( - col1 = color.NRGBA{R: 0xac, G: 0xbe, B: 0xef, A: 0xde} + col1 = color.NRGBA{R: 0xac, G: 0xbd, B: 0xef, A: 0xde} col2 = color.NRGBA{R: 0xfe, G: 0xba, B: 0xbe, A: 0xca} ) fcol1, fcol2 := f32color.LinearFromSRGB(col1), f32color.LinearFromSRGB(col2) diff --git a/internal/f32color/rgba.go b/internal/f32color/rgba.go index 4fc27421..5e24d912 100644 --- a/internal/f32color/rgba.go +++ b/internal/f32color/rgba.go @@ -28,9 +28,9 @@ func (col RGBA) SRGB() color.NRGBA { return color.NRGBA{} } return color.NRGBA{ - R: uint8(linearTosRGB(col.R/col.A)*255 + .5), - G: uint8(linearTosRGB(col.G/col.A)*255 + .5), - B: uint8(linearTosRGB(col.B/col.A)*255 + .5), + R: uint8(linearTosRGB(col.R)/col.A*255 + .5), + G: uint8(linearTosRGB(col.G)/col.A*255 + .5), + B: uint8(linearTosRGB(col.B)/col.A*255 + .5), A: uint8(col.A*255 + .5), } } @@ -49,13 +49,13 @@ func (col RGBA) Opaque() RGBA { return col } -// LinearFromSRGB converts from SRGBA to RGBA. +// LinearFromSRGB converts from col in the sRGB colorspace to RGBA. func LinearFromSRGB(col color.NRGBA) RGBA { af := float32(col.A) / 0xFF return RGBA{ - R: sRGBToLinear(float32(col.R)/0xff) * af, - G: sRGBToLinear(float32(col.G)/0xff) * af, - B: sRGBToLinear(float32(col.B)/0xff) * af, + R: sRGBToLinear(float32(col.R) / 0xff * af), + G: sRGBToLinear(float32(col.G) / 0xff * af), + B: sRGBToLinear(float32(col.B) / 0xff * af), A: af, } } diff --git a/internal/f32color/rgba_test.go b/internal/f32color/rgba_test.go index 654fd139..f30cfad9 100644 --- a/internal/f32color/rgba_test.go +++ b/internal/f32color/rgba_test.go @@ -36,3 +36,18 @@ func TestNRGBAToLinearRGBA_Boundary(t *testing.T) { } } } + +func TestLinearToRGBARoundtrip(t *testing.T) { + for col := 0; col <= 0xFF; col++ { + for alpha := 0; alpha <= 0xFF; alpha++ { + want := color.NRGBA{R: uint8(col), A: uint8(alpha)} + if alpha == 0 { + want.R = 0 + } + got := LinearFromSRGB(want).SRGB() + if want != got { + t.Errorf("got %v expected %v", got, want) + } + } + } +}