From f8f0f3f1b7fd5e8421501d3095623fdd38d1012c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 16 Sep 2019 21:14:49 +0200 Subject: [PATCH] python: expose framebuffer reading to an image (not a view). --- src/python/magnum/gl.cpp | 2 ++ src/python/magnum/test/test.py | 3 ++ src/python/magnum/test/test_gl_gl.py | 54 +++++++++++++++++++++++++++- 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/python/magnum/gl.cpp b/src/python/magnum/gl.cpp index be641af..e46e35a 100644 --- a/src/python/magnum/gl.cpp +++ b/src/python/magnum/gl.cpp @@ -27,6 +27,7 @@ #include /* for Mesh.buffers */ #include #include +#include #include #include #include @@ -686,6 +687,7 @@ void gl(py::module& m) { self.clear(mask); }, "Clear specified buffers in the framebuffer") .def("read", static_cast(&GL::AbstractFramebuffer::read), "Read block of pixels from the framebuffer to an image view") + .def("read", static_cast(&GL::AbstractFramebuffer::read), "Read block of pixels from the framebuffer to an image") /** @todo more */; py::class_> defaultFramebuffer{m, diff --git a/src/python/magnum/test/test.py b/src/python/magnum/test/test.py index 55f9a70..0af0f8e 100644 --- a/src/python/magnum/test/test.py +++ b/src/python/magnum/test/test.py @@ -65,6 +65,7 @@ class Image(unittest.TestCase): @unittest.skip("No way to create a non-empty Image at the moment") def test_data(self): + # Tested in test_gl_gl.Framebuffer.test_read_image instead a = Image2D(PixelFormat.R8I, Vector2i(3, 17)) # TODO a_refcount = sys.getrefcount(a) @@ -87,6 +88,7 @@ class Image(unittest.TestCase): @unittest.skip("No way to create a non-empty Image at the moment") def test_pixels(self): + # Tested in test_gl_gl.Framebuffer.test_read_image instead a = Image2D(PixelFormat.RG32UI, Vector2i(3, 17)) # TODO a_refcount = sys.getrefcount(a) @@ -197,6 +199,7 @@ class ImageView(unittest.TestCase): @unittest.skip("No way to create a non-empty Image at the moment") def test_init_image(self): + # Tested in test_gl_gl.Framebuffer.test_read_image instead a = Image2D(PixelFormat.R32F, Vector2i(3, 17)) # TODO a_refcount = sys.getrefcount(a) diff --git a/src/python/magnum/test/test_gl_gl.py b/src/python/magnum/test/test_gl_gl.py index 3b2a260..90da61e 100644 --- a/src/python/magnum/test/test_gl_gl.py +++ b/src/python/magnum/test/test_gl_gl.py @@ -154,7 +154,59 @@ class Framebuffer(GLTestCase): self.assertIs(framebuffer.attachments[0], renderbuffer) self.assertEqual(sys.getrefcount(renderbuffer), renderbuffer_refcount + 1) - def test_read(self): + def test_read_image(self): + renderbuffer = gl.Renderbuffer() + renderbuffer.set_storage(gl.RenderbufferFormat.RGBA8, (4, 4)) + + framebuffer = gl.Framebuffer(((0, 0), (4, 4))) + framebuffer.attach_renderbuffer(gl.Framebuffer.ColorAttachment(0), renderbuffer) + + gl.Renderer.clear_color = Color4(1.0, 0.5, 0.75) + framebuffer.clear(gl.FramebufferClear.COLOR) + + a = Image2D(PixelFormat.RGBA8_UNORM) + framebuffer.read(Range2Di.from_size((1, 1), (2, 2)), a) + self.assertEqual(a.size, Vector2i(2, 2)) + + # This tests Image internals because this is the only way how to get a + # non-empty Image ATM (sorry) + # TODO: remove once Image can be created non-empty + a_refcount = sys.getrefcount(a) + + data = a.data + self.assertIs(data.owner, a) + self.assertEqual(sys.getrefcount(a), a_refcount + 1) + + del data + self.assertEqual(sys.getrefcount(a), a_refcount) + + pixels = a.pixels + self.assertIs(pixels.owner, a) + self.assertEqual(sys.getrefcount(a), a_refcount + 1) + self.assertEqual(ord(a.pixels[0, 0, 0]), 0xff) + self.assertEqual(ord(a.pixels[0, 1, 1]), 0x80) + self.assertEqual(ord(a.pixels[1, 0, 2]), 0xbf) + + del pixels + self.assertEqual(sys.getrefcount(a), a_refcount) + + view = ImageView2D(a) + self.assertEqual(view.size, (2, 2)) + self.assertIs(view.owner, a) + self.assertEqual(sys.getrefcount(a), a_refcount + 1) + + del view + self.assertEqual(sys.getrefcount(a), a_refcount) + + mview = MutableImageView2D(a) + self.assertEqual(mview.size, (2, 2)) + self.assertIs(mview.owner, a) + self.assertEqual(sys.getrefcount(a), a_refcount + 1) + + del mview + self.assertEqual(sys.getrefcount(a), a_refcount) + + def test_read_view(self): renderbuffer = gl.Renderbuffer() renderbuffer.set_storage(gl.RenderbufferFormat.RGBA8, (4, 4))