OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkDashPathEffect.h" | 10 #include "SkDashPathEffect.h" |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 | 230 |
231 bool SkDashPathEffect::filterPath(SkPath* dst, const SkPath& src, | 231 bool SkDashPathEffect::filterPath(SkPath* dst, const SkPath& src, |
232 SkStrokeRec* rec, const SkRect* cullRect) const { | 232 SkStrokeRec* rec, const SkRect* cullRect) const { |
233 // we do nothing if the src wants to be filled, or if our dashlength is 0 | 233 // we do nothing if the src wants to be filled, or if our dashlength is 0 |
234 if (rec->isFillStyle() || fInitialDashLength < 0) { | 234 if (rec->isFillStyle() || fInitialDashLength < 0) { |
235 return false; | 235 return false; |
236 } | 236 } |
237 | 237 |
238 const SkScalar* intervals = fIntervals; | 238 const SkScalar* intervals = fIntervals; |
239 SkScalar dashCount = 0; | 239 SkScalar dashCount = 0; |
| 240 int segCount = 0; |
240 | 241 |
241 SkPath cullPathStorage; | 242 SkPath cullPathStorage; |
242 const SkPath* srcPtr = &src; | 243 const SkPath* srcPtr = &src; |
243 if (cull_path(src, *rec, cullRect, fIntervalLength, &cullPathStorage)) { | 244 if (cull_path(src, *rec, cullRect, fIntervalLength, &cullPathStorage)) { |
244 srcPtr = &cullPathStorage; | 245 srcPtr = &cullPathStorage; |
245 } | 246 } |
246 | 247 |
247 SpecialLineRec lineRec; | 248 SpecialLineRec lineRec; |
248 bool specialLine = lineRec.init(*srcPtr, dst, rec, fCount >> 1, fIntervalLen
gth); | 249 bool specialLine = lineRec.init(*srcPtr, dst, rec, fCount >> 1, fIntervalLen
gth); |
249 | 250 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 // Using double precision to avoid looping indefinitely due to single pr
ecision rounding | 285 // Using double precision to avoid looping indefinitely due to single pr
ecision rounding |
285 // (for extreme path_length/dash_length ratios). See test_infinite_dash(
) unittest. | 286 // (for extreme path_length/dash_length ratios). See test_infinite_dash(
) unittest. |
286 double distance = 0; | 287 double distance = 0; |
287 double dlen = SkScalarMul(fInitialDashLength, scale); | 288 double dlen = SkScalarMul(fInitialDashLength, scale); |
288 | 289 |
289 while (distance < length) { | 290 while (distance < length) { |
290 SkASSERT(dlen >= 0); | 291 SkASSERT(dlen >= 0); |
291 addedSegment = false; | 292 addedSegment = false; |
292 if (is_even(index) && dlen > 0 && !skipFirstSegment) { | 293 if (is_even(index) && dlen > 0 && !skipFirstSegment) { |
293 addedSegment = true; | 294 addedSegment = true; |
| 295 ++segCount; |
294 | 296 |
295 if (specialLine) { | 297 if (specialLine) { |
296 lineRec.addSegment(SkDoubleToScalar(distance), | 298 lineRec.addSegment(SkDoubleToScalar(distance), |
297 SkDoubleToScalar(distance + dlen), | 299 SkDoubleToScalar(distance + dlen), |
298 dst); | 300 dst); |
299 } else { | 301 } else { |
300 meas.getSegment(SkDoubleToScalar(distance), | 302 meas.getSegment(SkDoubleToScalar(distance), |
301 SkDoubleToScalar(distance + dlen), | 303 SkDoubleToScalar(distance + dlen), |
302 dst, true); | 304 dst, true); |
303 } | 305 } |
(...skipping 11 matching lines...) Expand all Loading... |
315 } | 317 } |
316 | 318 |
317 // fetch our next dlen | 319 // fetch our next dlen |
318 dlen = SkScalarMul(intervals[index], scale); | 320 dlen = SkScalarMul(intervals[index], scale); |
319 } | 321 } |
320 | 322 |
321 // extend if we ended on a segment and we need to join up with the (skip
ped) initial segment | 323 // extend if we ended on a segment and we need to join up with the (skip
ped) initial segment |
322 if (meas.isClosed() && is_even(fInitialDashIndex) && | 324 if (meas.isClosed() && is_even(fInitialDashIndex) && |
323 fInitialDashLength > 0) { | 325 fInitialDashLength > 0) { |
324 meas.getSegment(0, SkScalarMul(fInitialDashLength, scale), dst, !add
edSegment); | 326 meas.getSegment(0, SkScalarMul(fInitialDashLength, scale), dst, !add
edSegment); |
| 327 ++segCount; |
325 } | 328 } |
326 } while (meas.nextContour()); | 329 } while (meas.nextContour()); |
327 | 330 |
| 331 if (segCount > 1) { |
| 332 dst->setConvexity(SkPath::kConcave_Convexity); |
| 333 } |
| 334 |
328 return true; | 335 return true; |
329 } | 336 } |
330 | 337 |
331 // Currently asPoints is more restrictive then it needs to be. In the future | 338 // Currently asPoints is more restrictive then it needs to be. In the future |
332 // we need to: | 339 // we need to: |
333 // allow kRound_Cap capping (could allow rotations in the matrix with this) | 340 // allow kRound_Cap capping (could allow rotations in the matrix with this) |
334 // allow paths to be returned | 341 // allow paths to be returned |
335 bool SkDashPathEffect::asPoints(PointData* results, | 342 bool SkDashPathEffect::asPoints(PointData* results, |
336 const SkPath& src, | 343 const SkPath& src, |
337 const SkStrokeRec& rec, | 344 const SkStrokeRec& rec, |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 SkDashPathEffect::SkDashPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(
buffer) { | 550 SkDashPathEffect::SkDashPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(
buffer) { |
544 fInitialDashIndex = buffer.readInt(); | 551 fInitialDashIndex = buffer.readInt(); |
545 fInitialDashLength = buffer.readScalar(); | 552 fInitialDashLength = buffer.readScalar(); |
546 fIntervalLength = buffer.readScalar(); | 553 fIntervalLength = buffer.readScalar(); |
547 fScaleToFit = buffer.readBool(); | 554 fScaleToFit = buffer.readBool(); |
548 | 555 |
549 fCount = buffer.getArrayCount(); | 556 fCount = buffer.getArrayCount(); |
550 fIntervals = (SkScalar*)sk_malloc_throw(sizeof(SkScalar) * fCount); | 557 fIntervals = (SkScalar*)sk_malloc_throw(sizeof(SkScalar) * fCount); |
551 buffer.readScalarArray(fIntervals); | 558 buffer.readScalarArray(fIntervals); |
552 } | 559 } |
OLD | NEW |