xref: /aosp_15_r20/external/webrtc/modules/desktop_capture/desktop_geometry.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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