static void TraverseLinetoVerticalRel(const float* aArgs, SVGPathTraversalState& aState) { aState.pos.y += aArgs[0]; if (aState.ShouldUpdateLengthAndControlPoints()) { aState.length += fabs(aArgs[0]); aState.cp1 = aState.cp2 = aState.pos; } }
static void TraverseMovetoRel(const float* aArgs, SVGPathTraversalState& aState) { aState.start = aState.pos += gfxPoint(aArgs[0], aArgs[1]); if (aState.ShouldUpdateLengthAndControlPoints()) { // aState.length is unchanged, since move commands don't affect path length. aState.cp1 = aState.cp2 = aState.start; } }
static void TraverseClosePath(const float* aArgs, SVGPathTraversalState& aState) { if (aState.ShouldUpdateLengthAndControlPoints()) { aState.length += CalcDistanceBetweenPoints(aState.pos, aState.start); aState.cp1 = aState.cp2 = aState.start; } aState.pos = aState.start; }
static void TraverseLinetoVerticalAbs(const float* aArgs, SVGPathTraversalState& aState) { gfxPoint to(aState.pos.x, aArgs[0]); if (aState.ShouldUpdateLengthAndControlPoints()) { aState.length += fabs(to.y - aState.pos.y); aState.cp1 = aState.cp2 = to; } aState.pos = to; }
static void TraverseLinetoRel(const float* aArgs, SVGPathTraversalState& aState) { gfxPoint to = aState.pos + gfxPoint(aArgs[0], aArgs[1]); if (aState.ShouldUpdateLengthAndControlPoints()) { aState.length += CalcDistanceBetweenPoints(aState.pos, to); aState.cp1 = aState.cp2 = to; } aState.pos = to; }
static void TraverseLinetoHorizontalAbs(const float* aArgs, SVGPathTraversalState& aState) { Point to(aArgs[0], aState.pos.y); if (aState.ShouldUpdateLengthAndControlPoints()) { aState.length += fabs(to.x - aState.pos.x); aState.cp1 = aState.cp2 = to; } aState.pos = to; }
static void TraverseCurvetoQuadraticRel(const float* aArgs, SVGPathTraversalState& aState) { gfxPoint to = aState.pos + gfxPoint(aArgs[2], aArgs[3]); if (aState.ShouldUpdateLengthAndControlPoints()) { gfxPoint cp = aState.pos + gfxPoint(aArgs[0], aArgs[1]); aState.length += (float)CalcLengthOfQuadraticBezier(aState.pos, cp, to); aState.cp1 = cp; aState.cp2 = to; } aState.pos = to; }
static void TraverseCurvetoCubicSmoothRel(const float* aArgs, SVGPathTraversalState& aState) { gfxPoint to = aState.pos + gfxPoint(aArgs[2], aArgs[3]); if (aState.ShouldUpdateLengthAndControlPoints()) { gfxPoint cp1 = aState.pos - (aState.cp2 - aState.pos); gfxPoint cp2 = aState.pos + gfxPoint(aArgs[0], aArgs[1]); aState.length += (float)CalcLengthOfCubicBezier(aState.pos, cp1, cp2, to); aState.cp2 = cp2; aState.cp1 = to; } aState.pos = to; }
static void TraverseCurvetoCubicAbs(const float* aArgs, SVGPathTraversalState& aState) { Point to(aArgs[4], aArgs[5]); if (aState.ShouldUpdateLengthAndControlPoints()) { Point cp1(aArgs[0], aArgs[1]); Point cp2(aArgs[2], aArgs[3]); aState.length += (float)CalcLengthOfCubicBezier(aState.pos, cp1, cp2, to); aState.cp2 = cp2; aState.cp1 = to; } aState.pos = to; }
static void TraverseArcRel(const float* aArgs, SVGPathTraversalState& aState) { Point to = aState.pos + Point(aArgs[5], aArgs[6]); if (aState.ShouldUpdateLengthAndControlPoints()) { float dist = 0; Point radii(aArgs[0], aArgs[1]); Point bez[4] = { aState.pos, Point(0, 0), Point(0, 0), Point(0, 0) }; nsSVGArcConverter converter(aState.pos, to, radii, aArgs[2], aArgs[3] != 0, aArgs[4] != 0); while (converter.GetNextSegment(&bez[1], &bez[2], &bez[3])) { dist += CalcBezLengthHelper(bez, 4, 0, SplitCubicBezier); bez[0] = bez[3]; } aState.length += dist; aState.cp1 = aState.cp2 = to; } aState.pos = to; }