| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #ifndef SMALLRECT_H |
| | #define SMALLRECT_H |
| |
|
| | #include <windows.h> |
| |
|
| | #include <algorithm> |
| | #include <string> |
| |
|
| | #include "../shared/winpty_snprintf.h" |
| | #include "Coord.h" |
| |
|
| | struct SmallRect : SMALL_RECT |
| | { |
| | SmallRect() |
| | { |
| | Left = Right = Top = Bottom = 0; |
| | } |
| |
|
| | SmallRect(SHORT x, SHORT y, SHORT width, SHORT height) |
| | { |
| | Left = x; |
| | Top = y; |
| | Right = x + width - 1; |
| | Bottom = y + height - 1; |
| | } |
| |
|
| | SmallRect(const COORD &topLeft, const COORD &size) |
| | { |
| | Left = topLeft.X; |
| | Top = topLeft.Y; |
| | Right = Left + size.X - 1; |
| | Bottom = Top + size.Y - 1; |
| | } |
| |
|
| | SmallRect(const SMALL_RECT &other) |
| | { |
| | *(SMALL_RECT*)this = other; |
| | } |
| |
|
| | SmallRect(const SmallRect &other) |
| | { |
| | *(SMALL_RECT*)this = *(const SMALL_RECT*)&other; |
| | } |
| |
|
| | SmallRect &operator=(const SmallRect &other) |
| | { |
| | *(SMALL_RECT*)this = *(const SMALL_RECT*)&other; |
| | return *this; |
| | } |
| |
|
| | bool contains(const SmallRect &other) const |
| | { |
| | return other.Left >= Left && |
| | other.Right <= Right && |
| | other.Top >= Top && |
| | other.Bottom <= Bottom; |
| | } |
| |
|
| | bool contains(const Coord &other) const |
| | { |
| | return other.X >= Left && |
| | other.X <= Right && |
| | other.Y >= Top && |
| | other.Y <= Bottom; |
| | } |
| |
|
| | SmallRect intersected(const SmallRect &other) const |
| | { |
| | int x1 = std::max(Left, other.Left); |
| | int x2 = std::min(Right, other.Right); |
| | int y1 = std::max(Top, other.Top); |
| | int y2 = std::min(Bottom, other.Bottom); |
| | return SmallRect(x1, |
| | y1, |
| | std::max(0, x2 - x1 + 1), |
| | std::max(0, y2 - y1 + 1)); |
| | } |
| |
|
| | SmallRect ensureLineIncluded(SHORT line) const |
| | { |
| | const SHORT h = height(); |
| | if (line < Top) { |
| | return SmallRect(Left, line, width(), h); |
| | } else if (line > Bottom) { |
| | return SmallRect(Left, line - h + 1, width(), h); |
| | } else { |
| | return *this; |
| | } |
| | } |
| |
|
| | SHORT top() const { return Top; } |
| | SHORT left() const { return Left; } |
| | SHORT width() const { return Right - Left + 1; } |
| | SHORT height() const { return Bottom - Top + 1; } |
| | void setTop(SHORT top) { Top = top; } |
| | void setLeft(SHORT left) { Left = left; } |
| | void setWidth(SHORT width) { Right = Left + width - 1; } |
| | void setHeight(SHORT height) { Bottom = Top + height - 1; } |
| | Coord size() const { return Coord(width(), height()); } |
| |
|
| | bool operator==(const SmallRect &other) const |
| | { |
| | return Left == other.Left && |
| | Right == other.Right && |
| | Top == other.Top && |
| | Bottom == other.Bottom; |
| | } |
| |
|
| | bool operator!=(const SmallRect &other) const |
| | { |
| | return !(*this == other); |
| | } |
| |
|
| | std::string toString() const |
| | { |
| | char ret[64]; |
| | winpty_snprintf(ret, "(x=%d,y=%d,w=%d,h=%d)", |
| | Left, Top, width(), height()); |
| | return std::string(ret); |
| | } |
| | }; |
| |
|
| | #endif |
| |
|