SkASSERT(style);
SkASSERT(dst);
SkStrokeRec strokeRec = fStrokeRec;
- if (!apply_path_effect(dst, &strokeRec, fPathEffect, src)) {
+ const SkPath* pathForStrokeRec = &src;
+ if (apply_path_effect(dst, &strokeRec, fPathEffect, src)) {
+ pathForStrokeRec = dst;
+ } else if (fPathEffect) {
return false;
}
if (strokeRec.needToApply()) {
- if (!strokeRec.applyToPath(dst, *dst)) {
+ if (!strokeRec.applyToPath(dst, *pathForStrokeRec)) {
return false;
}
*style = SkStrokeRec::kFill_InitStyle;
+ } else if (!fPathEffect) {
+ // Nothing to do for path effect or stroke, fail.
+ return false;
} else {
SkASSERT(SkStrokeRec::kFill_Style == strokeRec.getStyle() ||
SkStrokeRec::kHairline_Style == strokeRec.getStyle());
/**
* Applies just the path effect and returns remaining stroke information. This will fail if
- * there is no path effect.
+ * there is no path effect. dst may or may not have been overwritten on failure.
*/
- bool applyPathEffectToPath(SkPath* dst, SkStrokeRec* remainingStoke, const SkPath& src) const;
+ bool SK_WARN_UNUSED_RESULT applyPathEffectToPath(SkPath* dst, SkStrokeRec* remainingStoke,
+ const SkPath& src) const;
/** If this succeeds then the result path should be filled or hairlined as indicated by the
returned SkStrokeRec::InitStyle value. Will fail if there is no path effect and the
- strokerec doesn't change the geometry. */
- bool applyToPath(SkPath* dst, SkStrokeRec::InitStyle* fillOrHairline, const SkPath& src) const;
+ strokerec doesn't change the geometry. When this fails the outputs may or may not have
+ been overwritten.
+ */
+ bool SK_WARN_UNUSED_RESULT applyToPath(SkPath* dst, SkStrokeRec::InitStyle* fillOrHairline,
+ const SkPath& src) const;
/** Given bounds of a path compute the bounds of path with the style applied. */
void adjustBounds(SkRect* dst, const SkRect& src) const {
SkPath postAllStyle;
fBase.asPath(&preStyle);
- SkStrokeRec postPathEffectStrokeRec(SkStrokeRec::kFill_InitStyle);
- if (fBase.style().applyPathEffectToPath(&postPathEffect, &postPathEffectStrokeRec,
- preStyle)) {
+ SkStrokeRec postPEStrokeRec(SkStrokeRec::kFill_InitStyle);
+ if (fBase.style().applyPathEffectToPath(&postPathEffect, &postPEStrokeRec, preStyle)) {
+ // run postPathEffect through GrShape to get any geometry reductions that would have
+ // occurred to fAppliedPE.
+ GrShape(postPathEffect, GrStyle(postPEStrokeRec, nullptr)).asPath(&postPathEffect);
+
SkPath testPath;
fAppliedPE.asPath(&testPath);
REPORTER_ASSERT(r, testPath == postPathEffect);
- REPORTER_ASSERT(r,
- postPathEffectStrokeRec.hasEqualEffect(fAppliedPE.style().strokeRec()));
+ REPORTER_ASSERT(r, postPEStrokeRec.hasEqualEffect(fAppliedPE.style().strokeRec()));
}
SkStrokeRec::InitStyle fillOrHairline;
if (fBase.style().applyToPath(&postAllStyle, &fillOrHairline, preStyle)) {
+ // run postPathEffect through GrShape to get any reductions that would have occurred
+ // to fAppliedFull.
+ GrShape(postAllStyle, GrStyle(fillOrHairline)).asPath(&postAllStyle);
+
SkPath testPath;
fAppliedFull.asPath(&testPath);
REPORTER_ASSERT(r, testPath == postAllStyle);