| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2008 The Android Open Source Project | 2 * Copyright 2008 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkStrokerPriv.h" | 8 #include "SkStrokerPriv.h" |
| 9 #include "SkGeometry.h" | 9 #include "SkGeometry.h" |
| 10 #include "SkPath.h" | 10 #include "SkPath.h" |
| (...skipping 887 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 898 #endif | 898 #endif |
| 899 | 899 |
| 900 this->postJoinTo(pt2, normalBC, unitBC); | 900 this->postJoinTo(pt2, normalBC, unitBC); |
| 901 } | 901 } |
| 902 | 902 |
| 903 #ifdef SK_QUAD_STROKE_APPROXIMATION | 903 #ifdef SK_QUAD_STROKE_APPROXIMATION |
| 904 // Given a point on the curve and its derivative, scale the derivative by the ra
dius, and | 904 // Given a point on the curve and its derivative, scale the derivative by the ra
dius, and |
| 905 // compute the perpendicular point and its tangent. | 905 // compute the perpendicular point and its tangent. |
| 906 void SkPathStroker::setRayPts(const SkPoint& tPt, SkVector* dxy, SkPoint* onPt, | 906 void SkPathStroker::setRayPts(const SkPoint& tPt, SkVector* dxy, SkPoint* onPt, |
| 907 SkPoint* tangent) const { | 907 SkPoint* tangent) const { |
| 908 SkPoint oldDxy = *dxy; |
| 908 if (!dxy->setLength(fRadius)) { // consider moving double logic into SkPoin
t::setLength | 909 if (!dxy->setLength(fRadius)) { // consider moving double logic into SkPoin
t::setLength |
| 909 double xx = dxy->fX; | 910 double xx = oldDxy.fX; |
| 910 double yy = dxy->fY; | 911 double yy = oldDxy.fY; |
| 911 double dscale = fRadius / sqrt(xx * xx + yy * yy); | 912 double dscale = fRadius / sqrt(xx * xx + yy * yy); |
| 912 dxy->fX = SkDoubleToScalar(xx * dscale); | 913 dxy->fX = SkDoubleToScalar(xx * dscale); |
| 913 dxy->fY = SkDoubleToScalar(yy * dscale); | 914 dxy->fY = SkDoubleToScalar(yy * dscale); |
| 914 } | 915 } |
| 915 SkScalar axisFlip = SkIntToScalar(fStrokeType); // go opposite ways for out
er, inner | 916 SkScalar axisFlip = SkIntToScalar(fStrokeType); // go opposite ways for out
er, inner |
| 916 onPt->fX = tPt.fX + axisFlip * dxy->fY; | 917 onPt->fX = tPt.fX + axisFlip * dxy->fY; |
| 917 onPt->fY = tPt.fY - axisFlip * dxy->fX; | 918 onPt->fY = tPt.fY - axisFlip * dxy->fX; |
| 918 if (tangent) { | 919 if (tangent) { |
| 919 tangent->fX = onPt->fX + dxy->fX; | 920 tangent->fX = onPt->fX + dxy->fX; |
| 920 tangent->fY = onPt->fY + dxy->fY; | 921 tangent->fY = onPt->fY + dxy->fY; |
| (...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1405 SkVector normalAB, unitAB, normalCD, unitCD; | 1406 SkVector normalAB, unitAB, normalCD, unitCD; |
| 1406 this->preJoinTo(*tangentPt, &normalAB, &unitAB, false); | 1407 this->preJoinTo(*tangentPt, &normalAB, &unitAB, false); |
| 1407 SkScalar tValues[2]; | 1408 SkScalar tValues[2]; |
| 1408 int count = SkFindCubicInflections(cubic, tValues); | 1409 int count = SkFindCubicInflections(cubic, tValues); |
| 1409 SkScalar lastT = 0; | 1410 SkScalar lastT = 0; |
| 1410 for (int index = 0; index <= count; ++index) { | 1411 for (int index = 0; index <= count; ++index) { |
| 1411 SkScalar nextT = index < count ? tValues[index] : 1; | 1412 SkScalar nextT = index < count ? tValues[index] : 1; |
| 1412 SkQuadConstruct quadPts; | 1413 SkQuadConstruct quadPts; |
| 1413 this->init(kOuter_StrokeType, &quadPts, lastT, nextT); | 1414 this->init(kOuter_StrokeType, &quadPts, lastT, nextT); |
| 1414 if (!this->cubicStroke(cubic, &quadPts)) { | 1415 if (!this->cubicStroke(cubic, &quadPts)) { |
| 1415 return; | 1416 break; |
| 1416 } | 1417 } |
| 1417 this->init(kInner_StrokeType, &quadPts, lastT, nextT); | 1418 this->init(kInner_StrokeType, &quadPts, lastT, nextT); |
| 1418 if (!this->cubicStroke(cubic, &quadPts)) { | 1419 if (!this->cubicStroke(cubic, &quadPts)) { |
| 1419 return; | 1420 break; |
| 1420 } | 1421 } |
| 1421 lastT = nextT; | 1422 lastT = nextT; |
| 1422 } | 1423 } |
| 1424 // emit the join even if one stroke succeeded but the last one failed |
| 1425 // this avoids reversing an inner stroke with a partial path followed by ano
ther moveto |
| 1423 this->setCubicEndNormal(cubic, normalAB, unitAB, &normalCD, &unitCD); | 1426 this->setCubicEndNormal(cubic, normalAB, unitAB, &normalCD, &unitCD); |
| 1424 #else | 1427 #else |
| 1425 bool degenerateAB = SkPath::IsLineDegenerate(fPrevPt, pt1); | 1428 bool degenerateAB = SkPath::IsLineDegenerate(fPrevPt, pt1); |
| 1426 bool degenerateBC = SkPath::IsLineDegenerate(pt1, pt2); | 1429 bool degenerateBC = SkPath::IsLineDegenerate(pt1, pt2); |
| 1427 bool degenerateCD = SkPath::IsLineDegenerate(pt2, pt3); | 1430 bool degenerateCD = SkPath::IsLineDegenerate(pt2, pt3); |
| 1428 | 1431 |
| 1429 if (degenerateAB + degenerateBC + degenerateCD >= 2 | 1432 if (degenerateAB + degenerateBC + degenerateCD >= 2 |
| 1430 || (degenerateAB && SkPath::IsLineDegenerate(fPrevPt, pt2))) { | 1433 || (degenerateAB && SkPath::IsLineDegenerate(fPrevPt, pt2))) { |
| 1431 this->lineTo(pt3); | 1434 this->lineTo(pt3); |
| 1432 return; | 1435 return; |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1736 default: | 1739 default: |
| 1737 break; | 1740 break; |
| 1738 } | 1741 } |
| 1739 | 1742 |
| 1740 if (fWidth < SkMinScalar(rw, rh) && !fDoFill) { | 1743 if (fWidth < SkMinScalar(rw, rh) && !fDoFill) { |
| 1741 r = rect; | 1744 r = rect; |
| 1742 r.inset(radius, radius); | 1745 r.inset(radius, radius); |
| 1743 dst->addRect(r, reverse_direction(dir)); | 1746 dst->addRect(r, reverse_direction(dir)); |
| 1744 } | 1747 } |
| 1745 } | 1748 } |
| OLD | NEW |