Index: src/pathops/SkPathOpsSimplify.cpp |
diff --git a/src/pathops/SkPathOpsSimplify.cpp b/src/pathops/SkPathOpsSimplify.cpp |
index 34b19d1fe2a0e73b74cbb12f19d75c6699f0a542..08bb26d9a91255f55768605e6ff0cdadaaad0093 100644 |
--- a/src/pathops/SkPathOpsSimplify.cpp |
+++ b/src/pathops/SkPathOpsSimplify.cpp |
@@ -11,7 +11,7 @@ |
#include "SkPathWriter.h" |
static bool bridgeWinding(SkOpContourHead* contourList, SkPathWriter* simple, |
- SkChunkAlloc* allocator) { |
+ SkChunkAlloc* allocator, bool* closable) { |
bool unsortable = false; |
do { |
SkOpSpan* span = FindSortableTop(contourList); |
@@ -37,7 +37,9 @@ static bool bridgeWinding(SkOpContourHead* contourList, SkPathWriter* simple, |
if (!unsortable && simple->hasMove() |
&& current->verb() != SkPath::kLine_Verb |
&& !simple->isClosed()) { |
- current->addCurveTo(start, end, simple, true); |
+ if (!current->addCurveTo(start, end, simple)) { |
+ return false; |
+ } |
#if DEBUG_ACTIVE_SPANS |
if (!simple->isClosed()) { |
DebugShowActiveSpans(contourList); |
@@ -51,7 +53,9 @@ static bool bridgeWinding(SkOpContourHead* contourList, SkPathWriter* simple, |
current->debugID(), start->pt().fX, start->pt().fY, |
end->pt().fX, end->pt().fY); |
#endif |
- current->addCurveTo(start, end, simple, true); |
+ if (!current->addCurveTo(start, end, simple)) { |
+ return false; |
+ } |
current = next; |
start = nextStart; |
end = nextEnd; |
@@ -59,7 +63,9 @@ static bool bridgeWinding(SkOpContourHead* contourList, SkPathWriter* simple, |
if (current->activeWinding(start, end) && !simple->isClosed()) { |
SkOpSpan* spanStart = start->starter(end); |
if (!spanStart->done()) { |
- current->addCurveTo(start, end, simple, true); |
+ if (!current->addCurveTo(start, end, simple)) { |
+ return false; |
+ } |
current->markDone(spanStart); |
} |
} |
@@ -88,17 +94,18 @@ static bool bridgeWinding(SkOpContourHead* contourList, SkPathWriter* simple, |
} |
} while (true); |
} while (true); |
- return simple->someAssemblyRequired(); |
+ *closable = !simple->someAssemblyRequired(); |
+ return true; |
} |
// returns true if all edges were processed |
static bool bridgeXor(SkOpContourHead* contourList, SkPathWriter* simple, |
- SkChunkAlloc* allocator) { |
+ SkChunkAlloc* allocator, bool* closable) { |
SkOpSegment* current; |
SkOpSpanBase* start; |
SkOpSpanBase* end; |
bool unsortable = false; |
- bool closable = true; |
+ *closable = true; |
while ((current = FindUndone(contourList, &start, &end))) { |
do { |
#if DEBUG_ACTIVE_SPANS |
@@ -114,7 +121,9 @@ static bool bridgeXor(SkOpContourHead* contourList, SkPathWriter* simple, |
if (!unsortable && simple->hasMove() |
&& current->verb() != SkPath::kLine_Verb |
&& !simple->isClosed()) { |
- current->addCurveTo(start, end, simple, true); |
+ if (!current->addCurveTo(start, end, simple)) { |
+ return false; |
+ } |
#if DEBUG_ACTIVE_SPANS |
if (!simple->isClosed()) { |
DebugShowActiveSpans(contourList); |
@@ -128,7 +137,9 @@ static bool bridgeXor(SkOpContourHead* contourList, SkPathWriter* simple, |
current->debugID(), start->pt().fX, start->pt().fY, |
end->pt().fX, end->pt().fY); |
#endif |
- current->addCurveTo(start, end, simple, true); |
+ if (!current->addCurveTo(start, end, simple)) { |
+ return false; |
+ } |
current = next; |
start = nextStart; |
end = nextEnd; |
@@ -137,17 +148,19 @@ static bool bridgeXor(SkOpContourHead* contourList, SkPathWriter* simple, |
SkASSERT(unsortable); |
SkOpSpan* spanStart = start->starter(end); |
if (!spanStart->done()) { |
- current->addCurveTo(start, end, simple, true); |
+ if (!current->addCurveTo(start, end, simple)) { |
+ return false; |
+ } |
current->markDone(spanStart); |
} |
- closable = false; |
+ *closable = false; |
} |
simple->close(); |
#if DEBUG_ACTIVE_SPANS |
DebugShowActiveSpans(contourList); |
#endif |
} |
- return closable; |
+ return true; |
} |
// FIXME : add this as a member of SkPath |
@@ -203,8 +216,13 @@ bool Simplify(const SkPath& path, SkPath* result) { |
result->reset(); |
result->setFillType(fillType); |
SkPathWriter wrapper(*result); |
- if (builder.xorMask() == kWinding_PathOpsMask ? bridgeWinding(contourList, &wrapper, &allocator) |
- : !bridgeXor(contourList, &wrapper, &allocator)) |
+ bool closable; |
+ if (builder.xorMask() == kWinding_PathOpsMask |
+ ? !bridgeWinding(contourList, &wrapper, &allocator, &closable) |
+ : !bridgeXor(contourList, &wrapper, &allocator, &closable)) { |
+ return false; |
+ } |
+ if (!closable) |
{ // if some edges could not be resolved, assemble remaining fragments |
SkPath temp; |
temp.setFillType(fillType); |