• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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