| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 import 'dart:math' as math; | 5 import 'dart:math' as math; |
| 6 import 'dart:sky' as sky; | 6 import 'dart:sky' as sky; |
| 7 | 7 |
| 8 import 'package:vector_math/vector_math.dart'; | 8 import 'package:vector_math/vector_math.dart'; |
| 9 | 9 |
| 10 import '../base/debug.dart'; | 10 import '../base/debug.dart'; |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 } | 422 } |
| 423 } | 423 } |
| 424 | 424 |
| 425 void hitTestChildren(HitTestResult result, { Point position }) { | 425 void hitTestChildren(HitTestResult result, { Point position }) { |
| 426 if (child != null) | 426 if (child != null) |
| 427 child.hitTest(result, position: position); | 427 child.hitTest(result, position: position); |
| 428 else | 428 else |
| 429 super.hitTestChildren(result, position: position); | 429 super.hitTestChildren(result, position: position); |
| 430 } | 430 } |
| 431 | 431 |
| 432 void paint(RenderCanvas canvas, Offset offset) { | 432 void paint(PaintingCanvas canvas, Offset offset) { |
| 433 if (child != null) | 433 if (child != null) |
| 434 child.paint(canvas, offset); | 434 child.paint(canvas, offset); |
| 435 } | 435 } |
| 436 | 436 |
| 437 } | 437 } |
| 438 | 438 |
| 439 class RenderConstrainedBox extends RenderProxyBox { | 439 class RenderConstrainedBox extends RenderProxyBox { |
| 440 RenderConstrainedBox({ | 440 RenderConstrainedBox({ |
| 441 RenderBox child, | 441 RenderBox child, |
| 442 BoxConstraints additionalConstraints | 442 BoxConstraints additionalConstraints |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 543 double get opacity => _opacity; | 543 double get opacity => _opacity; |
| 544 void set opacity (double value) { | 544 void set opacity (double value) { |
| 545 assert(value != null); | 545 assert(value != null); |
| 546 assert(value >= 0.0 && value <= 1.0); | 546 assert(value >= 0.0 && value <= 1.0); |
| 547 if (_opacity == value) | 547 if (_opacity == value) |
| 548 return; | 548 return; |
| 549 _opacity = value; | 549 _opacity = value; |
| 550 markNeedsPaint(); | 550 markNeedsPaint(); |
| 551 } | 551 } |
| 552 | 552 |
| 553 void paint(RenderCanvas canvas, Offset offset) { | 553 void paint(PaintingCanvas canvas, Offset offset) { |
| 554 if (child != null) { | 554 if (child != null) { |
| 555 int a = (_opacity * 255).round(); | 555 int a = (_opacity * 255).round(); |
| 556 | 556 |
| 557 if (a == 0) | 557 if (a == 0) |
| 558 return; | 558 return; |
| 559 | 559 |
| 560 if (a == 255) { | 560 if (a == 255) { |
| 561 child.paint(canvas, offset); | 561 child.paint(canvas, offset); |
| 562 return; | 562 return; |
| 563 } | 563 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 590 sky.TransferMode _transferMode; | 590 sky.TransferMode _transferMode; |
| 591 sky.TransferMode get transferMode => _transferMode; | 591 sky.TransferMode get transferMode => _transferMode; |
| 592 void set transferMode (sky.TransferMode value) { | 592 void set transferMode (sky.TransferMode value) { |
| 593 assert(value != null); | 593 assert(value != null); |
| 594 if (_transferMode == value) | 594 if (_transferMode == value) |
| 595 return; | 595 return; |
| 596 _transferMode = value; | 596 _transferMode = value; |
| 597 markNeedsPaint(); | 597 markNeedsPaint(); |
| 598 } | 598 } |
| 599 | 599 |
| 600 void paint(RenderCanvas canvas, Offset offset) { | 600 void paint(PaintingCanvas canvas, Offset offset) { |
| 601 if (child != null) { | 601 if (child != null) { |
| 602 Paint paint = new Paint() | 602 Paint paint = new Paint() |
| 603 ..setColorFilter(new sky.ColorFilter.mode(_color, _transferMode)); | 603 ..setColorFilter(new sky.ColorFilter.mode(_color, _transferMode)); |
| 604 canvas.saveLayer(null, paint); | 604 canvas.saveLayer(null, paint); |
| 605 child.paint(canvas, offset); | 605 child.paint(canvas, offset); |
| 606 canvas.restore(); | 606 canvas.restore(); |
| 607 } | 607 } |
| 608 } | 608 } |
| 609 } | 609 } |
| 610 | 610 |
| 611 class RenderClipRect extends RenderProxyBox { | 611 class RenderClipRect extends RenderProxyBox { |
| 612 RenderClipRect({ RenderBox child }) : super(child); | 612 RenderClipRect({ RenderBox child }) : super(child); |
| 613 | 613 |
| 614 void paint(RenderCanvas canvas, Offset offset) { | 614 void paint(PaintingCanvas canvas, Offset offset) { |
| 615 if (child != null) { | 615 if (child != null) { |
| 616 canvas.save(); | 616 canvas.save(); |
| 617 canvas.clipRect(offset & size); | 617 canvas.clipRect(offset & size); |
| 618 child.paint(canvas, offset); | 618 child.paint(canvas, offset); |
| 619 canvas.restore(); | 619 canvas.restore(); |
| 620 } | 620 } |
| 621 } | 621 } |
| 622 } | 622 } |
| 623 | 623 |
| 624 class RenderClipRRect extends RenderProxyBox { | 624 class RenderClipRRect extends RenderProxyBox { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 641 double _yRadius; | 641 double _yRadius; |
| 642 double get yRadius => _yRadius; | 642 double get yRadius => _yRadius; |
| 643 void set yRadius (double value) { | 643 void set yRadius (double value) { |
| 644 assert(value != null); | 644 assert(value != null); |
| 645 if (_yRadius == value) | 645 if (_yRadius == value) |
| 646 return; | 646 return; |
| 647 _yRadius = value; | 647 _yRadius = value; |
| 648 markNeedsPaint(); | 648 markNeedsPaint(); |
| 649 } | 649 } |
| 650 | 650 |
| 651 void paint(RenderCanvas canvas, Offset offset) { | 651 void paint(PaintingCanvas canvas, Offset offset) { |
| 652 if (child != null) { | 652 if (child != null) { |
| 653 Rect rect = offset & size; | 653 Rect rect = offset & size; |
| 654 canvas.saveLayer(rect, new Paint()); | 654 canvas.saveLayer(rect, new Paint()); |
| 655 sky.RRect rrect = new sky.RRect()..setRectXY(rect, xRadius, yRadius); | 655 sky.RRect rrect = new sky.RRect()..setRectXY(rect, xRadius, yRadius); |
| 656 canvas.clipRRect(rrect); | 656 canvas.clipRRect(rrect); |
| 657 child.paint(canvas, offset); | 657 child.paint(canvas, offset); |
| 658 canvas.restore(); | 658 canvas.restore(); |
| 659 } | 659 } |
| 660 } | 660 } |
| 661 } | 661 } |
| 662 | 662 |
| 663 class RenderClipOval extends RenderProxyBox { | 663 class RenderClipOval extends RenderProxyBox { |
| 664 RenderClipOval({ RenderBox child }) : super(child); | 664 RenderClipOval({ RenderBox child }) : super(child); |
| 665 | 665 |
| 666 void paint(RenderCanvas canvas, Offset offset) { | 666 void paint(PaintingCanvas canvas, Offset offset) { |
| 667 if (child != null) { | 667 if (child != null) { |
| 668 Rect rect = offset & size; | 668 Rect rect = offset & size; |
| 669 canvas.saveLayer(rect, new Paint()); | 669 canvas.saveLayer(rect, new Paint()); |
| 670 Path path = new Path(); | 670 Path path = new Path(); |
| 671 path.addOval(rect); | 671 path.addOval(rect); |
| 672 canvas.clipPath(path); | 672 canvas.clipPath(path); |
| 673 child.paint(canvas, offset); | 673 child.paint(canvas, offset); |
| 674 canvas.restore(); | 674 canvas.restore(); |
| 675 } | 675 } |
| 676 } | 676 } |
| 677 } | 677 } |
| 678 | 678 |
| 679 abstract class RenderShiftedBox extends RenderBox with RenderObjectWithChildMixi
n<RenderBox> { | 679 abstract class RenderShiftedBox extends RenderBox with RenderObjectWithChildMixi
n<RenderBox> { |
| 680 | 680 |
| 681 // Abstract class for one-child-layout render boxes | 681 // Abstract class for one-child-layout render boxes |
| 682 | 682 |
| 683 RenderShiftedBox(RenderBox child) { | 683 RenderShiftedBox(RenderBox child) { |
| 684 this.child = child; | 684 this.child = child; |
| 685 } | 685 } |
| 686 | 686 |
| 687 void paint(RenderCanvas canvas, Offset offset) { | 687 void paint(PaintingCanvas canvas, Offset offset) { |
| 688 if (child != null) | 688 if (child != null) |
| 689 canvas.paintChild(child, child.parentData.position + offset); | 689 canvas.paintChild(child, child.parentData.position + offset); |
| 690 } | 690 } |
| 691 | 691 |
| 692 double getDistanceToActualBaseline(TextBaseline baseline) { | 692 double getDistanceToActualBaseline(TextBaseline baseline) { |
| 693 double result; | 693 double result; |
| 694 if (child != null) { | 694 if (child != null) { |
| 695 assert(!needsLayout); | 695 assert(!needsLayout); |
| 696 result = child.getDistanceToActualBaseline(baseline); | 696 result = child.getDistanceToActualBaseline(baseline); |
| 697 assert(child.parentData is BoxParentData); | 697 assert(child.parentData is BoxParentData); |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 927 } | 927 } |
| 928 | 928 |
| 929 double getMaxIntrinsicHeight(BoxConstraints constraints) { | 929 double getMaxIntrinsicHeight(BoxConstraints constraints) { |
| 930 return _sizeForConstraints(constraints).height; | 930 return _sizeForConstraints(constraints).height; |
| 931 } | 931 } |
| 932 | 932 |
| 933 void performLayout() { | 933 void performLayout() { |
| 934 size = _sizeForConstraints(constraints); | 934 size = _sizeForConstraints(constraints); |
| 935 } | 935 } |
| 936 | 936 |
| 937 void paint(RenderCanvas canvas, Offset offset) { | 937 void paint(PaintingCanvas canvas, Offset offset) { |
| 938 if (_image == null) | 938 if (_image == null) |
| 939 return; | 939 return; |
| 940 bool needsScale = size.width != _image.width || size.height != _image.height
; | 940 bool needsScale = size.width != _image.width || size.height != _image.height
; |
| 941 if (needsScale) { | 941 if (needsScale) { |
| 942 double widthScale = size.width / _image.width; | 942 double widthScale = size.width / _image.width; |
| 943 double heightScale = size.height / _image.height; | 943 double heightScale = size.height / _image.height; |
| 944 canvas.save(); | 944 canvas.save(); |
| 945 canvas.translate(offset.dx, offset.dy); | 945 canvas.translate(offset.dx, offset.dy); |
| 946 canvas.scale(widthScale, heightScale); | 946 canvas.scale(widthScale, heightScale); |
| 947 offset = Offset.zero; | 947 offset = Offset.zero; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 965 BoxPainter _painter; | 965 BoxPainter _painter; |
| 966 BoxDecoration get decoration => _painter.decoration; | 966 BoxDecoration get decoration => _painter.decoration; |
| 967 void set decoration (BoxDecoration value) { | 967 void set decoration (BoxDecoration value) { |
| 968 assert(value != null); | 968 assert(value != null); |
| 969 if (value == _painter.decoration) | 969 if (value == _painter.decoration) |
| 970 return; | 970 return; |
| 971 _painter.decoration = value; | 971 _painter.decoration = value; |
| 972 markNeedsPaint(); | 972 markNeedsPaint(); |
| 973 } | 973 } |
| 974 | 974 |
| 975 void paint(RenderCanvas canvas, Offset offset) { | 975 void paint(PaintingCanvas canvas, Offset offset) { |
| 976 assert(size.width != null); | 976 assert(size.width != null); |
| 977 assert(size.height != null); | 977 assert(size.height != null); |
| 978 _painter.paint(canvas, offset & size); | 978 _painter.paint(canvas, offset & size); |
| 979 super.paint(canvas, offset); | 979 super.paint(canvas, offset); |
| 980 } | 980 } |
| 981 | 981 |
| 982 String debugDescribeSettings(String prefix) => '${super.debugDescribeSettings(
prefix)}${prefix}decoration:\n${_painter.decoration.toString(prefix + " ")}\n'; | 982 String debugDescribeSettings(String prefix) => '${super.debugDescribeSettings(
prefix)}${prefix}decoration:\n${_painter.decoration.toString(prefix + " ")}\n'; |
| 983 } | 983 } |
| 984 | 984 |
| 985 class RenderTransform extends RenderProxyBox { | 985 class RenderTransform extends RenderProxyBox { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1035 Matrix4 inverse = new Matrix4.zero(); | 1035 Matrix4 inverse = new Matrix4.zero(); |
| 1036 /* double det = */ inverse.copyInverse(_transform); | 1036 /* double det = */ inverse.copyInverse(_transform); |
| 1037 // TODO(abarth): Check the determinant for degeneracy. | 1037 // TODO(abarth): Check the determinant for degeneracy. |
| 1038 | 1038 |
| 1039 Vector3 position3 = new Vector3(position.x, position.y, 0.0); | 1039 Vector3 position3 = new Vector3(position.x, position.y, 0.0); |
| 1040 Vector3 transformed3 = inverse.transform3(position3); | 1040 Vector3 transformed3 = inverse.transform3(position3); |
| 1041 Point transformed = new Point(transformed3.x, transformed3.y); | 1041 Point transformed = new Point(transformed3.x, transformed3.y); |
| 1042 super.hitTestChildren(result, position: transformed); | 1042 super.hitTestChildren(result, position: transformed); |
| 1043 } | 1043 } |
| 1044 | 1044 |
| 1045 void paint(RenderCanvas canvas, Offset offset) { | 1045 void paint(PaintingCanvas canvas, Offset offset) { |
| 1046 canvas.save(); | 1046 canvas.save(); |
| 1047 canvas.translate(offset.dx, offset.dy); | 1047 canvas.translate(offset.dx, offset.dy); |
| 1048 canvas.concat(_transform.storage); | 1048 canvas.concat(_transform.storage); |
| 1049 super.paint(canvas, Offset.zero); | 1049 super.paint(canvas, Offset.zero); |
| 1050 canvas.restore(); | 1050 canvas.restore(); |
| 1051 } | 1051 } |
| 1052 | 1052 |
| 1053 String debugDescribeSettings(String prefix) { | 1053 String debugDescribeSettings(String prefix) { |
| 1054 List<String> result = _transform.toString().split('\n').map((s) => '$prefix
$s\n').toList(); | 1054 List<String> result = _transform.toString().split('\n').map((s) => '$prefix
$s\n').toList(); |
| 1055 result.removeLast(); | 1055 result.removeLast(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1072 void performLayout() { | 1072 void performLayout() { |
| 1073 Size oldSize = size; | 1073 Size oldSize = size; |
| 1074 | 1074 |
| 1075 super.performLayout(); | 1075 super.performLayout(); |
| 1076 | 1076 |
| 1077 if (oldSize != size) | 1077 if (oldSize != size) |
| 1078 callback(size); | 1078 callback(size); |
| 1079 } | 1079 } |
| 1080 } | 1080 } |
| 1081 | 1081 |
| 1082 typedef void CustomPaintCallback(RenderCanvas canvas, Size size); | 1082 typedef void CustomPaintCallback(PaintingCanvas canvas, Size size); |
| 1083 | 1083 |
| 1084 class RenderCustomPaint extends RenderProxyBox { | 1084 class RenderCustomPaint extends RenderProxyBox { |
| 1085 | 1085 |
| 1086 RenderCustomPaint({ | 1086 RenderCustomPaint({ |
| 1087 CustomPaintCallback callback, | 1087 CustomPaintCallback callback, |
| 1088 RenderBox child | 1088 RenderBox child |
| 1089 }) : super(child) { | 1089 }) : super(child) { |
| 1090 assert(callback != null); | 1090 assert(callback != null); |
| 1091 _callback = callback; | 1091 _callback = callback; |
| 1092 } | 1092 } |
| 1093 | 1093 |
| 1094 CustomPaintCallback _callback; | 1094 CustomPaintCallback _callback; |
| 1095 void set callback (CustomPaintCallback value) { | 1095 void set callback (CustomPaintCallback value) { |
| 1096 assert(value != null || !attached); | 1096 assert(value != null || !attached); |
| 1097 if (_callback == value) | 1097 if (_callback == value) |
| 1098 return; | 1098 return; |
| 1099 _callback = value; | 1099 _callback = value; |
| 1100 markNeedsPaint(); | 1100 markNeedsPaint(); |
| 1101 } | 1101 } |
| 1102 | 1102 |
| 1103 void attach() { | 1103 void attach() { |
| 1104 assert(_callback != null); | 1104 assert(_callback != null); |
| 1105 super.attach(); | 1105 super.attach(); |
| 1106 } | 1106 } |
| 1107 | 1107 |
| 1108 void paint(RenderCanvas canvas, Offset offset) { | 1108 void paint(PaintingCanvas canvas, Offset offset) { |
| 1109 assert(_callback != null); | 1109 assert(_callback != null); |
| 1110 canvas.translate(offset.dx, offset.dy); | 1110 canvas.translate(offset.dx, offset.dy); |
| 1111 _callback(canvas, size); | 1111 _callback(canvas, size); |
| 1112 super.paint(canvas, Offset.zero); | 1112 super.paint(canvas, Offset.zero); |
| 1113 canvas.translate(-offset.dx, -offset.dy); | 1113 canvas.translate(-offset.dx, -offset.dy); |
| 1114 } | 1114 } |
| 1115 } | 1115 } |
| 1116 | 1116 |
| 1117 // RENDER VIEW LAYOUT MANAGER | 1117 // RENDER VIEW LAYOUT MANAGER |
| 1118 | 1118 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1174 bool hitTest(HitTestResult result, { Point position }) { | 1174 bool hitTest(HitTestResult result, { Point position }) { |
| 1175 if (child != null) { | 1175 if (child != null) { |
| 1176 Rect childBounds = Point.origin & child.size; | 1176 Rect childBounds = Point.origin & child.size; |
| 1177 if (childBounds.contains(position)) | 1177 if (childBounds.contains(position)) |
| 1178 child.hitTest(result, position: position); | 1178 child.hitTest(result, position: position); |
| 1179 } | 1179 } |
| 1180 result.add(new HitTestEntry(this)); | 1180 result.add(new HitTestEntry(this)); |
| 1181 return true; | 1181 return true; |
| 1182 } | 1182 } |
| 1183 | 1183 |
| 1184 void paint(RenderCanvas canvas, Offset offset) { | 1184 void paint(PaintingCanvas canvas, Offset offset) { |
| 1185 if (child != null) | 1185 if (child != null) |
| 1186 canvas.paintChild(child, offset.toPoint()); | 1186 canvas.paintChild(child, offset.toPoint()); |
| 1187 } | 1187 } |
| 1188 | 1188 |
| 1189 void paintFrame() { | 1189 void paintFrame() { |
| 1190 sky.tracing.begin('RenderView.paintFrame'); | 1190 sky.tracing.begin('RenderView.paintFrame'); |
| 1191 RenderObject.debugDoingPaint = true; | 1191 RenderObject.debugDoingPaint = true; |
| 1192 try { | 1192 try { |
| 1193 sky.PictureRecorder recorder = new sky.PictureRecorder(); | 1193 sky.PictureRecorder recorder = new sky.PictureRecorder(); |
| 1194 RenderCanvas canvas = new RenderCanvas(recorder, _size); | 1194 PaintingCanvas canvas = new PaintingCanvas(recorder, _size); |
| 1195 paint(canvas, Offset.zero); | 1195 paint(canvas, Offset.zero); |
| 1196 sky.view.picture = recorder.endRecording(); | 1196 sky.view.picture = recorder.endRecording(); |
| 1197 } finally { | 1197 } finally { |
| 1198 RenderObject.debugDoingPaint = false; | 1198 RenderObject.debugDoingPaint = false; |
| 1199 sky.tracing.end('RenderView.paintFrame'); | 1199 sky.tracing.end('RenderView.paintFrame'); |
| 1200 } | 1200 } |
| 1201 } | 1201 } |
| 1202 | 1202 |
| 1203 } | 1203 } |
| 1204 | 1204 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1248 Rect childBounds = child.parentData.position & child.size; | 1248 Rect childBounds = child.parentData.position & child.size; |
| 1249 if (childBounds.contains(position)) { | 1249 if (childBounds.contains(position)) { |
| 1250 if (child.hitTest(result, position: new Point(position.x - child.parentD
ata.position.x, | 1250 if (child.hitTest(result, position: new Point(position.x - child.parentD
ata.position.x, |
| 1251 position.y - child.par
entData.position.y))) | 1251 position.y - child.par
entData.position.y))) |
| 1252 break; | 1252 break; |
| 1253 } | 1253 } |
| 1254 child = child.parentData.previousSibling; | 1254 child = child.parentData.previousSibling; |
| 1255 } | 1255 } |
| 1256 } | 1256 } |
| 1257 | 1257 |
| 1258 void defaultPaint(RenderCanvas canvas, Offset offset) { | 1258 void defaultPaint(PaintingCanvas canvas, Offset offset) { |
| 1259 RenderBox child = firstChild; | 1259 RenderBox child = firstChild; |
| 1260 while (child != null) { | 1260 while (child != null) { |
| 1261 assert(child.parentData is ParentDataType); | 1261 assert(child.parentData is ParentDataType); |
| 1262 canvas.paintChild(child, child.parentData.position + offset); | 1262 canvas.paintChild(child, child.parentData.position + offset); |
| 1263 child = child.parentData.nextSibling; | 1263 child = child.parentData.nextSibling; |
| 1264 } | 1264 } |
| 1265 } | 1265 } |
| 1266 } | 1266 } |
| OLD | NEW |