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 import 'dart:typed_data'; | 7 import 'dart:typed_data'; |
8 import 'object.dart'; | 8 import 'object.dart'; |
9 import '../painting/shadows.dart'; | 9 import '../painting/shadows.dart'; |
10 import 'package:vector_math/vector_math.dart'; | 10 import 'package:vector_math/vector_math.dart'; |
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
549 | 549 |
550 Size _requestedSize; | 550 Size _requestedSize; |
551 Size get requestedSize => _requestedSize; | 551 Size get requestedSize => _requestedSize; |
552 void set requestedSize (Size value) { | 552 void set requestedSize (Size value) { |
553 if (value == _requestedSize) | 553 if (value == _requestedSize) |
554 return; | 554 return; |
555 _requestedSize = value; | 555 _requestedSize = value; |
556 markNeedsLayout(); | 556 markNeedsLayout(); |
557 } | 557 } |
558 | 558 |
559 void performLayout() { | 559 Size _sizeForConstraints(BoxConstraints innerConstraints) { |
560 // If there's no image, we can't size ourselves automatically | 560 // If there's no image, we can't size ourselves automatically |
561 if (_image == null) { | 561 if (_image == null) { |
562 double width = requestedSize.width == null ? 0.0 : requestedSize.width; | 562 double width = requestedSize.width == null ? 0.0 : requestedSize.width; |
563 double height = requestedSize.height == null ? 0.0 : requestedSize.height; | 563 double height = requestedSize.height == null ? 0.0 : requestedSize.height; |
564 size = constraints.constrain(new Size(width, height)); | 564 return constraints.constrain(new Size(width, height)); |
565 return; | |
566 } | 565 } |
567 | 566 |
568 // If neither height nor width are specified, use inherent image dimensions | 567 // If neither height nor width are specified, use inherent image dimensions |
569 // If only one dimension is specified, adjust the other dimension to | 568 // If only one dimension is specified, adjust the other dimension to |
570 // maintain the aspect ratio | 569 // maintain the aspect ratio |
571 if (requestedSize.width == null) { | 570 if (requestedSize.width == null) { |
572 if (requestedSize.height == null) { | 571 if (requestedSize.height == null) { |
573 size = constraints.constrain(new Size(_image.width.toDouble(), _image.he
ight.toDouble())); | 572 return constraints.constrain(new Size(_image.width.toDouble(), _image.he
ight.toDouble())); |
574 } else { | 573 } else { |
575 double width = requestedSize.height * _image.width / _image.height; | 574 double width = requestedSize.height * _image.width / _image.height; |
576 size = constraints.constrain(new Size(width, requestedSize.height)); | 575 return constraints.constrain(new Size(width, requestedSize.height)); |
577 } | 576 } |
578 } else if (requestedSize.height == null) { | 577 } else if (requestedSize.height == null) { |
579 double height = requestedSize.width * _image.height / _image.width; | 578 double height = requestedSize.width * _image.height / _image.width; |
580 size = constraints.constrain(new Size(requestedSize.width, height)); | 579 return constraints.constrain(new Size(requestedSize.width, height)); |
581 } else { | 580 } else { |
582 size = constraints.constrain(requestedSize); | 581 return constraints.constrain(requestedSize); |
583 } | 582 } |
584 } | 583 } |
585 | 584 |
| 585 double getMinIntrinsicWidth(BoxConstraints constraints) { |
| 586 if (requestedSize.width == null && requestedSize.height == null) |
| 587 return constraints.constrainWidth(0.0); |
| 588 return _sizeForConstraints(constraints).width; |
| 589 } |
| 590 |
| 591 double getMaxIntrinsicWidth(BoxConstraints constraints) { |
| 592 return _sizeForConstraints(constraints).width; |
| 593 } |
| 594 |
| 595 double getMinIntrinsicHeight(BoxConstraints constraints) { |
| 596 if (requestedSize.width == null && requestedSize.height == null) |
| 597 return constraints.constrainHeight(0.0); |
| 598 return _sizeForConstraints(constraints).height; |
| 599 } |
| 600 |
| 601 double getMaxIntrinsicHeight(BoxConstraints constraints) { |
| 602 return _sizeForConstraints(constraints).height; |
| 603 } |
| 604 |
| 605 void performLayout() { |
| 606 size = _sizeForConstraints(constraints); |
| 607 } |
| 608 |
586 void paint(RenderObjectDisplayList canvas) { | 609 void paint(RenderObjectDisplayList canvas) { |
587 if (_image == null) return; | 610 if (_image == null) return; |
588 bool needsScale = size.width != _image.width || size.height != _image.height
; | 611 bool needsScale = size.width != _image.width || size.height != _image.height
; |
589 if (needsScale) { | 612 if (needsScale) { |
590 double widthScale = size.width / _image.width; | 613 double widthScale = size.width / _image.width; |
591 double heightScale = size.height / _image.height; | 614 double heightScale = size.height / _image.height; |
592 canvas.save(); | 615 canvas.save(); |
593 canvas.scale(widthScale, heightScale); | 616 canvas.scale(widthScale, heightScale); |
594 } | 617 } |
595 Paint paint = new Paint(); | 618 Paint paint = new Paint(); |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 } | 813 } |
791 | 814 |
792 return _cachedBackgroundPaint; | 815 return _cachedBackgroundPaint; |
793 } | 816 } |
794 | 817 |
795 void paint(RenderObjectDisplayList canvas) { | 818 void paint(RenderObjectDisplayList canvas) { |
796 assert(size.width != null); | 819 assert(size.width != null); |
797 assert(size.height != null); | 820 assert(size.height != null); |
798 | 821 |
799 if (_decoration.backgroundColor != null || _decoration.boxShadow != null || | 822 if (_decoration.backgroundColor != null || _decoration.boxShadow != null || |
800 _deocration.gradient != null) { | 823 _decoration.gradient != null) { |
801 Rect rect = new Rect.fromLTRB(0.0, 0.0, size.width, size.height); | 824 Rect rect = new Rect.fromLTRB(0.0, 0.0, size.width, size.height); |
802 if (_decoration.borderRadius == null) | 825 if (_decoration.borderRadius == null) |
803 canvas.drawRect(rect, _backgroundPaint); | 826 canvas.drawRect(rect, _backgroundPaint); |
804 else | 827 else |
805 canvas.drawRRect(new sky.RRect()..setRectXY(rect, _decoration.borderRadi
us, _decoration.borderRadius), _backgroundPaint); | 828 canvas.drawRRect(new sky.RRect()..setRectXY(rect, _decoration.borderRadi
us, _decoration.borderRadius), _backgroundPaint); |
806 } | 829 } |
807 | 830 |
808 if (_decoration.border != null) { | 831 if (_decoration.border != null) { |
809 assert(_decoration.borderRadius == null); // TODO(abarth): Implement borde
rs with border radius. | 832 assert(_decoration.borderRadius == null); // TODO(abarth): Implement borde
rs with border radius. |
810 | 833 |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1089 | 1112 |
1090 void defaultPaint(RenderObjectDisplayList canvas) { | 1113 void defaultPaint(RenderObjectDisplayList canvas) { |
1091 RenderBox child = firstChild; | 1114 RenderBox child = firstChild; |
1092 while (child != null) { | 1115 while (child != null) { |
1093 assert(child.parentData is ParentDataType); | 1116 assert(child.parentData is ParentDataType); |
1094 canvas.paintChild(child, child.parentData.position); | 1117 canvas.paintChild(child, child.parentData.position); |
1095 child = child.parentData.nextSibling; | 1118 child = child.parentData.nextSibling; |
1096 } | 1119 } |
1097 } | 1120 } |
1098 } | 1121 } |
OLD | NEW |