diff --git a/dom/svg/SVGPathData.cpp b/dom/svg/SVGPathData.cpp index 1bf819a1f44..0e11782754f 100644 --- a/dom/svg/SVGPathData.cpp +++ b/dom/svg/SVGPathData.cpp @@ -537,9 +537,9 @@ AngleOfVector(const Point& aVector) } static float -AngleOfVectorF(const Point& aVector) +AngleOfVector(const Point& cp1, const Point& cp2) { - return static_cast(AngleOfVector(aVector)); + return static_cast(AngleOfVector(cp1 - cp2)); } void @@ -573,7 +573,7 @@ SVGPathData::GetMarkerPositioningData(nsTArray *aMarks) const { case PATHSEG_CLOSEPATH: segEnd = pathStart; - segStartAngle = segEndAngle = AngleOfVectorF(segEnd - segStart); + segStartAngle = segEndAngle = AngleOfVector(segEnd, segStart); break; case PATHSEG_MOVETO_ABS: @@ -586,7 +586,7 @@ SVGPathData::GetMarkerPositioningData(nsTArray *aMarks) const pathStart = segEnd; // If authors are going to specify multiple consecutive moveto commands // with markers, me might as well make the angle do something useful: - segStartAngle = segEndAngle = AngleOfVectorF(segEnd - segStart); + segStartAngle = segEndAngle = AngleOfVector(segEnd, segStart); i += 2; break; @@ -597,7 +597,7 @@ SVGPathData::GetMarkerPositioningData(nsTArray *aMarks) const } else { segEnd = segStart + Point(mData[i], mData[i+1]); } - segStartAngle = segEndAngle = AngleOfVectorF(segEnd - segStart); + segStartAngle = segEndAngle = AngleOfVector(segEnd, segStart); i += 2; break; @@ -615,14 +615,10 @@ SVGPathData::GetMarkerPositioningData(nsTArray *aMarks) const segEnd = segStart + Point(mData[i+4], mData[i+5]); } prevCP = cp2; - if (cp1 == segStart) { - cp1 = cp2; - } - if (cp2 == segEnd) { - cp2 = cp1; - } - segStartAngle = AngleOfVectorF(cp1 - segStart); - segEndAngle = AngleOfVectorF(segEnd - cp2); + segStartAngle = + AngleOfVector(cp1 == segStart ? (cp1 == cp2 ? segEnd : cp2) : cp1, segStart); + segEndAngle = + AngleOfVector(segEnd, cp2 == segEnd ? (cp1 == cp2 ? segStart : cp1) : cp2); i += 6; break; } @@ -630,7 +626,7 @@ SVGPathData::GetMarkerPositioningData(nsTArray *aMarks) const case PATHSEG_CURVETO_QUADRATIC_ABS: case PATHSEG_CURVETO_QUADRATIC_REL: { - Point cp1, cp2; // control points + Point cp1; // control point if (segType == PATHSEG_CURVETO_QUADRATIC_ABS) { cp1 = Point(mData[i], mData[i+1]); segEnd = Point(mData[i+2], mData[i+3]); @@ -639,8 +635,8 @@ SVGPathData::GetMarkerPositioningData(nsTArray *aMarks) const segEnd = segStart + Point(mData[i+2], mData[i+3]); } prevCP = cp1; - segStartAngle = AngleOfVectorF(cp1 - segStart); - segEndAngle = AngleOfVectorF(segEnd - cp1); + segStartAngle = AngleOfVector(cp1 == segStart ? segEnd : cp1, segStart); + segEndAngle = AngleOfVector(segEnd, cp1 == segEnd ? segStart : cp1); i += 4; break; } @@ -680,7 +676,7 @@ SVGPathData::GetMarkerPositioningData(nsTArray *aMarks) const if (rx == 0.0 || ry == 0.0) { // F.6.6 step 1 - straight line or coincidental points - segStartAngle = segEndAngle = AngleOfVectorF(segEnd - segStart); + segStartAngle = segEndAngle = AngleOfVector(segEnd, segStart); i += 7; break; } @@ -755,7 +751,7 @@ SVGPathData::GetMarkerPositioningData(nsTArray *aMarks) const } else { segEnd = segStart + Point(mData[i++], 0.0f); } - segStartAngle = segEndAngle = AngleOfVectorF(segEnd - segStart); + segStartAngle = segEndAngle = AngleOfVector(segEnd, segStart); break; case PATHSEG_LINETO_VERTICAL_ABS: @@ -765,7 +761,7 @@ SVGPathData::GetMarkerPositioningData(nsTArray *aMarks) const } else { segEnd = segStart + Point(0.0f, mData[i++]); } - segStartAngle = segEndAngle = AngleOfVectorF(segEnd - segStart); + segStartAngle = segEndAngle = AngleOfVector(segEnd, segStart); break; case PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: @@ -782,14 +778,10 @@ SVGPathData::GetMarkerPositioningData(nsTArray *aMarks) const segEnd = segStart + Point(mData[i+2], mData[i+3]); } prevCP = cp2; - if (cp1 == segStart) { - cp1 = cp2; - } - if (cp2 == segEnd) { - cp2 = cp1; - } - segStartAngle = AngleOfVectorF(cp1 - segStart); - segEndAngle = AngleOfVectorF(segEnd - cp2); + segStartAngle = + AngleOfVector(cp1 == segStart ? (cp1 == cp2 ? segEnd : cp2) : cp1, segStart); + segEndAngle = + AngleOfVector(segEnd, cp2 == segEnd ? (cp1 == cp2 ? segStart : cp1) : cp2); i += 4; break; } @@ -799,15 +791,14 @@ SVGPathData::GetMarkerPositioningData(nsTArray *aMarks) const { Point cp1 = SVGPathSegUtils::IsQuadraticType(prevSegType) ? segStart * 2 - prevCP : segStart; - Point cp2; if (segType == PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS) { segEnd = Point(mData[i], mData[i+1]); } else { segEnd = segStart + Point(mData[i], mData[i+1]); } prevCP = cp1; - segStartAngle = AngleOfVectorF(cp1 - segStart); - segEndAngle = AngleOfVectorF(segEnd - cp1); + segStartAngle = AngleOfVector(cp1 == segStart ? segEnd : cp1, segStart); + segEndAngle = AngleOfVector(segEnd, cp1 == segEnd ? segStart : cp1); i += 2; break; } diff --git a/layout/reftests/svg/marker-orientation-04.svg b/layout/reftests/svg/marker-orientation-04.svg new file mode 100644 index 00000000000..3fb2fdd0b92 --- /dev/null +++ b/layout/reftests/svg/marker-orientation-04.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/layout/reftests/svg/reftest.list b/layout/reftests/svg/reftest.list index 1c35d1478df..cf80bb59027 100644 --- a/layout/reftests/svg/reftest.list +++ b/layout/reftests/svg/reftest.list @@ -201,6 +201,7 @@ fuzzy-if(cocoaWidget,15,19679) fuzzy-if(winWidget,1,8800) fuzzy-if(!cocoaWidget& == marker-orientation-01.svg marker-orientation-01-ref.svg pref(svg.marker-improvements.enabled,true) == marker-orientation-02.svg marker-orientation-02-ref.svg == marker-orientation-03.svg pass.svg +== marker-orientation-04.svg pass.svg == mask-basic-01.svg pass.svg == mask-basic-02.svg mask-basic-02-ref.svg == mask-basic-03.svg pass.svg