diff --git a/src/core/geometry_type.hpp b/src/core/geometry_type.hpp index cba944fb6f..d5fdd2a944 100644 --- a/src/core/geometry_type.hpp +++ b/src/core/geometry_type.hpp @@ -49,6 +49,112 @@ struct Rect { int top; int right; int bottom; + + /** + * Get width of Rect. + * @return width of Rect. + */ + inline int Width() const { return this->right - this->left + 1; } + + /** + * Get height of Rect. + * @return height of Rect. + */ + inline int Height() const { return this->bottom - this->top + 1; } + + /** + * Copy and shrink Rect by s pixels. + * @param s number of pixels to remove from each side of Rect. + * @return the new smaller Rect. + */ + [[nodiscard]] inline Rect Shrink(int s) const + { + return {this->left + s, this->top + s, this->right - s, this->bottom - s}; + } + + /** + * Copy and shrink Rect by h horizontal and v vertical pixels. + * @param h number of pixels to remove from left and right sides. + * @param v number of pixels to remove from top and bottom sides. + * @return the new smaller Rect. + */ + [[nodiscard]] inline Rect Shrink(int h, int v) const + { + return {this->left + h, this->top + v, this->right - h, this->bottom - v}; + } + + /** + * Copy and shrink Rect by pixels. + * @param left number of pixels to remove from left side. + * @param top number of pixels to remove from top side. + * @param right number of pixels to remove from right side. + * @param bottom number of pixels to remove from bottom side. + * @return the new smaller Rect. + */ + [[nodiscard]] inline Rect Shrink(int left, int top, int right, int bottom) const + { + return {this->left + left, this->top + top, this->right - right, this->bottom - bottom}; + } + + /** + * Copy and expand Rect by s pixels. + * @param s number of pixels to add to each side of Rect. + * @return the new larger Rect. + */ + [[nodiscard]] inline Rect Expand(int s) const + { + return this->Shrink(-s); + } + + /** + * Copy and translate Rect by x,y pixels. + * @param x number of pixels to move horizontally. + * @param y number of pixels to move vertically. + * @return the new translated Rect. + */ + [[nodiscard]] inline Rect Translate(int x, int y) const + { + return {this->left + x, this->top + y, this->right + x, this->bottom + y}; + } + + /** + * Copy Rect and set its width. + * @param width width in pixels for new Rect. + * @param end if set, set width at end of Rect, i.e. on right. + * @return the new resized Rect. + */ + [[nodiscard]] inline Rect WithWidth(int width, bool end) const + { + return end + ? Rect {this->right - width + 1, this->top, this->right, this->bottom} + : Rect {this->left, this->top, this->left + width - 1, this->bottom}; + } + + /** + * Copy Rect and indent it from its position. + * @param indent offset in pixels for new Rect. + * @param end if set, set indent at end of Rect, i.e. on right. + * @return the new resized Rect. + */ + [[nodiscard]] inline Rect Indent(int indent, bool end) const + { + return end + ? Rect {this->left, this->top, this->right - indent, this->bottom} + : Rect {this->left + indent, this->top, this->right, this->bottom}; + } + + /** + * Copy Rect and set its height. + * @param width height in pixels for new Rect. + * @param end if set, set height at end of Rect, i.e. at bottom. + * @return the new resized Rect. + */ + [[nodiscard]] inline Rect WithHeight(int height, bool end = false) const + { + return end + ? Rect {this->left, this->bottom - height + 1, this->right, this->bottom} + : Rect {this->left, this->top, this->right, this->top + height - 1}; + } }; /**