Index: ash/utility/transformer_util.cc |
diff --git a/ash/utility/transformer_util.cc b/ash/utility/transformer_util.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f5499b3f948474b5bd147a6874f3c63ec2b5bc61 |
--- /dev/null |
+++ b/ash/utility/transformer_util.cc |
@@ -0,0 +1,56 @@ |
+// 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. |
+ |
+#include "ash/utility/transformer_util.h" |
+ |
+#include <cmath> |
+ |
+#include "third_party/skia/include/core/SkMatrix44.h" |
+#include "ui/gfx/transform.h" |
+ |
+namespace ash { |
+ |
+// Round near zero value to zero. |
+void RoundNearZero(gfx::Transform* transform) { |
+ const float kEpsilon = 0.001f; |
+ SkMatrix44& matrix = transform->matrix(); |
+ for (int x = 0; x < 4; ++x) { |
+ for (int y = 0; y < 4; ++y) { |
+ if (std::abs(SkMScalarToFloat(matrix.get(x, y))) < kEpsilon) |
+ matrix.set(x, y, SkFloatToMScalar(0.0f)); |
+ } |
+ } |
+} |
+ |
+gfx::Transform CreateRotationTransform(display::Display::Rotation old_rotation, |
+ display::Display::Rotation new_rotation, |
+ const display::Display& display) { |
+ const int rotation_angle = 90 * (((new_rotation - old_rotation) + 4) % 4); |
+ gfx::Transform rotate; |
+ // The origin is (0, 0), so the translate width/height must be reduced by |
+ // 1 pixel. |
+ float one_pixel = 1.0f / display.device_scale_factor(); |
+ switch (rotation_angle) { |
+ case 0: |
+ break; |
+ case 90: |
+ rotate.Translate(display.bounds().height() - one_pixel, 0); |
+ rotate.Rotate(90); |
+ break; |
+ case 180: |
+ rotate.Translate(display.bounds().width() - one_pixel, |
+ display.bounds().height() - one_pixel); |
+ rotate.Rotate(180); |
+ break; |
+ case 270: |
+ rotate.Translate(0, display.bounds().width() - one_pixel); |
+ rotate.Rotate(270); |
+ break; |
+ } |
+ |
+ RoundNearZero(&rotate); |
+ return rotate; |
+} |
+ |
+} // namespace ash |