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

Unified Diff: sky/sdk/lib/framework/rendering/image.dart

Issue 1160013004: Implement RenderImage and Image for Sky (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: CR feedback from Eric Created 5 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: sky/sdk/lib/framework/rendering/image.dart
diff --git a/sky/sdk/lib/framework/rendering/image.dart b/sky/sdk/lib/framework/rendering/image.dart
new file mode 100644
index 0000000000000000000000000000000000000000..5e5e9f6ce272f8be68e5133b238a82c0847c657a
--- /dev/null
+++ b/sky/sdk/lib/framework/rendering/image.dart
@@ -0,0 +1,77 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:sky' as sky;
+import 'package:sky/framework/net/image_cache.dart' as image_cache;
+import 'render_node.dart';
+import 'render_box.dart';
+
+class RenderImage extends RenderBox {
abarth-chromium 2015/06/03 00:16:31 We probably should just put the class in box.dart.
jackson 2015/06/03 17:41:43 Done.
+
+ RenderImage(String src, num width, num height) {
+ configure(src, width, height);
+ }
+
+ sky.Image _image;
+ sky.Size requestedSize;
+ final sky.Paint _paint = new sky.Paint();
+
+ void configure(String src, num width, num height) {
+ sky.Size newSize = new sky.Size(width, height);
+ if (requestedSize != newSize) {
+ requestedSize = newSize;
+ markNeedsLayout();
+ markNeedsPaint();
+ }
+ image_cache.load(src, (result) {
+ if (_image != result) {
+ _image = result;
+ _updateSizeFromImage();
+ markNeedsLayout();
+ markNeedsPaint();
+ }
+ });
+ }
+
+ void _updateSizeFromImage() {
+ // If both height and width are specified, we don't care about image dimensions
+ if (requestedSize.width != null && requestedSize.height != null)
+ size = constraints.constrain(requestedSize);
+
+ // If there's no image, we can't size ourselves
+ if (_image == null)
+ 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 {
+ num width = requestedSize.height * _image.width / _image.height;
+ size = constraints.constrain(new sky.Size(width, requestedSize.height));
+ }
+ } else if (requestedSize.height == null) {
+ num height = requestedSize.width * _image.height / _image.width;
+ size = constraints.constrain(new sky.Size(requestedSize.width, height));
+ } else {
+ size = constraints.constrain(requestedSize);
+ }
+ }
+
+ void performLayout() {
+ _updateSizeFromImage();
+ }
+
+ void paint(RenderNodeDisplayList canvas) {
+ if (_image == null) return;
+ double widthScale = size.width / _image.width;
+ double heightScale = size.height / _image.height;
+ canvas.save();
+ canvas.scale(widthScale, heightScale);
+ canvas.drawImage(_image, 0.0, 0.0, _paint);
+ canvas.restore();
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698