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(); |
+ } |
} |