| 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 "SkPathPriv.h" | 10 #include "SkPathPriv.h" |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 void close(bool isLine) { this->finishContour(true, isLine); } | 133 void close(bool isLine) { this->finishContour(true, isLine); } |
| 134 | 134 |
| 135 void done(SkPath* dst, bool isLine) { | 135 void done(SkPath* dst, bool isLine) { |
| 136 this->finishContour(false, isLine); | 136 this->finishContour(false, isLine); |
| 137 fOuter.addPath(fExtra); | 137 fOuter.addPath(fExtra); |
| 138 dst->swap(fOuter); | 138 dst->swap(fOuter); |
| 139 } | 139 } |
| 140 | 140 |
| 141 SkScalar getResScale() const { return fResScale; } | 141 SkScalar getResScale() const { return fResScale; } |
| 142 | 142 |
| 143 bool isZeroLength() const { |
| 144 return fInner.isZeroLength() && fOuter.isZeroLength(); |
| 145 } |
| 146 |
| 143 private: | 147 private: |
| 144 SkScalar fRadius; | 148 SkScalar fRadius; |
| 145 SkScalar fInvMiterLimit; | 149 SkScalar fInvMiterLimit; |
| 146 SkScalar fResScale; | 150 SkScalar fResScale; |
| 147 SkScalar fInvResScale; | 151 SkScalar fInvResScale; |
| 148 SkScalar fInvResScaleSquared; | 152 SkScalar fInvResScaleSquared; |
| 149 | 153 |
| 150 SkVector fFirstNormal, fPrevNormal, fFirstUnitNormal, fPrevUnitNormal; | 154 SkVector fFirstNormal, fPrevNormal, fFirstUnitNormal, fPrevUnitNormal; |
| 151 SkPoint fFirstPt, fPrevPt; // on original path | 155 SkPoint fFirstPt, fPrevPt; // on original path |
| 152 SkPoint fFirstOuterPt; | 156 SkPoint fFirstOuterPt; |
| (...skipping 1234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1387 case SkPath::kConic_Verb: { | 1391 case SkPath::kConic_Verb: { |
| 1388 stroker.conicTo(pts[1], pts[2], iter.conicWeight()); | 1392 stroker.conicTo(pts[1], pts[2], iter.conicWeight()); |
| 1389 lastSegment = SkPath::kConic_Verb; | 1393 lastSegment = SkPath::kConic_Verb; |
| 1390 break; | 1394 break; |
| 1391 } break; | 1395 } break; |
| 1392 case SkPath::kCubic_Verb: | 1396 case SkPath::kCubic_Verb: |
| 1393 stroker.cubicTo(pts[1], pts[2], pts[3]); | 1397 stroker.cubicTo(pts[1], pts[2], pts[3]); |
| 1394 lastSegment = SkPath::kCubic_Verb; | 1398 lastSegment = SkPath::kCubic_Verb; |
| 1395 break; | 1399 break; |
| 1396 case SkPath::kClose_Verb: | 1400 case SkPath::kClose_Verb: |
| 1397 if (stroker.hasOnlyMoveTo() && SkPaint::kButt_Cap != this->getCa
p()) { | 1401 if (SkPaint::kButt_Cap != this->getCap()) { |
| 1398 /* If the stroke consists of a moveTo followed by a close, t
reat it | 1402 /* If the stroke consists of a moveTo followed by a close, t
reat it |
| 1399 as if it were followed by a zero-length line. Lines witho
ut length | 1403 as if it were followed by a zero-length line. Lines witho
ut length |
| 1400 can have square and round end caps. */ | 1404 can have square and round end caps. */ |
| 1401 stroker.lineTo(stroker.moveToPt()); | 1405 if (stroker.hasOnlyMoveTo()) { |
| 1402 lastSegment = SkPath::kLine_Verb; | 1406 stroker.lineTo(stroker.moveToPt()); |
| 1403 break; | 1407 goto ZERO_LENGTH; |
| 1408 } |
| 1409 /* If the stroke consists of a moveTo followed by one or mor
e zero-length |
| 1410 verbs, then followed by a close, treat is as if it were f
ollowed by a |
| 1411 zero-length line. Lines without length can have square &
round end caps. */ |
| 1412 if (stroker.isZeroLength()) { |
| 1413 ZERO_LENGTH: |
| 1414 lastSegment = SkPath::kLine_Verb; |
| 1415 break; |
| 1416 } |
| 1404 } | 1417 } |
| 1405 stroker.close(lastSegment == SkPath::kLine_Verb); | 1418 stroker.close(lastSegment == SkPath::kLine_Verb); |
| 1406 break; | 1419 break; |
| 1407 case SkPath::kDone_Verb: | 1420 case SkPath::kDone_Verb: |
| 1408 goto DONE; | 1421 goto DONE; |
| 1409 } | 1422 } |
| 1410 } | 1423 } |
| 1411 DONE: | 1424 DONE: |
| 1412 stroker.done(dst, lastSegment == SkPath::kLine_Verb); | 1425 stroker.done(dst, lastSegment == SkPath::kLine_Verb); |
| 1413 | 1426 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1518 default: | 1531 default: |
| 1519 break; | 1532 break; |
| 1520 } | 1533 } |
| 1521 | 1534 |
| 1522 if (fWidth < SkMinScalar(rw, rh) && !fDoFill) { | 1535 if (fWidth < SkMinScalar(rw, rh) && !fDoFill) { |
| 1523 r = rect; | 1536 r = rect; |
| 1524 r.inset(radius, radius); | 1537 r.inset(radius, radius); |
| 1525 dst->addRect(r, reverse_direction(dir)); | 1538 dst->addRect(r, reverse_direction(dir)); |
| 1526 } | 1539 } |
| 1527 } | 1540 } |
| OLD | NEW |