1 /* 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_GEOMETRY_H_ 12 #define WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_GEOMETRY_H_ 13 14 #include "webrtc/base/constructormagic.h" 15 #include "webrtc/typedefs.h" 16 17 namespace webrtc { 18 19 // A vector in the 2D integer space. E.g. can be used to represent screen DPI. 20 class DesktopVector { 21 public: DesktopVector()22 DesktopVector() : x_(0), y_(0) {} DesktopVector(int32_t x,int32_t y)23 DesktopVector(int32_t x, int32_t y) : x_(x), y_(y) {} 24 x()25 int32_t x() const { return x_; } y()26 int32_t y() const { return y_; } is_zero()27 bool is_zero() const { return x_ == 0 && y_ == 0; } 28 equals(const DesktopVector & other)29 bool equals(const DesktopVector& other) const { 30 return x_ == other.x_ && y_ == other.y_; 31 } 32 set(int32_t x,int32_t y)33 void set(int32_t x, int32_t y) { 34 x_ = x; 35 y_ = y; 36 } 37 add(const DesktopVector & other)38 DesktopVector add(const DesktopVector& other) const { 39 return DesktopVector(x() + other.x(), y() + other.y()); 40 } subtract(const DesktopVector & other)41 DesktopVector subtract(const DesktopVector& other) const { 42 return DesktopVector(x() - other.x(), y() - other.y()); 43 } 44 45 private: 46 int32_t x_; 47 int32_t y_; 48 }; 49 50 // Type used to represent screen/window size. 51 class DesktopSize { 52 public: DesktopSize()53 DesktopSize() : width_(0), height_(0) {} DesktopSize(int32_t width,int32_t height)54 DesktopSize(int32_t width, int32_t height) 55 : width_(width), height_(height) { 56 } 57 width()58 int32_t width() const { return width_; } height()59 int32_t height() const { return height_; } 60 is_empty()61 bool is_empty() const { return width_ <= 0 || height_ <= 0; } 62 equals(const DesktopSize & other)63 bool equals(const DesktopSize& other) const { 64 return width_ == other.width_ && height_ == other.height_; 65 } 66 set(int32_t width,int32_t height)67 void set(int32_t width, int32_t height) { 68 width_ = width; 69 height_ = height; 70 } 71 72 private: 73 int32_t width_; 74 int32_t height_; 75 }; 76 77 // Represents a rectangle on the screen. 78 class DesktopRect { 79 public: MakeSize(const DesktopSize & size)80 static DesktopRect MakeSize(const DesktopSize& size) { 81 return DesktopRect(0, 0, size.width(), size.height()); 82 } MakeWH(int32_t width,int32_t height)83 static DesktopRect MakeWH(int32_t width, int32_t height) { 84 return DesktopRect(0, 0, width, height); 85 } MakeXYWH(int32_t x,int32_t y,int32_t width,int32_t height)86 static DesktopRect MakeXYWH(int32_t x, int32_t y, 87 int32_t width, int32_t height) { 88 return DesktopRect(x, y, x + width, y + height); 89 } MakeLTRB(int32_t left,int32_t top,int32_t right,int32_t bottom)90 static DesktopRect MakeLTRB(int32_t left, int32_t top, 91 int32_t right, int32_t bottom) { 92 return DesktopRect(left, top, right, bottom); 93 } MakeOriginSize(const DesktopVector & origin,const DesktopSize & size)94 static DesktopRect MakeOriginSize(const DesktopVector& origin, 95 const DesktopSize& size) { 96 return MakeXYWH(origin.x(), origin.y(), size.width(), size.height()); 97 } 98 DesktopRect()99 DesktopRect() : left_(0), top_(0), right_(0), bottom_(0) {} 100 left()101 int32_t left() const { return left_; } top()102 int32_t top() const { return top_; } right()103 int32_t right() const { return right_; } bottom()104 int32_t bottom() const { return bottom_; } width()105 int32_t width() const { return right_ - left_; } height()106 int32_t height() const { return bottom_ - top_; } 107 top_left()108 DesktopVector top_left() const { return DesktopVector(left_, top_); } size()109 DesktopSize size() const { return DesktopSize(width(), height()); } 110 is_empty()111 bool is_empty() const { return left_ >= right_ || top_ >= bottom_; } 112 equals(const DesktopRect & other)113 bool equals(const DesktopRect& other) const { 114 return left_ == other.left_ && top_ == other.top_ && 115 right_ == other.right_ && bottom_ == other.bottom_; 116 } 117 118 // Returns true if |point| lies within the rectangle boundaries. 119 bool Contains(const DesktopVector& point) const; 120 121 // Returns true if |rect| lies within the boundaries of this rectangle. 122 bool ContainsRect(const DesktopRect& rect) const; 123 124 // Finds intersection with |rect|. 125 void IntersectWith(const DesktopRect& rect); 126 127 // Adds (dx, dy) to the position of the rectangle. 128 void Translate(int32_t dx, int32_t dy); Translate(DesktopVector d)129 void Translate(DesktopVector d) { Translate(d.x(), d.y()); }; 130 131 private: DesktopRect(int32_t left,int32_t top,int32_t right,int32_t bottom)132 DesktopRect(int32_t left, int32_t top, int32_t right, int32_t bottom) 133 : left_(left), top_(top), right_(right), bottom_(bottom) { 134 } 135 136 int32_t left_; 137 int32_t top_; 138 int32_t right_; 139 int32_t bottom_; 140 }; 141 142 } // namespace webrtc 143 144 #endif // WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_GEOMETRY_H_ 145 146