// // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include "BoundingBox.hpp" #include namespace od { BoundingBox::BoundingBox() : BoundingBox(0, 0, 0u, 0u) {} BoundingBox::BoundingBox( int x, int y, unsigned int width, unsigned int height) : m_X(x), m_Y(y), m_Width(width), m_Height(height) {} BoundingBox::BoundingBox(const BoundingBox& other) : m_X(other.m_X), m_Y(other.m_Y), m_Width(other.m_Width), m_Height(other.m_Height) {} int BoundingBox::GetX() const { return m_X; } int BoundingBox::GetY() const { return m_Y; } unsigned int BoundingBox::GetWidth() const { return m_Width; } unsigned int BoundingBox::GetHeight() const { return m_Height; } void BoundingBox::SetX(int x) { m_X = x; } void BoundingBox::SetY(int y) { m_Y = y; } void BoundingBox::SetWidth(unsigned int width) { m_Width = width; } void BoundingBox::SetHeight(unsigned int height) { m_Height = height; } BoundingBox& BoundingBox::operator=(const BoundingBox& other) { m_X = other.m_X; m_Y = other.m_Y; m_Width = other.m_Width; m_Height = other.m_Height; return *this; } /* Helper function to get a "valid" bounding box */ void GetValidBoundingBox(const BoundingBox& boxIn, BoundingBox& boxOut, const BoundingBox& boxLimits) { boxOut.SetX(std::max(boxIn.GetX(), boxLimits.GetX())); boxOut.SetY(std::max(boxIn.GetY(), boxLimits.GetY())); /* If we have changed x and/or y, we compensate by reducing the height and/or width */ int boxOutWidth = static_cast(boxIn.GetWidth()) - std::max(0, (boxOut.GetX() - boxIn.GetX())); int boxOutHeight = static_cast(boxIn.GetHeight()) - std::max(0, (boxOut.GetY() - boxIn.GetY())); /* This suggests that there was no overlap on x or/and y axis */ if (boxOutHeight <= 0 || boxOutWidth <= 0) { boxOut = BoundingBox{0, 0, 0, 0}; return; } const int limitBoxRightX = boxLimits.GetX() + static_cast(boxLimits.GetWidth()); const int limitBoxRightY = boxLimits.GetY() + static_cast(boxLimits.GetHeight()); const int boxRightX = boxOut.GetX() + boxOutWidth; const int boxRightY = boxOut.GetY() + boxOutHeight; if (boxRightX > limitBoxRightX) { boxOutWidth -= (boxRightX - limitBoxRightX); } if (boxRightY > limitBoxRightY) { boxOutHeight -= (boxRightY - limitBoxRightY); } /* This suggests value has rolled over because of very high numbers, not handled for now */ if (boxOutHeight <= 0 || boxOutWidth <= 0) { boxOut = BoundingBox{0, 0, 0, 0}; return; } boxOut.SetHeight(static_cast(boxOutHeight)); boxOut.SetWidth(static_cast(boxOutWidth)); } }// namespace od