Commit 92ef38fd authored by Adam Barth's avatar Adam Barth

Merge pull request #946 from abarth/infinite_border_radius

BoxDecoration's borderRadius should be able to handle a value of double.INFINITY
parents bef55951 650c4a64
......@@ -474,6 +474,14 @@ class BoxPainter {
return hasUniformWidth;
}
double _getEffectiveBorderRadius(Rect rect) {
double shortestSide = rect.shortestSide;
// In principle, we should use shortestSide / 2.0, but we don't want to
// run into floating point rounding errors. Instead, we just use
// shortestSide and let sky.Canvas do any remaning clamping.
return _decoration.borderRadius > shortestSide ? shortestSide : _decoration.borderRadius;
}
void _paintBackgroundColor(sky.Canvas canvas, Rect rect) {
if (_decoration.backgroundColor != null ||
_decoration.boxShadow != null ||
......@@ -486,10 +494,12 @@ class BoxPainter {
canvas.drawCircle(center, radius, _backgroundPaint);
break;
case Shape.rectangle:
if (_decoration.borderRadius == null)
if (_decoration.borderRadius == null) {
canvas.drawRect(rect, _backgroundPaint);
else
canvas.drawRRect(new sky.RRect()..setRectXY(rect, _decoration.borderRadius, _decoration.borderRadius), _backgroundPaint);
} else {
double radius = _getEffectiveBorderRadius(rect);
canvas.drawRRect(new sky.RRect()..setRectXY(rect, radius, radius), _backgroundPaint);
}
break;
}
}
......@@ -580,7 +590,7 @@ class BoxPainter {
assert(_decoration.shape == Shape.rectangle);
Color color = _decoration.border.top.color;
double width = _decoration.border.top.width;
double radius = _decoration.borderRadius;
double radius = _getEffectiveBorderRadius(rect);
sky.RRect outer = new sky.RRect()..setRectXY(rect, radius, radius);
sky.RRect inner = new sky.RRect()..setRectXY(rect.deflate(width), radius - width, radius - width);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment