1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef MODULES_DESKTOP_CAPTURE_DESKTOP_GEOMETRY_H_ 12*d9f75844SAndroid Build Coastguard Worker #define MODULES_DESKTOP_CAPTURE_DESKTOP_GEOMETRY_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <stdint.h> 15*d9f75844SAndroid Build Coastguard Worker 16*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/system/rtc_export.h" 17*d9f75844SAndroid Build Coastguard Worker 18*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 19*d9f75844SAndroid Build Coastguard Worker 20*d9f75844SAndroid Build Coastguard Worker // A vector in the 2D integer space. E.g. can be used to represent screen DPI. 21*d9f75844SAndroid Build Coastguard Worker class DesktopVector { 22*d9f75844SAndroid Build Coastguard Worker public: DesktopVector()23*d9f75844SAndroid Build Coastguard Worker DesktopVector() : x_(0), y_(0) {} DesktopVector(int32_t x,int32_t y)24*d9f75844SAndroid Build Coastguard Worker DesktopVector(int32_t x, int32_t y) : x_(x), y_(y) {} 25*d9f75844SAndroid Build Coastguard Worker x()26*d9f75844SAndroid Build Coastguard Worker int32_t x() const { return x_; } y()27*d9f75844SAndroid Build Coastguard Worker int32_t y() const { return y_; } is_zero()28*d9f75844SAndroid Build Coastguard Worker bool is_zero() const { return x_ == 0 && y_ == 0; } 29*d9f75844SAndroid Build Coastguard Worker equals(const DesktopVector & other)30*d9f75844SAndroid Build Coastguard Worker bool equals(const DesktopVector& other) const { 31*d9f75844SAndroid Build Coastguard Worker return x_ == other.x_ && y_ == other.y_; 32*d9f75844SAndroid Build Coastguard Worker } 33*d9f75844SAndroid Build Coastguard Worker set(int32_t x,int32_t y)34*d9f75844SAndroid Build Coastguard Worker void set(int32_t x, int32_t y) { 35*d9f75844SAndroid Build Coastguard Worker x_ = x; 36*d9f75844SAndroid Build Coastguard Worker y_ = y; 37*d9f75844SAndroid Build Coastguard Worker } 38*d9f75844SAndroid Build Coastguard Worker add(const DesktopVector & other)39*d9f75844SAndroid Build Coastguard Worker DesktopVector add(const DesktopVector& other) const { 40*d9f75844SAndroid Build Coastguard Worker return DesktopVector(x() + other.x(), y() + other.y()); 41*d9f75844SAndroid Build Coastguard Worker } subtract(const DesktopVector & other)42*d9f75844SAndroid Build Coastguard Worker DesktopVector subtract(const DesktopVector& other) const { 43*d9f75844SAndroid Build Coastguard Worker return DesktopVector(x() - other.x(), y() - other.y()); 44*d9f75844SAndroid Build Coastguard Worker } 45*d9f75844SAndroid Build Coastguard Worker 46*d9f75844SAndroid Build Coastguard Worker DesktopVector operator-() const { return DesktopVector(-x_, -y_); } 47*d9f75844SAndroid Build Coastguard Worker 48*d9f75844SAndroid Build Coastguard Worker private: 49*d9f75844SAndroid Build Coastguard Worker int32_t x_; 50*d9f75844SAndroid Build Coastguard Worker int32_t y_; 51*d9f75844SAndroid Build Coastguard Worker }; 52*d9f75844SAndroid Build Coastguard Worker 53*d9f75844SAndroid Build Coastguard Worker // Type used to represent screen/window size. 54*d9f75844SAndroid Build Coastguard Worker class DesktopSize { 55*d9f75844SAndroid Build Coastguard Worker public: DesktopSize()56*d9f75844SAndroid Build Coastguard Worker DesktopSize() : width_(0), height_(0) {} DesktopSize(int32_t width,int32_t height)57*d9f75844SAndroid Build Coastguard Worker DesktopSize(int32_t width, int32_t height) : width_(width), height_(height) {} 58*d9f75844SAndroid Build Coastguard Worker width()59*d9f75844SAndroid Build Coastguard Worker int32_t width() const { return width_; } height()60*d9f75844SAndroid Build Coastguard Worker int32_t height() const { return height_; } 61*d9f75844SAndroid Build Coastguard Worker is_empty()62*d9f75844SAndroid Build Coastguard Worker bool is_empty() const { return width_ <= 0 || height_ <= 0; } 63*d9f75844SAndroid Build Coastguard Worker equals(const DesktopSize & other)64*d9f75844SAndroid Build Coastguard Worker bool equals(const DesktopSize& other) const { 65*d9f75844SAndroid Build Coastguard Worker return width_ == other.width_ && height_ == other.height_; 66*d9f75844SAndroid Build Coastguard Worker } 67*d9f75844SAndroid Build Coastguard Worker set(int32_t width,int32_t height)68*d9f75844SAndroid Build Coastguard Worker void set(int32_t width, int32_t height) { 69*d9f75844SAndroid Build Coastguard Worker width_ = width; 70*d9f75844SAndroid Build Coastguard Worker height_ = height; 71*d9f75844SAndroid Build Coastguard Worker } 72*d9f75844SAndroid Build Coastguard Worker 73*d9f75844SAndroid Build Coastguard Worker private: 74*d9f75844SAndroid Build Coastguard Worker int32_t width_; 75*d9f75844SAndroid Build Coastguard Worker int32_t height_; 76*d9f75844SAndroid Build Coastguard Worker }; 77*d9f75844SAndroid Build Coastguard Worker 78*d9f75844SAndroid Build Coastguard Worker // Represents a rectangle on the screen. 79*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT DesktopRect { 80*d9f75844SAndroid Build Coastguard Worker public: MakeSize(const DesktopSize & size)81*d9f75844SAndroid Build Coastguard Worker static DesktopRect MakeSize(const DesktopSize& size) { 82*d9f75844SAndroid Build Coastguard Worker return DesktopRect(0, 0, size.width(), size.height()); 83*d9f75844SAndroid Build Coastguard Worker } MakeWH(int32_t width,int32_t height)84*d9f75844SAndroid Build Coastguard Worker static DesktopRect MakeWH(int32_t width, int32_t height) { 85*d9f75844SAndroid Build Coastguard Worker return DesktopRect(0, 0, width, height); 86*d9f75844SAndroid Build Coastguard Worker } MakeXYWH(int32_t x,int32_t y,int32_t width,int32_t height)87*d9f75844SAndroid Build Coastguard Worker static DesktopRect MakeXYWH(int32_t x, 88*d9f75844SAndroid Build Coastguard Worker int32_t y, 89*d9f75844SAndroid Build Coastguard Worker int32_t width, 90*d9f75844SAndroid Build Coastguard Worker int32_t height) { 91*d9f75844SAndroid Build Coastguard Worker return DesktopRect(x, y, x + width, y + height); 92*d9f75844SAndroid Build Coastguard Worker } MakeLTRB(int32_t left,int32_t top,int32_t right,int32_t bottom)93*d9f75844SAndroid Build Coastguard Worker static DesktopRect MakeLTRB(int32_t left, 94*d9f75844SAndroid Build Coastguard Worker int32_t top, 95*d9f75844SAndroid Build Coastguard Worker int32_t right, 96*d9f75844SAndroid Build Coastguard Worker int32_t bottom) { 97*d9f75844SAndroid Build Coastguard Worker return DesktopRect(left, top, right, bottom); 98*d9f75844SAndroid Build Coastguard Worker } MakeOriginSize(const DesktopVector & origin,const DesktopSize & size)99*d9f75844SAndroid Build Coastguard Worker static DesktopRect MakeOriginSize(const DesktopVector& origin, 100*d9f75844SAndroid Build Coastguard Worker const DesktopSize& size) { 101*d9f75844SAndroid Build Coastguard Worker return MakeXYWH(origin.x(), origin.y(), size.width(), size.height()); 102*d9f75844SAndroid Build Coastguard Worker } 103*d9f75844SAndroid Build Coastguard Worker DesktopRect()104*d9f75844SAndroid Build Coastguard Worker DesktopRect() : left_(0), top_(0), right_(0), bottom_(0) {} 105*d9f75844SAndroid Build Coastguard Worker left()106*d9f75844SAndroid Build Coastguard Worker int32_t left() const { return left_; } top()107*d9f75844SAndroid Build Coastguard Worker int32_t top() const { return top_; } right()108*d9f75844SAndroid Build Coastguard Worker int32_t right() const { return right_; } bottom()109*d9f75844SAndroid Build Coastguard Worker int32_t bottom() const { return bottom_; } width()110*d9f75844SAndroid Build Coastguard Worker int32_t width() const { return right_ - left_; } height()111*d9f75844SAndroid Build Coastguard Worker int32_t height() const { return bottom_ - top_; } 112*d9f75844SAndroid Build Coastguard Worker set_width(int32_t width)113*d9f75844SAndroid Build Coastguard Worker void set_width(int32_t width) { right_ = left_ + width; } set_height(int32_t height)114*d9f75844SAndroid Build Coastguard Worker void set_height(int32_t height) { bottom_ = top_ + height; } 115*d9f75844SAndroid Build Coastguard Worker top_left()116*d9f75844SAndroid Build Coastguard Worker DesktopVector top_left() const { return DesktopVector(left_, top_); } size()117*d9f75844SAndroid Build Coastguard Worker DesktopSize size() const { return DesktopSize(width(), height()); } 118*d9f75844SAndroid Build Coastguard Worker is_empty()119*d9f75844SAndroid Build Coastguard Worker bool is_empty() const { return left_ >= right_ || top_ >= bottom_; } 120*d9f75844SAndroid Build Coastguard Worker equals(const DesktopRect & other)121*d9f75844SAndroid Build Coastguard Worker bool equals(const DesktopRect& other) const { 122*d9f75844SAndroid Build Coastguard Worker return left_ == other.left_ && top_ == other.top_ && 123*d9f75844SAndroid Build Coastguard Worker right_ == other.right_ && bottom_ == other.bottom_; 124*d9f75844SAndroid Build Coastguard Worker } 125*d9f75844SAndroid Build Coastguard Worker 126*d9f75844SAndroid Build Coastguard Worker // Returns true if `point` lies within the rectangle boundaries. 127*d9f75844SAndroid Build Coastguard Worker bool Contains(const DesktopVector& point) const; 128*d9f75844SAndroid Build Coastguard Worker 129*d9f75844SAndroid Build Coastguard Worker // Returns true if `rect` lies within the boundaries of this rectangle. 130*d9f75844SAndroid Build Coastguard Worker bool ContainsRect(const DesktopRect& rect) const; 131*d9f75844SAndroid Build Coastguard Worker 132*d9f75844SAndroid Build Coastguard Worker // Finds intersection with `rect`. 133*d9f75844SAndroid Build Coastguard Worker void IntersectWith(const DesktopRect& rect); 134*d9f75844SAndroid Build Coastguard Worker 135*d9f75844SAndroid Build Coastguard Worker // Extends the rectangle to cover `rect`. If `this` is empty, replaces `this` 136*d9f75844SAndroid Build Coastguard Worker // with `rect`; if `rect` is empty, this function takes no effect. 137*d9f75844SAndroid Build Coastguard Worker void UnionWith(const DesktopRect& rect); 138*d9f75844SAndroid Build Coastguard Worker 139*d9f75844SAndroid Build Coastguard Worker // Adds (dx, dy) to the position of the rectangle. 140*d9f75844SAndroid Build Coastguard Worker void Translate(int32_t dx, int32_t dy); Translate(DesktopVector d)141*d9f75844SAndroid Build Coastguard Worker void Translate(DesktopVector d) { Translate(d.x(), d.y()); } 142*d9f75844SAndroid Build Coastguard Worker 143*d9f75844SAndroid Build Coastguard Worker // Enlarges current DesktopRect by subtracting `left_offset` and `top_offset` 144*d9f75844SAndroid Build Coastguard Worker // from `left_` and `top_`, and adding `right_offset` and `bottom_offset` to 145*d9f75844SAndroid Build Coastguard Worker // `right_` and `bottom_`. This function does not normalize the result, so 146*d9f75844SAndroid Build Coastguard Worker // `left_` and `top_` may be less than zero or larger than `right_` and 147*d9f75844SAndroid Build Coastguard Worker // `bottom_`. 148*d9f75844SAndroid Build Coastguard Worker void Extend(int32_t left_offset, 149*d9f75844SAndroid Build Coastguard Worker int32_t top_offset, 150*d9f75844SAndroid Build Coastguard Worker int32_t right_offset, 151*d9f75844SAndroid Build Coastguard Worker int32_t bottom_offset); 152*d9f75844SAndroid Build Coastguard Worker 153*d9f75844SAndroid Build Coastguard Worker // Scales current DesktopRect. This function does not impact the `top_` and 154*d9f75844SAndroid Build Coastguard Worker // `left_`. 155*d9f75844SAndroid Build Coastguard Worker void Scale(double horizontal, double vertical); 156*d9f75844SAndroid Build Coastguard Worker 157*d9f75844SAndroid Build Coastguard Worker private: DesktopRect(int32_t left,int32_t top,int32_t right,int32_t bottom)158*d9f75844SAndroid Build Coastguard Worker DesktopRect(int32_t left, int32_t top, int32_t right, int32_t bottom) 159*d9f75844SAndroid Build Coastguard Worker : left_(left), top_(top), right_(right), bottom_(bottom) {} 160*d9f75844SAndroid Build Coastguard Worker 161*d9f75844SAndroid Build Coastguard Worker int32_t left_; 162*d9f75844SAndroid Build Coastguard Worker int32_t top_; 163*d9f75844SAndroid Build Coastguard Worker int32_t right_; 164*d9f75844SAndroid Build Coastguard Worker int32_t bottom_; 165*d9f75844SAndroid Build Coastguard Worker }; 166*d9f75844SAndroid Build Coastguard Worker 167*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 168*d9f75844SAndroid Build Coastguard Worker 169*d9f75844SAndroid Build Coastguard Worker #endif // MODULES_DESKTOP_CAPTURE_DESKTOP_GEOMETRY_H_ 170