Index: Source/core/rendering/style/BasicShapes.cpp |
diff --git a/Source/core/rendering/style/BasicShapes.cpp b/Source/core/rendering/style/BasicShapes.cpp |
index eb5b94745d049df94283a4dec11da62980fa490b..18293efd9397594ab1fb82c2f47f2cbe49f6cb17 100644 |
--- a/Source/core/rendering/style/BasicShapes.cpp |
+++ b/Source/core/rendering/style/BasicShapes.cpp |
@@ -58,7 +58,16 @@ bool BasicShape::canBlend(const BasicShape* other) const |
return false; |
} |
- return true; |
+ // Ellipses with keywords for radii or center coordinates cannot be animated. |
+ if (type() != BasicShape::BasicShapeEllipseType) |
+ return true; |
+ |
+ const BasicShapeEllipse* thisEllipse = static_cast<const BasicShapeEllipse*>(this); |
+ const BasicShapeEllipse* otherEllipse = static_cast<const BasicShapeEllipse*>(other); |
+ return (thisEllipse->radiusX().canBlend(otherEllipse->radiusX()) |
+ && thisEllipse->radiusY().canBlend(otherEllipse->radiusY()) |
+ && thisEllipse->centerX().canBlend(otherEllipse->centerX()) |
+ && thisEllipse->centerY().canBlend(otherEllipse->centerY())); |
} |
void BasicShapeRectangle::path(Path& path, const FloatRect& boundingBox) |
@@ -227,25 +236,27 @@ bool BasicShapeEllipse::operator==(const BasicShape& o) const |
return m_centerX == other.m_centerX && m_centerY == other.m_centerY && m_radiusX == other.m_radiusX && m_radiusY == other.m_radiusY; |
} |
+float BasicShapeEllipse::floatValueForRadiusInBox(const BasicShapeRadius& radius, float center, float boxWidthOrHeight) const |
+{ |
+ if (radius.type() == BasicShapeRadius::Value) |
+ return floatValueForLength(radius.value(), boxWidthOrHeight); |
+ |
+ if (radius.type() == BasicShapeRadius::ClosestSide) |
+ return std::min(center, boxWidthOrHeight - center); |
+ |
+ ASSERT(radius.type() == BasicShapeRadius::FarthestSide); |
+ return std::max(center, boxWidthOrHeight - center); |
+} |
+ |
void BasicShapeEllipse::path(Path& path, const FloatRect& boundingBox) |
{ |
ASSERT(path.isEmpty()); |
- // FIXME Complete implementation of path. Bug 124619. |
- // Compute closest-side and farthest-side from boundingBox. |
- // Compute top, left, bottom, right from boundingBox. |
- if (m_radiusX.type() != BasicShapeRadius::Value || m_radiusY.type() != BasicShapeRadius::Value) |
- return; |
- if (m_centerX.keyword() != BasicShapeCenterCoordinate::None || m_centerY.keyword() != BasicShapeCenterCoordinate::None) |
- return; |
- |
- float diagonal = hypotf(boundingBox.width(), boundingBox.height()) / sqrtf(2); |
- float centerX = floatValueForLength(m_centerX.length(), boundingBox.width()); |
- float centerY = floatValueForLength(m_centerY.length(), boundingBox.height()); |
- float radiusX = floatValueForLength(m_radiusX.value(), diagonal); |
- float radiusY = floatValueForLength(m_radiusY.value(), diagonal); |
+ FloatPoint center = floatPointForCenterCoordinate(m_centerX, m_centerY, boundingBox.size()); |
+ float radiusX = floatValueForRadiusInBox(m_radiusX, center.x(), boundingBox.width()); |
+ float radiusY = floatValueForRadiusInBox(m_radiusY, center.y(), boundingBox.height()); |
path.addEllipse(FloatRect( |
- centerX - radiusX + boundingBox.x(), |
- centerY - radiusY + boundingBox.y(), |
+ center.x() - radiusX + boundingBox.x(), |
+ center.y() - radiusY + boundingBox.y(), |
radiusX * 2, |
radiusY * 2 |
)); |