From 1a0b9ed7d8e16a8ebc34732b5e54246003921423 Mon Sep 17 00:00:00 2001 From: bsalomon Date: Fri, 6 May 2016 11:07:03 -0700 Subject: Fix issue where GrStyle::applyToPath exited before applying stroke GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1954123002 Review-Url: https://codereview.chromium.org/1954123002 --- src/gpu/GrStyle.cpp | 10 ++++++++-- src/gpu/GrStyle.h | 12 ++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/gpu/GrStyle.cpp b/src/gpu/GrStyle.cpp index 6480fb341a..68238dded9 100644 --- a/src/gpu/GrStyle.cpp +++ b/src/gpu/GrStyle.cpp @@ -137,14 +137,20 @@ bool GrStyle::applyToPath(SkPath* dst, SkStrokeRec::InitStyle* style, const SkPa 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()); diff --git a/src/gpu/GrStyle.h b/src/gpu/GrStyle.h index bc87ebd61f..2ca037a463 100644 --- a/src/gpu/GrStyle.h +++ b/src/gpu/GrStyle.h @@ -135,14 +135,18 @@ public: /** * 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 { -- cgit v1.2.3