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 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 fEndSet = true; | 151 fEndSet = true; |
152 return true; | 152 return true; |
153 } | 153 } |
154 }; | 154 }; |
155 #endif | 155 #endif |
156 | 156 |
157 class SkPathStroker { | 157 class SkPathStroker { |
158 public: | 158 public: |
159 #if QUAD_STROKE_APPROXIMATION | 159 #if QUAD_STROKE_APPROXIMATION |
160 SkPathStroker(const SkPath& src, | 160 SkPathStroker(const SkPath& src, |
161 SkScalar radius, SkScalar miterLimit, SkScalar error, SkPaint:
:Cap cap, | 161 SkScalar radius, SkScalar miterLimit, SkScalar error, SkPaint:
:Cap, |
162 SkPaint::Join join); | 162 SkPaint::Join, SkScalar resScale); |
163 #else | 163 #else |
164 SkPathStroker(const SkPath& src, | 164 SkPathStroker(const SkPath& src, |
165 SkScalar radius, SkScalar miterLimit, SkPaint::Cap cap, | 165 SkScalar radius, SkScalar miterLimit, SkPaint::Cap, |
166 SkPaint::Join join); | 166 SkPaint::Join, SkScalar resScale); |
167 #endif | 167 #endif |
168 | 168 |
169 void moveTo(const SkPoint&); | 169 void moveTo(const SkPoint&); |
170 void lineTo(const SkPoint&); | 170 void lineTo(const SkPoint&); |
171 void quadTo(const SkPoint&, const SkPoint&); | 171 void quadTo(const SkPoint&, const SkPoint&); |
172 void cubicTo(const SkPoint&, const SkPoint&, const SkPoint&); | 172 void cubicTo(const SkPoint&, const SkPoint&, const SkPoint&); |
173 void close(bool isLine) { this->finishContour(true, isLine); } | 173 void close(bool isLine) { this->finishContour(true, isLine); } |
174 | 174 |
175 void done(SkPath* dst, bool isLine) { | 175 void done(SkPath* dst, bool isLine) { |
176 this->finishContour(false, isLine); | 176 this->finishContour(false, isLine); |
177 fOuter.addPath(fExtra); | 177 fOuter.addPath(fExtra); |
178 dst->swap(fOuter); | 178 dst->swap(fOuter); |
179 } | 179 } |
180 | 180 |
| 181 SkScalar getResScale() const { return fResScale; } |
| 182 |
181 private: | 183 private: |
182 #if QUAD_STROKE_APPROXIMATION | 184 #if QUAD_STROKE_APPROXIMATION |
183 SkScalar fError; | 185 SkScalar fError; |
184 #endif | 186 #endif |
185 SkScalar fRadius; | 187 SkScalar fRadius; |
186 SkScalar fInvMiterLimit; | 188 SkScalar fInvMiterLimit; |
| 189 SkScalar fResScale; |
187 | 190 |
188 SkVector fFirstNormal, fPrevNormal, fFirstUnitNormal, fPrevUnitNormal; | 191 SkVector fFirstNormal, fPrevNormal, fFirstUnitNormal, fPrevUnitNormal; |
189 SkPoint fFirstPt, fPrevPt; // on original path | 192 SkPoint fFirstPt, fPrevPt; // on original path |
190 SkPoint fFirstOuterPt; | 193 SkPoint fFirstOuterPt; |
191 int fSegmentCount; | 194 int fSegmentCount; |
192 bool fPrevIsLine; | 195 bool fPrevIsLine; |
193 | 196 |
194 SkStrokerPriv::CapProc fCapper; | 197 SkStrokerPriv::CapProc fCapper; |
195 SkStrokerPriv::JoinProc fJoiner; | 198 SkStrokerPriv::JoinProc fJoiner; |
196 | 199 |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 // reallocating its internal storage. | 344 // reallocating its internal storage. |
342 fInner.rewind(); | 345 fInner.rewind(); |
343 fSegmentCount = -1; | 346 fSegmentCount = -1; |
344 } | 347 } |
345 | 348 |
346 /////////////////////////////////////////////////////////////////////////////// | 349 /////////////////////////////////////////////////////////////////////////////// |
347 | 350 |
348 #if QUAD_STROKE_APPROXIMATION | 351 #if QUAD_STROKE_APPROXIMATION |
349 SkPathStroker::SkPathStroker(const SkPath& src, | 352 SkPathStroker::SkPathStroker(const SkPath& src, |
350 SkScalar radius, SkScalar miterLimit, SkScalar erro
r, | 353 SkScalar radius, SkScalar miterLimit, SkScalar erro
r, |
351 SkPaint::Cap cap, SkPaint::Join join) | 354 SkPaint::Cap cap, SkPaint::Join join, SkScalar resS
cale) |
352 #else | 355 #else |
353 SkPathStroker::SkPathStroker(const SkPath& src, | 356 SkPathStroker::SkPathStroker(const SkPath& src, |
354 SkScalar radius, SkScalar miterLimit, | 357 SkScalar radius, SkScalar miterLimit, |
355 SkPaint::Cap cap, SkPaint::Join join) | 358 SkPaint::Cap cap, SkPaint::Join join, SkScalar resS
cale) |
356 #endif | 359 #endif |
357 : fRadius(radius) { | 360 : fRadius(radius), fResScale(resScale) { |
358 | 361 |
359 /* This is only used when join is miter_join, but we initialize it here | 362 /* This is only used when join is miter_join, but we initialize it here |
360 so that it is always defined, to fis valgrind warnings. | 363 so that it is always defined, to fis valgrind warnings. |
361 */ | 364 */ |
362 fInvMiterLimit = 0; | 365 fInvMiterLimit = 0; |
363 | 366 |
364 if (join == SkPaint::kMiter_Join) { | 367 if (join == SkPaint::kMiter_Join) { |
365 if (miterLimit <= SK_Scalar1) { | 368 if (miterLimit <= SK_Scalar1) { |
366 join = SkPaint::kBevel_Join; | 369 join = SkPaint::kBevel_Join; |
367 } else { | 370 } else { |
(...skipping 1054 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1422 // our answer should preserve the inverseness of the src | 1425 // our answer should preserve the inverseness of the src |
1423 if (src.isInverseFillType()) { | 1426 if (src.isInverseFillType()) { |
1424 SkASSERT(!dst->isInverseFillType()); | 1427 SkASSERT(!dst->isInverseFillType()); |
1425 dst->toggleInverseFillType(); | 1428 dst->toggleInverseFillType(); |
1426 } | 1429 } |
1427 return; | 1430 return; |
1428 } | 1431 } |
1429 } | 1432 } |
1430 | 1433 |
1431 SkAutoConicToQuads converter; | 1434 SkAutoConicToQuads converter; |
1432 const SkScalar conicTol = SK_Scalar1 / 4; | 1435 const SkScalar conicTol = SK_Scalar1 / 4 / fResScale; |
1433 | 1436 |
1434 #if QUAD_STROKE_APPROXIMATION | 1437 #if QUAD_STROKE_APPROXIMATION |
1435 SkPathStroker stroker(src, radius, fMiterLimit, fError, this->getCap(), | 1438 SkPathStroker stroker(src, radius, fMiterLimit, fError, this->getCap(), |
1436 this->getJoin()); | 1439 this->getJoin(), fResScale); |
1437 #else | 1440 #else |
1438 SkPathStroker stroker(src, radius, fMiterLimit, this->getCap(), | 1441 SkPathStroker stroker(src, radius, fMiterLimit, this->getCap(), this->getJ
oin(), fResScale); |
1439 this->getJoin()); | |
1440 #endif | 1442 #endif |
1441 SkPath::Iter iter(src, false); | 1443 SkPath::Iter iter(src, false); |
1442 SkPath::Verb lastSegment = SkPath::kMove_Verb; | 1444 SkPath::Verb lastSegment = SkPath::kMove_Verb; |
1443 | 1445 |
1444 for (;;) { | 1446 for (;;) { |
1445 SkPoint pts[4]; | 1447 SkPoint pts[4]; |
1446 switch (iter.next(pts, false)) { | 1448 switch (iter.next(pts, false)) { |
1447 case SkPath::kMove_Verb: | 1449 case SkPath::kMove_Verb: |
1448 stroker.moveTo(pts[0]); | 1450 stroker.moveTo(pts[0]); |
1449 break; | 1451 break; |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1587 default: | 1589 default: |
1588 break; | 1590 break; |
1589 } | 1591 } |
1590 | 1592 |
1591 if (fWidth < SkMinScalar(rw, rh) && !fDoFill) { | 1593 if (fWidth < SkMinScalar(rw, rh) && !fDoFill) { |
1592 r = rect; | 1594 r = rect; |
1593 r.inset(radius, radius); | 1595 r.inset(radius, radius); |
1594 dst->addRect(r, reverse_direction(dir)); | 1596 dst->addRect(r, reverse_direction(dir)); |
1595 } | 1597 } |
1596 } | 1598 } |
OLD | NEW |