Fastpath lines in SkCurveMeasure
BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2229403004 Review-Url: https://codereview.chromium.org/2229403004
This commit is contained in:
parent
f9635999a4
commit
386ba54061
@ -77,10 +77,6 @@ static inline Sk8f evaluateDerivativeLength(const Sk8f& ts,
|
|||||||
x = xCoeff[0]*ts + xCoeff[1];
|
x = xCoeff[0]*ts + xCoeff[1];
|
||||||
y = yCoeff[0]*ts + yCoeff[1];
|
y = yCoeff[0]*ts + yCoeff[1];
|
||||||
break;
|
break;
|
||||||
case kLine_SegType:
|
|
||||||
// length of line derivative is constant
|
|
||||||
// and we precompute it in the constructor
|
|
||||||
return xCoeff[0];
|
|
||||||
case kCubic_SegType:
|
case kCubic_SegType:
|
||||||
x = (xCoeff[0]*ts + xCoeff[1])*ts + xCoeff[2];
|
x = (xCoeff[0]*ts + xCoeff[1])*ts + xCoeff[2];
|
||||||
y = (yCoeff[0]*ts + yCoeff[1])*ts + yCoeff[2];
|
y = (yCoeff[0]*ts + yCoeff[1])*ts + yCoeff[2];
|
||||||
@ -117,14 +113,6 @@ ArcLengthIntegrator::ArcLengthIntegrator(const SkPoint* pts, SkSegType segType)
|
|||||||
yCoeff[1] = Sk8f(2.0f*(By - Ay));
|
yCoeff[1] = Sk8f(2.0f*(By - Ay));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case kLine_SegType: {
|
|
||||||
// the length of the derivative of a line is constant
|
|
||||||
// we put in in both coeff arrays for consistency's sake
|
|
||||||
SkScalar length = (pts[1] - pts[0]).length();
|
|
||||||
xCoeff[0] = Sk8f(length);
|
|
||||||
yCoeff[0] = Sk8f(length);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case kCubic_SegType:
|
case kCubic_SegType:
|
||||||
{
|
{
|
||||||
float Ax = pts[0].x();
|
float Ax = pts[0].x();
|
||||||
@ -183,6 +171,7 @@ SkCurveMeasure::SkCurveMeasure(const SkPoint* pts, SkSegType segType)
|
|||||||
case SkSegType::kLine_SegType:
|
case SkSegType::kLine_SegType:
|
||||||
fPts[0] = pts[0];
|
fPts[0] = pts[0];
|
||||||
fPts[1] = pts[1];
|
fPts[1] = pts[1];
|
||||||
|
fLength = (fPts[1] - fPts[0]).length();
|
||||||
break;
|
break;
|
||||||
case SkSegType::kCubic_SegType:
|
case SkSegType::kCubic_SegType:
|
||||||
for (size_t i = 0; i < 4; i++) {
|
for (size_t i = 0; i < 4; i++) {
|
||||||
@ -198,7 +187,9 @@ SkCurveMeasure::SkCurveMeasure(const SkPoint* pts, SkSegType segType)
|
|||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fIntegrator = ArcLengthIntegrator(fPts, fSegType);
|
if (kLine_SegType != segType) {
|
||||||
|
fIntegrator = ArcLengthIntegrator(fPts, fSegType);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SkScalar SkCurveMeasure::getLength() {
|
SkScalar SkCurveMeasure::getLength() {
|
||||||
@ -227,6 +218,9 @@ SkScalar SkCurveMeasure::getTime(SkScalar targetLength) {
|
|||||||
if (SkScalarNearlyEqual(targetLength, currentLength)) {
|
if (SkScalarNearlyEqual(targetLength, currentLength)) {
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
}
|
}
|
||||||
|
if (kLine_SegType == fSegType) {
|
||||||
|
return targetLength / currentLength;
|
||||||
|
}
|
||||||
|
|
||||||
// initial estimate of t is percentage of total length
|
// initial estimate of t is percentage of total length
|
||||||
SkScalar currentT = targetLength / currentLength;
|
SkScalar currentT = targetLength / currentLength;
|
||||||
|
Loading…
Reference in New Issue
Block a user