From 077e75e87b574e08608e5fd2e79983c4459783e3 Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Thu, 20 Aug 2015 10:53:24 -0700 Subject: [PATCH] Remove RenderView.paintFrame We now use the repaint system to do all the painting. During initialization, we set up a root layer that applies the device pixel ratio. Fixes #706 --- packages/flutter/lib/rendering/layer.dart | 13 ++++++++++++ packages/flutter/lib/rendering/object.dart | 20 ++++++------------- .../flutter/lib/rendering/sky_binding.dart | 2 +- packages/flutter/lib/rendering/view.dart | 18 ++++++----------- 4 files changed, 26 insertions(+), 27 deletions(-) diff --git a/packages/flutter/lib/rendering/layer.dart b/packages/flutter/lib/rendering/layer.dart index 634dd41496..9c6837376f 100644 --- a/packages/flutter/lib/rendering/layer.dart +++ b/packages/flutter/lib/rendering/layer.dart @@ -169,6 +169,19 @@ class ContainerLayer extends Layer { child._parent = null; } + void removeAllChildren() { + Layer child = _firstChild; + while (child != null) { + Layer next = child.nextSibling; + child._previousSibling = null; + child._nextSibling = null; + child._parent = null; + child = next; + } + _firstChild = null; + _lastChild = null; + } + void paint(sky.Canvas canvas) { canvas.translate(offset.dx, offset.dy); paintChildren(canvas); diff --git a/packages/flutter/lib/rendering/object.dart b/packages/flutter/lib/rendering/object.dart index 7cd6e94a13..7b1cc7450e 100644 --- a/packages/flutter/lib/rendering/object.dart +++ b/packages/flutter/lib/rendering/object.dart @@ -51,13 +51,6 @@ class PaintingContext { _startRecording(paintBounds); } - factory PaintingContext.replacingLayer(ContainerLayer oldLayer, Rect paintBounds) { - PaintingContext newContext = new PaintingContext.withOffset(oldLayer.offset, paintBounds); - if (oldLayer.parent != null) - oldLayer.replaceWith(newContext._containerLayer); - return newContext; - } - PaintingContext.forTesting(this._canvas); ContainerLayer _containerLayer; @@ -650,21 +643,20 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget { sky.tracing.end('RenderObject.flushPaint'); } } - void initialPaint(ContainerLayer rootLayer, Size size) { + void scheduleInitialPaint(ContainerLayer rootLayer) { assert(attached); assert(parent is! RenderObject); assert(!_debugDoingPaint); assert(hasLayer); - PaintingContext newContext = new PaintingContext.withLayer(rootLayer, Point.origin & size); - _paintLayer(newContext); + _layer = rootLayer; + assert(_needsPaint); + _nodesNeedingPaint.add(this); } void _repaint() { assert(hasLayer); assert(_layer != null); - PaintingContext newContext = new PaintingContext.replacingLayer(_layer, paintBounds); - _paintLayer(newContext); - } - void _paintLayer(PaintingContext context) { + _layer.removeAllChildren(); + PaintingContext context = new PaintingContext.withLayer(_layer, paintBounds); _layer = context._containerLayer; try { _paintWithContext(context, Offset.zero); diff --git a/packages/flutter/lib/rendering/sky_binding.dart b/packages/flutter/lib/rendering/sky_binding.dart index 2005164347..e950ee6ef5 100644 --- a/packages/flutter/lib/rendering/sky_binding.dart +++ b/packages/flutter/lib/rendering/sky_binding.dart @@ -44,6 +44,7 @@ class SkyBinding { _renderView.attach(); _renderView.rootConstraints = _createConstraints(); _renderView.scheduleInitialLayout(); + _renderView.initializeLayerTree(); } else { _renderView = renderViewOverride; } @@ -74,7 +75,6 @@ class SkyBinding { RenderObject.flushLayout(); _renderView.updateCompositingBits(); RenderObject.flushPaint(); - _renderView.paintFrame(); _renderView.compositeFrame(); } diff --git a/packages/flutter/lib/rendering/view.dart b/packages/flutter/lib/rendering/view.dart index 11987dd44a..7366896b6b 100644 --- a/packages/flutter/lib/rendering/view.dart +++ b/packages/flutter/lib/rendering/view.dart @@ -42,6 +42,12 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin markNeedsLayout(); } + void initializeLayerTree() { + final double devicePixelRatio = sky.view.devicePixelRatio; + Matrix4 logicalToDeviceZoom = new Matrix4.diagonal3Values(devicePixelRatio, devicePixelRatio, 1.0); + scheduleInitialPaint(new TransformLayer(transform: logicalToDeviceZoom)); + } + // We never call layout() on this class, so this should never get // checked. (This class is laid out using scheduleInitialLayout().) bool debugDoesMeetConstraints() { assert(false); return false; } @@ -84,18 +90,6 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin context.paintChild(child, offset.toPoint()); } - void paintFrame() { - sky.tracing.begin('RenderView.paintFrame'); - try { - final double devicePixelRatio = sky.view.devicePixelRatio; - Matrix4 logicalToDeviceZoom = new Matrix4.diagonal3Values(devicePixelRatio, devicePixelRatio, 1.0); - ContainerLayer rootLayer = new TransformLayer(transform: logicalToDeviceZoom); - initialPaint(rootLayer, size); - } finally { - sky.tracing.end('RenderView.paintFrame'); - } - } - void compositeFrame() { sky.tracing.begin('RenderView.compositeFrame'); try {