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