Chromium Code Reviews| 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 ed9762e19f21a171201b8a21b72c3ec2ec6f6d90..4399cfe0044f765cda9a006530b4230439ce07f4 100644 |
| --- a/sky/sdk/lib/framework/rendering/box.dart |
| +++ b/sky/sdk/lib/framework/rendering/box.dart |
| @@ -7,6 +7,7 @@ import 'dart:sky' as sky; |
| import 'dart:typed_data'; |
| import 'node.dart'; |
| import 'package:vector_math/vector_math.dart'; |
| +import 'package:sky/framework/net/image_cache.dart' as image_cache; |
| // GENERIC BOX RENDERING |
| // Anything that has a concept of x, y, width, height is going to derive from this |
| @@ -255,6 +256,79 @@ class RenderPadding extends RenderBox with RenderNodeWithChildMixin<RenderBox> { |
| } |
| +class RenderImage extends RenderBox { |
| + |
| + RenderImage(String url, sky.Size dimensions) { |
| + requestedSize = dimensions; |
| + src = url; |
| + } |
| + |
| + sky.Image _image; |
| + String _src; |
| + String get src => _src; |
| + void set src (String value) { |
| + if (value == _src) |
| + return; |
| + _src = value; |
| + image_cache.load(_src, (result) { |
| + _image = result; |
| + if (requestedSize.width == null || requestedSize.height == null) |
| + markNeedsLayout(); |
| + markNeedsPaint(); |
| + }); |
| + } |
| + |
| + sky.Size _requestedSize; |
| + sky.Size get requestedSize => _requestedSize; |
| + void set requestedSize (sky.Size value) { |
| + if (value == _requestedSize) |
| + return; |
| + _requestedSize = value; |
| + markNeedsLayout(); |
| + } |
| + |
| + void performLayout() { |
| + // If there's no image, we can't size ourselves automatically |
| + if (_image == null) { |
| + size = new sky.Size(requestedSize.width == null ? 0.0 : requestedSize.width, |
| + requestedSize.height == null ? 0.0 : requestedSize.height); |
|
abarth-chromium
2015/06/03 22:10:30
We need to constaint the size using the box constr
|
| + return; |
| + } |
| + |
| + // If neither height nor width are specified, use inherent image dimensions |
| + // If only one dimension is specified, adjust the other dimension to |
| + // maintain the aspect ratio |
| + if (requestedSize.width == null) { |
| + if (requestedSize.height == null) { |
| + size = constraints.constrain(new sky.Size(_image.width, _image.height)); |
| + } else { |
| + double width = requestedSize.height * _image.width / _image.height; |
| + size = constraints.constrain(new sky.Size(width, requestedSize.height)); |
| + } |
| + } else if (requestedSize.height == null) { |
| + double height = requestedSize.width * _image.height / _image.width; |
| + size = constraints.constrain(new sky.Size(requestedSize.width, height)); |
| + } else { |
| + size = constraints.constrain(requestedSize); |
| + } |
| + } |
| + |
| + void paint(RenderNodeDisplayList canvas) { |
| + if (_image == null) return; |
| + bool needsScale = size.width != _image.width || size.height != _image.height; |
| + if (needsScale) { |
| + double widthScale = size.width / _image.width; |
| + double heightScale = size.height / _image.height; |
| + canvas.save(); |
| + canvas.scale(widthScale, heightScale); |
| + } |
| + sky.Paint paint = new sky.Paint(); |
| + canvas.drawImage(_image, 0.0, 0.0, paint); |
| + if (needsScale) |
| + canvas.restore(); |
| + } |
| +} |
| + |
| // This must be immutable, because we won't notice when it changes |
| class BoxDecoration { |
| const BoxDecoration({this.backgroundColor}); |