Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(612)

Unified Diff: sky/sdk/lib/framework/rendering/box.dart

Issue 1152273004: Add support for transforms to container (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sky/sdk/lib/framework/fn2.dart ('k') | sky/sdk/pubspec.yaml » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sky/sdk/lib/framework/rendering/box.dart
diff --git a/sky/sdk/lib/framework/rendering/box.dart b/sky/sdk/lib/framework/rendering/box.dart
index 803c85b2b884b7e1d962cfa6940fd2f753dd3fc5..7f753a8decc280ab09e99877602d79f9aec50f75 100644
--- a/sky/sdk/lib/framework/rendering/box.dart
+++ b/sky/sdk/lib/framework/rendering/box.dart
@@ -2,8 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'node.dart';
import 'dart:sky' as sky;
+import 'dart:typed_data';
+import 'node.dart';
+import 'package:vector_math/vector_math.dart';
// GENERIC BOX RENDERING
// Anything that has a concept of x, y, width, height is going to derive from this
@@ -283,7 +285,75 @@ class RenderDecoratedBox extends RenderProxyBox {
}
super.paint(canvas);
}
+}
+
+class RenderTransform extends RenderProxyBox {
+ RenderTransform({
+ Matrix4 transform,
+ RenderBox child
+ }) : super(child) {
+ assert(transform != null);
+ this.transform = transform;
+ }
+
+ Matrix4 _transform;
+
+ void set transform (Matrix4 value) {
+ assert(value != null);
+ if (_transform == value)
+ return;
+ _transform = new Matrix4.copy(value);
+ markNeedsPaint();
+ }
+ void rotateX(double radians) {
+ _transform.rotateX(radians);
+ markNeedsPaint();
+ }
+
+ void rotateY(double radians) {
+ _transform.rotateY(radians);
+ markNeedsPaint();
+ }
+
+ void rotateZ(double radians) {
+ _transform.rotateZ(radians);
+ markNeedsPaint();
+ }
+
+ void translate(x, [double y=0.0, double z=0.0]) {
eseidel 2015/06/03 17:16:18 Does the style put a space around these or not?
+ _transform.translate(x, y, z);
+ markNeedsPaint();
+ }
+
+ void scale(x, [double y=null, double z=null]) {
+ _transform.scale(x, y, z);
+ markNeedsPaint();
+ }
+
+ void hitTestChildren(HitTestResult result, { sky.Point position }) {
+ Matrix4 inverse = new Matrix4.zero();
+ double det = inverse.copyInverse(_transform);
+ // TODO(abarth): Check the determinant for degeneracy.
+
+ Vector3 position3 = new Vector3(position.x, position.y, 0.0);
+ Vector3 transformed3 = inverse.transform3(position3);
+ sky.Point transformed = new sky.Point(transformed3.x, transformed3.y);
+ super.hitTestChildren(result, position: transformed);
+ }
+
+ void paint(RenderNodeDisplayList canvas) {
+ Float32List storage = _transform.storage;
+
+ canvas.save();
+ canvas.concat([
+ storage[ 0], storage[ 1], storage[ 3],
+ storage[ 4], storage[ 5], storage[ 7],
+ storage[12], storage[13], storage[15],
+ ]);
+ super.paint(canvas);
+ canvas.restore();
+ }
}
« no previous file with comments | « sky/sdk/lib/framework/fn2.dart ('k') | sky/sdk/pubspec.yaml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698