Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / rendering / shapes / RectangleShape.cpp
index 329cebf..eaf5142 100644 (file)
@@ -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,11 @@ void RectangleShape::getExcludedIntervals(LayoutUnit logicalTop, LayoutUnit logi
     result.append(LineSegment(x1, x2));
 }
 
-void RectangleShape::getIncludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList& result) const
+void RectangleShape::buildDisplayPaths(DisplayPaths& paths) 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;
+    paths.shape.addRoundedRect(m_bounds, m_radii);
+    if (shapeMargin())
+        paths.marginShape.addRoundedRect(shapeMarginBounds(), FloatSize(m_radii.width() + shapeMargin(), m_radii.height() + shapeMargin()));
 }
 
 } // namespace WebCore