What version of Go are you using (go version)?
$ go version
go version go1.18 linux/amd64
Does this issue reproduce with the latest release?
Yes
What operating system and processor architecture are you using (go env)?
go env Output
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/nicolas/.cache/go-build"
GOENV="/home/nicolas/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/nicolas/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/nicolas/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.18"
GCCGO="gccgo"
GOAMD64="v1"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
GOWORK=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build2624768179=/tmp/go-build -gno-record-gcc-switches"
What did you do?
I simply created an NRGBA image with a single pixel (with a small value color (1 in uint8) and an alpha less than 0.5 (127 in uint8)), and tried to copy it using it as source of draw.Draw():
package main
import (
"image"
"image/color"
"image/draw"
"testing"
"github.com/stretchr/testify/assert"
)
func TestImgDrawNRGBA(t *testing.T) {
pixel := color.NRGBA{1, 0, 0, 127}
expected := image.NewNRGBA(image.Rect(0, 0, 1, 1))
expected.SetNRGBA(0, 0, pixel)
actual := image.NewNRGBA(expected.Rect)
draw.Draw(actual, expected.Rect, expected, image.Point{0, 0}, draw.Src)
assert.Equal(t, expected, actual)
}
Go playground link: https://go.dev/play/p/IYelc0epkM7
What did you expect to see?
I expected the test to pass because this test passes using go-1.17.8 (Go playground link: https://go.dev/play/p/IYelc0epkM7?v=goprev).
What did you see instead?
Instead I saw a difference between the original image (expected) and the actual one (drawn using draw.Draw()):
Diff:
--- Expected
+++ Actual
@@ -2,3 +2,3 @@
Pix: ([]uint8) (len=4) {
- 00000000 01 00 00 7f |....|
+ 00000000 00 00 00 7f |....|
},
Even though this is a non-alpha-premultiplied image, it looks like a possible precision loss due to the value of the alpha channel: if I use an alpha higher or equal than 0.5 (128 in uint8) the test passes.
What version of Go are you using (
go version)?Does this issue reproduce with the latest release?
Yes
What operating system and processor architecture are you using (
go env)?go envOutputWhat did you do?
I simply created an NRGBA image with a single pixel (with a small value color (1 in
uint8) and an alpha less than 0.5 (127 inuint8)), and tried to copy it using it as source ofdraw.Draw():Go playground link: https://go.dev/play/p/IYelc0epkM7
What did you expect to see?
I expected the test to pass because this test passes using
go-1.17.8(Go playground link: https://go.dev/play/p/IYelc0epkM7?v=goprev).What did you see instead?
Instead I saw a difference between the original image (expected) and the actual one (drawn using
draw.Draw()):Even though this is a
non-alpha-premultipliedimage, it looks like a possible precision loss due to the value of thealphachannel: if I use an alpha higher or equal than 0.5 (128 inuint8) the test passes.