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
17namespace webrtc {
18
19// A vector in the 2D integer space. E.g. can be used to represent screen DPI.
20class DesktopVector {
21 public:
22  DesktopVector() : x_(0), y_(0) {}
23  DesktopVector(int32_t x, int32_t y) : x_(x), y_(y) {}
24
25  int32_t x() const { return x_; }
26  int32_t y() const { return y_; }
27  bool is_zero() const { return x_ == 0 && y_ == 0; }
28
29  bool equals(const DesktopVector& other) const {
30    return x_ == other.x_ && y_ == other.y_;
31  }
32
33  void set(int32_t x, int32_t y) {
34    x_ = x;
35    y_ = y;
36  }
37
38  DesktopVector add(const DesktopVector& other) const {
39    return DesktopVector(x() + other.x(), y() + other.y());
40  }
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.
51class DesktopSize {
52 public:
53  DesktopSize() : width_(0), height_(0) {}
54  DesktopSize(int32_t width, int32_t height)
55      : width_(width), height_(height) {
56  }
57
58  int32_t width() const { return width_; }
59  int32_t height() const { return height_; }
60
61  bool is_empty() const { return width_ <= 0 || height_ <= 0; }
62
63  bool equals(const DesktopSize& other) const {
64    return width_ == other.width_ && height_ == other.height_;
65  }
66
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.
78class DesktopRect {
79 public:
80  static DesktopRect MakeSize(const DesktopSize& size) {
81    return DesktopRect(0, 0, size.width(), size.height());
82  }
83  static DesktopRect MakeWH(int32_t width, int32_t height) {
84    return DesktopRect(0, 0, width, height);
85  }
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  }
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  }
94  static DesktopRect MakeOriginSize(const DesktopVector& origin,
95                                    const DesktopSize& size) {
96    return MakeXYWH(origin.x(), origin.y(), size.width(), size.height());
97  }
98
99  DesktopRect() : left_(0), top_(0), right_(0), bottom_(0) {}
100
101  int32_t left() const { return left_; }
102  int32_t top() const { return top_; }
103  int32_t right() const { return right_; }
104  int32_t bottom() const { return bottom_; }
105  int32_t width() const { return right_ - left_; }
106  int32_t height() const { return bottom_ - top_; }
107
108  DesktopVector top_left() const { return DesktopVector(left_, top_); }
109  DesktopSize size() const { return DesktopSize(width(), height()); }
110
111  bool is_empty() const { return left_ >= right_ || top_ >= bottom_; }
112
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);
129  void Translate(DesktopVector d) { Translate(d.x(), d.y()); };
130
131 private:
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