diff --git a/examples/game/lib/sprite_box.dart b/examples/game/lib/sprite_box.dart index 62532f2dc..a18f3a89d 100644 --- a/examples/game/lib/sprite_box.dart +++ b/examples/game/lib/sprite_box.dart @@ -321,7 +321,8 @@ class SpriteBox extends RenderBox { _rootNode._invalidateToBoxTransformMatrix(); } - void paint(PaintingCanvas canvas, Offset offset) { + void paint(PaintingContext context, Offset offset) { + final PaintingCanvas canvas = context.canvas; canvas.save(); // Move to correct coordinate space before drawing diff --git a/examples/rendering/sector_layout.dart b/examples/rendering/sector_layout.dart index a91914c50..3d6375b61 100644 --- a/examples/rendering/sector_layout.dart +++ b/examples/rendering/sector_layout.dart @@ -129,7 +129,7 @@ abstract class RenderDecoratedSector extends RenderSector { } // offset must point to the center of the circle - void paint(PaintingCanvas canvas, Offset offset) { + void paint(PaintingContext context, Offset offset) { assert(deltaRadius != null); assert(deltaTheta != null); assert(parentData is SectorParentData); @@ -138,6 +138,7 @@ abstract class RenderDecoratedSector extends RenderSector { return; if (_decoration.backgroundColor != null) { + final PaintingCanvas canvas = context.canvas; Paint paint = new Paint()..color = _decoration.backgroundColor; Path path = new Path(); double outerRadius = (parentData.radius + deltaRadius); @@ -266,13 +267,13 @@ class RenderSectorRing extends RenderSectorWithChildren { // offset must point to the center of our circle // each sector then knows how to paint itself at its location - void paint(PaintingCanvas canvas, Offset offset) { + void paint(PaintingContext context, Offset offset) { // TODO(ianh): avoid code duplication - super.paint(canvas, offset); + super.paint(context, offset); RenderSector child = firstChild; while (child != null) { assert(child.parentData is SectorChildListParentData); - canvas.paintChild(child, offset.toPoint()); + context.paintChild(child, offset.toPoint()); child = child.parentData.nextSibling; } } @@ -371,13 +372,13 @@ class RenderSectorSlice extends RenderSectorWithChildren { // offset must point to the center of our circle // each sector then knows how to paint itself at its location - void paint(PaintingCanvas canvas, Offset offset) { + void paint(PaintingContext context, Offset offset) { // TODO(ianh): avoid code duplication - super.paint(canvas, offset); + super.paint(context, offset); RenderSector child = firstChild; while (child != null) { assert(child.parentData is SectorChildListParentData); - canvas.paintChild(child, offset.toPoint()); + context.paintChild(child, offset.toPoint()); child = child.parentData.nextSibling; } } @@ -464,12 +465,12 @@ class RenderBoxToRenderSectorAdapter extends RenderBox { } } - void paint(PaintingCanvas canvas, Offset offset) { - super.paint(canvas, offset); + void paint(PaintingContext context, Offset offset) { + super.paint(context, offset); if (child != null) { Rect bounds = offset & size; // we move the offset to the center of the circle for the RenderSectors - canvas.paintChild(child, bounds.center); + context.paintChild(child, bounds.center); } } diff --git a/examples/rendering/touch_demo.dart b/examples/rendering/touch_demo.dart index ea4d836a7..d94333bb0 100644 --- a/examples/rendering/touch_demo.dart +++ b/examples/rendering/touch_demo.dart @@ -33,8 +33,8 @@ class Dot { radius = 5 + (95 * event.pressure); } - void paint(PaintingCanvas canvas, Offset offset) { - canvas.drawCircle(position + offset, radius, _paint); + void paint(PaintingContext context, Offset offset) { + context.canvas.drawCircle(position + offset, radius, _paint); } } @@ -70,7 +70,8 @@ class RenderTouchDemo extends RenderBox { size = constraints.biggest; } - void paint(PaintingCanvas canvas, Offset offset) { + void paint(PaintingContext context, Offset offset) { + final PaintingCanvas canvas = context.canvas; Paint white = new Paint() ..color = const Color(0xFFFFFFFF); canvas.drawRect(offset & size, white); diff --git a/sky/packages/sky/lib/rendering/auto_layout.dart b/sky/packages/sky/lib/rendering/auto_layout.dart index 194276001..82ea25573 100644 --- a/sky/packages/sky/lib/rendering/auto_layout.dart +++ b/sky/packages/sky/lib/rendering/auto_layout.dart @@ -216,8 +216,8 @@ class RenderAutoLayout extends RenderBox defaultHitTestChildren(result, position: position); } - void paint(PaintingCanvas canvas, Offset offset) { - defaultPaint(canvas, offset); + void paint(PaintingContext context, Offset offset) { + defaultPaint(context, offset); } List _constructImplicitConstraints() { diff --git a/sky/packages/sky/lib/rendering/block.dart b/sky/packages/sky/lib/rendering/block.dart index 1fe9b4e2f..d5f3497e3 100644 --- a/sky/packages/sky/lib/rendering/block.dart +++ b/sky/packages/sky/lib/rendering/block.dart @@ -156,8 +156,8 @@ class RenderBlock extends RenderBlockBase { assert(!size.isInfinite); } - void paint(PaintingCanvas canvas, Offset offset) { - defaultPaint(canvas, offset); + void paint(PaintingContext context, Offset offset) { + defaultPaint(context, offset); } void hitTestChildren(HitTestResult result, { Point position }) { @@ -242,11 +242,11 @@ class RenderBlockViewport extends RenderBlockBase { super.performLayout(); } - void paint(PaintingCanvas canvas, Offset offset) { - canvas.save(); - canvas.clipRect(offset & size); - defaultPaint(canvas, offset.translate(0.0, startOffset)); - canvas.restore(); + void paint(PaintingContext context, Offset offset) { + context.canvas.save(); + context.canvas.clipRect(offset & size); + defaultPaint(context, offset.translate(0.0, startOffset)); + context.canvas.restore(); } void applyPaintTransform(Matrix4 transform) { diff --git a/sky/packages/sky/lib/rendering/box.dart b/sky/packages/sky/lib/rendering/box.dart index c10689274..e7ad244d7 100644 --- a/sky/packages/sky/lib/rendering/box.dart +++ b/sky/packages/sky/lib/rendering/box.dart @@ -491,20 +491,20 @@ abstract class RenderBox extends RenderObject { } Rect get paintBounds => Point.origin & size; - void debugPaint(PaintingCanvas canvas, Offset offset) { + void debugPaint(PaintingContext context, Offset offset) { if (debugPaintSizeEnabled) - debugPaintSize(canvas, offset); + debugPaintSize(context, offset); if (debugPaintBaselinesEnabled) - debugPaintBaselines(canvas, offset); + debugPaintBaselines(context, offset); } - void debugPaintSize(PaintingCanvas canvas, Offset offset) { + void debugPaintSize(PaintingContext context, Offset offset) { Paint paint = new Paint(); paint.setStyle(sky.PaintingStyle.stroke); paint.strokeWidth = 1.0; paint.color = debugPaintSizeColor; - canvas.drawRect(offset & size, paint); + context.canvas.drawRect(offset & size, paint); } - void debugPaintBaselines(PaintingCanvas canvas, Offset offset) { + void debugPaintBaselines(PaintingContext context, Offset offset) { Paint paint = new Paint(); paint.setStyle(sky.PaintingStyle.stroke); paint.strokeWidth = 0.25; @@ -516,7 +516,7 @@ abstract class RenderBox extends RenderObject { path = new Path(); path.moveTo(offset.dx, offset.dy + baselineI); path.lineTo(offset.dx + size.width, offset.dy + baselineI); - canvas.drawPath(path, paint); + context.canvas.drawPath(path, paint); } // alphabetic baseline double baselineA = getDistanceToBaseline(TextBaseline.alphabetic, onlyReal: true); @@ -525,7 +525,7 @@ abstract class RenderBox extends RenderObject { path = new Path(); path.moveTo(offset.dx, offset.dy + baselineA); path.lineTo(offset.dx + size.width, offset.dy + baselineA); - canvas.drawPath(path, paint); + context.canvas.drawPath(path, paint); } } @@ -586,9 +586,9 @@ class RenderProxyBox extends RenderBox with RenderObjectWithChildMixin '${super.debugDescribeSettings(prefix)}${prefix}decoration:\n${_painter.decoration.toString(prefix + " ")}\n'; @@ -1588,12 +1589,12 @@ class RenderTransform extends RenderProxyBox { return super.hitTest(result, position: transformed); } - void paint(PaintingCanvas canvas, Offset offset) { - canvas.save(); - canvas.translate(offset.dx, offset.dy); - canvas.concat(_transform.storage); - super.paint(canvas, Offset.zero); - canvas.restore(); + void paint(PaintingContext context, Offset offset) { + context.canvas.save(); + context.canvas.translate(offset.dx, offset.dy); + context.canvas.concat(_transform.storage); + super.paint(context, Offset.zero); + context.canvas.restore(); } void applyPaintTransform(Matrix4 transform) { @@ -1656,12 +1657,14 @@ class RenderCustomPaint extends RenderProxyBox { super.attach(); } - void paint(PaintingCanvas canvas, Offset offset) { + void paint(PaintingContext context, Offset offset) { assert(_callback != null); - canvas.translate(offset.dx, offset.dy); - _callback(canvas, size); - super.paint(canvas, Offset.zero); - canvas.translate(-offset.dx, -offset.dy); + context.canvas.translate(offset.dx, offset.dy); + _callback(context.canvas, size); + // TODO(abarth): We should translate back before calling super because in + // the future, super.paint might switch our compositing layer. + super.paint(context, Offset.zero); + context.canvas.translate(-offset.dx, -offset.dy); } } @@ -1735,9 +1738,9 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin return true; } - void paint(PaintingCanvas canvas, Offset offset) { + void paint(PaintingContext context, Offset offset) { if (child != null) - canvas.paintChild(child, offset.toPoint()); + context.paintChild(child, offset.toPoint()); } void paintFrame() { @@ -1747,9 +1750,10 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin sky.PictureRecorder recorder = new sky.PictureRecorder(); Rect cullRect = Point.origin & (size * devicePixelRatio); PaintingCanvas canvas = new PaintingCanvas(recorder, cullRect); + PaintingContext context = new PaintingContext(canvas); canvas.drawColor(const Color(0xFF000000), sky.TransferMode.src); canvas.scale(devicePixelRatio, devicePixelRatio); - canvas.paintChild(child, Point.origin); + context.paintChild(child, Point.origin); sky.view.picture = recorder.endRecording(); } finally { sky.tracing.end('RenderView.paintFrame'); @@ -1817,11 +1821,11 @@ abstract class RenderBoxContainerDefaultsMixin 0) { - canvas.save(); - canvas.clipRect(offset & size); - defaultPaint(canvas, offset); - canvas.restore(); + context.canvas.save(); + context.canvas.clipRect(offset & size); + defaultPaint(context, offset); + context.canvas.restore(); } else { - defaultPaint(canvas, offset); + defaultPaint(context, offset); } } - void debugPaintSize(PaintingCanvas canvas, Offset offset) { - super.debugPaintSize(canvas, offset); + void debugPaintSize(PaintingContext context, Offset offset) { + super.debugPaintSize(context, offset); if (_overflow <= 0) return; @@ -479,6 +479,6 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin _descendentsWithPaintingCanvases = new List(); // used by RenderObject._updatePaintingCanvas() to find out which RenderObjects to ask to paint void paintChild(RenderObject child, Point point) { if (child.createNewDisplayList) { assert(!_descendentsWithPaintingCanvases.contains(child)); _descendentsWithPaintingCanvases.add(child); - drawPaintingNode(child._paintingNode, point); + canvas.drawPaintingNode(child._paintingNode, point); } else { - child._paintOnCanvas(this, point.toOffset()); + child._paintWithContext(this, point.toOffset()); } } } @@ -362,10 +368,11 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget { assert(!_needsLayout); assert(createNewDisplayList); sky.PictureRecorder recorder = new sky.PictureRecorder(); - PaintingCanvas canvas = new PaintingCanvas(recorder, paintBounds); + sky.Canvas canvas = new sky.Canvas(recorder, paintBounds); + PaintingContext context = new PaintingContext(canvas); _needsPaint = false; try { - _paintOnCanvas(canvas, Offset.zero); + _paintWithContext(context, Offset.zero); } catch (e) { print('Exception raised during _updatePaintingCanvas:\n${e}\nContext:\n${this}'); if (inDebugBuild) @@ -375,8 +382,8 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget { assert(!_needsLayout); // check that the paint() method didn't mark us dirty again assert(!_needsPaint); // check that the paint() method didn't mark us dirty again _paintingNode.setBackingDrawable(recorder.endRecordingAsDrawable()); - if (canvas._descendentsWithPaintingCanvases != null) { - for (RenderObject node in canvas._descendentsWithPaintingCanvases) { + if (context._descendentsWithPaintingCanvases != null) { + for (RenderObject node in context._descendentsWithPaintingCanvases) { assert(node.attached == attached); if (node._needsPaint) node._updatePaintingCanvas(); @@ -384,7 +391,7 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget { } } - void _paintOnCanvas(PaintingCanvas canvas, Offset offset) { + void _paintWithContext(PaintingContext context, Offset offset) { _needsPaint = false; assert(!_debugDoingThisPaint); RenderObject debugLastActivePaint; @@ -392,17 +399,17 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget { _debugDoingThisPaint = true; debugLastActivePaint = _debugActivePaint; _debugActivePaint = this; - debugPaint(canvas, offset); + debugPaint(context, offset); if (debugPaintBoundsEnabled) { - canvas.save(); - canvas.clipRect(paintBounds.shift(offset)); + context.canvas.save(); + context.canvas.clipRect(paintBounds.shift(offset)); } return true; }); - paint(canvas, offset); + paint(context, offset); assert(() { if (debugPaintBoundsEnabled) - canvas.restore(); + context.canvas.restore(); _debugActivePaint = debugLastActivePaint; _debugDoingThisPaint = false; return true; @@ -412,8 +419,8 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget { bool get createNewDisplayList => false; Rect get paintBounds; - void debugPaint(PaintingCanvas canvas, Offset offset) { } - void paint(PaintingCanvas canvas, Offset offset) { } + void debugPaint(PaintingContext context, Offset offset) { } + void paint(PaintingContext context, Offset offset) { } void applyPaintTransform(Matrix4 transform) { } diff --git a/sky/packages/sky/lib/rendering/paragraph.dart b/sky/packages/sky/lib/rendering/paragraph.dart index ac64d59f6..7b8838bdf 100644 --- a/sky/packages/sky/lib/rendering/paragraph.dart +++ b/sky/packages/sky/lib/rendering/paragraph.dart @@ -181,7 +181,7 @@ class RenderParagraph extends RenderBox { _applyFloatingPointHack(root.height))); } - void paint(PaintingCanvas canvas, Offset offset) { + void paint(PaintingContext context, Offset offset) { // Ideally we could compute the min/max intrinsic width/height with a // non-destructive operation. However, currently, computing these values // will destroy state inside the layout root. If that happens, we need to @@ -192,9 +192,9 @@ class RenderParagraph extends RenderBox { // TODO(ianh): Make LayoutRoot support a paint offset so we don't // need to translate for each span of text. _layout(constraints); - canvas.translate(offset.dx, offset.dy); - _layoutRoot.paint(canvas); - canvas.translate(-offset.dx, -offset.dy); + context.canvas.translate(offset.dx, offset.dy); + _layoutRoot.paint(context.canvas); + context.canvas.translate(-offset.dx, -offset.dy); } // we should probably expose a way to do precise (inter-glpyh) hit testing diff --git a/sky/packages/sky/lib/rendering/stack.dart b/sky/packages/sky/lib/rendering/stack.dart index 8b7a2b7a2..4a01dae17 100644 --- a/sky/packages/sky/lib/rendering/stack.dart +++ b/sky/packages/sky/lib/rendering/stack.dart @@ -201,14 +201,14 @@ class RenderStack extends RenderBox with ContainerRenderObjectMixin sum + width) : size.width; Rect rect = offset & new Size(width, size.height); - canvas.drawRect(rect, new Paint()..color = backgroundColor); + context.canvas.drawRect(rect, new Paint()..color = backgroundColor); } int index = 0; RenderBox child = firstChild; while (child != null) { assert(child.parentData is TabBarParentData); - canvas.paintChild(child, child.parentData.position + offset); + context.paintChild(child, child.parentData.position + offset); if (index++ == selectedIndex) - _paintIndicator(canvas, child, offset); + _paintIndicator(context.canvas, child, offset); child = child.parentData.nextSibling; } } diff --git a/sky/tests/resources/display_list.dart b/sky/tests/resources/display_list.dart index 6bd3e67b4..570d7673a 100644 --- a/sky/tests/resources/display_list.dart +++ b/sky/tests/resources/display_list.dart @@ -113,10 +113,15 @@ class TestPaintingCanvas extends PaintingCanvas { void drawImageRect(sky.Image image, sky.Rect src, sky.Rect dst, Paint paint) { log("drawImageRect($image, $src, $dst, paint)"); } +} + +class TestPaintingContext extends PaintingContext { + TestPaintingContext(TestPaintingCanvas canvas) : super(canvas); void paintChild(RenderObject child, Point position) { - log("paintChild ${child.runtimeType} at $position"); - child.paint(new TestPaintingCanvas(new sky.PictureRecorder(), size, logger, indent: "$indent |"), position.toOffset()); + canvas.log("paintChild ${child.runtimeType} at $position"); + TestPaintingCanvas childCanvas = new TestPaintingCanvas(new sky.PictureRecorder(), canvas.size, canvas.logger, indent: "${canvas.indent} |"); + child.paint(new TestPaintingContext(childCanvas), position.toOffset()); } } @@ -142,9 +147,11 @@ class TestRenderView extends RenderView { frame += 1; lastPaint = ''; log("PAINT FOR FRAME #${frame} ----------------------------------------------"); - var recorder = new sky.PictureRecorder(); - var canvas = new TestPaintingCanvas(recorder, rootConstraints.size, log, indent: "${frame} |"); - paint(canvas, Offset.zero); + sky.PictureRecorder recorder = new sky.PictureRecorder(); + TestPaintingCanvas canvas = new TestPaintingCanvas(recorder, rootConstraints.size, log, indent: "${frame} |"); + TestPaintingContext context = new TestPaintingContext(canvas); + + paint(context, Offset.zero); recorder.endRecording(); log("------------------------------------------------------------------------"); RenderObject.debugDoingPaint = false;