115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org/*
215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org *
415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org *  Use of this source code is governed by a BSD-style license
515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org *  that can be found in the LICENSE file in the root of the source
615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org *  tree. An additional intellectual property rights grant can be found
715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org *  in the file PATENTS.  All contributing project authors may
815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org *  be found in the AUTHORS file in the root of the source tree.
915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org */
1015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
1115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org#ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_GEOMETRY_H_
1215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org#define WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_GEOMETRY_H_
1315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
1488fbb2d86b33a3886bba1af4d098efa2c19eb1e7henrike@webrtc.org#include "webrtc/base/constructormagic.h"
1515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org#include "webrtc/typedefs.h"
1615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
1715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.orgnamespace webrtc {
1815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
1915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org// A vector in the 2D integer space. E.g. can be used to represent screen DPI.
2015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.orgclass DesktopVector {
2115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org public:
2215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  DesktopVector() : x_(0), y_(0) {}
2315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  DesktopVector(int32_t x, int32_t y) : x_(x), y_(y) {}
2415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
2515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t x() const { return x_; }
2615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t y() const { return y_; }
2715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  bool is_zero() const { return x_ == 0 && y_ == 0; }
2815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
2915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  bool equals(const DesktopVector& other) const {
3015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org    return x_ == other.x_ && y_ == other.y_;
3115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  }
3215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
3315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  void set(int32_t x, int32_t y) {
3415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org    x_ = x;
3515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org    y_ = y;
3615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  }
3715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
38e6e749da3840e6855bd6fc13172b6589bdc3a973sergeyu@chromium.org  DesktopVector add(const DesktopVector& other) const {
39e6e749da3840e6855bd6fc13172b6589bdc3a973sergeyu@chromium.org    return DesktopVector(x() + other.x(), y() + other.y());
40e6e749da3840e6855bd6fc13172b6589bdc3a973sergeyu@chromium.org  }
41e6e749da3840e6855bd6fc13172b6589bdc3a973sergeyu@chromium.org  DesktopVector subtract(const DesktopVector& other) const {
42e6e749da3840e6855bd6fc13172b6589bdc3a973sergeyu@chromium.org    return DesktopVector(x() - other.x(), y() - other.y());
43e6e749da3840e6855bd6fc13172b6589bdc3a973sergeyu@chromium.org  }
44e6e749da3840e6855bd6fc13172b6589bdc3a973sergeyu@chromium.org
4515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org private:
4615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t x_;
4715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t y_;
4815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org};
4915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
5015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org// Type used to represent screen/window size.
5115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.orgclass DesktopSize {
5215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org public:
5315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  DesktopSize() : width_(0), height_(0) {}
5415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  DesktopSize(int32_t width, int32_t height)
5515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org      : width_(width), height_(height) {
5615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  }
5715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
5815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t width() const { return width_; }
5915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t height() const { return height_; }
6015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
6174f6074ec15f808482739c615f80243d0f32bef7sergeyu@chromium.org  bool is_empty() const { return width_ <= 0 || height_ <= 0; }
6215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
6315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  bool equals(const DesktopSize& other) const {
6415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org    return width_ == other.width_ && height_ == other.height_;
6515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  }
6615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
6715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  void set(int32_t width, int32_t height) {
6815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org    width_ = width;
6915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org    height_ = height;
7015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  }
7115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
7215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org private:
7315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t width_;
7415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t height_;
7515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org};
7615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
7715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org// Represents a rectangle on the screen.
7815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.orgclass DesktopRect {
7915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org public:
8015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  static DesktopRect MakeSize(const DesktopSize& size) {
8115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org    return DesktopRect(0, 0, size.width(), size.height());
8215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  }
8315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  static DesktopRect MakeWH(int32_t width, int32_t height) {
8415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org    return DesktopRect(0, 0, width, height);
8515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  }
8615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  static DesktopRect MakeXYWH(int32_t x, int32_t y,
8715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org                              int32_t width, int32_t height) {
8815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org    return DesktopRect(x, y, x + width, y + height);
8915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  }
9015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  static DesktopRect MakeLTRB(int32_t left, int32_t top,
9115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org                              int32_t right, int32_t bottom) {
9215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org    return DesktopRect(left, top, right, bottom);
9315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  }
945d85819dd21842cc3e6d74676a292cf9d9142f4esergeyu@chromium.org  static DesktopRect MakeOriginSize(const DesktopVector& origin,
955d85819dd21842cc3e6d74676a292cf9d9142f4esergeyu@chromium.org                                    const DesktopSize& size) {
965d85819dd21842cc3e6d74676a292cf9d9142f4esergeyu@chromium.org    return MakeXYWH(origin.x(), origin.y(), size.width(), size.height());
975d85819dd21842cc3e6d74676a292cf9d9142f4esergeyu@chromium.org  }
9815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
9915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  DesktopRect() : left_(0), top_(0), right_(0), bottom_(0) {}
10015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
10115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t left() const { return left_; }
10215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t top() const { return top_; }
10315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t right() const { return right_; }
10415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t bottom() const { return bottom_; }
10515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t width() const { return right_ - left_; }
10615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t height() const { return bottom_ - top_; }
10715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
108e6e749da3840e6855bd6fc13172b6589bdc3a973sergeyu@chromium.org  DesktopVector top_left() const { return DesktopVector(left_, top_); }
109e6e749da3840e6855bd6fc13172b6589bdc3a973sergeyu@chromium.org  DesktopSize size() const { return DesktopSize(width(), height()); }
110e6e749da3840e6855bd6fc13172b6589bdc3a973sergeyu@chromium.org
11115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  bool is_empty() const { return left_ >= right_ || top_ >= bottom_; }
11215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
11315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  bool equals(const DesktopRect& other) const {
11415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org    return left_ == other.left_ && top_ == other.top_ &&
11515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org        right_ == other.right_ && bottom_ == other.bottom_;
11615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  }
11715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
118e6e749da3840e6855bd6fc13172b6589bdc3a973sergeyu@chromium.org  // Returns true if |point| lies within the rectangle boundaries.
119e6e749da3840e6855bd6fc13172b6589bdc3a973sergeyu@chromium.org  bool Contains(const DesktopVector& point) const;
120e6e749da3840e6855bd6fc13172b6589bdc3a973sergeyu@chromium.org
1215d85819dd21842cc3e6d74676a292cf9d9142f4esergeyu@chromium.org  // Returns true if |rect| lies within the boundaries of this rectangle.
1225d85819dd21842cc3e6d74676a292cf9d9142f4esergeyu@chromium.org  bool ContainsRect(const DesktopRect& rect) const;
1235d85819dd21842cc3e6d74676a292cf9d9142f4esergeyu@chromium.org
12415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  // Finds intersection with |rect|.
12515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  void IntersectWith(const DesktopRect& rect);
12615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
12715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  // Adds (dx, dy) to the position of the rectangle.
12815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  void Translate(int32_t dx, int32_t dy);
129e6e749da3840e6855bd6fc13172b6589bdc3a973sergeyu@chromium.org  void Translate(DesktopVector d) { Translate(d.x(), d.y()); };
13015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
13115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org private:
13215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  DesktopRect(int32_t left, int32_t top, int32_t right, int32_t bottom)
13315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org      : left_(left), top_(top), right_(right), bottom_(bottom) {
13415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  }
13515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
13615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t left_;
13715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t top_;
13815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t right_;
13915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int32_t bottom_;
14015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org};
14115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
14215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org}  // namespace webrtc
14315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
14415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_GEOMETRY_H_
14515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
146