Index: ui/gfx/geometry/axis_transform2d.h |
diff --git a/ui/gfx/geometry/axis_transform2d.h b/ui/gfx/geometry/axis_transform2d.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1829bf60fcfc3580a8d3adc7262600c41608f3b6 |
--- /dev/null |
+++ b/ui/gfx/geometry/axis_transform2d.h |
@@ -0,0 +1,138 @@ |
+// Copyright (c) 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 UI_GFX_GEOMETRY_AXIS_TRANSFORM2D_H_ |
+#define UI_GFX_GEOMETRY_AXIS_TRANSFORM2D_H_ |
+ |
+#include "ui/gfx/geometry/rect_f.h" |
+#include "ui/gfx/geometry/vector2d_f.h" |
+#include "ui/gfx/gfx_export.h" |
+ |
+namespace gfx { |
+ |
+// This class implements the subset of 2D linear transforms that only |
+// translation and uniform scaling are allowed. |
+// Internally this is stored as a scalar pre-scale factor, and a vector |
+// for post-translation. The class constructor and member accessor follows |
+// the same convention. |
+class GFX_EXPORT AxisTransform2d { |
+ public: |
+ constexpr AxisTransform2d() = default; |
+ constexpr AxisTransform2d(float scale, const Vector2dF& translation) |
+ : scale_(scale), translation_(translation) {} |
+ |
+ bool operator==(const AxisTransform2d& other) const { |
+ return scale_ == other.scale_ && translation_ == other.translation_; |
+ } |
+ bool operator!=(const AxisTransform2d& other) const { |
+ return !(*this == other); |
+ } |
+ |
+ void PreScale(float scale) { scale_ *= scale; } |
+ void PostScale(float scale) { |
+ scale_ *= scale; |
+ translation_.Scale(scale); |
+ } |
+ void PreTranslate(const Vector2dF& translation) { |
+ translation_ += ScaleVector2d(translation, scale_); |
+ } |
+ void PostTranslate(const Vector2dF& translation) { |
+ translation_ += translation; |
+ } |
+ |
+ void PreConcat(const AxisTransform2d& pre) { |
+ PreTranslate(pre.translation_); |
+ PreScale(pre.scale_); |
+ } |
+ void PostConcat(const AxisTransform2d& post) { |
+ PostScale(post.scale_); |
+ PostTranslate(post.translation_); |
+ } |
+ |
+ void Invert() { |
+ DCHECK(scale_); |
+ scale_ = 1.f / scale_; |
+ translation_.Scale(-scale_); |
+ } |
+ |
+ PointF MapPoint(const PointF& p) const { |
+ return ScalePoint(p, scale_) + translation_; |
+ } |
+ PointF InverseMapPoint(const PointF& p) const { |
+ return ScalePoint(p - translation_, 1.f / scale_); |
+ } |
+ |
+ RectF MapRect(const RectF& r) const { |
+ DCHECK(scale_ >= 0.f); |
+ return ScaleRect(r, scale_) + translation_; |
+ } |
+ RectF InverseMapRect(const RectF& r) const { |
+ DCHECK(scale_ > 0.f); |
+ return ScaleRect(r - translation_, 1.f / scale_); |
+ } |
+ |
+ float scale() const { return scale_; } |
+ const Vector2dF& translation() const { return translation_; } |
+ |
+ std::string ToString() const; |
+ |
+ private: |
+ // Scale is applied before translation, i.e. |
+ // this->Transform(p) == scale_ * p + translation_ |
+ float scale_ = 1.f; |
+ Vector2dF translation_; |
+}; |
+ |
+static inline AxisTransform2d PreScaleAxisTransform2d(const AxisTransform2d& t, |
+ float scale) { |
+ AxisTransform2d result(t); |
+ result.PreScale(scale); |
+ return result; |
+} |
+ |
+static inline AxisTransform2d PostScaleAxisTransform2d(const AxisTransform2d& t, |
+ float scale) { |
+ AxisTransform2d result(t); |
+ result.PostScale(scale); |
+ return result; |
+} |
+ |
+static inline AxisTransform2d PreTranslateAxisTransform2d( |
+ const AxisTransform2d& t, |
+ const Vector2dF& translation) { |
+ AxisTransform2d result(t); |
+ result.PreTranslate(translation); |
+ return result; |
+} |
+ |
+static inline AxisTransform2d PostTranslateAxisTransform2d( |
+ const AxisTransform2d& t, |
+ const Vector2dF& translation) { |
+ AxisTransform2d result(t); |
+ result.PostTranslate(translation); |
+ return result; |
+} |
+ |
+static inline AxisTransform2d ConcatAxisTransform2d( |
+ const AxisTransform2d& post, |
+ const AxisTransform2d& pre) { |
+ AxisTransform2d result(post); |
+ result.PreConcat(pre); |
+ return result; |
+} |
+ |
+static inline AxisTransform2d InvertAxisTransform2d(const AxisTransform2d& t) { |
+ AxisTransform2d result = t; |
+ result.Invert(); |
+ return result; |
+} |
+ |
+// This is declared here for use in gtest-based unit tests but is defined in |
+// the //ui/gfx:test_support target. Depend on that to use this in your unit |
+// test. This should not be used in production code - call ToString() instead. |
+void PrintTo(const AxisTransform2d&, ::std::ostream* os); |
+ |
+} // namespace gfx |
+ |
+#endif // UI_GFX_GEOMETRY_AXIS_TRANSFORM2D_H_ |