Attempt to write a RenderShadowedBox

The goal of this is to have a Renderer-layer abstraction
around the Sky Engine c++ apis for drawing a shadow.

R=mpcomplete@chromium.org

Review URL: https://codereview.chromium.org/1146893004
This commit is contained in:
Eric Seidel 2015-06-04 14:49:24 -07:00
parent 67d883c506
commit 54d01bc005
3 changed files with 79 additions and 0 deletions

View File

@ -24,6 +24,7 @@
void setPaintBits(unsigned long bits);
void setColorMode(TransferMode mode);
// TODO(eseidel): Offset should be a Size not a Point.
void setOffset(Point offset);
void setPostTranslate(boolean postTranslate);
};

View File

@ -0,0 +1,22 @@
// 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';
import 'package:sky/framework/app.dart';
import 'package:sky/framework/rendering/box.dart';
import 'package:sky/framework/rendering/flex.dart';
AppView app;
void main() {
var coloredBox = new RenderDecoratedBox(
decoration: new BoxDecoration(backgroundColor: const Color(0xFFFFFF00))
);
var shadow = const BoxShadow(
color: const Color(0xFFEEEEEE), offset: const Size(5.0, 5.0), blur: 5.0);
var shadowBox = new RenderShadowedBox(shadow: shadow, child: coloredBox);
var paddedBox = new RenderPadding(padding: const EdgeDims.all(30.0),
child: shadowBox);
app = new AppView(paddedBox);
}

View File

@ -601,6 +601,62 @@ class RenderSizeObserver extends RenderProxyBox {
}
}
// This must be immutable, because we won't notice when it changes
class BoxShadow {
const BoxShadow({
this.color,
this.offset,
this.blur
});
final sky.Size offset;
final double blur;
final sky.Color color;
}
class RenderShadowedBox extends RenderProxyBox {
RenderShadowedBox({
BoxShadow shadow,
RenderBox child
}) : _shadow = shadow, super(child);
BoxShadow _shadow;
BoxShadow get shadow => _shadow;
void set shadow (BoxShadow value) {
if (value == _shadow)
return;
_shadow = value;
markNeedsPaint();
}
sky.Paint _createShadowPaint(BoxShadow shadow) {
// TODO(eseidel): This should not be hard-coded yellow.
sky.Paint paint = new sky.Paint()..color = const sky.Color.fromARGB(255, 0, 255, 0);
var builder = new sky.LayerDrawLooperBuilder()
// Shadow layer.
..addLayerOnTop(
new sky.DrawLooperLayerInfo()
..setPaintBits(-1)
..setOffset(shadow.offset.toPoint())
..setColorMode(sky.TransferMode.srcMode),
(sky.Paint layerPaint) {
layerPaint.color = shadow.color;
layerPaint.setMaskFilter(
new sky.MaskFilter.Blur(sky.BlurStyle.normal, shadow.blur, highQuality: true));
})
// Main layer.
..addLayerOnTop(new sky.DrawLooperLayerInfo(), (_) {});
paint.setDrawLooper(builder.build());
return paint;
}
void paint(RenderObjectDisplayList canvas) {
sky.Paint paint = _createShadowPaint(_shadow);
canvas.drawRect(new sky.Rect.fromLTRB(0.0, 0.0, size.width, size.height), paint);
super.paint(canvas);
}
}
// RENDER VIEW LAYOUT MANAGER