Message ID | 20240930195915.152187-2-jacopo.mondi@ideasonboard.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
Hi Jacopo, Thanks for the updated description. It makes more sense to me. Reviewed-by: Harvey Yang <chenghaoyang@chromium.org> BR, Harvey On Tue, Oct 1, 2024 at 3:59 AM Jacopo Mondi <jacopo.mondi@ideasonboard.com> wrote: > > The libcamera::Rectangle class allows defining rectangles regardless of > the orientation of the reference system where a rectangle is used in. > > This implies that, depending on the reference system in use, the > rectangle's top-left corner, as defined by libcamera, doesn't correspond > to the visual top-left position. > > ^ > | > | ------------------- > | ^ | h > | | | > y| o---->------------- > | w > -------------------------------> > (0,0) x > > (0,0) x > ------------------------------> > | w > y| o---->------------- > | | | h > | v | > | ------------------- > | > V > > Clarify that a Rectangle's top-left corner corresponds to the point > with the smaller x and y coordinates and that the horizontal and > vertical dimensions are obtained by positive increments along the > corresponding axes. > > Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > --- > src/libcamera/geometry.cpp | 93 ++++++++++++++++++++++++++++++++++++++ > 1 file changed, 93 insertions(+) > > diff --git a/src/libcamera/geometry.cpp b/src/libcamera/geometry.cpp > index 000151364c7f..6eb432e5d803 100644 > --- a/src/libcamera/geometry.cpp > +++ b/src/libcamera/geometry.cpp > @@ -595,6 +595,88 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) > * Rectangles are used to identify an area of an image. They are specified by > * the coordinates of top-left corner and their horizontal and vertical size. > * > + * libcamera canonically defines a rectangle's 'top-left' corner as the point > + * with the smaller 'x' and smaller 'y' coordinates. Depending on the reference > + * system where the rectangle is used this might not correspond to the visual > + * top-left corner of the rectangle. > + * > + * The rectangle's horizontal and vertical dimensions are obtained by positively > + * increments along the corresponding axes by the given horizontal and vertical > + * sizes. > + * > + * Examples: > + * > + * \verbatim > + > + X = top-left corner > + o = reference system origin point > + > + ^ > + | > + | ----------------- > + | ^ | > + | | | > + | X--->------------- > + | > + o-------------------------------> > + (0,0) > + > + > + (0,0) > + <-------------------------------o > + | > + -------------<---X | > + | | | > + | V | > + ----------------- | > + V > + > + > + (0,0) > + o-------------------------------> > + | X--->------------- > + | | | > + | v | > + | ----------------- > + | > + V > + > + ^ > + | > + ----------------- | > + | ^ | > + | | | > + -------------<---X | > + <-------------------------------o > + (0,0) > + > + ^ > + | > + ------|----------- > + ^ | | > + | | | > + X--->--|----------- > + ---------------o----------------> > + |(0,0) > + | > + | > + | > + | > + > + ^ > + | > + | > + | > + | > + | > + ---------------o----------------> > + (0,0)| ------------ > + | ^ | > + | | | > + | X--->-------- > + | > + \endverbatim > + * > * The measure unit of the rectangle coordinates and size, as well as the > * reference point from which the Rectangle::x and Rectangle::y displacements > * refers to, are defined by the context were rectangle is used. > @@ -611,6 +693,8 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) > * \param[in] x The horizontal coordinate of the top-left corner > * \param[in] y The vertical coordinate of the top-left corner > * \param[in] size The size > + * > + * The rectangle's top-left corner is the point with the smaller x and y values. > */ > > /** > @@ -620,6 +704,8 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) > * \param[in] y The vertical coordinate of the top-left corner > * \param[in] width The width > * \param[in] height The height > + * > + * The rectangle's top-left corner is the point with the smaller x and y values. > */ > > /** > @@ -632,11 +718,15 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) > /** > * \var Rectangle::x > * \brief The horizontal coordinate of the rectangle's top-left corner > + * > + * The rectangle's top-left corner is the point with the smaller x and y values. > */ > > /** > * \var Rectangle::y > * \brief The vertical coordinate of the rectangle's top-left corner > + * > + * The rectangle's top-left corner is the point with the smaller x and y values. > */ > > /** > @@ -685,6 +775,9 @@ Point Rectangle::center() const > /** > * \fn Point Rectangle::topLeft() const > * \brief Retrieve the coordinates of the top left corner of this Rectangle > + * > + * The rectangle's top-left corner is the point with the smaller x and y values. > + * > * \return The Rectangle's top left corner > */ > > -- > 2.46.1 >
Hi Jacopo Thanks for the clarification here. Yes, I think this is exactly right. I think the important point is that the "top left" is the corner with smallest x and y in the coordinate system in which the rectangle was created. (A viewer might be standing, for example, upside down with respect to that, in which case it's not _their_ top left any more. But it's the viewer's problem to deal with their own "transform".) Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Thanks! David On Tue, 1 Oct 2024 at 08:19, Cheng-Hao Yang <chenghaoyang@chromium.org> wrote: > > Hi Jacopo, > > Thanks for the updated description. > It makes more sense to me. > > Reviewed-by: Harvey Yang <chenghaoyang@chromium.org> > > BR, > Harvey > > On Tue, Oct 1, 2024 at 3:59 AM Jacopo Mondi > <jacopo.mondi@ideasonboard.com> wrote: > > > > The libcamera::Rectangle class allows defining rectangles regardless of > > the orientation of the reference system where a rectangle is used in. > > > > This implies that, depending on the reference system in use, the > > rectangle's top-left corner, as defined by libcamera, doesn't correspond > > to the visual top-left position. > > > > ^ > > | > > | ------------------- > > | ^ | h > > | | | > > y| o---->------------- > > | w > > -------------------------------> > > (0,0) x > > > > (0,0) x > > ------------------------------> > > | w > > y| o---->------------- > > | | | h > > | v | > > | ------------------- > > | > > V > > > > Clarify that a Rectangle's top-left corner corresponds to the point > > with the smaller x and y coordinates and that the horizontal and > > vertical dimensions are obtained by positive increments along the > > corresponding axes. > > > > Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > > --- > > src/libcamera/geometry.cpp | 93 ++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 93 insertions(+) > > > > diff --git a/src/libcamera/geometry.cpp b/src/libcamera/geometry.cpp > > index 000151364c7f..6eb432e5d803 100644 > > --- a/src/libcamera/geometry.cpp > > +++ b/src/libcamera/geometry.cpp > > @@ -595,6 +595,88 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) > > * Rectangles are used to identify an area of an image. They are specified by > > * the coordinates of top-left corner and their horizontal and vertical size. > > * > > + * libcamera canonically defines a rectangle's 'top-left' corner as the point > > + * with the smaller 'x' and smaller 'y' coordinates. Depending on the reference > > + * system where the rectangle is used this might not correspond to the visual > > + * top-left corner of the rectangle. > > + * > > + * The rectangle's horizontal and vertical dimensions are obtained by positively > > + * increments along the corresponding axes by the given horizontal and vertical > > + * sizes. > > + * > > + * Examples: > > + * > > + * \verbatim > > + > > + X = top-left corner > > + o = reference system origin point > > + > > + ^ > > + | > > + | ----------------- > > + | ^ | > > + | | | > > + | X--->------------- > > + | > > + o-------------------------------> > > + (0,0) > > + > > + > > + (0,0) > > + <-------------------------------o > > + | > > + -------------<---X | > > + | | | > > + | V | > > + ----------------- | > > + V > > + > > + > > + (0,0) > > + o-------------------------------> > > + | X--->------------- > > + | | | > > + | v | > > + | ----------------- > > + | > > + V > > + > > + ^ > > + | > > + ----------------- | > > + | ^ | > > + | | | > > + -------------<---X | > > + <-------------------------------o > > + (0,0) > > + > > + ^ > > + | > > + ------|----------- > > + ^ | | > > + | | | > > + X--->--|----------- > > + ---------------o----------------> > > + |(0,0) > > + | > > + | > > + | > > + | > > + > > + ^ > > + | > > + | > > + | > > + | > > + | > > + ---------------o----------------> > > + (0,0)| ------------ > > + | ^ | > > + | | | > > + | X--->-------- > > + | > > + \endverbatim > > + * > > * The measure unit of the rectangle coordinates and size, as well as the > > * reference point from which the Rectangle::x and Rectangle::y displacements > > * refers to, are defined by the context were rectangle is used. > > @@ -611,6 +693,8 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) > > * \param[in] x The horizontal coordinate of the top-left corner > > * \param[in] y The vertical coordinate of the top-left corner > > * \param[in] size The size > > + * > > + * The rectangle's top-left corner is the point with the smaller x and y values. > > */ > > > > /** > > @@ -620,6 +704,8 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) > > * \param[in] y The vertical coordinate of the top-left corner > > * \param[in] width The width > > * \param[in] height The height > > + * > > + * The rectangle's top-left corner is the point with the smaller x and y values. > > */ > > > > /** > > @@ -632,11 +718,15 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) > > /** > > * \var Rectangle::x > > * \brief The horizontal coordinate of the rectangle's top-left corner > > + * > > + * The rectangle's top-left corner is the point with the smaller x and y values. > > */ > > > > /** > > * \var Rectangle::y > > * \brief The vertical coordinate of the rectangle's top-left corner > > + * > > + * The rectangle's top-left corner is the point with the smaller x and y values. > > */ > > > > /** > > @@ -685,6 +775,9 @@ Point Rectangle::center() const > > /** > > * \fn Point Rectangle::topLeft() const > > * \brief Retrieve the coordinates of the top left corner of this Rectangle > > + * > > + * The rectangle's top-left corner is the point with the smaller x and y values. > > + * > > * \return The Rectangle's top left corner > > */ > > > > -- > > 2.46.1 > >
Hi Jacopo, Thank you for the patch. On Mon, Sep 30, 2024 at 09:59:09PM +0200, Jacopo Mondi wrote: > The libcamera::Rectangle class allows defining rectangles regardless of > the orientation of the reference system where a rectangle is used in. > > This implies that, depending on the reference system in use, the > rectangle's top-left corner, as defined by libcamera, doesn't correspond > to the visual top-left position. > > ^ > | > | ------------------- > | ^ | h > | | | > y| o---->------------- > | w > -------------------------------> > (0,0) x > > (0,0) x > ------------------------------> > | w > y| o---->------------- > | | | h > | v | > | ------------------- > | > V > > Clarify that a Rectangle's top-left corner corresponds to the point > with the smaller x and y coordinates and that the horizontal and > vertical dimensions are obtained by positive increments along the > corresponding axes. > > Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > --- > src/libcamera/geometry.cpp | 93 ++++++++++++++++++++++++++++++++++++++ > 1 file changed, 93 insertions(+) > > diff --git a/src/libcamera/geometry.cpp b/src/libcamera/geometry.cpp > index 000151364c7f..6eb432e5d803 100644 > --- a/src/libcamera/geometry.cpp > +++ b/src/libcamera/geometry.cpp > @@ -595,6 +595,88 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) > * Rectangles are used to identify an area of an image. They are specified by > * the coordinates of top-left corner and their horizontal and vertical size. > * > + * libcamera canonically defines a rectangle's 'top-left' corner as the point > + * with the smaller 'x' and smaller 'y' coordinates. Depending on the reference > + * system where the rectangle is used this might not correspond to the visual > + * top-left corner of the rectangle. > + * > + * The rectangle's horizontal and vertical dimensions are obtained by positively > + * increments along the corresponding axes by the given horizontal and vertical > + * sizes. > + * > + * Examples: > + * > + * \verbatim > + > + X = top-left corner > + o = reference system origin point > + > + ^ > + | > + | ----------------- > + | ^ | > + | | | > + | X--->------------- > + | > + o-------------------------------> > + (0,0) > + > + > + (0,0) > + <-------------------------------o > + | > + -------------<---X | > + | | | > + | V | > + ----------------- | > + V > + > + > + (0,0) > + o-------------------------------> > + | X--->------------- > + | | | > + | v | > + | ----------------- > + | > + V > + > + ^ > + | > + ----------------- | > + | ^ | > + | | | > + -------------<---X | > + <-------------------------------o > + (0,0) > + > + ^ > + | > + ------|----------- > + ^ | | > + | | | > + X--->--|----------- > + ---------------o----------------> > + |(0,0) > + | > + | > + | > + | > + > + ^ > + | > + | > + | > + | > + | > + ---------------o----------------> > + (0,0)| ------------ > + | ^ | > + | | | > + | X--->-------- > + | > + \endverbatim > + * I think this is way too complicated and confusing. Can't we simplify this patch to just the two lines below ? diff --git a/src/libcamera/geometry.cpp b/src/libcamera/geometry.cpp index 000151364c7f..57894f767c68 100644 --- a/src/libcamera/geometry.cpp +++ b/src/libcamera/geometry.cpp @@ -594,6 +594,8 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) * * Rectangles are used to identify an area of an image. They are specified by * the coordinates of top-left corner and their horizontal and vertical size. + * By convention, the top-left corner is defined as the corner with the lowest + * x and y coordinates, regardless of the origin and direction of the axes. * * The measure unit of the rectangle coordinates and size, as well as the * reference point from which the Rectangle::x and Rectangle::y displacements > * The measure unit of the rectangle coordinates and size, as well as the > * reference point from which the Rectangle::x and Rectangle::y displacements > * refers to, are defined by the context were rectangle is used. > @@ -611,6 +693,8 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) > * \param[in] x The horizontal coordinate of the top-left corner > * \param[in] y The vertical coordinate of the top-left corner > * \param[in] size The size > + * > + * The rectangle's top-left corner is the point with the smaller x and y values. > */ > > /** > @@ -620,6 +704,8 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) > * \param[in] y The vertical coordinate of the top-left corner > * \param[in] width The width > * \param[in] height The height > + * > + * The rectangle's top-left corner is the point with the smaller x and y values. > */ > > /** > @@ -632,11 +718,15 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) > /** > * \var Rectangle::x > * \brief The horizontal coordinate of the rectangle's top-left corner > + * > + * The rectangle's top-left corner is the point with the smaller x and y values. > */ > > /** > * \var Rectangle::y > * \brief The vertical coordinate of the rectangle's top-left corner > + * > + * The rectangle's top-left corner is the point with the smaller x and y values. > */ > > /** > @@ -685,6 +775,9 @@ Point Rectangle::center() const > /** > * \fn Point Rectangle::topLeft() const > * \brief Retrieve the coordinates of the top left corner of this Rectangle > + * > + * The rectangle's top-left corner is the point with the smaller x and y values. > + * > * \return The Rectangle's top left corner > */ > > -- > 2.46.1 >
diff --git a/src/libcamera/geometry.cpp b/src/libcamera/geometry.cpp index 000151364c7f..6eb432e5d803 100644 --- a/src/libcamera/geometry.cpp +++ b/src/libcamera/geometry.cpp @@ -595,6 +595,88 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) * Rectangles are used to identify an area of an image. They are specified by * the coordinates of top-left corner and their horizontal and vertical size. * + * libcamera canonically defines a rectangle's 'top-left' corner as the point + * with the smaller 'x' and smaller 'y' coordinates. Depending on the reference + * system where the rectangle is used this might not correspond to the visual + * top-left corner of the rectangle. + * + * The rectangle's horizontal and vertical dimensions are obtained by positively + * increments along the corresponding axes by the given horizontal and vertical + * sizes. + * + * Examples: + * + * \verbatim + + X = top-left corner + o = reference system origin point + + ^ + | + | ----------------- + | ^ | + | | | + | X--->------------- + | + o-------------------------------> + (0,0) + + + (0,0) + <-------------------------------o + | + -------------<---X | + | | | + | V | + ----------------- | + V + + + (0,0) + o-------------------------------> + | X--->------------- + | | | + | v | + | ----------------- + | + V + + ^ + | + ----------------- | + | ^ | + | | | + -------------<---X | + <-------------------------------o + (0,0) + + ^ + | + ------|----------- + ^ | | + | | | + X--->--|----------- + ---------------o----------------> + |(0,0) + | + | + | + | + + ^ + | + | + | + | + | + ---------------o----------------> + (0,0)| ------------ + | ^ | + | | | + | X--->-------- + | + \endverbatim + * * The measure unit of the rectangle coordinates and size, as well as the * reference point from which the Rectangle::x and Rectangle::y displacements * refers to, are defined by the context were rectangle is used. @@ -611,6 +693,8 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) * \param[in] x The horizontal coordinate of the top-left corner * \param[in] y The vertical coordinate of the top-left corner * \param[in] size The size + * + * The rectangle's top-left corner is the point with the smaller x and y values. */ /** @@ -620,6 +704,8 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) * \param[in] y The vertical coordinate of the top-left corner * \param[in] width The width * \param[in] height The height + * + * The rectangle's top-left corner is the point with the smaller x and y values. */ /** @@ -632,11 +718,15 @@ std::ostream &operator<<(std::ostream &out, const SizeRange &sr) /** * \var Rectangle::x * \brief The horizontal coordinate of the rectangle's top-left corner + * + * The rectangle's top-left corner is the point with the smaller x and y values. */ /** * \var Rectangle::y * \brief The vertical coordinate of the rectangle's top-left corner + * + * The rectangle's top-left corner is the point with the smaller x and y values. */ /** @@ -685,6 +775,9 @@ Point Rectangle::center() const /** * \fn Point Rectangle::topLeft() const * \brief Retrieve the coordinates of the top left corner of this Rectangle + * + * The rectangle's top-left corner is the point with the smaller x and y values. + * * \return The Rectangle's top left corner */
The libcamera::Rectangle class allows defining rectangles regardless of the orientation of the reference system where a rectangle is used in. This implies that, depending on the reference system in use, the rectangle's top-left corner, as defined by libcamera, doesn't correspond to the visual top-left position. ^ | | ------------------- | ^ | h | | | y| o---->------------- | w -------------------------------> (0,0) x (0,0) x ------------------------------> | w y| o---->------------- | | | h | v | | ------------------- | V Clarify that a Rectangle's top-left corner corresponds to the point with the smaller x and y coordinates and that the horizontal and vertical dimensions are obtained by positive increments along the corresponding axes. Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> --- src/libcamera/geometry.cpp | 93 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+)