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

Unified Diff: Source/core/css/CSSBasicShapes.cpp

Issue 103413006: Implement parsing of the new ellipse shape syntax. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years 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
Index: Source/core/css/CSSBasicShapes.cpp
diff --git a/Source/core/css/CSSBasicShapes.cpp b/Source/core/css/CSSBasicShapes.cpp
index 1104f176ef96fcff14c0862a34fdc729007ed307..468d9041177bf5093759fdac7e8e02c83e9331f5 100644
--- a/Source/core/css/CSSBasicShapes.cpp
+++ b/Source/core/css/CSSBasicShapes.cpp
@@ -107,14 +107,41 @@ bool CSSBasicShapeRectangle::hasVariableReference() const
|| (m_radiusY.get() && m_radiusY->hasVariableReference());
}
-static String buildCircleString(const String& x, const String& y, const String& radius)
+static String buildCircleString(const String& radius, const String& centerX, const String& centerY, const String& box)
{
- return "circle(" + x + ", " + y + ", " + radius + ')';
+ char opening[] = "circle(";
+ char at[] = "at";
+ char separator[] = " ";
+ StringBuilder result;
+ // Compute the required capacity in advance to reduce allocations.
+ result.reserveCapacity((sizeof(opening) - 1) + (3 * (sizeof(separator) - 1)) + 1 + radius.length() + sizeof(at) + centerX.length() + centerY.length());
bemjb 2013/12/07 00:05:32 It looks like you didn't pull the latest patch: I'
+ result.append(opening);
+ if (!radius.isNull())
+ result.append(radius);
+
+ if (!centerX.isNull() || !centerY.isNull()) {
+ if (!radius.isNull())
+ result.append(separator);
+ result.append(at);
+ result.append(separator);
+ result.append(centerX);
+ result.append(separator);
+ result.append(centerY);
+ }
+ result.append(")");
+ if (box.length()) {
+ result.append(separator);
+ result.append(box);
+ }
+ return result.toString();
}
String CSSBasicShapeCircle::cssText() const
{
- return buildCircleString(m_centerX->cssText(), m_centerY->cssText(), m_radius->cssText());
+ return buildCircleString(m_radius ? m_radius->cssText() : String(),
+ m_centerX ? m_centerX->cssText() : String(),
+ m_centerY ? m_centerY->cssText() : String(),
+ m_box ? m_box->cssText() : String());
}
bool CSSBasicShapeCircle::equals(const CSSBasicShape& shape) const
@@ -125,31 +152,103 @@ bool CSSBasicShapeCircle::equals(const CSSBasicShape& shape) const
const CSSBasicShapeCircle& other = static_cast<const CSSBasicShapeCircle&>(shape);
return compareCSSValuePtr(m_centerX, other.m_centerX)
&& compareCSSValuePtr(m_centerY, other.m_centerY)
- && compareCSSValuePtr(m_radius, other.m_radius);
+ && compareCSSValuePtr(m_radius, other.m_radius)
+ && compareCSSValuePtr(m_box, other.m_box);
}
String CSSBasicShapeCircle::serializeResolvingVariables(const HashMap<AtomicString, String>& variables) const
{
- return buildCircleString(m_centerX->serializeResolvingVariables(variables),
+ return buildCircleString(m_radius.get() ? m_radius->serializeResolvingVariables(variables) : String(),
+ m_centerX.get() ? m_centerX->serializeResolvingVariables(variables) : String(),
+ m_centerY.get() ? m_centerY->serializeResolvingVariables(variables) : String(),
+ m_box.get() ? m_box->serializeResolvingVariables(variables) : String());
+}
+
+bool CSSBasicShapeCircle::hasVariableReference() const
+{
+ return (m_centerX && m_centerX->hasVariableReference())
+ || (m_centerY && m_centerY->hasVariableReference())
+ || (m_radius && m_radius->hasVariableReference());
+}
+
+static String buildDeprecatedCircleString(const String& x, const String& y, const String& radius)
+{
+ return "circle(" + x + ", " + y + ", " + radius + ')';
+}
+
+String CSSDeprecatedBasicShapeCircle::cssText() const
+{
+ return buildDeprecatedCircleString(m_centerX->cssText(), m_centerY->cssText(), m_radius->cssText());
+}
+
+bool CSSDeprecatedBasicShapeCircle::equals(const CSSBasicShape& shape) const
+{
+ if (shape.type() != CSSDeprecatedBasicShapeCircleType)
+ return false;
+
+ const CSSDeprecatedBasicShapeCircle& other = static_cast<const CSSDeprecatedBasicShapeCircle&>(shape);
+ return compareCSSValuePtr(m_centerX, other.m_centerX)
+ && compareCSSValuePtr(m_centerY, other.m_centerY)
+ && compareCSSValuePtr(m_radius, other.m_radius);
+}
+
+String CSSDeprecatedBasicShapeCircle::serializeResolvingVariables(const HashMap<AtomicString, String>& variables) const
+{
+ return buildDeprecatedCircleString(m_centerX->serializeResolvingVariables(variables),
m_centerY->serializeResolvingVariables(variables),
m_radius->serializeResolvingVariables(variables));
}
-bool CSSBasicShapeCircle::hasVariableReference() const
+bool CSSDeprecatedBasicShapeCircle::hasVariableReference() const
{
return m_centerX->hasVariableReference()
|| m_centerY->hasVariableReference()
|| m_radius->hasVariableReference();
}
-static String buildEllipseString(const String& x, const String& y, const String& radiusX, const String& radiusY)
+static String buildEllipseString(const String& radiusX, const String& radiusY, const String& centerX, const String& centerY, const String& box)
{
- return "ellipse(" + x + ", " + y + ", " + radiusX + ", " + radiusY + ')';
+ char opening[] = "ellipse(";
+ char at[] = "at";
+ char separator[] = " ";
+ StringBuilder result;
+ result.appendLiteral(opening);
+ bool needsSeparator = false;
+ if (!radiusX.isNull()) {
+ result.append(radiusX);
+ needsSeparator = true;
+ }
+ if (!radiusY.isNull()) {
+ if (needsSeparator)
+ result.appendLiteral(separator);
+ result.append(radiusY);
+ needsSeparator = true;
+ }
+
+ if (!centerX.isNull() || !centerY.isNull()) {
+ if (needsSeparator)
+ result.appendLiteral(separator);
+ result.appendLiteral(at);
+ result.appendLiteral(separator);
+ result.append(centerX);
+ result.appendLiteral(separator);
+ result.append(centerY);
+ }
+ result.append(")");
+ if (box.length()) {
+ result.appendLiteral(separator);
+ result.append(box);
+ }
+ return result.toString();
}
String CSSBasicShapeEllipse::cssText() const
{
- return buildEllipseString(m_centerX->cssText(), m_centerY->cssText(), m_radiusX->cssText(), m_radiusY->cssText());
+ return buildEllipseString(m_radiusX ? m_radiusX->cssText() : String(),
+ m_radiusY ? m_radiusY->cssText() : String(),
+ m_centerX ? m_centerX->cssText() : String(),
+ m_centerY ? m_centerY->cssText() : String(),
+ m_box ? m_box->cssText() : String());
}
bool CSSBasicShapeEllipse::equals(const CSSBasicShape& shape) const
@@ -161,18 +260,58 @@ bool CSSBasicShapeEllipse::equals(const CSSBasicShape& shape) const
return compareCSSValuePtr(m_centerX, other.m_centerX)
&& compareCSSValuePtr(m_centerY, other.m_centerY)
&& compareCSSValuePtr(m_radiusX, other.m_radiusX)
- && compareCSSValuePtr(m_radiusY, other.m_radiusY);
+ && compareCSSValuePtr(m_radiusY, other.m_radiusY)
+ && compareCSSValuePtr(m_box, other.m_box);
}
String CSSBasicShapeEllipse::serializeResolvingVariables(const HashMap<AtomicString, String>& variables) const
{
- return buildEllipseString(m_centerX->serializeResolvingVariables(variables),
+ return buildEllipseString(m_radiusX.get() ? m_radiusX->serializeResolvingVariables(variables) : String(),
+ m_radiusY.get() ? m_radiusY->serializeResolvingVariables(variables) : String(),
+ m_centerX.get() ? m_centerX->serializeResolvingVariables(variables) : String(),
+ m_centerY.get() ? m_centerY->serializeResolvingVariables(variables) : String(),
+ m_box.get() ? m_box->serializeResolvingVariables(variables) : String());
+}
+
+bool CSSBasicShapeEllipse::hasVariableReference() const
+{
+ return (m_centerX && m_centerX->hasVariableReference())
+ || (m_centerY && m_centerY->hasVariableReference())
+ || (m_radiusX && m_radiusX->hasVariableReference())
+ || (m_radiusY && m_radiusY->hasVariableReference());
+}
+
+static String buildDeprecatedEllipseString(const String& x, const String& y, const String& radiusX, const String& radiusY)
+{
+ return "ellipse(" + x + ", " + y + ", " + radiusX + ", " + radiusY + ')';
+}
+
+String CSSDeprecatedBasicShapeEllipse::cssText() const
+{
+ return buildDeprecatedEllipseString(m_centerX->cssText(), m_centerY->cssText(), m_radiusX->cssText(), m_radiusY->cssText());
+}
+
+bool CSSDeprecatedBasicShapeEllipse::equals(const CSSBasicShape& shape) const
+{
+ if (shape.type() != CSSDeprecatedBasicShapeEllipseType)
+ return false;
+
+ const CSSDeprecatedBasicShapeEllipse& other = static_cast<const CSSDeprecatedBasicShapeEllipse&>(shape);
+ return compareCSSValuePtr(m_centerX, other.m_centerX)
+ && compareCSSValuePtr(m_centerY, other.m_centerY)
+ && compareCSSValuePtr(m_radiusX, other.m_radiusX)
+ && compareCSSValuePtr(m_radiusY, other.m_radiusY);
+}
+
+String CSSDeprecatedBasicShapeEllipse::serializeResolvingVariables(const HashMap<AtomicString, String>& variables) const
+{
+ return buildDeprecatedEllipseString(m_centerX->serializeResolvingVariables(variables),
m_centerY->serializeResolvingVariables(variables),
m_radiusX->serializeResolvingVariables(variables),
m_radiusY->serializeResolvingVariables(variables));
}
-bool CSSBasicShapeEllipse::hasVariableReference() const
+bool CSSDeprecatedBasicShapeEllipse::hasVariableReference() const
{
return m_centerX->hasVariableReference()
|| m_centerY->hasVariableReference()

Powered by Google App Engine
This is Rietveld 408576698