[{"id":22999,"web_url":"https://patchwork.libcamera.org/comment/22999/","msgid":"<YoPKzH/0sVbft/U1@pendragon.ideasonboard.com>","date":"2022-05-17T16:18:20","subject":"Re: [libcamera-devel] [PATCH v2 12/13] py: add geometry classes","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Tomi,\n\nThank you for the patch.\n\nOn Tue, May 17, 2022 at 05:33:24PM +0300, Tomi Valkeinen wrote:\n> Add libcamera's geometry classes to the Python bindings.\n> \n> Note that this commit only adds the classes, but they are not used\n> anywhere yet.\n> \n> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> ---\n>  src/py/libcamera/meson.build    |   1 +\n>  src/py/libcamera/pygeometry.cpp | 119 ++++++++++++++++++++++++++++++++\n>  src/py/libcamera/pymain.cpp     |   2 +\n>  3 files changed, 122 insertions(+)\n>  create mode 100644 src/py/libcamera/pygeometry.cpp\n> \n> diff --git a/src/py/libcamera/meson.build b/src/py/libcamera/meson.build\n> index 32e74504..0bef52c7 100644\n> --- a/src/py/libcamera/meson.build\n> +++ b/src/py/libcamera/meson.build\n> @@ -14,6 +14,7 @@ pybind11_dep = pybind11_proj.get_variable('pybind11_dep')\n>  \n>  pycamera_sources = files([\n>      'pyenums.cpp',\n> +    'pygeometry.cpp',\n>      'pymain.cpp',\n>  ])\n>  \n> diff --git a/src/py/libcamera/pygeometry.cpp b/src/py/libcamera/pygeometry.cpp\n> new file mode 100644\n> index 00000000..d77de144\n> --- /dev/null\n> +++ b/src/py/libcamera/pygeometry.cpp\n> @@ -0,0 +1,119 @@\n> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> +/*\n> + * Copyright (C) 2022, Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n> + *\n> + * Python bindings - Geometry classes\n> + */\n> +\n> +#include <array>\n> +\n> +#include <libcamera/geometry.h>\n> +#include <libcamera/libcamera.h>\n> +\n> +#include <pybind11/operators.h>\n> +#include <pybind11/smart_holder.h>\n> +#include <pybind11/stl.h>\n> +\n> +namespace py = pybind11;\n> +\n> +using namespace libcamera;\n> +\n> +void init_pygeometry(py::module &m)\n> +{\n> +\tauto pyPoint = py::class_<Point>(m, \"Point\");\n> +\tauto pySize = py::class_<Size>(m, \"Size\");\n> +\tauto pySizeRange = py::class_<SizeRange>(m, \"SizeRange\");\n> +\tauto pyRectangle = py::class_<Rectangle>(m, \"Rectangle\");\n> +\n> +\tpyPoint\n> +\t\t.def(py::init<>())\n> +\t\t.def(py::init<int, int>())\n> +\t\t.def_readwrite(\"x\", &Point::x)\n> +\t\t.def_readwrite(\"y\", &Point::y)\n> +\t\t.def(py::self == py::self)\n> +\t\t.def(-py::self)\n> +\t\t.def(\"__str__\", &Point::toString)\n> +\t\t.def(\"__repr__\", [](const Point &self) {\n> +\t\t\treturn py::str(\"libcamera.Point({}, {})\")\n> +\t\t\t\t.format(self.x, self.y);\n> +\t\t});\n> +\n> +\tpySize\n> +\t\t.def(py::init<>())\n> +\t\t.def(py::init<unsigned int, unsigned int>())\n> +\t\t.def_readwrite(\"width\", &Size::width)\n> +\t\t.def_readwrite(\"height\", &Size::height)\n> +\t\t.def_property_readonly(\"is_null\", &Size::isNull)\n> +\t\t.def(\"align_down_to\", &Size::alignDownTo)\n> +\t\t.def(\"align_up_to\", &Size::alignUpTo)\n> +\t\t.def(\"bound_to\", &Size::boundTo)\n> +\t\t.def(\"expand_to\", &Size::expandTo)\n> +\t\t.def(\"grow_by\", &Size::growBy)\n> +\t\t.def(\"shrink_by\", &Size::shrinkBy)\n> +\t\t.def(\"aligned_up_to\", &Size::alignedUpTo)\n> +\t\t.def(\"aligned_up_to\", &Size::alignedUpTo)\n> +\t\t.def(\"bounded_to\", &Size::boundedTo)\n> +\t\t.def(\"expanded_to\", &Size::expandedTo)\n> +\t\t.def(\"grown_by\", &Size::grownBy)\n> +\t\t.def(\"shrunk_by\", &Size::shrunkBy)\n> +\t\t.def(\"bounded_to_aspect_ratio\", &Size::boundedToAspectRatio)\n> +\t\t.def(\"expanded_to_aspect_ratio\", &Size::expandedToAspectRatio)\n> +\t\t.def(\"centered_to\", &Size::centeredTo)\n> +\t\t.def(py::self == py::self)\n> +\t\t.def(py::self < py::self)\n> +\t\t.def(py::self <= py::self)\n> +\t\t.def(py::self * float())\n> +\t\t.def(py::self / float())\n> +\t\t.def(py::self *= float())\n> +\t\t.def(py::self /= float())\n> +\t\t.def(\"__str__\", &Size::toString)\n> +\t\t.def(\"__repr__\", [](const Size &self) {\n> +\t\t\treturn py::str(\"libcamera.Size({}, {})\")\n> +\t\t\t\t.format(self.width, self.height);\n> +\t\t});\n> +\n> +\tpySizeRange\n> +\t\t.def(py::init<>())\n> +\t\t.def(py::init<Size>())\n> +\t\t.def(py::init<Size, Size>())\n> +\t\t.def(py::init<Size, Size, unsigned int, unsigned int>())\n> +\t\t.def_readwrite(\"min\", &SizeRange::min)\n> +\t\t.def_readwrite(\"max\", &SizeRange::max)\n> +\t\t.def_readwrite(\"hStep\", &SizeRange::hStep)\n> +\t\t.def_readwrite(\"vStep\", &SizeRange::vStep)\n> +\t\t.def(\"contains\", &SizeRange::contains)\n> +\t\t.def(py::self == py::self)\n> +\t\t.def(\"__str__\", &SizeRange::toString)\n> +\t\t.def(\"__repr__\", [](const SizeRange &self) {\n> +\t\t\treturn py::str(\"libcamera.SizeRange(({}, {}), ({}, {}), {}, {})\")\n> +\t\t\t\t.format(self.min.width, self.min.height,\n> +\t\t\t\t\tself.max.width, self.max.height,\n> +\t\t\t\t\tself.hStep, self.vStep);\n> +\t\t});\n> +\n> +\tpyRectangle\n> +\t\t.def(py::init<>())\n> +\t\t.def(py::init<int, int, Size>())\n> +\t\t.def(py::init<int, int, unsigned int, unsigned int>())\n> +\t\t.def(py::init<Size>())\n> +\t\t.def_readwrite(\"x\", &Rectangle::x)\n> +\t\t.def_readwrite(\"y\", &Rectangle::y)\n> +\t\t.def_readwrite(\"width\", &Rectangle::width)\n> +\t\t.def_readwrite(\"height\", &Rectangle::height)\n> +\t\t.def_property_readonly(\"is_null\", &Rectangle::isNull)\n> +\t\t.def_property_readonly(\"center\", &Rectangle::center)\n> +\t\t.def_property_readonly(\"size\", &Rectangle::size)\n> +\t\t.def_property_readonly(\"topLeft\", &Rectangle::topLeft)\n> +\t\t.def(\"scale_by\", &Rectangle::scaleBy)\n> +\t\t.def(\"translate_by\", &Rectangle::translateBy)\n> +\t\t.def(\"bounded_to\", &Rectangle::boundedTo)\n> +\t\t.def(\"enclosed_in\", &Rectangle::enclosedIn)\n> +\t\t.def(\"scaled_by\", &Rectangle::scaledBy)\n> +\t\t.def(\"translated_by\", &Rectangle::translatedBy)\n> +\t\t.def(py::self == py::self)\n> +\t\t.def(\"__str__\", &Rectangle::toString)\n> +\t\t.def(\"__repr__\", [](const Rectangle &self) {\n> +\t\t\treturn py::str(\"libcamera.Rectangle({}, {}, {}, {})\")\n> +\t\t\t\t.format(self.x, self.y, self.width, self.height);\n> +\t\t});\n> +}\n> diff --git a/src/py/libcamera/pymain.cpp b/src/py/libcamera/pymain.cpp\n> index 97b05903..96333ebc 100644\n> --- a/src/py/libcamera/pymain.cpp\n> +++ b/src/py/libcamera/pymain.cpp\n> @@ -137,11 +137,13 @@ static void handleRequestCompleted(Request *req)\n>  \n>  void init_pyenums(py::module &m);\n>  void init_pyenums_generated(py::module &m);\n> +void init_pygeometry(py::module &m);\n>  \n>  PYBIND11_MODULE(_libcamera, m)\n>  {\n>  \tinit_pyenums(m);\n>  \tinit_pyenums_generated(m);\n> +\tinit_pygeometry(m);\n>  \n>  \t/* Forward declarations */\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 3EC8AC3256\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 17 May 2022 16:18:31 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 91F8565659;\n\tTue, 17 May 2022 18:18:30 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0ECA06041D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 17 May 2022 18:18:29 +0200 (CEST)","from pendragon.ideasonboard.com (unknown [45.131.31.124])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C765748F;\n\tTue, 17 May 2022 18:18:27 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1652804310;\n\tbh=SFmK/IFTnuGtPXVOIhTfR0m8K0jeKj+ZY5PcCiGHzXQ=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=MkheVNas8sMWbPTWrRKGQe7/7+7qxbJsPurLaPfJLuYJGW7IDo4Xzr7+WfBKU8+KS\n\tohrQ7Q75IXKzxdIe4AOS0OfNxIhiClpokjbXtrUxTc0tvSm1xLARQM76Eg6FJvEidH\n\twa79o4KXWA4bqWqnn9d49OtrgNRde/5pOAOwXXTTNRY4Z+hbHpqqOd/o5QZvmufQnL\n\t8Id9oC4ZZ68FzTYIU337N67M6Xyzd0NykcSgkTViuXwL6R2HBsr7j2S+7YLnDp24Fn\n\t7Ubl01fq2ez9sqOXGTLZY1yi9rBQ7yWkY7rRj42KVfhkoSOAvwmt/YGNw7DgA4JFVp\n\tj2r+Kdb2nVPFQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1652804308;\n\tbh=SFmK/IFTnuGtPXVOIhTfR0m8K0jeKj+ZY5PcCiGHzXQ=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=BrdOKUoxFKL9MB1yWxtTUKDmfmTK8yXI5cM+F4YhZJJ/WEwjKOfaE+hdhL8wjpYO1\n\t2lebfVRpwlAXd+kmXfbLAnsr7rqJr+OOE4HgROHsH8xJJpdeXM4aPsdFinqbeWx6C1\n\tr81UNqREBgqvR8Z6bWYE3cEHWZA69uUf21U8B3iw="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"BrdOKUox\"; dkim-atps=neutral","Date":"Tue, 17 May 2022 19:18:20 +0300","To":"Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>","Message-ID":"<YoPKzH/0sVbft/U1@pendragon.ideasonboard.com>","References":"<20220517143325.71784-1-tomi.valkeinen@ideasonboard.com>\n\t<20220517143325.71784-13-tomi.valkeinen@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20220517143325.71784-13-tomi.valkeinen@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v2 12/13] py: add geometry classes","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":23014,"web_url":"https://patchwork.libcamera.org/comment/23014/","msgid":"<165280773165.2416244.3616904199695133077@Monstersaurus>","date":"2022-05-17T17:15:31","subject":"Re: [libcamera-devel] [PATCH v2 12/13] py: add geometry classes","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Laurent Pinchart (2022-05-17 17:18:20)\n> Hi Tomi,\n> \n> Thank you for the patch.\n> \n> On Tue, May 17, 2022 at 05:33:24PM +0300, Tomi Valkeinen wrote:\n> > Add libcamera's geometry classes to the Python bindings.\n> > \n> > Note that this commit only adds the classes, but they are not used\n> > anywhere yet.\n> > \n> > Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nAll looks quite clean to me.\n\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> \n> > ---\n> >  src/py/libcamera/meson.build    |   1 +\n> >  src/py/libcamera/pygeometry.cpp | 119 ++++++++++++++++++++++++++++++++\n> >  src/py/libcamera/pymain.cpp     |   2 +\n> >  3 files changed, 122 insertions(+)\n> >  create mode 100644 src/py/libcamera/pygeometry.cpp\n> > \n> > diff --git a/src/py/libcamera/meson.build b/src/py/libcamera/meson.build\n> > index 32e74504..0bef52c7 100644\n> > --- a/src/py/libcamera/meson.build\n> > +++ b/src/py/libcamera/meson.build\n> > @@ -14,6 +14,7 @@ pybind11_dep = pybind11_proj.get_variable('pybind11_dep')\n> >  \n> >  pycamera_sources = files([\n> >      'pyenums.cpp',\n> > +    'pygeometry.cpp',\n> >      'pymain.cpp',\n> >  ])\n> >  \n> > diff --git a/src/py/libcamera/pygeometry.cpp b/src/py/libcamera/pygeometry.cpp\n> > new file mode 100644\n> > index 00000000..d77de144\n> > --- /dev/null\n> > +++ b/src/py/libcamera/pygeometry.cpp\n> > @@ -0,0 +1,119 @@\n> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> > +/*\n> > + * Copyright (C) 2022, Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n> > + *\n> > + * Python bindings - Geometry classes\n> > + */\n> > +\n> > +#include <array>\n> > +\n> > +#include <libcamera/geometry.h>\n> > +#include <libcamera/libcamera.h>\n> > +\n> > +#include <pybind11/operators.h>\n> > +#include <pybind11/smart_holder.h>\n> > +#include <pybind11/stl.h>\n> > +\n> > +namespace py = pybind11;\n> > +\n> > +using namespace libcamera;\n> > +\n> > +void init_pygeometry(py::module &m)\n> > +{\n> > +     auto pyPoint = py::class_<Point>(m, \"Point\");\n> > +     auto pySize = py::class_<Size>(m, \"Size\");\n> > +     auto pySizeRange = py::class_<SizeRange>(m, \"SizeRange\");\n> > +     auto pyRectangle = py::class_<Rectangle>(m, \"Rectangle\");\n> > +\n> > +     pyPoint\n> > +             .def(py::init<>())\n> > +             .def(py::init<int, int>())\n> > +             .def_readwrite(\"x\", &Point::x)\n> > +             .def_readwrite(\"y\", &Point::y)\n> > +             .def(py::self == py::self)\n> > +             .def(-py::self)\n> > +             .def(\"__str__\", &Point::toString)\n> > +             .def(\"__repr__\", [](const Point &self) {\n> > +                     return py::str(\"libcamera.Point({}, {})\")\n> > +                             .format(self.x, self.y);\n> > +             });\n> > +\n> > +     pySize\n> > +             .def(py::init<>())\n> > +             .def(py::init<unsigned int, unsigned int>())\n> > +             .def_readwrite(\"width\", &Size::width)\n> > +             .def_readwrite(\"height\", &Size::height)\n> > +             .def_property_readonly(\"is_null\", &Size::isNull)\n> > +             .def(\"align_down_to\", &Size::alignDownTo)\n> > +             .def(\"align_up_to\", &Size::alignUpTo)\n> > +             .def(\"bound_to\", &Size::boundTo)\n> > +             .def(\"expand_to\", &Size::expandTo)\n> > +             .def(\"grow_by\", &Size::growBy)\n> > +             .def(\"shrink_by\", &Size::shrinkBy)\n> > +             .def(\"aligned_up_to\", &Size::alignedUpTo)\n> > +             .def(\"aligned_up_to\", &Size::alignedUpTo)\n> > +             .def(\"bounded_to\", &Size::boundedTo)\n> > +             .def(\"expanded_to\", &Size::expandedTo)\n> > +             .def(\"grown_by\", &Size::grownBy)\n> > +             .def(\"shrunk_by\", &Size::shrunkBy)\n> > +             .def(\"bounded_to_aspect_ratio\", &Size::boundedToAspectRatio)\n> > +             .def(\"expanded_to_aspect_ratio\", &Size::expandedToAspectRatio)\n> > +             .def(\"centered_to\", &Size::centeredTo)\n> > +             .def(py::self == py::self)\n> > +             .def(py::self < py::self)\n> > +             .def(py::self <= py::self)\n> > +             .def(py::self * float())\n> > +             .def(py::self / float())\n> > +             .def(py::self *= float())\n> > +             .def(py::self /= float())\n> > +             .def(\"__str__\", &Size::toString)\n> > +             .def(\"__repr__\", [](const Size &self) {\n> > +                     return py::str(\"libcamera.Size({}, {})\")\n> > +                             .format(self.width, self.height);\n> > +             });\n> > +\n> > +     pySizeRange\n> > +             .def(py::init<>())\n> > +             .def(py::init<Size>())\n> > +             .def(py::init<Size, Size>())\n> > +             .def(py::init<Size, Size, unsigned int, unsigned int>())\n> > +             .def_readwrite(\"min\", &SizeRange::min)\n> > +             .def_readwrite(\"max\", &SizeRange::max)\n> > +             .def_readwrite(\"hStep\", &SizeRange::hStep)\n> > +             .def_readwrite(\"vStep\", &SizeRange::vStep)\n> > +             .def(\"contains\", &SizeRange::contains)\n> > +             .def(py::self == py::self)\n> > +             .def(\"__str__\", &SizeRange::toString)\n> > +             .def(\"__repr__\", [](const SizeRange &self) {\n> > +                     return py::str(\"libcamera.SizeRange(({}, {}), ({}, {}), {}, {})\")\n> > +                             .format(self.min.width, self.min.height,\n> > +                                     self.max.width, self.max.height,\n> > +                                     self.hStep, self.vStep);\n> > +             });\n> > +\n> > +     pyRectangle\n> > +             .def(py::init<>())\n> > +             .def(py::init<int, int, Size>())\n> > +             .def(py::init<int, int, unsigned int, unsigned int>())\n> > +             .def(py::init<Size>())\n> > +             .def_readwrite(\"x\", &Rectangle::x)\n> > +             .def_readwrite(\"y\", &Rectangle::y)\n> > +             .def_readwrite(\"width\", &Rectangle::width)\n> > +             .def_readwrite(\"height\", &Rectangle::height)\n> > +             .def_property_readonly(\"is_null\", &Rectangle::isNull)\n> > +             .def_property_readonly(\"center\", &Rectangle::center)\n> > +             .def_property_readonly(\"size\", &Rectangle::size)\n> > +             .def_property_readonly(\"topLeft\", &Rectangle::topLeft)\n> > +             .def(\"scale_by\", &Rectangle::scaleBy)\n> > +             .def(\"translate_by\", &Rectangle::translateBy)\n> > +             .def(\"bounded_to\", &Rectangle::boundedTo)\n> > +             .def(\"enclosed_in\", &Rectangle::enclosedIn)\n> > +             .def(\"scaled_by\", &Rectangle::scaledBy)\n> > +             .def(\"translated_by\", &Rectangle::translatedBy)\n> > +             .def(py::self == py::self)\n> > +             .def(\"__str__\", &Rectangle::toString)\n> > +             .def(\"__repr__\", [](const Rectangle &self) {\n> > +                     return py::str(\"libcamera.Rectangle({}, {}, {}, {})\")\n> > +                             .format(self.x, self.y, self.width, self.height);\n> > +             });\n> > +}\n> > diff --git a/src/py/libcamera/pymain.cpp b/src/py/libcamera/pymain.cpp\n> > index 97b05903..96333ebc 100644\n> > --- a/src/py/libcamera/pymain.cpp\n> > +++ b/src/py/libcamera/pymain.cpp\n> > @@ -137,11 +137,13 @@ static void handleRequestCompleted(Request *req)\n> >  \n> >  void init_pyenums(py::module &m);\n> >  void init_pyenums_generated(py::module &m);\n> > +void init_pygeometry(py::module &m);\n> >  \n> >  PYBIND11_MODULE(_libcamera, m)\n> >  {\n> >       init_pyenums(m);\n> >       init_pyenums_generated(m);\n> > +     init_pygeometry(m);\n> >  \n> >       /* Forward declarations */\n> >  \n> \n> -- \n> Regards,\n> \n> Laurent Pinchart","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id B8792C3256\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 17 May 2022 17:15:36 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0991C65656;\n\tTue, 17 May 2022 19:15:36 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6817C6041D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 17 May 2022 19:15:34 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C9B704A8;\n\tTue, 17 May 2022 19:15:33 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1652807736;\n\tbh=M8/rsC+FLDB0wTwdJRSTMgt2Yc3ZijSYrk/JTJKdYGI=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=OGVXXDUCGmpvKYA0bNzxOTfA2JS94HkKwFJtT+5fTE1YZi1XrCs7bi8DLvugBj83i\n\tCpiKuDFY9GvtdOkHdMCti5DsAgxPdHX1SJ7ObJrLg2Ox2g95c/DeJVxHrjv5U+Yp/s\n\tnPeD8F+rLCMOalTqm3X8qZXXqbmYCcUwak36s4o8ZpRqXwD1B1tcwrrvwHhhWcD7aj\n\tOTNUXQdc8Sf1byeRjNGnEBAHWgYxqNsk/z5dOEocmSJDbqavqitrpeKohHUqkH1xdA\n\tRrlSR9L8tkxoqI/jateE4KHbPkV7vQG+FOCuE0/7MKVR4dkXsyRdfP42CyUZV7z6ph\n\tQj2+WWsMJ1qDw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1652807733;\n\tbh=M8/rsC+FLDB0wTwdJRSTMgt2Yc3ZijSYrk/JTJKdYGI=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=Pu2kpQoTHnnYkiUSQ025ivPEyjd9vy3UvyovSRg3mvEG2VpXLttIS5wctx+Eq2qXv\n\tcVny23Xwn+tJt1lgaHQJ7IxiwhgYoPO80haBAY7cE53TDWNkjXT+bgtrJv5vc0XkN3\n\tbLZ9gx7mjs5QHYWsFEQVcYfFogyTjSw7XIdCMP9Q="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"Pu2kpQoT\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<YoPKzH/0sVbft/U1@pendragon.ideasonboard.com>","References":"<20220517143325.71784-1-tomi.valkeinen@ideasonboard.com>\n\t<20220517143325.71784-13-tomi.valkeinen@ideasonboard.com>\n\t<YoPKzH/0sVbft/U1@pendragon.ideasonboard.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tTomi Valkeinen <tomi.valkeinen@ideasonboard.com>","Date":"Tue, 17 May 2022 18:15:31 +0100","Message-ID":"<165280773165.2416244.3616904199695133077@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH v2 12/13] py: add geometry classes","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]