blob: a04b29b6c26cdface003aefa148a6d359282af5c [file] [log] [blame]
// 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_