diff --git a/engine/core/painting/DrawLooperLayerInfo.idl b/engine/core/painting/DrawLooperLayerInfo.idl index 8cb47152ab9..75614b61b2d 100644 --- a/engine/core/painting/DrawLooperLayerInfo.idl +++ b/engine/core/painting/DrawLooperLayerInfo.idl @@ -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); }; diff --git a/examples/raw/shadowed_box.dart b/examples/raw/shadowed_box.dart new file mode 100644 index 00000000000..ee03459fcfc --- /dev/null +++ b/examples/raw/shadowed_box.dart @@ -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); +} diff --git a/sdk/lib/framework/rendering/box.dart b/sdk/lib/framework/rendering/box.dart index f3b279febee..04be3199e43 100644 --- a/sdk/lib/framework/rendering/box.dart +++ b/sdk/lib/framework/rendering/box.dart @@ -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