Bug 932762, part 1 - Get rid of nsSVGPathGeometryElement::CreatePathBuilder and make BuildPath's aBuilder argument non-optional. r=longsonr
--- a/content/svg/content/src/SVGCircleElement.cpp
+++ b/content/svg/content/src/SVGCircleElement.cpp
@@ -86,17 +86,15 @@ SVGCircleElement::BuildPath(PathBuilder*
{
float x, y, r;
GetAnimatedLengthValues(&x, &y, &r, nullptr);
if (r <= 0.0f) {
return nullptr;
}
- RefPtr<PathBuilder> pathBuilder = aBuilder ? aBuilder : CreatePathBuilder();
+ aBuilder->Arc(Point(x, y), r, 0, Float(2*M_PI));
- pathBuilder->Arc(Point(x, y), r, 0, Float(2*M_PI));
-
- return pathBuilder->Finish();
+ return aBuilder->Finish();
}
} // namespace dom
} // namespace mozilla
--- a/content/svg/content/src/SVGCircleElement.h
+++ b/content/svg/content/src/SVGCircleElement.h
@@ -25,17 +25,17 @@ protected:
friend nsresult (::NS_NewSVGCircleElement(nsIContent **aResult,
already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo));
public:
// nsSVGSVGElement methods:
virtual bool HasValidDimensions() const MOZ_OVERRIDE;
// nsSVGPathGeometryElement methods:
- virtual TemporaryRef<Path> BuildPath(PathBuilder* aBuilder = nullptr) MOZ_OVERRIDE;
+ virtual TemporaryRef<Path> BuildPath(PathBuilder* aBuilder) MOZ_OVERRIDE;
virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
// WebIDL
already_AddRefed<SVGAnimatedLength> Cx();
already_AddRefed<SVGAnimatedLength> Cy();
already_AddRefed<SVGAnimatedLength> R();
--- a/content/svg/content/src/SVGEllipseElement.cpp
+++ b/content/svg/content/src/SVGEllipseElement.cpp
@@ -97,17 +97,15 @@ SVGEllipseElement::BuildPath(PathBuilder
{
float x, y, rx, ry;
GetAnimatedLengthValues(&x, &y, &rx, &ry, nullptr);
if (rx <= 0.0f || ry <= 0.0f) {
return nullptr;
}
- RefPtr<PathBuilder> pathBuilder = aBuilder ? aBuilder : CreatePathBuilder();
+ EllipseToBezier(aBuilder, Point(x, y), Size(rx, ry));
- EllipseToBezier(pathBuilder.get(), Point(x, y), Size(rx, ry));
-
- return pathBuilder->Finish();
+ return aBuilder->Finish();
}
} // namespace dom
} // namespace mozilla
--- a/content/svg/content/src/SVGEllipseElement.h
+++ b/content/svg/content/src/SVGEllipseElement.h
@@ -25,17 +25,17 @@ protected:
friend nsresult (::NS_NewSVGEllipseElement(nsIContent **aResult,
already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo));
public:
// nsSVGSVGElement methods:
virtual bool HasValidDimensions() const MOZ_OVERRIDE;
// nsSVGPathGeometryElement methods:
- virtual TemporaryRef<Path> BuildPath(PathBuilder* aBuilder = nullptr) MOZ_OVERRIDE;
+ virtual TemporaryRef<Path> BuildPath(PathBuilder* aBuilder) MOZ_OVERRIDE;
virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
// WebIDL
already_AddRefed<SVGAnimatedLength> Cx();
already_AddRefed<SVGAnimatedLength> Cy();
already_AddRefed<SVGAnimatedLength> Rx();
already_AddRefed<SVGAnimatedLength> Ry();
--- a/content/svg/content/src/SVGImageElement.cpp
+++ b/content/svg/content/src/SVGImageElement.cpp
@@ -234,26 +234,24 @@ SVGImageElement::BuildPath(PathBuilder*
float x, y, width, height;
GetAnimatedLengthValues(&x, &y, &width, &height, nullptr);
if (width <= 0 || height <= 0) {
return nullptr;
}
- RefPtr<PathBuilder> pathBuilder = aBuilder ? aBuilder : CreatePathBuilder();
+ Rect r(x, y, width, height);
+ aBuilder->MoveTo(r.TopLeft());
+ aBuilder->LineTo(r.TopRight());
+ aBuilder->LineTo(r.BottomRight());
+ aBuilder->LineTo(r.BottomLeft());
+ aBuilder->Close();
- Rect r(x, y, width, height);
- pathBuilder->MoveTo(r.TopLeft());
- pathBuilder->LineTo(r.TopRight());
- pathBuilder->LineTo(r.BottomRight());
- pathBuilder->LineTo(r.BottomLeft());
- pathBuilder->Close();
-
- return pathBuilder->Finish();
+ return aBuilder->Finish();
}
//----------------------------------------------------------------------
// nsSVGElement methods
/* virtual */ bool
SVGImageElement::HasValidDimensions() const
{
--- a/content/svg/content/src/SVGImageElement.h
+++ b/content/svg/content/src/SVGImageElement.h
@@ -48,17 +48,17 @@ public:
bool aCompileEventHandlers) MOZ_OVERRIDE;
virtual void UnbindFromTree(bool aDeep, bool aNullParent) MOZ_OVERRIDE;
virtual EventStates IntrinsicState() const MOZ_OVERRIDE;
NS_IMETHOD_(bool) IsAttributeMapped(const nsIAtom* name) const MOZ_OVERRIDE;
// nsSVGPathGeometryElement methods:
- virtual TemporaryRef<Path> BuildPath(PathBuilder* aBuilder = nullptr) MOZ_OVERRIDE;
+ virtual TemporaryRef<Path> BuildPath(PathBuilder* aBuilder) MOZ_OVERRIDE;
// nsSVGSVGElement methods:
virtual bool HasValidDimensions() const MOZ_OVERRIDE;
virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
nsresult CopyInnerTo(mozilla::dom::Element* aDest);
--- a/content/svg/content/src/SVGLineElement.cpp
+++ b/content/svg/content/src/SVGLineElement.cpp
@@ -104,21 +104,19 @@ SVGLineElement::GetMarkPoints(nsTArray<n
aMarks->AppendElement(nsSVGMark(x1, y1, angle, nsSVGMark::eStart));
aMarks->AppendElement(nsSVGMark(x2, y2, angle, nsSVGMark::eEnd));
}
TemporaryRef<Path>
SVGLineElement::BuildPath(PathBuilder* aBuilder)
{
- RefPtr<PathBuilder> pathBuilder = aBuilder ? aBuilder : CreatePathBuilder();
-
float x1, y1, x2, y2;
GetAnimatedLengthValues(&x1, &y1, &x2, &y2, nullptr);
- pathBuilder->MoveTo(Point(x1, y1));
- pathBuilder->LineTo(Point(x2, y2));
+ aBuilder->MoveTo(Point(x1, y1));
+ aBuilder->LineTo(Point(x2, y2));
- return pathBuilder->Finish();
+ return aBuilder->Finish();
}
} // namespace dom
} // namespace mozilla
--- a/content/svg/content/src/SVGLineElement.h
+++ b/content/svg/content/src/SVGLineElement.h
@@ -27,17 +27,17 @@ protected:
public:
// nsIContent interface
NS_IMETHOD_(bool) IsAttributeMapped(const nsIAtom* name) const MOZ_OVERRIDE;
// nsSVGPathGeometryElement methods:
virtual bool IsMarkable() MOZ_OVERRIDE { return true; }
virtual void GetMarkPoints(nsTArray<nsSVGMark> *aMarks) MOZ_OVERRIDE;
- virtual TemporaryRef<Path> BuildPath(PathBuilder* aBuilder = nullptr) MOZ_OVERRIDE;
+ virtual TemporaryRef<Path> BuildPath(PathBuilder* aBuilder) MOZ_OVERRIDE;
virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult) const;
// WebIDL
already_AddRefed<SVGAnimatedLength> X1();
already_AddRefed<SVGAnimatedLength> Y1();
already_AddRefed<SVGAnimatedLength> X2();
already_AddRefed<SVGAnimatedLength> Y2();
--- a/content/svg/content/src/SVGPathElement.cpp
+++ b/content/svg/content/src/SVGPathElement.cpp
@@ -385,30 +385,13 @@ SVGPathElement::BuildPath(PathBuilder* a
// reason we do not check for eStyleSVGPaintType_None or check the stroke
// opacity here.
if (style->mStrokeLinecap != NS_STYLE_STROKE_LINECAP_BUTT) {
strokeLineCap = style->mStrokeLinecap;
strokeWidth = SVGContentUtils::GetStrokeWidth(this, styleContext, nullptr);
}
}
- RefPtr<PathBuilder> builder;
- if (aBuilder) {
- builder = aBuilder;
- } else {
- RefPtr<DrawTarget> drawTarget =
- gfxPlatform::GetPlatform()->ScreenReferenceDrawTarget();
- // The fill rule that we pass must be the current computed value of our
- // CSS 'fill-rule' property if the path that we return will be used for
- // painting or hit-testing. For all other uses (bounds calculatons, length
- // measurement, position-at-offset calculations) the fill rule that we pass
- // doesn't matter. As a result we can just pass the current computed value
- // regardless of who's calling us, or what they're going to do with the
- // path that we return.
- RefPtr<PathBuilder> builder =
- drawTarget->CreatePathBuilder(GetFillRule());
- }
-
- return mD.GetAnimValue().BuildPath(builder, strokeLineCap, strokeWidth);
+ return mD.GetAnimValue().BuildPath(aBuilder, strokeLineCap, strokeWidth);
}
} // namespace dom
} // namespace mozilla
--- a/content/svg/content/src/SVGPathElement.h
+++ b/content/svg/content/src/SVGPathElement.h
@@ -45,17 +45,17 @@ public:
// nsSVGSVGElement methods:
virtual bool HasValidDimensions() const MOZ_OVERRIDE;
// nsSVGPathGeometryElement methods:
virtual bool AttributeDefinesGeometry(const nsIAtom *aName) MOZ_OVERRIDE;
virtual bool IsMarkable() MOZ_OVERRIDE;
virtual void GetMarkPoints(nsTArray<nsSVGMark> *aMarks) MOZ_OVERRIDE;
- virtual TemporaryRef<Path> BuildPath(PathBuilder* aBuilder = nullptr) MOZ_OVERRIDE;
+ virtual TemporaryRef<Path> BuildPath(PathBuilder* aBuilder) MOZ_OVERRIDE;
/**
* This returns a path without the extra little line segments that
* ApproximateZeroLengthSubpathSquareCaps can insert if we have square-caps.
* See the comment for that function for more info on that.
*/
virtual TemporaryRef<Path>
GetPathForLengthOrPositionMeasuring() MOZ_OVERRIDE;
--- a/content/svg/content/src/SVGRectElement.cpp
+++ b/content/svg/content/src/SVGRectElement.cpp
@@ -113,29 +113,27 @@ SVGRectElement::BuildPath(PathBuilder* a
{
float x, y, width, height, rx, ry;
GetAnimatedLengthValues(&x, &y, &width, &height, &rx, &ry, nullptr);
if (width <= 0 || height <= 0) {
return nullptr;
}
- RefPtr<PathBuilder> pathBuilder = aBuilder ? aBuilder : CreatePathBuilder();
-
rx = std::max(rx, 0.0f);
ry = std::max(ry, 0.0f);
if (rx == 0 && ry == 0) {
// Optimization for the no rounded corners case.
Rect r(x, y, width, height);
- pathBuilder->MoveTo(r.TopLeft());
- pathBuilder->LineTo(r.TopRight());
- pathBuilder->LineTo(r.BottomRight());
- pathBuilder->LineTo(r.BottomLeft());
- pathBuilder->Close();
+ aBuilder->MoveTo(r.TopLeft());
+ aBuilder->LineTo(r.TopRight());
+ aBuilder->LineTo(r.BottomRight());
+ aBuilder->LineTo(r.BottomLeft());
+ aBuilder->Close();
} else {
// If either the 'rx' or the 'ry' attribute isn't set, then we have to
// set it to the value of the other:
bool hasRx = mLengthAttributes[ATTR_RX].IsExplicitlySet();
bool hasRy = mLengthAttributes[ATTR_RY].IsExplicitlySet();
MOZ_ASSERT(hasRx || hasRy);
if (hasRx && !hasRy) {
@@ -145,16 +143,16 @@ SVGRectElement::BuildPath(PathBuilder* a
}
// Clamp rx and ry to half the rect's width and height respectively:
rx = std::min(rx, width / 2);
ry = std::min(ry, height / 2);
Size cornerRadii(rx, ry);
Size radii[] = { cornerRadii, cornerRadii, cornerRadii, cornerRadii };
- AppendRoundedRectToPath(pathBuilder, Rect(x, y, width, height), radii);
+ AppendRoundedRectToPath(aBuilder, Rect(x, y, width, height), radii);
}
- return pathBuilder->Finish();
+ return aBuilder->Finish();
}
} // namespace dom
} // namespace mozilla
--- a/content/svg/content/src/nsSVGPathGeometryElement.cpp
+++ b/content/svg/content/src/nsSVGPathGeometryElement.cpp
@@ -61,36 +61,16 @@ nsSVGPathGeometryElement::GetMarkPoints(
}
TemporaryRef<Path>
nsSVGPathGeometryElement::GetPathForLengthOrPositionMeasuring()
{
return nullptr;
}
-TemporaryRef<PathBuilder>
-nsSVGPathGeometryElement::CreatePathBuilder()
-{
- RefPtr<DrawTarget> drawTarget =
- gfxPlatform::GetPlatform()->ScreenReferenceDrawTarget();
- NS_ASSERTION(gfxPlatform::GetPlatform()->
- SupportsAzureContentForDrawTarget(drawTarget),
- "Should support Moz2D content drawing");
-
- // The fill rule that we pass to CreatePathBuilder must be the current
- // computed value of our CSS 'fill-rule' property if the path that we return
- // will be used for painting or hit-testing. For all other uses (bounds
- // calculatons, length measurement, position-at-offset calculations) the fill
- // rule that we pass doesn't matter. As a result we can just pass the current
- // computed value regardless of who's calling us, or what they're going to do
- // with the path that we return.
-
- return drawTarget->CreatePathBuilder(GetFillRule());
-}
-
FillRule
nsSVGPathGeometryElement::GetFillRule()
{
FillRule fillRule = FillRule::FILL_WINDING; // Equivalent to NS_STYLE_FILL_RULE_NONZERO
nsRefPtr<nsStyleContext> styleContext =
nsComputedDOMStyle::GetStyleContextForElementNoFlush(this, nullptr,
nullptr);
--- a/content/svg/content/src/nsSVGPathGeometryElement.h
+++ b/content/svg/content/src/nsSVGPathGeometryElement.h
@@ -59,21 +59,15 @@ public:
* Returns a Path that can be used to paint, hit-test or calculate bounds for
* this element. May return nullptr if there is no [valid] path.
*/
virtual mozilla::TemporaryRef<Path> BuildPath(PathBuilder* aBuilder = nullptr) = 0;
virtual mozilla::TemporaryRef<Path> GetPathForLengthOrPositionMeasuring();
/**
- * Returns a PathBuilder object created using the current computed value of
- * the CSS property 'fill-rule' for this element.
- */
- mozilla::TemporaryRef<PathBuilder> CreatePathBuilder();
-
- /**
* Returns the current computed value of the CSS property 'fill-rule' for
* this element.
*/
FillRule GetFillRule();
};
#endif
--- a/content/svg/content/src/nsSVGPolyElement.cpp
+++ b/content/svg/content/src/nsSVGPolyElement.cpp
@@ -124,17 +124,15 @@ TemporaryRef<Path>
nsSVGPolyElement::BuildPath(PathBuilder* aBuilder)
{
const SVGPointList &points = mPoints.GetAnimValue();
if (points.IsEmpty()) {
return nullptr;
}
- RefPtr<PathBuilder> pathBuilder = aBuilder ? aBuilder : CreatePathBuilder();
-
- pathBuilder->MoveTo(points[0]);
+ aBuilder->MoveTo(points[0]);
for (uint32_t i = 1; i < points.Length(); ++i) {
- pathBuilder->LineTo(points[i]);
+ aBuilder->LineTo(points[i]);
}
- return pathBuilder->Finish();
+ return aBuilder->Finish();
}
--- a/content/svg/content/src/nsSVGPolyElement.h
+++ b/content/svg/content/src/nsSVGPolyElement.h
@@ -40,17 +40,17 @@ public:
// nsSVGElement methods:
virtual bool HasValidDimensions() const MOZ_OVERRIDE;
// nsSVGPathGeometryElement methods:
virtual bool AttributeDefinesGeometry(const nsIAtom *aName) MOZ_OVERRIDE;
virtual bool IsMarkable() MOZ_OVERRIDE { return true; }
virtual void GetMarkPoints(nsTArray<nsSVGMark> *aMarks) MOZ_OVERRIDE;
- virtual mozilla::TemporaryRef<Path> BuildPath(PathBuilder* aBuilder = nullptr) MOZ_OVERRIDE;
+ virtual mozilla::TemporaryRef<Path> BuildPath(PathBuilder* aBuilder) MOZ_OVERRIDE;
// WebIDL
already_AddRefed<mozilla::DOMSVGPointList> Points();
already_AddRefed<mozilla::DOMSVGPointList> AnimatedPoints();
protected:
SVGAnimatedPointList mPoints;
};