Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Unified Diff: sky/sdk/lib/framework/rendering/box.dart

Issue 1180633004: Factor BoxPainter out of RenderDecoratedBox (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sky/sdk/lib/framework/painting/box_painter.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 e1a4545cd9561fbc003ab278db0ea5659b11345b..efbef3d22a0389e8513ed24e912b12e8e30c1590 100644
--- a/sky/sdk/lib/framework/rendering/box.dart
+++ b/sky/sdk/lib/framework/rendering/box.dart
@@ -6,10 +6,12 @@ import 'dart:math' as math;
import 'dart:sky' as sky;
import 'dart:typed_data';
import 'object.dart';
-import '../painting/shadows.dart';
+import '../painting/box_painter.dart';
import 'package:vector_math/vector_math.dart';
import 'package:sky/framework/net/image_cache.dart' as image_cache;
+export '../painting/box_painter.dart';
+
// GENERIC BOX RENDERING
// Anything that has a concept of x, y, width, height is going to derive from this
@@ -686,262 +688,31 @@ class RenderImage extends RenderBox {
String debugDescribeSettings(String prefix) => '${super.debugDescribeSettings(prefix)}${prefix}url: ${src}\n${prefix}dimensions: ${requestedSize}\n';
}
-class BorderSide {
- const BorderSide({
- this.color: const Color(0xFF000000),
- this.width: 1.0
- });
- final Color color;
- final double width;
-
- static const none = const BorderSide(width: 0.0);
-
- int get hashCode {
- int value = 373;
- value = 37 * value * color.hashCode;
- value = 37 * value * width.hashCode;
- return value;
- }
- String toString() => 'BorderSide($color, $width)';
-}
-
-class Border {
- const Border({
- this.top: BorderSide.none,
- this.right: BorderSide.none,
- this.bottom: BorderSide.none,
- this.left: BorderSide.none
- });
-
- const Border.all(BorderSide side) :
- top = side,
- right = side,
- bottom = side,
- left = side;
-
- final BorderSide top;
- final BorderSide right;
- final BorderSide bottom;
- final BorderSide left;
-
- int get hashCode {
- int value = 373;
- value = 37 * value * top.hashCode;
- value = 37 * value * right.hashCode;
- value = 37 * value * bottom.hashCode;
- value = 37 * value * left.hashCode;
- return value;
- }
- 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)';
-}
-
-abstract class Gradient {
- sky.Shader createShader();
-}
-
-class LinearGradient extends Gradient {
- LinearGradient({
- this.endPoints,
- this.colors,
- this.colorStops,
- this.tileMode: sky.TileMode.clamp
- });
-
- String toString() =>
- 'LinearGradient($endPoints, $colors, $colorStops, $tileMode)';
-
- sky.Shader createShader() {
- return new sky.Gradient.Linear(this.endPoints, this.colors, this.colorStops,
- this.tileMode);
- }
-
- final List<Point> endPoints;
- final List<Color> colors;
- final List<double> colorStops;
- final sky.TileMode tileMode;
-}
-
-class RadialGradient extends Gradient {
- RadialGradient({
- this.center,
- this.radius,
- this.colors,
- this.colorStops,
- this.tileMode: sky.TileMode.clamp
- });
-
- String toString() =>
- 'RadialGradient($center, $radius, $colors, $colorStops, $tileMode)';
-
- sky.Shader createShader() {
- return new sky.Gradient.Radial(this.center, this.radius, this.colors,
- this.colorStops, this.tileMode);
- }
-
- final Point center;
- final double radius;
- final List<Color> colors;
- final List<double> colorStops;
- final sky.TileMode tileMode;
-}
-
-// This must be immutable, because we won't notice when it changes
-class BoxDecoration {
- const BoxDecoration({
- this.backgroundColor,
- this.border,
- this.borderRadius,
- this.boxShadow,
- this.gradient
- });
-
- final Color backgroundColor;
- final double borderRadius;
- final Border border;
- final List<BoxShadow> boxShadow;
- final Gradient gradient;
-
- String toString([String prefix = '']) {
- List<String> result = [];
- if (backgroundColor != null)
- result.add('${prefix}backgroundColor: $backgroundColor');
- if (border != null)
- result.add('${prefix}border: $border');
- if (borderRadius != null)
- result.add('${prefix}borderRadius: $borderRadius');
- if (boxShadow != null)
- result.add('${prefix}boxShadow: ${boxShadow.map((shadow) => shadow.toString())}');
- if (gradient != null)
- result.add('${prefix}gradient: $gradient');
- if (result.isEmpty)
- return '${prefix}<no decorations specified>';
- return result.join('\n');
- }
-}
-
class RenderDecoratedBox extends RenderProxyBox {
RenderDecoratedBox({
BoxDecoration decoration,
RenderBox child
- }) : _decoration = decoration, super(child) {
- assert(_decoration != null);
- }
+ }) : _painter = new BoxPainter(decoration), super(child);
- BoxDecoration _decoration;
- BoxDecoration get decoration => _decoration;
+ BoxPainter _painter;
+ BoxDecoration get decoration => _painter.decoration;
void set decoration (BoxDecoration value) {
assert(value != null);
- if (value == _decoration)
+ if (value == _painter.decoration)
return;
- _decoration = value;
- _cachedBackgroundPaint = null;
+ _painter.decoration = value;
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 ShadowDrawLooperBuilder();
- for (BoxShadow boxShadow in _decoration.boxShadow)
- builder.addShadow(boxShadow.offset, boxShadow.color, boxShadow.blur);
- paint.setDrawLooper(builder.build());
- }
-
- if (_decoration.gradient != null)
- paint.setShader(_decoration.gradient.createShader());
-
- _cachedBackgroundPaint = paint;
- }
-
- return _cachedBackgroundPaint;
- }
-
void paint(RenderObjectDisplayList canvas) {
assert(size.width != null);
assert(size.height != null);
-
- if (_decoration.backgroundColor != null || _decoration.boxShadow != null ||
- _decoration.gradient != null) {
- Rect rect = new Rect.fromLTRB(0.0, 0.0, size.width, size.height);
- if (_decoration.borderRadius == null)
- canvas.drawRect(rect, _backgroundPaint);
- else
- canvas.drawRRect(new sky.RRect()..setRectXY(rect, _decoration.borderRadius, _decoration.borderRadius), _backgroundPaint);
- }
-
- if (_decoration.border != null) {
- assert(_decoration.borderRadius == null); // TODO(abarth): Implement borders with border radius.
-
- assert(_decoration.border.top != null);
- assert(_decoration.border.right != null);
- assert(_decoration.border.bottom != null);
- assert(_decoration.border.left != null);
-
- Paint paint = new Paint();
- Path path;
-
- paint.color = _decoration.border.top.color;
- path = new Path();
- path.moveTo(0.0,0.0);
- path.lineTo(_decoration.border.left.width, _decoration.border.top.width);
- path.lineTo(size.width - _decoration.border.right.width, _decoration.border.top.width);
- path.lineTo(size.width, 0.0);
- path.close();
- canvas.drawPath(path, paint);
-
- paint.color = _decoration.border.right.color;
- path = new Path();
- path.moveTo(size.width, 0.0);
- path.lineTo(size.width - _decoration.border.right.width, _decoration.border.top.width);
- path.lineTo(size.width - _decoration.border.right.width, size.height - _decoration.border.bottom.width);
- path.lineTo(size.width, size.height);
- path.close();
- canvas.drawPath(path, paint);
-
- paint.color = _decoration.border.bottom.color;
- path = new Path();
- path.moveTo(size.width, size.height);
- path.lineTo(size.width - _decoration.border.right.width, size.height - _decoration.border.bottom.width);
- path.lineTo(_decoration.border.left.width, size.height - _decoration.border.bottom.width);
- path.lineTo(0.0, size.height);
- path.close();
- canvas.drawPath(path, paint);
-
- paint.color = _decoration.border.left.color;
- path = new Path();
- path.moveTo(0.0, size.height);
- path.lineTo(_decoration.border.left.width, size.height - _decoration.border.bottom.width);
- path.lineTo(_decoration.border.left.width, _decoration.border.top.width);
- path.lineTo(0.0,0.0);
- path.close();
- canvas.drawPath(path, paint);
- }
-
+ _painter.paint(canvas, new Rect.fromSize(size));
super.paint(canvas);
}
- String debugDescribeSettings(String prefix) => '${super.debugDescribeSettings(prefix)}${prefix}decoration:\n${decoration.toString(prefix + " ")}\n';
+ String debugDescribeSettings(String prefix) => '${super.debugDescribeSettings(prefix)}${prefix}decoration:\n${_painter.decoration.toString(prefix + " ")}\n';
}
class RenderTransform extends RenderProxyBox {
« no previous file with comments | « sky/sdk/lib/framework/painting/box_painter.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698