| Index: src/core/SkRegion_path.cpp
|
| diff --git a/src/core/SkRegion_path.cpp b/src/core/SkRegion_path.cpp
|
| index e9224d824e6c7b51e7e488c7aa6e2223a561737c..5b665d47061dead3a47e3e5c0d97d3340a35c55f 100644
|
| --- a/src/core/SkRegion_path.cpp
|
| +++ b/src/core/SkRegion_path.cpp
|
| @@ -268,7 +268,7 @@ static unsigned verb_to_max_edges(unsigned verb) {
|
| return gPathVerbToMaxEdges[verb];
|
| }
|
|
|
| -
|
| +// If returns 0, ignore itop and ibot
|
| static int count_path_runtype_values(const SkPath& path, int* itop, int* ibot) {
|
| SkPath::Iter iter(path, true);
|
| SkPoint pts[4];
|
| @@ -298,13 +298,24 @@ static int count_path_runtype_values(const SkPath& path, int* itop, int* ibot) {
|
| }
|
| }
|
| }
|
| - SkASSERT(top <= bot);
|
| + if (0 == maxEdges) {
|
| + return 0; // we have only moves+closes
|
| + }
|
|
|
| + SkASSERT(top <= bot);
|
| *itop = SkScalarRoundToInt(top);
|
| *ibot = SkScalarRoundToInt(bot);
|
| return maxEdges;
|
| }
|
|
|
| +static bool check_inverse_on_empty_return(SkRegion* dst, const SkPath& path, const SkRegion& clip) {
|
| + if (path.isInverseFillType()) {
|
| + return dst->set(clip);
|
| + } else {
|
| + return dst->setEmpty();
|
| + }
|
| +}
|
| +
|
| bool SkRegion::setPath(const SkPath& path, const SkRegion& clip) {
|
| SkDEBUGCODE(this->validate();)
|
|
|
| @@ -313,26 +324,24 @@ bool SkRegion::setPath(const SkPath& path, const SkRegion& clip) {
|
| }
|
|
|
| if (path.isEmpty()) {
|
| - if (path.isInverseFillType()) {
|
| - return this->set(clip);
|
| - } else {
|
| - return this->setEmpty();
|
| - }
|
| + return check_inverse_on_empty_return(this, path, clip);
|
| }
|
|
|
| // compute worst-case rgn-size for the path
|
| int pathTop, pathBot;
|
| int pathTransitions = count_path_runtype_values(path, &pathTop, &pathBot);
|
| - int clipTop, clipBot;
|
| - int clipTransitions;
|
| + if (0 == pathTransitions) {
|
| + return check_inverse_on_empty_return(this, path, clip);
|
| + }
|
|
|
| - clipTransitions = clip.count_runtype_values(&clipTop, &clipBot);
|
| + int clipTop, clipBot;
|
| + int clipTransitions = clip.count_runtype_values(&clipTop, &clipBot);
|
|
|
| int top = SkMax32(pathTop, clipTop);
|
| int bot = SkMin32(pathBot, clipBot);
|
| -
|
| - if (top >= bot)
|
| - return this->setEmpty();
|
| + if (top >= bot) {
|
| + return check_inverse_on_empty_return(this, path, clip);
|
| + }
|
|
|
| SkRgnBuilder builder;
|
|
|
|
|