Index: Source/core/rendering/shapes/RectangleShape.cpp |
diff --git a/Source/core/rendering/shapes/RectangleShape.cpp b/Source/core/rendering/shapes/RectangleShape.cpp |
index 329cebf76bb2f4fd26cef2abbb8acb3e909d6d21..5cf74cbc474302078607f1746082b3c063fafec1 100644 |
--- a/Source/core/rendering/shapes/RectangleShape.cpp |
+++ b/Source/core/rendering/shapes/RectangleShape.cpp |
@@ -40,26 +40,6 @@ static inline float ellipseXIntercept(float y, float rx, float ry) |
return rx * sqrt(1 - (y * y) / (ry * ry)); |
} |
-static inline float ellipseYIntercept(float x, float rx, float ry) |
-{ |
- ASSERT(rx > 0); |
- return ry * sqrt(1 - (x * x) / (rx * rx)); |
-} |
- |
-FloatRect RectangleShape::shapePaddingBounds() const |
-{ |
- ASSERT(shapePadding() >= 0); |
- if (!shapePadding() || isEmpty()) |
- return m_bounds; |
- |
- float boundsX = x() + std::min(width() / 2, shapePadding()); |
- float boundsY = y() + std::min(height() / 2, shapePadding()); |
- float boundsWidth = std::max(0.0f, width() - shapePadding() * 2); |
- float boundsHeight = std::max(0.0f, height() - shapePadding() * 2); |
- |
- return FloatRect(boundsX, boundsY, boundsWidth, boundsHeight); |
-} |
- |
FloatRect RectangleShape::shapeMarginBounds() const |
{ |
ASSERT(shapeMargin() >= 0); |
@@ -108,113 +88,4 @@ void RectangleShape::getExcludedIntervals(LayoutUnit logicalTop, LayoutUnit logi |
result.append(LineSegment(x1, x2)); |
} |
-void RectangleShape::getIncludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList& result) const |
-{ |
- const FloatRect& bounds = shapePaddingBounds(); |
- if (bounds.isEmpty()) |
- return; |
- |
- float y1 = logicalTop.toFloat(); |
- float y2 = (logicalTop + logicalHeight).toFloat(); |
- |
- if (y1 < bounds.y() || y2 > bounds.maxY()) |
- return; |
- |
- float x1 = bounds.x(); |
- float x2 = bounds.maxX(); |
- |
- float paddingRadiusX = std::max(0.0f, rx() - shapePadding()); |
- float paddingRadiusY = std::max(0.0f, ry() - shapePadding()); |
- |
- if (paddingRadiusX > 0) { |
- bool y1InterceptsCorner = y1 < bounds.y() + paddingRadiusY; |
- bool y2InterceptsCorner = y2 > bounds.maxY() - paddingRadiusY; |
- float xi = 0; |
- |
- if (y1InterceptsCorner && y2InterceptsCorner) { |
- if (y1 < bounds.height() + 2 * bounds.y() - y2) { |
- float yi = y1 - bounds.y() - paddingRadiusY; |
- xi = ellipseXIntercept(yi, paddingRadiusX, paddingRadiusY); |
- } else { |
- float yi = y2 - (bounds.maxY() - paddingRadiusY); |
- xi = ellipseXIntercept(yi, paddingRadiusX, paddingRadiusY); |
- } |
- } else if (y1InterceptsCorner) { |
- float yi = y1 - bounds.y() - paddingRadiusY; |
- xi = ellipseXIntercept(yi, paddingRadiusX, paddingRadiusY); |
- } else if (y2InterceptsCorner) { |
- float yi = y2 - (bounds.maxY() - paddingRadiusY); |
- xi = ellipseXIntercept(yi, paddingRadiusX, paddingRadiusY); |
- } |
- |
- if (y1InterceptsCorner || y2InterceptsCorner) { |
- x1 = bounds.x() + paddingRadiusX - xi; |
- x2 = bounds.maxX() - paddingRadiusX + xi; |
- } |
- } |
- |
- result.append(LineSegment(x1, x2)); |
-} |
- |
-static FloatPoint cornerInterceptForWidth(float width, float widthAtIntercept, float rx, float ry) |
-{ |
- float xi = (width - widthAtIntercept) / 2; |
- float yi = ry - ellipseYIntercept(rx - xi, rx, ry); |
- return FloatPoint(xi, yi); |
-} |
- |
-bool RectangleShape::firstIncludedIntervalLogicalTop(LayoutUnit minLogicalIntervalTop, const FloatSize& minLogicalIntervalSize, LayoutUnit& result) const |
-{ |
- float minIntervalTop = minLogicalIntervalTop.toFloat(); |
- float minIntervalHeight = minLogicalIntervalSize.height(); |
- float minIntervalWidth = minLogicalIntervalSize.width(); |
- |
- const FloatRect& bounds = shapePaddingBounds(); |
- if (bounds.isEmpty() || minIntervalWidth > bounds.width()) |
- return false; |
- |
- // FIXME: Shapes should be made to use LayoutUnits to avoid broken constructs like this. |
- float minY = LayoutUnit::fromFloatCeil(std::max(bounds.y(), minIntervalTop)).toFloat(); |
- float maxY = minY + minIntervalHeight; |
- |
- if (maxY > bounds.maxY()) |
- return false; |
- |
- float paddingRadiusX = std::max(0.0f, rx() - shapePadding()); |
- float paddingRadiusY = std::max(0.0f, ry() - shapePadding()); |
- |
- bool intervalOverlapsMinCorner = minY < bounds.y() + paddingRadiusY; |
- bool intervalOverlapsMaxCorner = maxY > bounds.maxY() - paddingRadiusY; |
- |
- if (!intervalOverlapsMinCorner && !intervalOverlapsMaxCorner) { |
- result = minY; |
- return true; |
- } |
- |
- float centerY = bounds.y() + bounds.height() / 2; |
- bool minCornerDefinesX = fabs(centerY - minY) > fabs(centerY - maxY); |
- bool intervalFitsWithinCorners = minIntervalWidth + 2 * paddingRadiusX <= bounds.width(); |
- FloatPoint cornerIntercept = cornerInterceptForWidth(bounds.width(), minIntervalWidth, paddingRadiusX, paddingRadiusY); |
- |
- if (intervalOverlapsMinCorner && (!intervalOverlapsMaxCorner || minCornerDefinesX)) { |
- if (intervalFitsWithinCorners || bounds.y() + cornerIntercept.y() < minY) { |
- result = minY; |
- return true; |
- } |
- if (minIntervalHeight < bounds.height() - (2 * cornerIntercept.y())) { |
- result = LayoutUnit::fromFloatCeil(bounds.y() + cornerIntercept.y()); |
- return true; |
- } |
- } |
- |
- if (intervalOverlapsMaxCorner && (!intervalOverlapsMinCorner || !minCornerDefinesX)) { |
- if (intervalFitsWithinCorners || minY <= bounds.maxY() - cornerIntercept.y() - minIntervalHeight) { |
- result = minY; |
- return true; |
- } |
- } |
- |
- return false; |
-} |
- |
} // namespace WebCore |