Home | History | Annotate | Download | only in desktop_capture
      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:
     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.
     51 class 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.
     78 class 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