From a0c4688d0cd349eb22197b59f4ad809ec80fd876 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Thu, 27 Feb 2020 18:24:09 +0100 Subject: [PATCH] app/headless,gpu/gl: make ReadPixels y-flipping backend specific The Direct3D backend doesn't need y-flipping, so don't do it unconditionally in package app/headless. Signed-off-by: Elias Naur --- app/headless/backend_test.go | 1 - app/headless/headless.go | 16 ---------------- gpu/gl/backend.go | 17 +++++++++++++++++ 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/app/headless/backend_test.go b/app/headless/backend_test.go index 04874bde..ec3965da 100644 --- a/app/headless/backend_test.go +++ b/app/headless/backend_test.go @@ -194,7 +194,6 @@ func screenshot(t *testing.T, fbo backend.Framebuffer, size image.Point) *image. if err != nil { t.Fatal(err) } - flipImageY(img) if *dumpImages { if err := saveImage(t.Name()+".png", img); err != nil { t.Error(err) diff --git a/app/headless/headless.go b/app/headless/headless.go index bae92738..b451cde8 100644 --- a/app/headless/headless.go +++ b/app/headless/headless.go @@ -127,25 +127,9 @@ func (w *Window) Screenshot() (*image.RGBA, error) { if err != nil { return nil, err } - flipImageY(img) return img, nil } -func flipImageY(img *image.RGBA) { - // Flip image in y-direction. OpenGL's origin is in the lower - // left corner. - row := make([]uint8, img.Stride) - sy := img.Bounds().Dy() - for y := 0; y < sy/2; y++ { - y1 := sy - y - 1 - dest := img.PixOffset(0, y1) - src := img.PixOffset(0, y) - copy(row, img.Pix[dest:]) - copy(img.Pix[dest:], img.Pix[src:src+len(row)]) - copy(img.Pix[src:], row) - } -} - func contextDo(ctx context, f func() error) error { errCh := make(chan error) go func() { diff --git a/gpu/gl/backend.go b/gpu/gl/backend.go index 1b9f5c08..f15a0144 100644 --- a/gpu/gl/backend.go +++ b/gpu/gl/backend.go @@ -640,9 +640,26 @@ func (f *gpuFramebuffer) ReadPixels(src image.Rectangle, pixels []byte) error { return errors.New("unexpected RGBA size") } f.backend.funcs.ReadPixels(src.Min.X, src.Min.Y, src.Dx(), src.Dy(), RGBA, UNSIGNED_BYTE, pixels) + // OpenGL origin is in the lower-left corner. Flip the image to + // match. + flipImageY(src.Dx()*4, src.Dy(), pixels) return glErr(f.backend.funcs) } +func flipImageY(stride int, height int, pixels []byte) { + // Flip image in y-direction. OpenGL's origin is in the lower + // left corner. + row := make([]uint8, stride) + for y := 0; y < height/2; y++ { + y1 := height - y - 1 + dest := y1 * stride + src := y * stride + copy(row, pixels[dest:]) + copy(pixels[dest:], pixels[src:src+len(row)]) + copy(pixels[src:], row) + } +} + func (b *Backend) BindFramebuffer(fbo backend.Framebuffer) { b.funcs.BindFramebuffer(FRAMEBUFFER, fbo.(*gpuFramebuffer).obj) }