Index: remoting/client/view_matrix.h |
diff --git a/remoting/client/view_matrix.h b/remoting/client/view_matrix.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..56b4ec5a162aa593367a74f040f7a6f000101344 |
--- /dev/null |
+++ b/remoting/client/view_matrix.h |
@@ -0,0 +1,71 @@ |
+// 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_VIEW_MATRIX_H_ |
+#define REMOTING_CLIENT_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; |
+ |
+ // 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_VIEW_MATRIX_H_ |