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

Side by Side Diff: sky/sdk/lib/framework/rendering/box.dart

Issue 1190123003: Decouple Canvas from DisplayList and map Picture and PictureRecorder more directly to their Skia co… (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 6 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 unified diff | Download patch
OLDNEW
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 import 'object.dart'; 7 import 'object.dart';
8 import '../painting/box_painter.dart'; 8 import '../painting/box_painter.dart';
9 import 'package:vector_math/vector_math.dart'; 9 import 'package:vector_math/vector_math.dart';
10 import 'package:sky/framework/net/image_cache.dart' as image_cache; 10 import 'package:sky/framework/net/image_cache.dart' as image_cache;
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 } 280 }
281 } 281 }
282 282
283 void hitTestChildren(HitTestResult result, { Point position }) { 283 void hitTestChildren(HitTestResult result, { Point position }) {
284 if (child != null) 284 if (child != null)
285 child.hitTest(result, position: position); 285 child.hitTest(result, position: position);
286 else 286 else
287 super.hitTestChildren(result, position: position); 287 super.hitTestChildren(result, position: position);
288 } 288 }
289 289
290 void paint(RenderObjectDisplayList canvas) { 290 void paint(sky.Canvas canvas) {
291 if (child != null) 291 if (child != null)
292 child.paint(canvas); 292 child.paint(canvas);
293 } 293 }
294 294
295 } 295 }
296 296
297 class RenderSizedBox extends RenderProxyBox { 297 class RenderSizedBox extends RenderProxyBox {
298 298
299 RenderSizedBox({ 299 RenderSizedBox({
300 RenderBox child, 300 RenderBox child,
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 double get opacity => _opacity; 445 double get opacity => _opacity;
446 void set opacity (double value) { 446 void set opacity (double value) {
447 assert(value != null); 447 assert(value != null);
448 assert(value >= 0.0 && value <= 1.0); 448 assert(value >= 0.0 && value <= 1.0);
449 if (_opacity == value) 449 if (_opacity == value)
450 return; 450 return;
451 _opacity = value; 451 _opacity = value;
452 markNeedsPaint(); 452 markNeedsPaint();
453 } 453 }
454 454
455 void paint(RenderObjectDisplayList canvas) { 455 void paint(sky.Canvas canvas) {
456 if (child != null) { 456 if (child != null) {
457 int a = (_opacity * 255).round(); 457 int a = (_opacity * 255).round();
458 458
459 if (a == 0) 459 if (a == 0)
460 return; 460 return;
461 461
462 if (a == 255) { 462 if (a == 255) {
463 child.paint(canvas); 463 child.paint(canvas);
464 return; 464 return;
465 } 465 }
466 466
467 Paint paint = new Paint() 467 Paint paint = new Paint()
468 ..color = new Color.fromARGB(a, 0, 0, 0) 468 ..color = new Color.fromARGB(a, 0, 0, 0)
469 ..setTransferMode(sky.TransferMode.srcOverMode); 469 ..setTransferMode(sky.TransferMode.srcOverMode);
470 canvas.saveLayer(null, paint); 470 canvas.saveLayer(null, paint);
471 child.paint(canvas); 471 child.paint(canvas);
472 canvas.restore(); 472 canvas.restore();
473 } 473 }
474 } 474 }
475 } 475 }
476 476
477 class RenderClipRect extends RenderProxyBox { 477 class RenderClipRect extends RenderProxyBox {
478 RenderClipRect({ RenderBox child }) : super(child); 478 RenderClipRect({ RenderBox child }) : super(child);
479 479
480 void paint(RenderObjectDisplayList canvas) { 480 void paint(sky.Canvas canvas) {
481 if (child != null) { 481 if (child != null) {
482 canvas.save(); 482 canvas.save();
483 canvas.clipRect(new Rect.fromSize(size)); 483 canvas.clipRect(new Rect.fromSize(size));
484 child.paint(canvas); 484 child.paint(canvas);
485 canvas.restore(); 485 canvas.restore();
486 } 486 }
487 } 487 }
488 } 488 }
489 489
490 class RenderClipOval extends RenderProxyBox { 490 class RenderClipOval extends RenderProxyBox {
491 RenderClipOval({ RenderBox child }) : super(child); 491 RenderClipOval({ RenderBox child }) : super(child);
492 492
493 void paint(RenderObjectDisplayList canvas) { 493 void paint(sky.Canvas canvas) {
494 if (child != null) { 494 if (child != null) {
495 Rect rect = new Rect.fromSize(size); 495 Rect rect = new Rect.fromSize(size);
496 canvas.saveLayer(rect, new Paint()); 496 canvas.saveLayer(rect, new Paint());
497 Path path = new Path(); 497 Path path = new Path();
498 path.addOval(rect); 498 path.addOval(rect);
499 canvas.clipPath(path); 499 canvas.clipPath(path);
500 child.paint(canvas); 500 child.paint(canvas);
501 canvas.restore(); 501 canvas.restore();
502 } 502 }
503 } 503 }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 new Size(padding.left + padding.right, padding.top + padding.bottom)); 557 new Size(padding.left + padding.right, padding.top + padding.bottom));
558 return; 558 return;
559 } 559 }
560 child.layout(innerConstraints, parentUsesSize: true); 560 child.layout(innerConstraints, parentUsesSize: true);
561 assert(child.parentData is BoxParentData); 561 assert(child.parentData is BoxParentData);
562 child.parentData.position = new Point(padding.left, padding.top); 562 child.parentData.position = new Point(padding.left, padding.top);
563 size = constraints.constrain(new Size(padding.left + child.size.width + padd ing.right, 563 size = constraints.constrain(new Size(padding.left + child.size.width + padd ing.right,
564 padding.top + child.size.height + padding.bottom)); 564 padding.top + child.size.height + padding.bottom));
565 } 565 }
566 566
567 void paint(RenderObjectDisplayList canvas) { 567 void paint(sky.Canvas canvas) {
568 if (child != null) 568 if (child != null)
569 canvas.paintChild(child, child.parentData.position); 569 paintChild(canvas, child, child.parentData.position);
570 } 570 }
571 571
572 void hitTestChildren(HitTestResult result, { Point position }) { 572 void hitTestChildren(HitTestResult result, { Point position }) {
573 if (child != null) { 573 if (child != null) {
574 assert(child.parentData is BoxParentData); 574 assert(child.parentData is BoxParentData);
575 Rect childBounds = new Rect.fromPointAndSize(child.parentData.position, ch ild.size); 575 Rect childBounds = new Rect.fromPointAndSize(child.parentData.position, ch ild.size);
576 if (childBounds.contains(position)) { 576 if (childBounds.contains(position)) {
577 child.hitTest(result, position: new Point(position.x - child.parentData. position.x, 577 child.hitTest(result, position: new Point(position.x - child.parentData. position.x,
578 position.y - child.parentD ata.position.y)); 578 position.y - child.parentD ata.position.y));
579 } 579 }
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
657 } 657 }
658 658
659 double getMaxIntrinsicHeight(BoxConstraints constraints) { 659 double getMaxIntrinsicHeight(BoxConstraints constraints) {
660 return _sizeForConstraints(constraints).height; 660 return _sizeForConstraints(constraints).height;
661 } 661 }
662 662
663 void performLayout() { 663 void performLayout() {
664 size = _sizeForConstraints(constraints); 664 size = _sizeForConstraints(constraints);
665 } 665 }
666 666
667 void paint(RenderObjectDisplayList canvas) { 667 void paint(sky.Canvas canvas) {
668 if (_image == null) return; 668 if (_image == null) return;
669 bool needsScale = size.width != _image.width || size.height != _image.height ; 669 bool needsScale = size.width != _image.width || size.height != _image.height ;
670 if (needsScale) { 670 if (needsScale) {
671 double widthScale = size.width / _image.width; 671 double widthScale = size.width / _image.width;
672 double heightScale = size.height / _image.height; 672 double heightScale = size.height / _image.height;
673 canvas.save(); 673 canvas.save();
674 canvas.scale(widthScale, heightScale); 674 canvas.scale(widthScale, heightScale);
675 } 675 }
676 Paint paint = new Paint(); 676 Paint paint = new Paint();
677 canvas.drawImage(_image, 0.0, 0.0, paint); 677 canvas.drawImage(_image, 0.0, 0.0, paint);
(...skipping 14 matching lines...) Expand all
692 BoxPainter _painter; 692 BoxPainter _painter;
693 BoxDecoration get decoration => _painter.decoration; 693 BoxDecoration get decoration => _painter.decoration;
694 void set decoration (BoxDecoration value) { 694 void set decoration (BoxDecoration value) {
695 assert(value != null); 695 assert(value != null);
696 if (value == _painter.decoration) 696 if (value == _painter.decoration)
697 return; 697 return;
698 _painter.decoration = value; 698 _painter.decoration = value;
699 markNeedsPaint(); 699 markNeedsPaint();
700 } 700 }
701 701
702 void paint(RenderObjectDisplayList canvas) { 702 void paint(sky.Canvas canvas) {
703 assert(size.width != null); 703 assert(size.width != null);
704 assert(size.height != null); 704 assert(size.height != null);
705 _painter.paint(canvas, new Rect.fromSize(size)); 705 _painter.paint(canvas, new Rect.fromSize(size));
706 super.paint(canvas); 706 super.paint(canvas);
707 } 707 }
708 708
709 String debugDescribeSettings(String prefix) => '${super.debugDescribeSettings( prefix)}${prefix}decoration:\n${_painter.decoration.toString(prefix + " ")}\n'; 709 String debugDescribeSettings(String prefix) => '${super.debugDescribeSettings( prefix)}${prefix}decoration:\n${_painter.decoration.toString(prefix + " ")}\n';
710 } 710 }
711 711
712 class RenderTransform extends RenderProxyBox { 712 class RenderTransform extends RenderProxyBox {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 Matrix4 inverse = new Matrix4.zero(); 762 Matrix4 inverse = new Matrix4.zero();
763 double det = inverse.copyInverse(_transform); 763 double det = inverse.copyInverse(_transform);
764 // TODO(abarth): Check the determinant for degeneracy. 764 // TODO(abarth): Check the determinant for degeneracy.
765 765
766 Vector3 position3 = new Vector3(position.x, position.y, 0.0); 766 Vector3 position3 = new Vector3(position.x, position.y, 0.0);
767 Vector3 transformed3 = inverse.transform3(position3); 767 Vector3 transformed3 = inverse.transform3(position3);
768 Point transformed = new Point(transformed3.x, transformed3.y); 768 Point transformed = new Point(transformed3.x, transformed3.y);
769 super.hitTestChildren(result, position: transformed); 769 super.hitTestChildren(result, position: transformed);
770 } 770 }
771 771
772 void paint(RenderObjectDisplayList canvas) { 772 void paint(sky.Canvas canvas) {
773 canvas.save(); 773 canvas.save();
774 canvas.concat(_transform.storage); 774 canvas.concat(_transform.storage);
775 super.paint(canvas); 775 super.paint(canvas);
776 canvas.restore(); 776 canvas.restore();
777 } 777 }
778 778
779 String debugDescribeSettings(String prefix) { 779 String debugDescribeSettings(String prefix) {
780 List<String> result = _transform.toString().split('\n').map((s) => '$prefix $s\n').toList(); 780 List<String> result = _transform.toString().split('\n').map((s) => '$prefix $s\n').toList();
781 result.removeLast(); 781 result.removeLast();
782 return '${super.debugDescribeSettings(prefix)}${prefix}transform matrix:\n${ result.join()}'; 782 return '${super.debugDescribeSettings(prefix)}${prefix}transform matrix:\n${ result.join()}';
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
824 return; 824 return;
825 _callback = value; 825 _callback = value;
826 markNeedsPaint(); 826 markNeedsPaint();
827 } 827 }
828 828
829 void attach() { 829 void attach() {
830 assert(_callback != null); 830 assert(_callback != null);
831 super.attach(); 831 super.attach();
832 } 832 }
833 833
834 void paint(RenderObjectDisplayList canvas) { 834 void paint(sky.Canvas canvas) {
835 assert(_callback != null); 835 assert(_callback != null);
836 _callback(canvas, size); 836 _callback(canvas, size);
837 super.paint(canvas); 837 super.paint(canvas);
838 } 838 }
839 } 839 }
840 840
841 // RENDER VIEW LAYOUT MANAGER 841 // RENDER VIEW LAYOUT MANAGER
842 842
843 class ViewConstraints { 843 class ViewConstraints {
844 844
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
902 bool hitTest(HitTestResult result, { Point position }) { 902 bool hitTest(HitTestResult result, { Point position }) {
903 if (child != null) { 903 if (child != null) {
904 Rect childBounds = new Rect.fromSize(child.size); 904 Rect childBounds = new Rect.fromSize(child.size);
905 if (childBounds.contains(position)) 905 if (childBounds.contains(position))
906 child.hitTest(result, position: position); 906 child.hitTest(result, position: position);
907 } 907 }
908 result.add(new HitTestEntry(this)); 908 result.add(new HitTestEntry(this));
909 return true; 909 return true;
910 } 910 }
911 911
912 void paint(RenderObjectDisplayList canvas) { 912 void paint(sky.Canvas canvas) {
913 if (child != null) 913 if (child != null)
914 canvas.paintChild(child, Point.origin); 914 paintChild(canvas, child, Point.origin);
915 } 915 }
916 916
917 void paintFrame() { 917 void paintFrame() {
918 RenderObject.debugDoingPaint = true; 918 RenderObject.debugDoingPaint = true;
919 RenderObjectDisplayList canvas = new RenderObjectDisplayList(sky.view.width, sky.view.height); 919 sky.PictureRecorder recorder = new sky.PictureRecorder();
920 sky.Canvas canvas = recorder.beginRecording(sky.view.width, sky.view.height) ;
920 paint(canvas); 921 paint(canvas);
921 sky.view.picture = canvas.endRecording(); 922 sky.view.picture = recorder.endRecording();
922 RenderObject.debugDoingPaint = false; 923 RenderObject.debugDoingPaint = false;
923 } 924 }
924 925
925 } 926 }
926 927
927 // DEFAULT BEHAVIORS FOR RENDERBOX CONTAINERS 928 // DEFAULT BEHAVIORS FOR RENDERBOX CONTAINERS
928 abstract class RenderBoxContainerDefaultsMixin<ChildType extends RenderBox, Pare ntDataType extends ContainerParentDataMixin<ChildType>> implements ContainerRend erObjectMixin<ChildType, ParentDataType> { 929 abstract class RenderBoxContainerDefaultsMixin<ChildType extends RenderBox, Pare ntDataType extends ContainerParentDataMixin<ChildType>> implements ContainerRend erObjectMixin<ChildType, ParentDataType> {
929 930
930 void defaultHitTestChildren(HitTestResult result, { Point position }) { 931 void defaultHitTestChildren(HitTestResult result, { Point position }) {
931 // the x, y parameters have the top left of the node's box as the origin 932 // the x, y parameters have the top left of the node's box as the origin
932 ChildType child = lastChild; 933 ChildType child = lastChild;
933 while (child != null) { 934 while (child != null) {
934 assert(child.parentData is ParentDataType); 935 assert(child.parentData is ParentDataType);
935 Rect childBounds = new Rect.fromPointAndSize(child.parentData.position, ch ild.size); 936 Rect childBounds = new Rect.fromPointAndSize(child.parentData.position, ch ild.size);
936 if (childBounds.contains(position)) { 937 if (childBounds.contains(position)) {
937 if (child.hitTest(result, position: new Point(position.x - child.parentD ata.position.x, 938 if (child.hitTest(result, position: new Point(position.x - child.parentD ata.position.x,
938 position.y - child.par entData.position.y))) 939 position.y - child.par entData.position.y)))
939 break; 940 break;
940 } 941 }
941 child = child.parentData.previousSibling; 942 child = child.parentData.previousSibling;
942 } 943 }
943 } 944 }
944 945
945 void defaultPaint(RenderObjectDisplayList canvas) { 946 void defaultPaint(sky.Canvas canvas) {
946 RenderBox child = firstChild; 947 RenderBox child = firstChild;
947 while (child != null) { 948 while (child != null) {
948 assert(child.parentData is ParentDataType); 949 assert(child.parentData is ParentDataType);
949 canvas.paintChild(child, child.parentData.position); 950 paintChild(canvas, child, child.parentData.position);
950 child = child.parentData.nextSibling; 951 child = child.parentData.nextSibling;
951 } 952 }
952 } 953 }
953 } 954 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698