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 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
357 } | 357 } |
358 } | 358 } |
359 | 359 |
360 void hitTestChildren(HitTestResult result, { Point position }) { | 360 void hitTestChildren(HitTestResult result, { Point position }) { |
361 if (child != null) | 361 if (child != null) |
362 child.hitTest(result, position: position); | 362 child.hitTest(result, position: position); |
363 else | 363 else |
364 super.hitTestChildren(result, position: position); | 364 super.hitTestChildren(result, position: position); |
365 } | 365 } |
366 | 366 |
367 void paint(RenderObjectDisplayList canvas) { | 367 void paint(RenderCanvas canvas) { |
368 if (child != null) | 368 if (child != null) |
369 child.paint(canvas); | 369 child.paint(canvas); |
370 } | 370 } |
371 | 371 |
372 } | 372 } |
373 | 373 |
374 class RenderConstrainedBox extends RenderProxyBox { | 374 class RenderConstrainedBox extends RenderProxyBox { |
375 RenderConstrainedBox({ | 375 RenderConstrainedBox({ |
376 RenderBox child, | 376 RenderBox child, |
377 BoxConstraints additionalConstraints | 377 BoxConstraints additionalConstraints |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
478 double get opacity => _opacity; | 478 double get opacity => _opacity; |
479 void set opacity (double value) { | 479 void set opacity (double value) { |
480 assert(value != null); | 480 assert(value != null); |
481 assert(value >= 0.0 && value <= 1.0); | 481 assert(value >= 0.0 && value <= 1.0); |
482 if (_opacity == value) | 482 if (_opacity == value) |
483 return; | 483 return; |
484 _opacity = value; | 484 _opacity = value; |
485 markNeedsPaint(); | 485 markNeedsPaint(); |
486 } | 486 } |
487 | 487 |
488 void paint(RenderObjectDisplayList canvas) { | 488 void paint(RenderCanvas canvas) { |
489 if (child != null) { | 489 if (child != null) { |
490 int a = (_opacity * 255).round(); | 490 int a = (_opacity * 255).round(); |
491 | 491 |
492 if (a == 0) | 492 if (a == 0) |
493 return; | 493 return; |
494 | 494 |
495 if (a == 255) { | 495 if (a == 255) { |
496 child.paint(canvas); | 496 child.paint(canvas); |
497 return; | 497 return; |
498 } | 498 } |
(...skipping 26 matching lines...) Expand all Loading... | |
525 sky.TransferMode _transferMode; | 525 sky.TransferMode _transferMode; |
526 sky.TransferMode get transferMode => _transferMode; | 526 sky.TransferMode get transferMode => _transferMode; |
527 void set transferMode (sky.TransferMode value) { | 527 void set transferMode (sky.TransferMode value) { |
528 assert(value != null); | 528 assert(value != null); |
529 if (_transferMode == value) | 529 if (_transferMode == value) |
530 return; | 530 return; |
531 _transferMode = value; | 531 _transferMode = value; |
532 markNeedsPaint(); | 532 markNeedsPaint(); |
533 } | 533 } |
534 | 534 |
535 void paint(RenderObjectDisplayList canvas) { | 535 void paint(RenderCanvas canvas) { |
536 if (child != null) { | 536 if (child != null) { |
537 Paint paint = new Paint() | 537 Paint paint = new Paint() |
538 ..setColorFilter(new sky.ColorFilter.mode(_color, _transferMode)); | 538 ..setColorFilter(new sky.ColorFilter.mode(_color, _transferMode)); |
539 canvas.saveLayer(null, paint); | 539 canvas.saveLayer(null, paint); |
540 child.paint(canvas); | 540 child.paint(canvas); |
541 canvas.restore(); | 541 canvas.restore(); |
542 } | 542 } |
543 } | 543 } |
544 } | 544 } |
545 | 545 |
546 class RenderClipRect extends RenderProxyBox { | 546 class RenderClipRect extends RenderProxyBox { |
547 RenderClipRect({ RenderBox child }) : super(child); | 547 RenderClipRect({ RenderBox child }) : super(child); |
548 | 548 |
549 void paint(RenderObjectDisplayList canvas) { | 549 void paint(RenderCanvas canvas) { |
550 if (child != null) { | 550 if (child != null) { |
551 canvas.save(); | 551 canvas.save(); |
552 canvas.clipRect(new Rect.fromSize(size)); | 552 canvas.clipRect(new Rect.fromSize(size)); |
553 child.paint(canvas); | 553 child.paint(canvas); |
554 canvas.restore(); | 554 canvas.restore(); |
555 } | 555 } |
556 } | 556 } |
557 } | 557 } |
558 | 558 |
559 class RenderClipOval extends RenderProxyBox { | 559 class RenderClipOval extends RenderProxyBox { |
560 RenderClipOval({ RenderBox child }) : super(child); | 560 RenderClipOval({ RenderBox child }) : super(child); |
561 | 561 |
562 void paint(RenderObjectDisplayList canvas) { | 562 void paint(RenderCanvas canvas) { |
563 if (child != null) { | 563 if (child != null) { |
564 Rect rect = new Rect.fromSize(size); | 564 Rect rect = new Rect.fromSize(size); |
565 canvas.saveLayer(rect, new Paint()); | 565 canvas.saveLayer(rect, new Paint()); |
566 Path path = new Path(); | 566 Path path = new Path(); |
567 path.addOval(rect); | 567 path.addOval(rect); |
568 canvas.clipPath(path); | 568 canvas.clipPath(path); |
569 child.paint(canvas); | 569 child.paint(canvas); |
570 canvas.restore(); | 570 canvas.restore(); |
571 } | 571 } |
572 } | 572 } |
573 } | 573 } |
574 | 574 |
575 abstract class RenderShiftedBox extends RenderBox with RenderObjectWithChildMixi n<RenderBox> { | 575 abstract class RenderShiftedBox extends RenderBox with RenderObjectWithChildMixi n<RenderBox> { |
576 | 576 |
577 // Abstract class for one-child-layout render boxes | 577 // Abstract class for one-child-layout render boxes |
578 | 578 |
579 RenderShiftedBox(RenderBox child) { | 579 RenderShiftedBox(RenderBox child) { |
580 this.child = child; | 580 this.child = child; |
581 } | 581 } |
582 | 582 |
583 void paint(RenderObjectDisplayList canvas) { | 583 void paint(RenderCanvas canvas) { |
584 if (child != null) | 584 if (child != null) |
585 canvas.paintChild(child, child.parentData.position); | 585 canvas.paintChild(child, child.parentData.position); |
586 } | 586 } |
587 | 587 |
588 void hitTestChildren(HitTestResult result, { Point position }) { | 588 void hitTestChildren(HitTestResult result, { Point position }) { |
589 if (child != null) { | 589 if (child != null) { |
590 assert(child.parentData is BoxParentData); | 590 assert(child.parentData is BoxParentData); |
591 Rect childBounds = new Rect.fromPointAndSize(child.parentData.position, ch ild.size); | 591 Rect childBounds = new Rect.fromPointAndSize(child.parentData.position, ch ild.size); |
592 if (childBounds.contains(position)) { | 592 if (childBounds.contains(position)) { |
593 child.hitTest(result, position: new Point(position.x - child.parentData. position.x, | 593 child.hitTest(result, position: new Point(position.x - child.parentData. position.x, |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
809 } | 809 } |
810 | 810 |
811 double getMaxIntrinsicHeight(BoxConstraints constraints) { | 811 double getMaxIntrinsicHeight(BoxConstraints constraints) { |
812 return _sizeForConstraints(constraints).height; | 812 return _sizeForConstraints(constraints).height; |
813 } | 813 } |
814 | 814 |
815 void performLayout() { | 815 void performLayout() { |
816 size = _sizeForConstraints(constraints); | 816 size = _sizeForConstraints(constraints); |
817 } | 817 } |
818 | 818 |
819 void paint(RenderObjectDisplayList canvas) { | 819 void paint(RenderCanvas canvas) { |
820 if (_image == null) return; | 820 if (_image == null) return; |
821 bool needsScale = size.width != _image.width || size.height != _image.height ; | 821 bool needsScale = size.width != _image.width || size.height != _image.height ; |
822 if (needsScale) { | 822 if (needsScale) { |
823 double widthScale = size.width / _image.width; | 823 double widthScale = size.width / _image.width; |
824 double heightScale = size.height / _image.height; | 824 double heightScale = size.height / _image.height; |
825 canvas.save(); | 825 canvas.save(); |
826 canvas.scale(widthScale, heightScale); | 826 canvas.scale(widthScale, heightScale); |
827 } | 827 } |
828 Paint paint = new Paint(); | 828 Paint paint = new Paint(); |
829 canvas.drawImage(_image, 0.0, 0.0, paint); | 829 canvas.drawImage(_image, 0.0, 0.0, paint); |
(...skipping 14 matching lines...) Expand all Loading... | |
844 BoxPainter _painter; | 844 BoxPainter _painter; |
845 BoxDecoration get decoration => _painter.decoration; | 845 BoxDecoration get decoration => _painter.decoration; |
846 void set decoration (BoxDecoration value) { | 846 void set decoration (BoxDecoration value) { |
847 assert(value != null); | 847 assert(value != null); |
848 if (value == _painter.decoration) | 848 if (value == _painter.decoration) |
849 return; | 849 return; |
850 _painter.decoration = value; | 850 _painter.decoration = value; |
851 markNeedsPaint(); | 851 markNeedsPaint(); |
852 } | 852 } |
853 | 853 |
854 void paint(RenderObjectDisplayList canvas) { | 854 void paint(RenderCanvas canvas) { |
855 assert(size.width != null); | 855 assert(size.width != null); |
856 assert(size.height != null); | 856 assert(size.height != null); |
857 _painter.paint(canvas, new Rect.fromSize(size)); | 857 _painter.paint(canvas, new Rect.fromSize(size)); |
858 super.paint(canvas); | 858 super.paint(canvas); |
859 } | 859 } |
860 | 860 |
861 String debugDescribeSettings(String prefix) => '${super.debugDescribeSettings( prefix)}${prefix}decoration:\n${_painter.decoration.toString(prefix + " ")}\n'; | 861 String debugDescribeSettings(String prefix) => '${super.debugDescribeSettings( prefix)}${prefix}decoration:\n${_painter.decoration.toString(prefix + " ")}\n'; |
862 } | 862 } |
863 | 863 |
864 class RenderTransform extends RenderProxyBox { | 864 class RenderTransform extends RenderProxyBox { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
914 Matrix4 inverse = new Matrix4.zero(); | 914 Matrix4 inverse = new Matrix4.zero(); |
915 /* double det = */ inverse.copyInverse(_transform); | 915 /* double det = */ inverse.copyInverse(_transform); |
916 // TODO(abarth): Check the determinant for degeneracy. | 916 // TODO(abarth): Check the determinant for degeneracy. |
917 | 917 |
918 Vector3 position3 = new Vector3(position.x, position.y, 0.0); | 918 Vector3 position3 = new Vector3(position.x, position.y, 0.0); |
919 Vector3 transformed3 = inverse.transform3(position3); | 919 Vector3 transformed3 = inverse.transform3(position3); |
920 Point transformed = new Point(transformed3.x, transformed3.y); | 920 Point transformed = new Point(transformed3.x, transformed3.y); |
921 super.hitTestChildren(result, position: transformed); | 921 super.hitTestChildren(result, position: transformed); |
922 } | 922 } |
923 | 923 |
924 void paint(RenderObjectDisplayList canvas) { | 924 void paint(RenderCanvas canvas) { |
925 canvas.save(); | 925 canvas.save(); |
926 canvas.concat(_transform.storage); | 926 canvas.concat(_transform.storage); |
927 super.paint(canvas); | 927 super.paint(canvas); |
928 canvas.restore(); | 928 canvas.restore(); |
929 } | 929 } |
930 | 930 |
931 String debugDescribeSettings(String prefix) { | 931 String debugDescribeSettings(String prefix) { |
932 List<String> result = _transform.toString().split('\n').map((s) => '$prefix $s\n').toList(); | 932 List<String> result = _transform.toString().split('\n').map((s) => '$prefix $s\n').toList(); |
933 result.removeLast(); | 933 result.removeLast(); |
934 return '${super.debugDescribeSettings(prefix)}${prefix}transform matrix:\n${ result.join()}'; | 934 return '${super.debugDescribeSettings(prefix)}${prefix}transform matrix:\n${ result.join()}'; |
(...skipping 15 matching lines...) Expand all Loading... | |
950 void performLayout() { | 950 void performLayout() { |
951 Size oldSize = size; | 951 Size oldSize = size; |
952 | 952 |
953 super.performLayout(); | 953 super.performLayout(); |
954 | 954 |
955 if (oldSize != size) | 955 if (oldSize != size) |
956 callback(size); | 956 callback(size); |
957 } | 957 } |
958 } | 958 } |
959 | 959 |
960 typedef void CustomPaintCallback(sky.Canvas canvas, Size size); | 960 typedef void CustomPaintCallback(RenderCanvas canvas, Size size); |
961 | 961 |
962 class RenderCustomPaint extends RenderProxyBox { | 962 class RenderCustomPaint extends RenderProxyBox { |
963 | 963 |
964 RenderCustomPaint({ | 964 RenderCustomPaint({ |
965 CustomPaintCallback callback, | 965 CustomPaintCallback callback, |
966 RenderBox child | 966 RenderBox child |
967 }) : super(child) { | 967 }) : super(child) { |
968 assert(callback != null); | 968 assert(callback != null); |
969 _callback = callback; | 969 _callback = callback; |
970 } | 970 } |
971 | 971 |
972 CustomPaintCallback _callback; | 972 CustomPaintCallback _callback; |
973 void set callback (CustomPaintCallback value) { | 973 void set callback (CustomPaintCallback value) { |
974 assert(value != null || !attached); | 974 assert(value != null || !attached); |
975 if (_callback == value) | 975 if (_callback == value) |
976 return; | 976 return; |
977 _callback = value; | 977 _callback = value; |
978 markNeedsPaint(); | 978 markNeedsPaint(); |
979 } | 979 } |
980 | 980 |
981 void attach() { | 981 void attach() { |
982 assert(_callback != null); | 982 assert(_callback != null); |
983 super.attach(); | 983 super.attach(); |
984 } | 984 } |
985 | 985 |
986 void paint(RenderObjectDisplayList canvas) { | 986 void paint(RenderCanvas canvas) { |
987 assert(_callback != null); | 987 assert(_callback != null); |
988 _callback(canvas, size); | 988 _callback(canvas, size); |
989 super.paint(canvas); | 989 super.paint(canvas); |
990 } | 990 } |
991 } | 991 } |
992 | 992 |
993 // RENDER VIEW LAYOUT MANAGER | 993 // RENDER VIEW LAYOUT MANAGER |
994 | 994 |
995 class ViewConstraints { | 995 class ViewConstraints { |
996 | 996 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1058 bool hitTest(HitTestResult result, { Point position }) { | 1058 bool hitTest(HitTestResult result, { Point position }) { |
1059 if (child != null) { | 1059 if (child != null) { |
1060 Rect childBounds = new Rect.fromSize(child.size); | 1060 Rect childBounds = new Rect.fromSize(child.size); |
1061 if (childBounds.contains(position)) | 1061 if (childBounds.contains(position)) |
1062 child.hitTest(result, position: position); | 1062 child.hitTest(result, position: position); |
1063 } | 1063 } |
1064 result.add(new HitTestEntry(this)); | 1064 result.add(new HitTestEntry(this)); |
1065 return true; | 1065 return true; |
1066 } | 1066 } |
1067 | 1067 |
1068 void paint(RenderObjectDisplayList canvas) { | 1068 void paint(RenderCanvas canvas) { |
1069 if (child != null) | 1069 if (child != null) |
1070 canvas.paintChild(child, Point.origin); | 1070 canvas.paintChild(child, Point.origin); |
1071 } | 1071 } |
1072 | 1072 |
1073 void paintFrame() { | 1073 void paintFrame() { |
1074 sky.tracing.begin('RenderView.paintFrame'); | 1074 sky.tracing.begin('RenderView.paintFrame'); |
1075 RenderObject.debugDoingPaint = true; | 1075 RenderObject.debugDoingPaint = true; |
1076 try { | 1076 try { |
1077 RenderObjectDisplayList canvas = new RenderObjectDisplayList(sky.view.widt h, sky.view.height); | 1077 sky.PictureRecorder recorder = new sky.PictureRecorder(); |
1078 RenderCanvas canvas = new RenderCanvas(recorder, width, height); | |
1078 paint(canvas); | 1079 paint(canvas); |
1079 sky.view.picture = canvas.endRecording(); | 1080 sky.view.picture = recorder.endRecording(); |
1081 RenderObject.debugDoingPaint = false; | |
abarth-chromium
2015/06/23 02:28:45
This line of code isn't needed. We assign this va
iansf
2015/06/23 22:46:09
Correct. Good catch.
| |
1080 } finally { | 1082 } finally { |
1081 RenderObject.debugDoingPaint = false; | 1083 RenderObject.debugDoingPaint = false; |
1082 sky.tracing.end('RenderView.paintFrame'); | 1084 sky.tracing.end('RenderView.paintFrame'); |
1083 } | 1085 } |
1084 } | 1086 } |
1085 | 1087 |
1086 } | 1088 } |
1087 | 1089 |
1088 // DEFAULT BEHAVIORS FOR RENDERBOX CONTAINERS | 1090 // DEFAULT BEHAVIORS FOR RENDERBOX CONTAINERS |
1089 abstract class RenderBoxContainerDefaultsMixin<ChildType extends RenderBox, Pare ntDataType extends ContainerParentDataMixin<ChildType>> implements ContainerRend erObjectMixin<ChildType, ParentDataType> { | 1091 abstract class RenderBoxContainerDefaultsMixin<ChildType extends RenderBox, Pare ntDataType extends ContainerParentDataMixin<ChildType>> implements ContainerRend erObjectMixin<ChildType, ParentDataType> { |
1090 | 1092 |
1091 void defaultHitTestChildren(HitTestResult result, { Point position }) { | 1093 void defaultHitTestChildren(HitTestResult result, { Point position }) { |
1092 // the x, y parameters have the top left of the node's box as the origin | 1094 // the x, y parameters have the top left of the node's box as the origin |
1093 ChildType child = lastChild; | 1095 ChildType child = lastChild; |
1094 while (child != null) { | 1096 while (child != null) { |
1095 assert(child.parentData is ParentDataType); | 1097 assert(child.parentData is ParentDataType); |
1096 Rect childBounds = new Rect.fromPointAndSize(child.parentData.position, ch ild.size); | 1098 Rect childBounds = new Rect.fromPointAndSize(child.parentData.position, ch ild.size); |
1097 if (childBounds.contains(position)) { | 1099 if (childBounds.contains(position)) { |
1098 if (child.hitTest(result, position: new Point(position.x - child.parentD ata.position.x, | 1100 if (child.hitTest(result, position: new Point(position.x - child.parentD ata.position.x, |
1099 position.y - child.par entData.position.y))) | 1101 position.y - child.par entData.position.y))) |
1100 break; | 1102 break; |
1101 } | 1103 } |
1102 child = child.parentData.previousSibling; | 1104 child = child.parentData.previousSibling; |
1103 } | 1105 } |
1104 } | 1106 } |
1105 | 1107 |
1106 void defaultPaint(RenderObjectDisplayList canvas) { | 1108 void defaultPaint(RenderCanvas canvas) { |
1107 RenderBox child = firstChild; | 1109 RenderBox child = firstChild; |
1108 while (child != null) { | 1110 while (child != null) { |
1109 assert(child.parentData is ParentDataType); | 1111 assert(child.parentData is ParentDataType); |
1110 canvas.paintChild(child, child.parentData.position); | 1112 canvas.paintChild(child, child.parentData.position); |
1111 child = child.parentData.nextSibling; | 1113 child = child.parentData.nextSibling; |
1112 } | 1114 } |
1113 } | 1115 } |
1114 } | 1116 } |
OLD | NEW |