Chromium Code Reviews| 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 'node.dart'; | 8 import 'node.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 | 11 |
| 11 // GENERIC BOX RENDERING | 12 // GENERIC BOX RENDERING |
| 12 // Anything that has a concept of x, y, width, height is going to derive from th is | 13 // Anything that has a concept of x, y, width, height is going to derive from th is |
| 13 | 14 |
| 14 class EdgeDims { | 15 class EdgeDims { |
| 15 // used for e.g. padding | 16 // used for e.g. padding |
| 16 const EdgeDims(this.top, this.right, this.bottom, this.left); | 17 const EdgeDims(this.top, this.right, this.bottom, this.left); |
| 17 const EdgeDims.all(double value) | 18 const EdgeDims.all(double value) |
| 18 : top = value, right = value, bottom = value, left = value; | 19 : top = value, right = value, bottom = value, left = value; |
| 19 | 20 |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 248 sky.Rect childBounds = new sky.Rect.fromPointAndSize(child.parentData.posi tion, child.size); | 249 sky.Rect childBounds = new sky.Rect.fromPointAndSize(child.parentData.posi tion, child.size); |
| 249 if (childBounds.contains(position)) { | 250 if (childBounds.contains(position)) { |
| 250 child.hitTest(result, position: new sky.Point(position.x - child.parentD ata.position.x, | 251 child.hitTest(result, position: new sky.Point(position.x - child.parentD ata.position.x, |
| 251 position.y - child.parentD ata.position.y)); | 252 position.y - child.parentD ata.position.y)); |
| 252 } | 253 } |
| 253 } | 254 } |
| 254 } | 255 } |
| 255 | 256 |
| 256 } | 257 } |
| 257 | 258 |
| 259 class RenderImage extends RenderBox { | |
| 260 | |
| 261 RenderImage(String url, sky.Size dimensions) { | |
| 262 requestedSize = dimensions; | |
| 263 src = url; | |
| 264 } | |
| 265 | |
| 266 sky.Image _image; | |
| 267 String _src; | |
| 268 String get src => _src; | |
| 269 void set src (String value) { | |
| 270 if (value == _src) | |
| 271 return; | |
| 272 _src = value; | |
| 273 image_cache.load(_src, (result) { | |
| 274 _image = result; | |
| 275 if (requestedSize.width == null || requestedSize.height == null) | |
| 276 markNeedsLayout(); | |
| 277 markNeedsPaint(); | |
| 278 }); | |
| 279 } | |
| 280 | |
| 281 sky.Size _requestedSize; | |
| 282 sky.Size get requestedSize => _requestedSize; | |
| 283 void set requestedSize (sky.Size value) { | |
| 284 if (value == _requestedSize) | |
| 285 return; | |
| 286 _requestedSize = value; | |
| 287 markNeedsLayout(); | |
| 288 } | |
| 289 | |
| 290 void performLayout() { | |
| 291 // If there's no image, we can't size ourselves automatically | |
| 292 if (_image == null) { | |
| 293 size = new sky.Size(requestedSize.width == null ? 0.0 : requestedSize.widt h, | |
| 294 requestedSize.height == null ? 0.0 : requestedSize.hei ght); | |
|
abarth-chromium
2015/06/03 22:10:30
We need to constaint the size using the box constr
| |
| 295 return; | |
| 296 } | |
| 297 | |
| 298 // If neither height nor width are specified, use inherent image dimensions | |
| 299 // If only one dimension is specified, adjust the other dimension to | |
| 300 // maintain the aspect ratio | |
| 301 if (requestedSize.width == null) { | |
| 302 if (requestedSize.height == null) { | |
| 303 size = constraints.constrain(new sky.Size(_image.width, _image.height)); | |
| 304 } else { | |
| 305 double width = requestedSize.height * _image.width / _image.height; | |
| 306 size = constraints.constrain(new sky.Size(width, requestedSize.height)); | |
| 307 } | |
| 308 } else if (requestedSize.height == null) { | |
| 309 double height = requestedSize.width * _image.height / _image.width; | |
| 310 size = constraints.constrain(new sky.Size(requestedSize.width, height)); | |
| 311 } else { | |
| 312 size = constraints.constrain(requestedSize); | |
| 313 } | |
| 314 } | |
| 315 | |
| 316 void paint(RenderNodeDisplayList canvas) { | |
| 317 if (_image == null) return; | |
| 318 bool needsScale = size.width != _image.width || size.height != _image.height ; | |
| 319 if (needsScale) { | |
| 320 double widthScale = size.width / _image.width; | |
| 321 double heightScale = size.height / _image.height; | |
| 322 canvas.save(); | |
| 323 canvas.scale(widthScale, heightScale); | |
| 324 } | |
| 325 sky.Paint paint = new sky.Paint(); | |
| 326 canvas.drawImage(_image, 0.0, 0.0, paint); | |
| 327 if (needsScale) | |
| 328 canvas.restore(); | |
| 329 } | |
| 330 } | |
| 331 | |
| 258 // This must be immutable, because we won't notice when it changes | 332 // This must be immutable, because we won't notice when it changes |
| 259 class BoxDecoration { | 333 class BoxDecoration { |
| 260 const BoxDecoration({this.backgroundColor}); | 334 const BoxDecoration({this.backgroundColor}); |
| 261 | 335 |
| 262 final sky.Color backgroundColor; | 336 final sky.Color backgroundColor; |
| 263 } | 337 } |
| 264 | 338 |
| 265 class RenderDecoratedBox extends RenderProxyBox { | 339 class RenderDecoratedBox extends RenderProxyBox { |
| 266 | 340 |
| 267 RenderDecoratedBox({ | 341 RenderDecoratedBox({ |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 463 | 537 |
| 464 void defaultPaint(RenderNodeDisplayList canvas) { | 538 void defaultPaint(RenderNodeDisplayList canvas) { |
| 465 RenderBox child = firstChild; | 539 RenderBox child = firstChild; |
| 466 while (child != null) { | 540 while (child != null) { |
| 467 assert(child.parentData is ParentDataType); | 541 assert(child.parentData is ParentDataType); |
| 468 canvas.paintChild(child, child.parentData.position); | 542 canvas.paintChild(child, child.parentData.position); |
| 469 child = child.parentData.nextSibling; | 543 child = child.parentData.nextSibling; |
| 470 } | 544 } |
| 471 } | 545 } |
| 472 } | 546 } |
| OLD | NEW |