Index: sky/sdk/lib/framework/rendering/box.dart |
diff --git a/sky/sdk/lib/framework/rendering/box.dart b/sky/sdk/lib/framework/rendering/box.dart |
index e6810a3355a2e767710c94c8a0aaaccd5dab323a..3b2ac5ab2b32e3caf3a4957d05069442c2aec4e5 100644 |
--- a/sky/sdk/lib/framework/rendering/box.dart |
+++ b/sky/sdk/lib/framework/rendering/box.dart |
@@ -630,15 +630,31 @@ class Border { |
String toString() => 'Border($top, $right, $bottom, $left)'; |
} |
+class BoxShadow { |
+ const BoxShadow({ |
+ this.color, |
+ this.offset, |
+ this.blur |
+ }); |
+ |
+ final Color color; |
+ final Size offset; |
+ final double blur; |
+ |
+ String toString() => 'BoxShadow($color, $offset, $blur)'; |
+} |
+ |
// This must be immutable, because we won't notice when it changes |
class BoxDecoration { |
const BoxDecoration({ |
this.backgroundColor, |
- this.border |
+ this.border, |
+ this.boxShadow |
}); |
final Color backgroundColor; |
final Border border; |
+ final List<BoxShadow> boxShadow; |
String toString([String prefix = '']) { |
List<String> result = []; |
@@ -646,6 +662,8 @@ class BoxDecoration { |
result.add('${prefix}backgroundColor: $backgroundColor'); |
if (border != null) |
result.add('${prefix}border: $border'); |
+ // if (boxShadow != null) |
+ // result.add('${prefix}boxShadow: $boxShadow'); |
if (result.isEmpty) |
return '${prefix}<no decorations specified>'; |
return result.join('\n'); |
@@ -668,17 +686,50 @@ class RenderDecoratedBox extends RenderProxyBox { |
if (value == _decoration) |
return; |
_decoration = value; |
+ _cachedBackgroundPaint = null; |
markNeedsPaint(); |
} |
+ Paint _cachedBackgroundPaint; |
+ Paint get _backgroundPaint { |
+ if (_cachedBackgroundPaint == null) { |
+ Paint paint = new Paint(); |
+ |
+ if (_decoration.backgroundColor != null) |
+ paint.color = _decoration.backgroundColor; |
+ |
+ if (_decoration.boxShadow != null) { |
+ var builder = new sky.LayerDrawLooperBuilder(); |
+ for (BoxShadow boxShadow in _decoration.boxShadow) { |
+ builder.addLayerOnTop( |
+ new sky.DrawLooperLayerInfo() |
+ ..setPaintBits(-1) |
+ ..setOffset(boxShadow.offset.toPoint()) |
+ ..setColorMode(sky.TransferMode.srcMode), |
+ (Paint layerPaint) { |
+ layerPaint.color = boxShadow.color; |
+ layerPaint.setMaskFilter( |
+ new sky.MaskFilter.Blur(sky.BlurStyle.normal, |
+ boxShadow.blur, |
+ highQuality: true)); |
+ }); |
+ } |
+ builder.addLayerOnTop(new sky.DrawLooperLayerInfo(), (_) {}); |
+ paint.setDrawLooper(builder.build()); |
+ } |
+ |
+ _cachedBackgroundPaint = paint; |
+ } |
+ |
+ return _cachedBackgroundPaint; |
+ } |
+ |
void paint(RenderObjectDisplayList canvas) { |
assert(size.width != null); |
assert(size.height != null); |
- if (_decoration.backgroundColor != null) { |
- Paint paint = new Paint()..color = _decoration.backgroundColor; |
- canvas.drawRect(new Rect.fromLTRB(0.0, 0.0, size.width, size.height), paint); |
- } |
+ if (_decoration.backgroundColor != null || _decoration.boxShadow != null) |
+ canvas.drawRect(new Rect.fromLTRB(0.0, 0.0, size.width, size.height), _backgroundPaint); |
if (_decoration.border != null) { |
assert(_decoration.border.top != null); |
@@ -823,63 +874,6 @@ 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 Size offset; |
- final double blur; |
- final 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(); |
- } |
- |
- Paint _createShadowPaint(BoxShadow shadow) { |
- // TODO(eseidel): This should not be hard-coded yellow. |
- Paint paint = new Paint()..color = const 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), |
- (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) { |
- Paint paint = _createShadowPaint(_shadow); |
- canvas.drawRect(new Rect.fromLTRB(0.0, 0.0, size.width, size.height), paint); |
- super.paint(canvas); |
- } |
-} |
- |
typedef void CustomPaintCallback(sky.Canvas canvas); |
class RenderCustomPaint extends RenderProxyBox { |