提交 33ec74a4 编写于 作者: A Adam Barth

Merge pull request #617 from abarth/separate_offset_and_size

Separate the notions of offset and size in compositing
...@@ -1751,10 +1751,8 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox> ...@@ -1751,10 +1751,8 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox>
try { try {
final double devicePixelRatio = sky.view.devicePixelRatio; final double devicePixelRatio = sky.view.devicePixelRatio;
Matrix4 transform = new Matrix4.diagonal3Values(devicePixelRatio, devicePixelRatio, 1.0); Matrix4 transform = new Matrix4.diagonal3Values(devicePixelRatio, devicePixelRatio, 1.0);
Rect bounds = Point.origin & size; _rootLayer = new TransformLayer(transform: transform);
Rect scaledBounds = Point.origin & (size * devicePixelRatio); PaintingContext context = new PaintingContext(Offset.zero, size);
_rootLayer = new TransformLayer(bounds: scaledBounds, transform: transform);
PaintingContext context = new PaintingContext(bounds);
_rootLayer.add(context.layer); _rootLayer.add(context.layer);
context.paintChild(child, Point.origin); context.paintChild(child, Point.origin);
context.endRecording(); context.endRecording();
...@@ -1767,7 +1765,7 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox> ...@@ -1767,7 +1765,7 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox>
sky.tracing.begin('RenderView.compositeFrame'); sky.tracing.begin('RenderView.compositeFrame');
try { try {
sky.PictureRecorder recorder = new sky.PictureRecorder(); sky.PictureRecorder recorder = new sky.PictureRecorder();
sky.Canvas canvas = new sky.Canvas(recorder, _rootLayer.bounds); sky.Canvas canvas = new sky.Canvas(recorder, Point.origin & (size * sky.view.devicePixelRatio));
_rootLayer.paint(canvas); _rootLayer.paint(canvas);
sky.view.picture = recorder.endRecording(); sky.view.picture = recorder.endRecording();
} finally { } finally {
......
...@@ -8,9 +8,9 @@ import 'dart:sky' show Point, Offset, Size, Rect, Color, Paint, Path; ...@@ -8,9 +8,9 @@ import 'dart:sky' show Point, Offset, Size, Rect, Color, Paint, Path;
import 'package:vector_math/vector_math.dart'; import 'package:vector_math/vector_math.dart';
abstract class Layer { abstract class Layer {
Layer({ this.bounds }); Layer({ this.offset: Offset.zero });
Rect bounds; Offset offset; // From parent, in parent's coordinate system.
ContainerLayer _parent; ContainerLayer _parent;
ContainerLayer get parent => _parent; ContainerLayer get parent => _parent;
...@@ -30,18 +30,21 @@ abstract class Layer { ...@@ -30,18 +30,21 @@ abstract class Layer {
} }
class PictureLayer extends Layer { class PictureLayer extends Layer {
PictureLayer({ Rect bounds }) PictureLayer({ Offset offset: Offset.zero, this.size })
: super(bounds: bounds); : super(offset: offset);
Size size;
sky.Picture picture; sky.Picture picture;
void paint(sky.Canvas canvas) { void paint(sky.Canvas canvas) {
canvas.translate(offset.dx, offset.dy);
canvas.drawPicture(picture); canvas.drawPicture(picture);
canvas.translate(-offset.dx, -offset.dy);
} }
} }
class ContainerLayer extends Layer { class ContainerLayer extends Layer {
ContainerLayer({ Rect bounds }) : super(bounds: bounds); ContainerLayer({ Offset offset: Offset.zero }) : super(offset: offset);
void paint(sky.Canvas canvas) { void paint(sky.Canvas canvas) {
Layer child = firstChild; Layer child = firstChild;
...@@ -133,12 +136,13 @@ class ContainerLayer extends Layer { ...@@ -133,12 +136,13 @@ class ContainerLayer extends Layer {
} }
class TransformLayer extends ContainerLayer { class TransformLayer extends ContainerLayer {
TransformLayer({ this.transform, Rect bounds }) : super(bounds: bounds); TransformLayer({ Offset offset: Offset.zero, this.transform }) : super(offset: offset);
Matrix4 transform; Matrix4 transform;
void paint(sky.Canvas canvas) { void paint(sky.Canvas canvas) {
canvas.save(); canvas.save();
canvas.translate(offset.dx, offset.dy);
canvas.concat(transform.storage); canvas.concat(transform.storage);
super.paint(canvas); super.paint(canvas);
canvas.restore(); canvas.restore();
...@@ -146,11 +150,14 @@ class TransformLayer extends ContainerLayer { ...@@ -146,11 +150,14 @@ class TransformLayer extends ContainerLayer {
} }
class ClipLayer extends ContainerLayer { class ClipLayer extends ContainerLayer {
ClipLayer({ Rect bounds }) : super(bounds: bounds); ClipLayer({ Offset offset: Offset.zero, this.size }) : super(offset: offset);
Size size;
void paint(sky.Canvas canvas) { void paint(sky.Canvas canvas) {
canvas.save(); canvas.save();
canvas.clipRect(bounds); canvas.translate(offset.dx, offset.dy);
canvas.clipRect(Point.origin & size);
super.paint(canvas); super.paint(canvas);
canvas.restore(); canvas.restore();
} }
...@@ -158,11 +165,13 @@ class ClipLayer extends ContainerLayer { ...@@ -158,11 +165,13 @@ class ClipLayer extends ContainerLayer {
class ColorFilterLayer extends ContainerLayer { class ColorFilterLayer extends ContainerLayer {
ColorFilterLayer({ ColorFilterLayer({
Rect bounds, Offset offset: Offset.zero,
this.size,
this.color, this.color,
this.transferMode this.transferMode
}) : super(bounds: bounds); }) : super(offset: offset);
Size size;
Color color; Color color;
sky.TransferMode transferMode; sky.TransferMode transferMode;
...@@ -171,7 +180,8 @@ class ColorFilterLayer extends ContainerLayer { ...@@ -171,7 +180,8 @@ class ColorFilterLayer extends ContainerLayer {
..color = color ..color = color
..setTransferMode(transferMode); ..setTransferMode(transferMode);
canvas.saveLayer(bounds, paint); canvas.saveLayer(offset & size, paint);
canvas.translate(offset.dx, offset.dy);
super.paint(canvas); super.paint(canvas);
canvas.restore(); canvas.restore();
} }
......
...@@ -40,19 +40,19 @@ class PaintingContext { ...@@ -40,19 +40,19 @@ class PaintingContext {
sky.PictureRecorder _recorder; sky.PictureRecorder _recorder;
PaintingContext(Rect bounds) { PaintingContext(Offset offest, Size size) {
_startRecording(bounds); _startRecording(offest, size);
} }
PaintingContext.forTesting(this.canvas); PaintingContext.forTesting(this.canvas);
void _startRecording(Rect bounds) { void _startRecording(Offset offset, Size size) {
assert(_layer == null); assert(_layer == null);
assert(_recorder == null); assert(_recorder == null);
assert(canvas == null); assert(canvas == null);
_layer = new PictureLayer(bounds: bounds); _layer = new PictureLayer(offset: offset, size: size);
_recorder = new sky.PictureRecorder(); _recorder = new sky.PictureRecorder();
canvas = new PaintingCanvas(_recorder, bounds); canvas = new PaintingCanvas(_recorder, Point.origin & size);
} }
void endRecording() { void endRecording() {
...@@ -70,18 +70,23 @@ class PaintingContext { ...@@ -70,18 +70,23 @@ class PaintingContext {
if (!child.requiresCompositing) if (!child.requiresCompositing)
return child._paintWithContext(this, offset); return child._paintWithContext(this, offset);
_compositChild(child, offset, layer.parent, layer.nextSibling);
}
final Layer originalLayer = layer; void _compositChild(RenderObject child, Offset offset, ContainerLayer parentLayer, Layer nextSibling) {
final PictureLayer originalLayer = _layer;
endRecording(); endRecording();
Rect bounds = child.paintBounds.shift(offset); Rect childBounds = child.paintBounds;
PaintingContext context = new PaintingContext(bounds); Offset childOffset = childBounds.topLeft.toOffset();
originalLayer.parent.add(context.layer, before: originalLayer.nextSibling); PaintingContext context = new PaintingContext(offset + childOffset, childBounds.size);
child._paintWithContext(context, Offset.zero); parentLayer.add(context.layer, before: nextSibling);
context.endRecording(); child._layer = context.layer;
child._paintWithContext(context, -childOffset);
_startRecording(originalLayer.bounds); _startRecording(originalLayer.offset, originalLayer.size);
originalLayer.parent.add(layer, before: context.layer.nextSibling); originalLayer.parent.add(layer, before: context.layer.nextSibling);
context.endRecording();
} }
} }
...@@ -411,7 +416,9 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget { ...@@ -411,7 +416,9 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget {
assert(!_needsLayout); assert(!_needsLayout);
assert(requiresCompositing); assert(requiresCompositing);
assert(_layer != null); assert(_layer != null);
PaintingContext context = new PaintingContext(paintBounds); // TODO(abarth): Using _layer.offset isn't correct if the topLeft of our
// paint bounds has changed since our last repaint.
PaintingContext context = new PaintingContext(_layer.offset, paintBounds.size);
_layer.parent.add(context.layer, before: _layer); _layer.parent.add(context.layer, before: _layer);
_layer.detach(); _layer.detach();
_layer = context._layer; _layer = context._layer;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册