From 1e4a9c424efb93159c15feeb2fc1733fef6e2297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 25 Jul 2019 16:54:45 +0200 Subject: [PATCH] python: bind PixelFormat and PixelStorage. Just the uncompressed ones for now. --- src/python/magnum/__init__.py | 4 +- src/python/magnum/magnum.cpp | 75 +++++++++++++++++++++++++++++++++- src/python/magnum/test/test.py | 47 +++++++++++++++++++++ 3 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 src/python/magnum/test/test.py diff --git a/src/python/magnum/__init__.py b/src/python/magnum/__init__.py index 559a253..9cd9728 100644 --- a/src/python/magnum/__init__.py +++ b/src/python/magnum/__init__.py @@ -84,5 +84,7 @@ __all__ = [ 'Range2D', 'Range2Di', 'Range2Dd', 'Range3D', 'Range3Di', 'Range3Dd', - 'MeshPrimitive', 'MeshIndexType' + 'MeshPrimitive', 'MeshIndexType', + + 'PixelFormat', 'PixelStorage' ] diff --git a/src/python/magnum/magnum.cpp b/src/python/magnum/magnum.cpp index f9fff86..90028de 100644 --- a/src/python/magnum/magnum.cpp +++ b/src/python/magnum/magnum.cpp @@ -23,8 +23,11 @@ DEALINGS IN THE SOFTWARE. */ +#include #include #include +#include +#include #include "magnum/bootstrap.h" @@ -50,6 +53,73 @@ void magnum(py::module& m) { .value("UNSIGNED_BYTE", MeshIndexType::UnsignedByte) .value("UNSIGNED_SHORT", MeshIndexType::UnsignedShort) .value("UNSIGNED_INT", MeshIndexType::UnsignedInt); + + py::enum_{m, "PixelFormat", "Format of pixel data"} + .value("R8UNORM", PixelFormat::R8Unorm) + .value("RG8UNORM", PixelFormat::RG8Unorm) + .value("RGB8UNORM", PixelFormat::RGB8Unorm) + .value("RGBA8UNORM", PixelFormat::RGBA8Unorm) + .value("R8SNORM", PixelFormat::R8Snorm) + .value("RG8SNORM", PixelFormat::RG8Snorm) + .value("RGB8SNORM", PixelFormat::RGB8Snorm) + .value("RGBA8SNORM", PixelFormat::RGBA8Snorm) + .value("R8UI", PixelFormat::R8UI) + .value("RG8UI", PixelFormat::RG8UI) + .value("RGB8UI", PixelFormat::RGB8UI) + .value("RGBA8UI", PixelFormat::RGBA8UI) + .value("R8I", PixelFormat::R8I) + .value("RG8I", PixelFormat::RG8I) + .value("RGB8I", PixelFormat::RGB8I) + .value("RGBA8I", PixelFormat::RGBA8I) + .value("R16UNORM", PixelFormat::R16Unorm) + .value("RG16UNORM", PixelFormat::RG16Unorm) + .value("RGB16UNORM", PixelFormat::RGB16Unorm) + .value("RGBA16UNORM", PixelFormat::RGBA16Unorm) + .value("R16SNORM", PixelFormat::R16Snorm) + .value("RG16SNORM", PixelFormat::RG16Snorm) + .value("RGB16SNORM", PixelFormat::RGB16Snorm) + .value("RGBA16SNORM", PixelFormat::RGBA16Snorm) + .value("R16UI", PixelFormat::R16UI) + .value("RG16UI", PixelFormat::RG16UI) + .value("RGB16UI", PixelFormat::RGB16UI) + .value("RGBA16UI", PixelFormat::RGBA16UI) + .value("R16I", PixelFormat::R16I) + .value("RG16I", PixelFormat::RG16I) + .value("RGB16I", PixelFormat::RGB16I) + .value("RGBA16I", PixelFormat::RGBA16I) + .value("R32UI", PixelFormat::R32UI) + .value("RG32UI", PixelFormat::RG32UI) + .value("RGB32UI", PixelFormat::RGB32UI) + .value("RGBA32UI", PixelFormat::RGBA32UI) + .value("R32I", PixelFormat::R32I) + .value("RG32I", PixelFormat::RG32I) + .value("RGB32I", PixelFormat::RGB32I) + .value("RGBA32I", PixelFormat::RGBA32I) + .value("R16F", PixelFormat::R16F) + .value("RG16F", PixelFormat::RG16F) + .value("RGB16F", PixelFormat::RGB16F) + .value("RGBA16F", PixelFormat::RGBA16F) + .value("R32F", PixelFormat::R32F) + .value("RG32F", PixelFormat::RG32F) + .value("RGB32F", PixelFormat::RGB32F) + .value("RGBA32F", PixelFormat::RGBA32F); + + py::class_{m, "PixelStorage", "Pixel storage parameters"} + .def(py::init(), "Default constructor") + + /* Comparison */ + .def(py::self == py::self, "Equality comparison") + .def(py::self != py::self, "Non-equality comparison") + + /* Properties */ + .def_property("alignment", + &PixelStorage::alignment, &PixelStorage::setAlignment, "Row alignment") + .def_property("row_length", + &PixelStorage::rowLength, &PixelStorage::setRowLength, "Row length") + .def_property("image_height", + &PixelStorage::imageHeight, &PixelStorage::setImageHeight, "Image height") + .def_property("skip", + &PixelStorage::skip, &PixelStorage::setSkip, "Pixel, row and image skip"); } }} @@ -57,11 +127,12 @@ void magnum(py::module& m) { PYBIND11_MODULE(_magnum, m) { m.doc() = "Root Magnum module"; - magnum::magnum(m); - py::module math = m.def_submodule("math"); magnum::math(m, math); + /* These need stuff from math, so need to be called after */ + magnum::magnum(m); + /* In case Magnum is a bunch of static libraries, put everything into a single shared lib to make it easier to install (which is the point of static builds) and avoid issues with multiply-defined global symbols. diff --git a/src/python/magnum/test/test.py b/src/python/magnum/test/test.py new file mode 100644 index 0000000..5c07e29 --- /dev/null +++ b/src/python/magnum/test/test.py @@ -0,0 +1,47 @@ +# +# This file is part of Magnum. +# +# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 +# Vladimír Vondruš +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# + +import unittest + +from magnum import * + +class PixelStorage_(unittest.TestCase): + def test_init(self): + a = PixelStorage() + self.assertEqual(a.alignment, 4) + self.assertEqual(a.row_length, 0) + self.assertEqual(a.image_height, 0) + self.assertEqual(a.skip, Vector3i()) + + def test_properties(self): + a = PixelStorage() + a.alignment = 1 + a.row_length = 64 + a.image_height = 256 + a.skip = (3, 1, 2) + self.assertEqual(a.alignment, 1) + self.assertEqual(a.row_length, 64) + self.assertEqual(a.image_height, 256) + self.assertEqual(a.skip, Vector3i(3, 1, 2))