|  | // Copyright 2017 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef REMOTING_CLIENT_UI_VIEW_MATRIX_H_ | 
|  | #define REMOTING_CLIENT_UI_VIEW_MATRIX_H_ | 
|  |  | 
|  | #include <array> | 
|  |  | 
|  | namespace remoting { | 
|  |  | 
|  | // A 2D non-skew equally scaled transformation matrix. | 
|  | // | SCALE, 0,     OFFSET_X, | | 
|  | // | 0,     SCALE, OFFSET_Y, | | 
|  | // | 0,     0,     1         | | 
|  | class ViewMatrix { | 
|  | public: | 
|  | struct Vector2D { | 
|  | float x; | 
|  | float y; | 
|  | }; | 
|  |  | 
|  | // Same as Vector2D. This alias just serves as a context hint. | 
|  | using Point = Vector2D; | 
|  |  | 
|  | // Creates an empty matrix (0 scale and offsets). | 
|  | ViewMatrix(); | 
|  |  | 
|  | ViewMatrix(float scale, const Vector2D& offset); | 
|  |  | 
|  | ~ViewMatrix(); | 
|  |  | 
|  | // Applies the matrix on the point and returns the result. | 
|  | Point MapPoint(const Point& point) const; | 
|  |  | 
|  | // Applies the matrix on the vector and returns the result. This only scales | 
|  | // the vector and does not apply offset. | 
|  | Vector2D MapVector(const Vector2D& vector) const; | 
|  |  | 
|  | // Sets the scale factor, with the pivot point at (0, 0). This WON'T affect | 
|  | // the offset. | 
|  | void SetScale(float scale); | 
|  |  | 
|  | // Returns the scale of this matrix. | 
|  | float GetScale() const; | 
|  |  | 
|  | // Sets the offset. | 
|  | void SetOffset(const Point& offset); | 
|  |  | 
|  | const Vector2D& GetOffset() const; | 
|  |  | 
|  | // Adjust the matrix M to M' such that: | 
|  | // M * p_a = p_b => M' * p_a = scale * (p_b - pivot) + pivot | 
|  | void PostScale(const Point& pivot, float scale); | 
|  |  | 
|  | // Applies translation to the matrix. | 
|  | // M * p_a = p_b => M' * p_a = p_b + delta | 
|  | void PostTranslate(const Vector2D& delta); | 
|  |  | 
|  | // Returns the inverse of this matrix. | 
|  | ViewMatrix Invert() const; | 
|  |  | 
|  | // Returns true if the scale and offsets are both 0. | 
|  | bool IsEmpty() const; | 
|  |  | 
|  | // Converts to the 3x3 matrix array. | 
|  | std::array<float, 9> ToMatrixArray() const; | 
|  |  | 
|  | private: | 
|  | float scale_; | 
|  | Vector2D offset_; | 
|  | }; | 
|  |  | 
|  | }  // namespace remoting | 
|  |  | 
|  | #endif  // REMOTING_CLIENT_UI_VIEW_MATRIX_H_ |