From f0367ee72d594afa6caaabe42feccf421f6d637c Mon Sep 17 00:00:00 2001 From: Thomas Friedel Date: Wed, 4 Dec 2019 12:13:09 +0100 Subject: [PATCH] GetImageData bugfix --- backend/goglbackend/imagedata.go | 15 ++++++++++----- backend/xmobilebackend/gen/gen.go | 4 ++++ backend/xmobilebackend/imagedata.go | 15 ++++++++++----- backend/xmobilebackend/images.go | 2 +- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/backend/goglbackend/imagedata.go b/backend/goglbackend/imagedata.go index d3bf9bb..a5161a0 100644 --- a/backend/goglbackend/imagedata.go +++ b/backend/goglbackend/imagedata.go @@ -26,14 +26,19 @@ func (b *GoGLBackend) GetImageData(x, y, w, h int) *image.RGBA { if h > b.h { h = b.h } - if len(b.imageBuf) < w*h*3 { - b.imageBuf = make([]byte, w*h*3) - } - gl.ReadPixels(int32(x), int32(y), int32(w), int32(h), gl.RGB, gl.UNSIGNED_BYTE, gl.Ptr(&b.imageBuf[0])) + var vp [4]int32 + gl.GetIntegerv(gl.VIEWPORT, &vp[0]) + + size := int(vp[2] * vp[3] * 3) + if len(b.imageBuf) < size { + b.imageBuf = make([]byte, size) + } + gl.ReadPixels(vp[0], vp[1], vp[2], vp[3], gl.RGB, gl.UNSIGNED_BYTE, gl.Ptr(&b.imageBuf[0])) + rgba := image.NewRGBA(image.Rect(x, y, x+w, y+h)) - bp := 0 for cy := y; cy < y+h; cy++ { + bp := (int(vp[3])-h+cy)*int(vp[2])*3 + x*3 for cx := x; cx < x+w; cx++ { rgba.SetRGBA(cx, y+h-1-cy, color.RGBA{R: b.imageBuf[bp], G: b.imageBuf[bp+1], B: b.imageBuf[bp+2], A: 255}) bp += 3 diff --git a/backend/xmobilebackend/gen/gen.go b/backend/xmobilebackend/gen/gen.go index 5362b39..303e3e9 100644 --- a/backend/xmobilebackend/gen/gen.go +++ b/backend/xmobilebackend/gen/gen.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "io/ioutil" "log" "os" @@ -212,6 +213,8 @@ func rewrite(filename, src string) (string, string) { params[i] = param[6 : len(param)-1] } else if strings.HasPrefix(param, "gl.Ptr(") { params[i] = param[8:len(param)-2] + ":]" + } else if len(param) >= 5 && param[:3] == "vp[" { + params[i] = fmt.Sprintf("int(%s)", param) } } return "b.glctx.ReadPixels(" + params[6] + ", " + strings.Join(params[:len(params)-1], ", ") + ")" @@ -239,6 +242,7 @@ func rewrite(filename, src string) (string, string) { src = rewriteCalls(src, "loadShader", func(params []string) string { return "loadShader(b, " + strings.Join(params, ", ") + ")" }) + src = strings.ReplaceAll(src, "if tex == 0 {", "if tex.Value == 0 {") if filename == "gogl.go" { filename = "xmobile.go" diff --git a/backend/xmobilebackend/imagedata.go b/backend/xmobilebackend/imagedata.go index 86bd625..a119b5a 100755 --- a/backend/xmobilebackend/imagedata.go +++ b/backend/xmobilebackend/imagedata.go @@ -26,14 +26,19 @@ func (b *XMobileBackend) GetImageData(x, y, w, h int) *image.RGBA { if h > b.h { h = b.h } - if len(b.imageBuf) < w*h*3 { - b.imageBuf = make([]byte, w*h*3) - } - b.glctx.ReadPixels(b.imageBuf[0:], x, y, w, h, gl.RGB, gl.UNSIGNED_BYTE) + var vp [4]int32 + b.glctx.GetIntegerv(vp[:], gl.VIEWPORT) + + size := int(vp[2] * vp[3] * 3) + if len(b.imageBuf) < size { + b.imageBuf = make([]byte, size) + } + b.glctx.ReadPixels(b.imageBuf[0:], int(vp[0]), int(vp[1]), int(vp[2]), int(vp[3]), gl.RGB, gl.UNSIGNED_BYTE) + rgba := image.NewRGBA(image.Rect(x, y, x+w, y+h)) - bp := 0 for cy := y; cy < y+h; cy++ { + bp := (int(vp[3])-h+cy)*int(vp[2])*3 + x*3 for cx := x; cx < x+w; cx++ { rgba.SetRGBA(cx, y+h-1-cy, color.RGBA{R: b.imageBuf[bp], G: b.imageBuf[bp+1], B: b.imageBuf[bp+2], A: 255}) bp += 3 diff --git a/backend/xmobilebackend/images.go b/backend/xmobilebackend/images.go index 4c01c5a..41d2751 100755 --- a/backend/xmobilebackend/images.go +++ b/backend/xmobilebackend/images.go @@ -23,7 +23,7 @@ func (b *XMobileBackend) LoadImage(src image.Image) (backendbase.Image, error) { var tex gl.Texture tex = b.glctx.CreateTexture() - if tex == 0 { + if tex.Value == 0 { return nil, errors.New("glGenTextures failed") }