update pathops core and tests
split out skpclip (the test of 1M pictures) into its own project TBR=reed Author: caryclark@google.com Review URL: https://codereview.chromium.org/400033002
This commit is contained in:
parent
384b0202c0
commit
19eb3b2f0a
@ -21,6 +21,7 @@
|
||||
'tests.gyp:tests',
|
||||
'tools.gyp:tools',
|
||||
'pathops_unittest.gyp:*',
|
||||
'pathops_skpclip.gyp:*',
|
||||
# 'pdfviewer.gyp:pdfviewer',
|
||||
'dm.gyp:dm',
|
||||
],
|
||||
|
46
gyp/pathops_skpclip.gyp
Executable file
46
gyp/pathops_skpclip.gyp
Executable file
@ -0,0 +1,46 @@
|
||||
# GYP file to build pathops skp clip test.
|
||||
{
|
||||
'includes': [
|
||||
'apptype_console.gypi',
|
||||
],
|
||||
'targets': [
|
||||
{
|
||||
'target_name': 'pathops_skpclip',
|
||||
'type': 'executable',
|
||||
'include_dirs': [
|
||||
'../src/core',
|
||||
'../src/effects',
|
||||
'../src/lazy',
|
||||
'../src/pathops',
|
||||
'../src/pipe/utils',
|
||||
'../src/utils',
|
||||
],
|
||||
'dependencies': [
|
||||
'flags.gyp:flags',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
'tools.gyp:crash_handler',
|
||||
'tools.gyp:resources',
|
||||
],
|
||||
'sources': [
|
||||
'../tests/PathOpsDebug.cpp',
|
||||
'../tests/PathOpsSkpClipTest.cpp',
|
||||
],
|
||||
'conditions': [
|
||||
[ 'skia_android_framework == 1', {
|
||||
'libraries': [
|
||||
'-lskia',
|
||||
],
|
||||
'libraries!': [
|
||||
'-lz',
|
||||
'-llog',
|
||||
],
|
||||
}],
|
||||
[ 'skia_gpu == 1', {
|
||||
'include_dirs': [
|
||||
'../src/gpu',
|
||||
],
|
||||
}],
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
@ -16,7 +16,6 @@
|
||||
'../tests/PathOpsCubicLineIntersectionIdeas.cpp',
|
||||
'../tests/PathOpsDebug.cpp',
|
||||
'../tests/PathOpsOpLoopThreadedTest.cpp',
|
||||
'../tests/PathOpsSkpClipTest.cpp',
|
||||
'../tests/skia_test.cpp',
|
||||
],
|
||||
'conditions': [
|
||||
|
@ -173,21 +173,24 @@ int SkIntersections::intersect(const SkDLine& a, const SkDLine& b) {
|
||||
nearCount += t >= 0;
|
||||
}
|
||||
if (nearCount > 0) {
|
||||
for (int iA = 0; iA < 2; ++iA) {
|
||||
if (!aNotB[iA]) {
|
||||
continue;
|
||||
// Skip if each segment contributes to one end point.
|
||||
if (nearCount != 2 || aNotB[0] == aNotB[1]) {
|
||||
for (int iA = 0; iA < 2; ++iA) {
|
||||
if (!aNotB[iA]) {
|
||||
continue;
|
||||
}
|
||||
int nearer = aNearB[iA] > 0.5;
|
||||
if (!bNotA[nearer]) {
|
||||
continue;
|
||||
}
|
||||
SkASSERT(a[iA] != b[nearer]);
|
||||
SkASSERT(iA == (bNearA[nearer] > 0.5));
|
||||
fNearlySame[iA] = true;
|
||||
insertNear(iA, nearer, a[iA], b[nearer]);
|
||||
aNearB[iA] = -1;
|
||||
bNearA[nearer] = -1;
|
||||
nearCount -= 2;
|
||||
}
|
||||
int nearer = aNearB[iA] > 0.5;
|
||||
if (!bNotA[nearer]) {
|
||||
continue;
|
||||
}
|
||||
SkASSERT(a[iA] != b[nearer]);
|
||||
SkASSERT(iA == (bNearA[nearer] > 0.5));
|
||||
fNearlySame[iA] = true;
|
||||
insertNear(iA, nearer, a[iA], b[nearer]);
|
||||
aNearB[iA] = -1;
|
||||
bNearA[nearer] = -1;
|
||||
nearCount -= 2;
|
||||
}
|
||||
if (nearCount > 0) {
|
||||
for (int iA = 0; iA < 2; ++iA) {
|
||||
|
@ -405,12 +405,14 @@ void SkOpSegment::addCurveTo(int start, int end, SkPathWriter* path, bool active
|
||||
}
|
||||
|
||||
void SkOpSegment::addEndSpan(int endIndex) {
|
||||
SkASSERT(span(endIndex).fT == 1 || (span(endIndex).fTiny
|
||||
&& approximately_greater_than_one(span(endIndex).fT)));
|
||||
int spanCount = fTs.count();
|
||||
int startIndex = endIndex - 1;
|
||||
while (fTs[startIndex].fT == 1 || fTs[startIndex].fTiny) {
|
||||
++startIndex;
|
||||
SkASSERT(startIndex < spanCount - 1);
|
||||
++endIndex;
|
||||
--startIndex;
|
||||
SkASSERT(startIndex > 0);
|
||||
--endIndex;
|
||||
}
|
||||
SkOpAngle& angle = fAngles.push_back();
|
||||
angle.set(this, spanCount - 1, startIndex);
|
||||
@ -815,7 +817,11 @@ int SkOpSegment::addSelfT(const SkPoint& pt, double newT) {
|
||||
// FIXME? assert that only one other span has a valid windValue or oppValue
|
||||
void SkOpSegment::addSimpleAngle(int index) {
|
||||
SkOpSpan* span = &fTs[index];
|
||||
if (index == 0) {
|
||||
int idx;
|
||||
int start, end;
|
||||
if (span->fT == 0) {
|
||||
idx = 0;
|
||||
span = &fTs[0];
|
||||
do {
|
||||
if (span->fToAngle) {
|
||||
SkASSERT(span->fToAngle->loopCount() == 2);
|
||||
@ -823,13 +829,15 @@ void SkOpSegment::addSimpleAngle(int index) {
|
||||
span->fFromAngle = span->fToAngle->next();
|
||||
return;
|
||||
}
|
||||
span = &fTs[++index];
|
||||
span = &fTs[++idx];
|
||||
} while (span->fT == 0);
|
||||
SkASSERT(index == 1);
|
||||
index = 0;
|
||||
SkASSERT(!fTs[0].fTiny && fTs[1].fT > 0);
|
||||
addStartSpan(1);
|
||||
SkASSERT(!fTs[0].fTiny && fTs[idx].fT > 0);
|
||||
addStartSpan(idx);
|
||||
start = 0;
|
||||
end = idx;
|
||||
} else {
|
||||
idx = count() - 1;
|
||||
span = &fTs[idx];
|
||||
do {
|
||||
if (span->fFromAngle) {
|
||||
SkASSERT(span->fFromAngle->loopCount() == 2);
|
||||
@ -837,29 +845,48 @@ void SkOpSegment::addSimpleAngle(int index) {
|
||||
span->fToAngle = span->fFromAngle->next();
|
||||
return;
|
||||
}
|
||||
span = &fTs[--index];
|
||||
span = &fTs[--idx];
|
||||
} while (span->fT == 1);
|
||||
SkASSERT(index == count() - 2);
|
||||
index = count() - 1;
|
||||
SkASSERT(!fTs[index - 1].fTiny && fTs[index - 1].fT < 1);
|
||||
addEndSpan(index);
|
||||
SkASSERT(!fTs[idx].fTiny && fTs[idx].fT < 1);
|
||||
addEndSpan(++idx);
|
||||
start = idx;
|
||||
end = count();
|
||||
}
|
||||
span = &fTs[index];
|
||||
SkOpSegment* other = span->fOther;
|
||||
SkOpSpan& oSpan = other->fTs[span->fOtherIndex];
|
||||
SkOpSegment* other;
|
||||
SkOpSpan* oSpan;
|
||||
index = start;
|
||||
do {
|
||||
span = &fTs[index];
|
||||
other = span->fOther;
|
||||
int oFrom = span->fOtherIndex;
|
||||
oSpan = &other->fTs[oFrom];
|
||||
if (oSpan->fT < 1 && oSpan->fWindValue) {
|
||||
break;
|
||||
}
|
||||
if (oSpan->fT == 0) {
|
||||
continue;
|
||||
}
|
||||
oFrom = other->nextExactSpan(oFrom, -1);
|
||||
SkOpSpan* oFromSpan = &other->fTs[oFrom];
|
||||
SkASSERT(oFromSpan->fT < 1);
|
||||
if (oFromSpan->fWindValue) {
|
||||
break;
|
||||
}
|
||||
} while (++index < end);
|
||||
SkOpAngle* angle, * oAngle;
|
||||
if (index == 0) {
|
||||
if (span->fT == 0) {
|
||||
SkASSERT(span->fOtherIndex - 1 >= 0);
|
||||
SkASSERT(span->fOtherT == 1);
|
||||
SkDEBUGCODE(SkOpSpan& oPrior = other->fTs[span->fOtherIndex - 1]);
|
||||
SkDEBUGCODE(int oPriorIndex = other->nextExactSpan(span->fOtherIndex, -1));
|
||||
SkDEBUGCODE(const SkOpSpan& oPrior = other->span(oPriorIndex));
|
||||
SkASSERT(!oPrior.fTiny && oPrior.fT < 1);
|
||||
other->addEndSpan(span->fOtherIndex);
|
||||
angle = span->fToAngle;
|
||||
oAngle = oSpan.fFromAngle;
|
||||
oAngle = oSpan->fFromAngle;
|
||||
} else {
|
||||
SkASSERT(span->fOtherIndex + 1 < other->count());
|
||||
SkASSERT(span->fOtherT == 0);
|
||||
SkASSERT(!oSpan.fTiny && (other->fTs[span->fOtherIndex + 1].fT > 0
|
||||
SkASSERT(!oSpan->fTiny && (other->fTs[span->fOtherIndex + 1].fT > 0
|
||||
|| (other->fTs[span->fOtherIndex + 1].fFromAngle == NULL
|
||||
&& other->fTs[span->fOtherIndex + 1].fToAngle == NULL)));
|
||||
int oIndex = 1;
|
||||
@ -873,7 +900,7 @@ void SkOpSegment::addSimpleAngle(int index) {
|
||||
} while (true);
|
||||
other->addStartSpan(oIndex);
|
||||
angle = span->fFromAngle;
|
||||
oAngle = oSpan.fToAngle;
|
||||
oAngle = oSpan->fToAngle;
|
||||
}
|
||||
angle->insert(oAngle);
|
||||
}
|
||||
@ -1348,7 +1375,10 @@ void SkOpSegment::addTCoincident(const SkPoint& startPt, const SkPoint& endPt, d
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
oPeek = &other->fTs[++oPeekIndex];
|
||||
if (++oPeekIndex == oCount) {
|
||||
break;
|
||||
}
|
||||
oPeek = &other->fTs[oPeekIndex];
|
||||
} while (endPt == oPeek->fPt);
|
||||
}
|
||||
if (success) {
|
||||
@ -3402,7 +3432,7 @@ SkOpSpan* SkOpSegment::markAndChaseWinding(const SkOpAngle* angle, int winding)
|
||||
SkOpSegment* other = this;
|
||||
while ((other = other->nextChase(&index, &step, &min, &last))) {
|
||||
if (other->fTs[min].fWindSum != SK_MinS32) {
|
||||
SkASSERT(other->fTs[min].fWindSum == winding);
|
||||
// SkASSERT(other->fTs[min].fWindSum == winding);
|
||||
SkASSERT(!last);
|
||||
break;
|
||||
}
|
||||
|
@ -108,6 +108,7 @@ void SkOpAngle::debugLoop() const {
|
||||
const SkOpAngle* next = this;
|
||||
do {
|
||||
next->dumpOne(true);
|
||||
SkDebugf("\n");
|
||||
next = next->fNext;
|
||||
} while (next && next != first);
|
||||
}
|
||||
|
@ -169,6 +169,7 @@ public:
|
||||
SkPathOpsDebug::DeleteNameStr)))
|
||||
static void BumpTestName(char* );
|
||||
#endif
|
||||
static void ShowOnePath(const SkPath& path, const char* name, bool includeDeclaration);
|
||||
static void ShowPath(const SkPath& one, const SkPath& two, SkPathOp op, const char* name);
|
||||
static void DumpCoincidence(const SkTArray<class SkOpContour, true>& contours);
|
||||
static void DumpCoincidence(const SkTArray<class SkOpContour* , true>& contours);
|
||||
|
@ -1,6 +1,7 @@
|
||||
#include "SkOpContour.h"
|
||||
#include "SkIntersectionHelper.h"
|
||||
#include "SkOpSegment.h"
|
||||
#include "SkString.h"
|
||||
|
||||
inline void DebugDumpDouble(double x) {
|
||||
if (x == floor(x)) {
|
||||
@ -18,6 +19,137 @@ inline void DebugDumpFloat(float x) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#if DEBUG_SHOW_TEST_NAME
|
||||
|
||||
static void output_scalar(SkScalar num) {
|
||||
if (num == (int) num) {
|
||||
SkDebugf("%d", (int) num);
|
||||
} else {
|
||||
SkString str;
|
||||
str.printf("%1.9g", num);
|
||||
int width = (int) str.size();
|
||||
const char* cStr = str.c_str();
|
||||
while (cStr[width - 1] == '0') {
|
||||
--width;
|
||||
}
|
||||
str.resize(width);
|
||||
SkDebugf("%sf", str.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
static void output_points(const SkPoint* pts, int count) {
|
||||
for (int index = 0; index < count; ++index) {
|
||||
output_scalar(pts[index].fX);
|
||||
SkDebugf(", ");
|
||||
output_scalar(pts[index].fY);
|
||||
if (index + 1 < count) {
|
||||
SkDebugf(", ");
|
||||
}
|
||||
}
|
||||
SkDebugf(");\n");
|
||||
}
|
||||
|
||||
static void showPathContours(SkPath::RawIter& iter, const char* pathName) {
|
||||
uint8_t verb;
|
||||
SkPoint pts[4];
|
||||
while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
|
||||
switch (verb) {
|
||||
case SkPath::kMove_Verb:
|
||||
SkDebugf(" %s.moveTo(", pathName);
|
||||
output_points(&pts[0], 1);
|
||||
continue;
|
||||
case SkPath::kLine_Verb:
|
||||
SkDebugf(" %s.lineTo(", pathName);
|
||||
output_points(&pts[1], 1);
|
||||
break;
|
||||
case SkPath::kQuad_Verb:
|
||||
SkDebugf(" %s.quadTo(", pathName);
|
||||
output_points(&pts[1], 2);
|
||||
break;
|
||||
case SkPath::kCubic_Verb:
|
||||
SkDebugf(" %s.cubicTo(", pathName);
|
||||
output_points(&pts[1], 3);
|
||||
break;
|
||||
case SkPath::kClose_Verb:
|
||||
SkDebugf(" %s.close();\n", pathName);
|
||||
break;
|
||||
default:
|
||||
SkDEBUGFAIL("bad verb");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static const char* gFillTypeStr[] = {
|
||||
"kWinding_FillType",
|
||||
"kEvenOdd_FillType",
|
||||
"kInverseWinding_FillType",
|
||||
"kInverseEvenOdd_FillType"
|
||||
};
|
||||
|
||||
void SkPathOpsDebug::ShowOnePath(const SkPath& path, const char* name, bool includeDeclaration) {
|
||||
SkPath::RawIter iter(path);
|
||||
#define SUPPORT_RECT_CONTOUR_DETECTION 0
|
||||
#if SUPPORT_RECT_CONTOUR_DETECTION
|
||||
int rectCount = path.isRectContours() ? path.rectContours(NULL, NULL) : 0;
|
||||
if (rectCount > 0) {
|
||||
SkTDArray<SkRect> rects;
|
||||
SkTDArray<SkPath::Direction> directions;
|
||||
rects.setCount(rectCount);
|
||||
directions.setCount(rectCount);
|
||||
path.rectContours(rects.begin(), directions.begin());
|
||||
for (int contour = 0; contour < rectCount; ++contour) {
|
||||
const SkRect& rect = rects[contour];
|
||||
SkDebugf("path.addRect(%1.9g, %1.9g, %1.9g, %1.9g, %s);\n", rect.fLeft, rect.fTop,
|
||||
rect.fRight, rect.fBottom, directions[contour] == SkPath::kCCW_Direction
|
||||
? "SkPath::kCCW_Direction" : "SkPath::kCW_Direction");
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
SkPath::FillType fillType = path.getFillType();
|
||||
SkASSERT(fillType >= SkPath::kWinding_FillType && fillType <= SkPath::kInverseEvenOdd_FillType);
|
||||
if (includeDeclaration) {
|
||||
SkDebugf(" SkPath %s;\n", name);
|
||||
}
|
||||
SkDebugf(" %s.setFillType(SkPath::%s);\n", name, gFillTypeStr[fillType]);
|
||||
iter.setPath(path);
|
||||
showPathContours(iter, name);
|
||||
}
|
||||
|
||||
static void show_function_header(const char* functionName) {
|
||||
SkDebugf("\nstatic void %s(skiatest::Reporter* reporter, const char* filename) {\n", functionName);
|
||||
if (strcmp("skphealth_com76", functionName) == 0) {
|
||||
SkDebugf("found it\n");
|
||||
}
|
||||
}
|
||||
|
||||
static const char* gOpStrs[] = {
|
||||
"kDifference_PathOp",
|
||||
"kIntersect_PathOp",
|
||||
"kUnion_PathOp",
|
||||
"kXor_PathOp",
|
||||
"kReverseDifference_PathOp",
|
||||
};
|
||||
|
||||
static void show_op(SkPathOp op, const char* pathOne, const char* pathTwo) {
|
||||
SkDebugf(" testPathOp(reporter, %s, %s, %s, filename);\n", pathOne, pathTwo, gOpStrs[op]);
|
||||
SkDebugf("}\n");
|
||||
}
|
||||
|
||||
SK_DECLARE_STATIC_MUTEX(gTestMutex);
|
||||
|
||||
void SkPathOpsDebug::ShowPath(const SkPath& a, const SkPath& b, SkPathOp shapeOp,
|
||||
const char* testName) {
|
||||
SkAutoMutexAcquire ac(gTestMutex);
|
||||
show_function_header(testName);
|
||||
ShowOnePath(a, "path", true);
|
||||
ShowOnePath(b, "pathB", true);
|
||||
show_op(shapeOp, "path", "pathB");
|
||||
}
|
||||
#endif
|
||||
|
||||
// if not defined by PathOpsDebug.cpp ...
|
||||
#if !defined SK_DEBUG && FORCE_RELEASE
|
||||
bool SkPathOpsDebug::ValidWind(int wind) {
|
||||
|
@ -49,102 +49,6 @@ static bool gShowPath = false;
|
||||
static bool gComparePathsAssert = true;
|
||||
static bool gPathStrAssert = true;
|
||||
|
||||
static const char* gFillTypeStr[] = {
|
||||
"kWinding_FillType",
|
||||
"kEvenOdd_FillType",
|
||||
"kInverseWinding_FillType",
|
||||
"kInverseEvenOdd_FillType"
|
||||
};
|
||||
|
||||
static void output_scalar(SkScalar num) {
|
||||
if (num == (int) num) {
|
||||
SkDebugf("%d", (int) num);
|
||||
} else {
|
||||
SkString str;
|
||||
str.printf("%1.9g", num);
|
||||
int width = (int) str.size();
|
||||
const char* cStr = str.c_str();
|
||||
while (cStr[width - 1] == '0') {
|
||||
--width;
|
||||
}
|
||||
str.resize(width);
|
||||
SkDebugf("%sf", str.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
static void output_points(const SkPoint* pts, int count) {
|
||||
for (int index = 0; index < count; ++index) {
|
||||
output_scalar(pts[index].fX);
|
||||
SkDebugf(", ");
|
||||
output_scalar(pts[index].fY);
|
||||
if (index + 1 < count) {
|
||||
SkDebugf(", ");
|
||||
}
|
||||
}
|
||||
SkDebugf(");\n");
|
||||
}
|
||||
|
||||
static void showPathContours(SkPath::RawIter& iter, const char* pathName) {
|
||||
uint8_t verb;
|
||||
SkPoint pts[4];
|
||||
while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
|
||||
switch (verb) {
|
||||
case SkPath::kMove_Verb:
|
||||
SkDebugf(" %s.moveTo(", pathName);
|
||||
output_points(&pts[0], 1);
|
||||
continue;
|
||||
case SkPath::kLine_Verb:
|
||||
SkDebugf(" %s.lineTo(", pathName);
|
||||
output_points(&pts[1], 1);
|
||||
break;
|
||||
case SkPath::kQuad_Verb:
|
||||
SkDebugf(" %s.quadTo(", pathName);
|
||||
output_points(&pts[1], 2);
|
||||
break;
|
||||
case SkPath::kCubic_Verb:
|
||||
SkDebugf(" %s.cubicTo(", pathName);
|
||||
output_points(&pts[1], 3);
|
||||
break;
|
||||
case SkPath::kClose_Verb:
|
||||
SkDebugf(" %s.close();\n", pathName);
|
||||
break;
|
||||
default:
|
||||
SkDEBUGFAIL("bad verb");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void showPath(const SkPath& path, const char* pathName, bool includeDeclaration) {
|
||||
SkPath::RawIter iter(path);
|
||||
#define SUPPORT_RECT_CONTOUR_DETECTION 0
|
||||
#if SUPPORT_RECT_CONTOUR_DETECTION
|
||||
int rectCount = path.isRectContours() ? path.rectContours(NULL, NULL) : 0;
|
||||
if (rectCount > 0) {
|
||||
SkTDArray<SkRect> rects;
|
||||
SkTDArray<SkPath::Direction> directions;
|
||||
rects.setCount(rectCount);
|
||||
directions.setCount(rectCount);
|
||||
path.rectContours(rects.begin(), directions.begin());
|
||||
for (int contour = 0; contour < rectCount; ++contour) {
|
||||
const SkRect& rect = rects[contour];
|
||||
SkDebugf("path.addRect(%1.9g, %1.9g, %1.9g, %1.9g, %s);\n", rect.fLeft, rect.fTop,
|
||||
rect.fRight, rect.fBottom, directions[contour] == SkPath::kCCW_Direction
|
||||
? "SkPath::kCCW_Direction" : "SkPath::kCW_Direction");
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
SkPath::FillType fillType = path.getFillType();
|
||||
SkASSERT(fillType >= SkPath::kWinding_FillType && fillType <= SkPath::kInverseEvenOdd_FillType);
|
||||
if (includeDeclaration) {
|
||||
SkDebugf(" SkPath %s;\n", pathName);
|
||||
}
|
||||
SkDebugf(" %s.setFillType(SkPath::%s);\n", pathName, gFillTypeStr[fillType]);
|
||||
iter.setPath(path);
|
||||
showPathContours(iter, pathName);
|
||||
}
|
||||
|
||||
#if DEBUG_SHOW_TEST_NAME
|
||||
static void showPathData(const SkPath& path) {
|
||||
SkPath::RawIter iter(path);
|
||||
@ -224,29 +128,6 @@ void showOp(const SkPathOp op) {
|
||||
}
|
||||
}
|
||||
|
||||
#if DEBUG_SHOW_TEST_NAME
|
||||
|
||||
void ShowFunctionHeader(const char* functionName) {
|
||||
SkDebugf("\nstatic void %s(skiatest::Reporter* reporter, const char* filename) {\n", functionName);
|
||||
if (strcmp("skphealth_com76", functionName) == 0) {
|
||||
SkDebugf("found it\n");
|
||||
}
|
||||
}
|
||||
|
||||
static const char* gOpStrs[] = {
|
||||
"kDifference_PathOp",
|
||||
"kIntersect_PathOp",
|
||||
"kUnion_PathOp",
|
||||
"kXor_PathOp",
|
||||
"kReverseDifference_PathOp",
|
||||
};
|
||||
|
||||
void ShowOp(SkPathOp op, const char* pathOne, const char* pathTwo) {
|
||||
SkDebugf(" testPathOp(reporter, %s, %s, %s, filename);\n", pathOne, pathTwo, gOpStrs[op]);
|
||||
SkDebugf("}\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
#if DEBUG_SHOW_TEST_NAME
|
||||
static char hexorator(int x) {
|
||||
if (x < 10) {
|
||||
@ -420,8 +301,10 @@ static void showPathOpPath(const char* testName, const SkPath& one, const SkPath
|
||||
*gTestOp.append() = shapeOp;
|
||||
++gTestNo;
|
||||
SkDebugf(" SkPath path, pathB;\n");
|
||||
showPath(a, "path", false);
|
||||
showPath(b, "pathB", false);
|
||||
#if DEBUG_SHOW_TEST_NAME
|
||||
SkPathOpsDebug::ShowOnePath(a, "path", false);
|
||||
SkPathOpsDebug::ShowOnePath(b, "pathB", false);
|
||||
#endif
|
||||
SkDebugf(" testPathOp(reporter, path, pathB, %s, filename);\n", opStrs[shapeOp]);
|
||||
SkDebugf("}\n");
|
||||
drawAsciiPaths(scaledOne, scaledTwo, true);
|
||||
@ -523,9 +406,11 @@ bool testSimplify(SkPath& path, bool useXor, SkPath& out, PathOpsThreadState& st
|
||||
const char* pathStr) {
|
||||
SkPath::FillType fillType = useXor ? SkPath::kEvenOdd_FillType : SkPath::kWinding_FillType;
|
||||
path.setFillType(fillType);
|
||||
#if DEBUG_SHOW_TEST_NAME
|
||||
if (gShowPath) {
|
||||
showPath(path, "path", false);
|
||||
SkPathOpsDebug::ShowOnePath(path, "path", false);
|
||||
}
|
||||
#endif
|
||||
if (!Simplify(path, &out)) {
|
||||
SkDebugf("%s did not expect failure\n", __FUNCTION__);
|
||||
REPORTER_ASSERT(state.fReporter, 0);
|
||||
@ -575,20 +460,6 @@ bool testSimplify(skiatest::Reporter* reporter, const SkPath& path, const char*
|
||||
return result == 0;
|
||||
}
|
||||
|
||||
#if DEBUG_SHOW_TEST_NAME
|
||||
|
||||
SK_DECLARE_STATIC_MUTEX(gTestMutex);
|
||||
|
||||
void SkPathOpsDebug::ShowPath(const SkPath& a, const SkPath& b, SkPathOp shapeOp,
|
||||
const char* testName) {
|
||||
SkAutoMutexAcquire ac(gTestMutex);
|
||||
ShowFunctionHeader(testName);
|
||||
showPath(a, "path", true);
|
||||
showPath(b, "pathB", true);
|
||||
ShowOp(shapeOp, "path", "pathB");
|
||||
}
|
||||
#endif
|
||||
|
||||
#if DEBUG_SHOW_TEST_NAME
|
||||
static void showName(const SkPath& a, const SkPath& b, const SkPathOp shapeOp) {
|
||||
SkDebugf("\n");
|
||||
|
@ -11,6 +11,10 @@
|
||||
|
||||
// FIXME: add tests for intersecting, non-intersecting, degenerate, coincident
|
||||
static const SkDLine tests[][2] = {
|
||||
#if 0
|
||||
// these do intersect at a pair of points, but not close enough for check results liking
|
||||
{{{{365.848175,5081.15186}, {368,5103}}}, {{{367.967712,5102.61084}, {368.278717,5105.71045}}}},
|
||||
#endif
|
||||
{{{{30,20}, {30,50}}}, {{{24,30}, {36,30}}}},
|
||||
{{{{323,193}, {-317,193}}}, {{{0,994}, {0,0}}}},
|
||||
{{{{90,230}, {160,60}}}, {{{60,120}, {260,120}}}},
|
||||
|
@ -3461,10 +3461,36 @@ static void rects4(skiatest::Reporter* reporter, const char* filename) {
|
||||
testPathOp(reporter, path, pathB, kDifference_PathOp, filename);
|
||||
}
|
||||
|
||||
#define TEST_ISSUE_2753 0
|
||||
#if TEST_ISSUE_2753
|
||||
static void issue2753(skiatest::Reporter* reporter, const char* filename) {
|
||||
SkPath path1;
|
||||
path1.moveTo(142.701f, 110.568f);
|
||||
path1.lineTo(142.957f, 100);
|
||||
path1.lineTo(153.835f, 100);
|
||||
path1.lineTo(154.592f, 108.188f);
|
||||
path1.cubicTo(154.592f, 108.188f, 153.173f, 108.483f, 152.83f, 109.412f);
|
||||
path1.cubicTo(152.83f, 109.412f, 142.701f, 110.568f, 142.701f, 110.568f);
|
||||
path1.close();
|
||||
|
||||
SkPath path2;
|
||||
path2.moveTo(39, 124.001f);
|
||||
path2.cubicTo(39, 124.001f, 50.6f, 117.001f, 50.6f, 117.001f);
|
||||
path2.cubicTo(50.6f, 117.001f, 164.601f, 85.2f, 188.201f, 117.601f);
|
||||
path2.cubicTo(188.201f, 117.601f, 174.801f, 93, 39, 124.001f);
|
||||
path2.close();
|
||||
|
||||
testPathOp(reporter, path1, path2, kUnion_PathOp, filename);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void (*firstTest)(skiatest::Reporter* , const char* filename) = 0;
|
||||
static void (*stopTest)(skiatest::Reporter* , const char* filename) = 0;
|
||||
|
||||
static struct TestDesc tests[] = {
|
||||
#if TEST_ISSUE_2753 // FIXME: pair of cubics miss intersection
|
||||
TEST(issue2753),
|
||||
#endif
|
||||
#if CUBIC_OP_114 // FIXME: curve with inflection is ordered the wrong way
|
||||
TEST(cubicOp114),
|
||||
#endif
|
||||
|
@ -4669,9 +4669,20 @@ static void testQuadralateral10(skiatest::Reporter* reporter, const char* filena
|
||||
testSimplify(reporter, path, filename);
|
||||
}
|
||||
|
||||
static void testRect3(skiatest::Reporter* reporter, const char* filename) {
|
||||
SkPath path;
|
||||
path.setFillType(SkPath::kEvenOdd_FillType);
|
||||
path.addRect(0, 0, 60, 60, SkPath::kCCW_Direction);
|
||||
path.addRect(10, 30, 40, 30, SkPath::kCCW_Direction);
|
||||
path.addRect(24, 6, 36, 36, SkPath::kCCW_Direction);
|
||||
path.addRect(32, 6, 36, 41, SkPath::kCCW_Direction);
|
||||
testSimplify(reporter, path, filename);
|
||||
}
|
||||
|
||||
static void (*firstTest)(skiatest::Reporter* , const char* filename) = 0;
|
||||
|
||||
static TestDesc tests[] = {
|
||||
TEST(testRect3),
|
||||
TEST(testQuadralateral10),
|
||||
TEST(testQuads61),
|
||||
TEST(testQuads60),
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -8,6 +8,8 @@
|
||||
|
||||
#define TEST(name) { name, #name }
|
||||
|
||||
#define TEST_NEW_FAILURES 0
|
||||
|
||||
static void skpcheeseandburger_com225(skiatest::Reporter* reporter, const char* filename) {
|
||||
SkPath path;
|
||||
path.setFillType(SkPath::kEvenOdd_FillType);
|
||||
@ -3547,9 +3549,233 @@ static void skpwww_mortgagemarketguide_com_109(skiatest::Reporter* reporter, con
|
||||
testPathOp(reporter, path, pathB, kIntersect_PathOp, filename);
|
||||
}
|
||||
|
||||
static void skpwww_9to5mac_com_64(skiatest::Reporter* reporter, const char* filename) {
|
||||
SkPath path;
|
||||
path.setFillType(SkPath::kEvenOdd_FillType);
|
||||
path.moveTo(365, 5101);
|
||||
path.lineTo(365, 5082);
|
||||
path.lineTo(366, 5083);
|
||||
path.lineTo(367, 5092.96631f);
|
||||
path.lineTo(367, 5100);
|
||||
path.quadTo(367, 5101.50537f, 367.967712f, 5102.61084f);
|
||||
path.lineTo(368.278717f, 5105.71045f);
|
||||
path.quadTo(367.277618f, 5105.34863f, 366.464478f, 5104.53564f);
|
||||
path.quadTo(365, 5103.07129f, 365, 5101);
|
||||
path.close();
|
||||
SkPath pathB;
|
||||
pathB.setFillType(SkPath::kWinding_FillType);
|
||||
pathB.moveTo(365, 5082);
|
||||
pathB.lineTo(365.848175f, 5081.15186f);
|
||||
pathB.lineTo(368, 5103);
|
||||
pathB.lineTo(365, 5106);
|
||||
testPathOp(reporter, path, pathB, kIntersect_PathOp, filename);
|
||||
}
|
||||
|
||||
#if TEST_NEW_FAILURES
|
||||
// addTCoincident SkASSERT(test->fT < 1);
|
||||
static void skpwww_googleventures_com_32(skiatest::Reporter* reporter, const char* filename) {
|
||||
SkPath path;
|
||||
path.setFillType(SkPath::kEvenOdd_FillType);
|
||||
path.moveTo(725.911682f, 898.767456f);
|
||||
path.lineTo(741.232544f, 885.911682f);
|
||||
path.lineTo(754.088318f, 901.232544f);
|
||||
path.lineTo(738.767456f, 914.088318f);
|
||||
path.lineTo(725.911682f, 898.767456f);
|
||||
path.close();
|
||||
SkPath pathB;
|
||||
pathB.setFillType(SkPath::kWinding_FillType);
|
||||
pathB.moveTo(728.37677f, 870.59082f);
|
||||
pathB.lineTo(754.088257f, 901.232605f);
|
||||
pathB.lineTo(738.767395f, 914.088379f);
|
||||
pathB.lineTo(713.055908f, 883.446594f);
|
||||
pathB.close();
|
||||
testPathOp(reporter, path, pathB, kIntersect_PathOp, filename);
|
||||
}
|
||||
|
||||
// checkSmallCoincidence failed assertion "!next->fSmall || checkMultiple"
|
||||
static void skpwww_devbridge_com_22(skiatest::Reporter* reporter, const char* filename) {
|
||||
SkPath path;
|
||||
path.setFillType(SkPath::kEvenOdd_FillType);
|
||||
path.moveTo(4915, 1523);
|
||||
path.quadTo(4887.24756f, 1523, 4867.62402f, 1542.6239f);
|
||||
path.quadTo(4848, 1562.24768f, 4848, 1590);
|
||||
path.quadTo(4848, 1617.75232f, 4867.62402f, 1637.3761f);
|
||||
path.quadTo(4887.24756f, 1657, 4915, 1657);
|
||||
path.quadTo(4942.75244f, 1657, 4962.37598f, 1637.3761f);
|
||||
path.quadTo(4982, 1617.75232f, 4982, 1590);
|
||||
path.quadTo(4982, 1562.24768f, 4962.37598f, 1542.6239f);
|
||||
path.quadTo(4942.75244f, 1523, 4915, 1523);
|
||||
path.close();
|
||||
SkPath pathB;
|
||||
pathB.setFillType(SkPath::kWinding_FillType);
|
||||
pathB.moveTo(4981.99902f, 1590);
|
||||
pathB.quadTo(4981.99902f, 1617.75232f, 4962.375f, 1637.3761f);
|
||||
pathB.quadTo(4942.75146f, 1657, 4914.99902f, 1657);
|
||||
pathB.quadTo(4887.24658f, 1657, 4867.62305f, 1637.3761f);
|
||||
pathB.quadTo(4847.99902f, 1617.75232f, 4847.99902f, 1590);
|
||||
pathB.quadTo(4847.99902f, 1562.24768f, 4867.62305f, 1542.6239f);
|
||||
pathB.quadTo(4887.24658f, 1523, 4914.99902f, 1523);
|
||||
pathB.quadTo(4942.75146f, 1523, 4962.375f, 1542.6239f);
|
||||
pathB.quadTo(4981.99902f, 1562.24768f, 4981.99902f, 1590);
|
||||
pathB.close();
|
||||
testPathOp(reporter, path, pathB, kIntersect_PathOp, filename);
|
||||
}
|
||||
|
||||
// cubic/quad intersection
|
||||
static void skpwww_alamdi_com_3(skiatest::Reporter* reporter, const char* filename) {
|
||||
SkPath path;
|
||||
path.setFillType(SkPath::kEvenOdd_FillType);
|
||||
path.moveTo(10210.8789f, 5315.87891f);
|
||||
path.quadTo(10211.7578f, 5315, 10213, 5315);
|
||||
path.lineTo(10230, 5315);
|
||||
path.quadTo(10231.2422f, 5315, 10232.1211f, 5315.87891f);
|
||||
path.quadTo(10233, 5316.75732f, 10233, 5318);
|
||||
path.lineTo(10233, 5338);
|
||||
path.quadTo(10233, 5339.24268f, 10232.1211f, 5340.12109f);
|
||||
path.quadTo(10231.2422f, 5341, 10230, 5341);
|
||||
path.lineTo(10213, 5341);
|
||||
path.quadTo(10211.7578f, 5341, 10210.8789f, 5340.12109f);
|
||||
path.quadTo(10210, 5339.24268f, 10210, 5338);
|
||||
path.lineTo(10210, 5318);
|
||||
path.quadTo(10210, 5316.75732f, 10210.8789f, 5315.87891f);
|
||||
path.close();
|
||||
SkPath pathB;
|
||||
pathB.setFillType(SkPath::kEvenOdd_FillType);
|
||||
pathB.moveTo(10213, 5315);
|
||||
pathB.lineTo(10230, 5315);
|
||||
pathB.cubicTo(10231.6572f, 5315, 10233, 5316.34326f, 10233, 5318);
|
||||
pathB.lineTo(10233, 5338);
|
||||
pathB.cubicTo(10233, 5339.10449f, 10231.6572f, 5340, 10230, 5340);
|
||||
pathB.lineTo(10213, 5340);
|
||||
pathB.cubicTo(10211.3428f, 5340, 10210, 5339.10449f, 10210, 5338);
|
||||
pathB.lineTo(10210, 5318);
|
||||
pathB.cubicTo(10210, 5316.34326f, 10211.3428f, 5315, 10213, 5315);
|
||||
pathB.close();
|
||||
testPathOp(reporter, path, pathB, kIntersect_PathOp, filename);
|
||||
}
|
||||
|
||||
// bumpSpan failed assertion "span->fOppValue >= 0"
|
||||
static void skpwww_familysurvivalprotocol_wordpress_com_61(skiatest::Reporter* reporter, const char* filename) {
|
||||
SkPath path;
|
||||
path.setFillType(SkPath::kEvenOdd_FillType);
|
||||
path.moveTo(143, 14557);
|
||||
path.lineTo(165, 14557);
|
||||
path.lineTo(165, 14555.9902f);
|
||||
path.lineTo(143, 14556);
|
||||
path.lineTo(143, 14557);
|
||||
path.close();
|
||||
SkPath pathB;
|
||||
pathB.setFillType(SkPath::kWinding_FillType);
|
||||
pathB.moveTo(143, 14557);
|
||||
pathB.lineTo(143, 14555.9902f);
|
||||
pathB.lineTo(165, 14556);
|
||||
pathB.lineTo(165, 14557);
|
||||
testPathOp(reporter, path, pathB, kIntersect_PathOp, filename);
|
||||
}
|
||||
|
||||
// addTCancel: failed assertion "oIndex > 0"
|
||||
static void skpwww_firstunitedbank_com_19(skiatest::Reporter* reporter, const char* filename) {
|
||||
SkPath path;
|
||||
path.setFillType(SkPath::kEvenOdd_FillType);
|
||||
path.moveTo(808.585815f, 11673.5859f);
|
||||
path.quadTo(809.17157f, 11673, 810, 11673);
|
||||
path.lineTo(1032, 11673);
|
||||
path.quadTo(1038.21326f, 11673, 1042.60657f, 11677.3936f);
|
||||
path.quadTo(1047, 11681.7871f, 1047, 11688);
|
||||
path.quadTo(1047, 11682.2012f, 1042.60657f, 11678.1006f);
|
||||
path.quadTo(1038.21326f, 11674, 1032, 11674);
|
||||
path.lineTo(810, 11674);
|
||||
path.quadTo(809.585815f, 11674, 809.292908f, 11674.293f);
|
||||
path.quadTo(809, 11674.5859f, 809, 11675);
|
||||
path.lineTo(809, 11701);
|
||||
path.quadTo(809, 11701.4141f, 809.292908f, 11701.707f);
|
||||
path.quadTo(809.585815f, 11702, 810, 11702);
|
||||
path.lineTo(1032, 11702);
|
||||
path.quadTo(1038.21326f, 11702, 1042.60657f, 11697.8994f);
|
||||
path.quadTo(1047, 11693.7988f, 1047, 11688);
|
||||
path.quadTo(1047, 11694.2129f, 1042.60657f, 11698.6064f);
|
||||
path.quadTo(1038.21326f, 11703, 1032, 11703);
|
||||
path.lineTo(810, 11703);
|
||||
path.quadTo(809.17157f, 11703, 808.585815f, 11702.4141f);
|
||||
path.quadTo(808, 11701.8281f, 808, 11701);
|
||||
path.lineTo(808, 11675);
|
||||
path.quadTo(808, 11674.1719f, 808.585815f, 11673.5859f);
|
||||
path.close();
|
||||
SkPath pathB;
|
||||
pathB.setFillType(SkPath::kWinding_FillType);
|
||||
pathB.moveTo(808, 11703);
|
||||
pathB.lineTo(809.5f, 11701.5f);
|
||||
pathB.lineTo(1062.91907f, 11687.0811f);
|
||||
pathB.lineTo(1047, 11703);
|
||||
testPathOp(reporter, path, pathB, kIntersect_PathOp, filename);
|
||||
}
|
||||
#endif
|
||||
|
||||
// addSimpleAngle: failed assertion "index == count() - 2"
|
||||
static void skpwww_shinydemos_com_5(skiatest::Reporter* reporter, const char* filename) {
|
||||
SkPath path;
|
||||
path.setFillType(SkPath::kEvenOdd_FillType);
|
||||
path.moveTo(205.884888f, 648.203857f);
|
||||
path.lineTo(771.570374f, 82.5183716f);
|
||||
path.lineTo(1110.98169f, 421.929626f);
|
||||
path.lineTo(545.296143f, 987.615112f);
|
||||
path.lineTo(205.884888f, 648.203857f);
|
||||
path.close();
|
||||
SkPath pathB;
|
||||
pathB.setFillType(SkPath::kWinding_FillType);
|
||||
pathB.moveTo(771.570374f, 82.5183716f);
|
||||
pathB.lineTo(1110.98169f, 421.929626f);
|
||||
pathB.lineTo(545.296204f, 987.615051f);
|
||||
pathB.lineTo(205.884949f, 648.203796f);
|
||||
pathB.close();
|
||||
testPathOp(reporter, path, pathB, kIntersect_PathOp, filename);
|
||||
}
|
||||
|
||||
// addTCoincident oPeek = &other->fTs[++oPeekIndex];
|
||||
static void skpwww_lptemp_com_3(skiatest::Reporter* reporter, const char* filename) {
|
||||
SkPath path;
|
||||
path.setFillType(SkPath::kEvenOdd_FillType);
|
||||
path.moveTo(78.6429825f, 1394.30969f);
|
||||
path.quadTo(79.6192932f, 1393.33337f, 81.0000076f, 1393.33337f);
|
||||
path.lineTo(341, 1393.33337f);
|
||||
path.quadTo(342.380707f, 1393.33337f, 343.357025f, 1394.30969f);
|
||||
path.quadTo(344.333344f, 1395.28601f, 344.333344f, 1396.66675f);
|
||||
path.lineTo(344.333344f, 1465.66663f);
|
||||
path.quadTo(344.333344f, 1467.04736f, 343.357025f, 1468.02368f);
|
||||
path.quadTo(342.380707f, 1469, 341, 1469);
|
||||
path.lineTo(81.0000076f, 1469);
|
||||
path.quadTo(79.6192932f, 1469, 78.6429825f, 1468.02368f);
|
||||
path.quadTo(77.6666718f, 1467.04736f, 77.6666718f, 1465.66663f);
|
||||
path.lineTo(77.6666718f, 1396.66675f);
|
||||
path.quadTo(77.6666718f, 1395.28601f, 78.6429825f, 1394.30969f);
|
||||
path.close();
|
||||
SkPath pathB;
|
||||
pathB.setFillType(SkPath::kEvenOdd_FillType);
|
||||
pathB.moveTo(81, 1393.33337f);
|
||||
pathB.lineTo(341, 1393.33337f);
|
||||
pathB.cubicTo(342.840942f, 1393.33337f, 344.333344f, 1394.82568f, 344.333344f, 1396.66675f);
|
||||
pathB.lineTo(344.333344f, 1465.66675f);
|
||||
pathB.cubicTo(344.333344f, 1467.32361f, 342.840942f, 1468.66675f, 341, 1468.66675f);
|
||||
pathB.lineTo(81, 1468.66675f);
|
||||
pathB.cubicTo(79.15905f, 1468.66675f, 77.6666718f, 1467.32361f, 77.6666718f, 1465.66675f);
|
||||
pathB.lineTo(77.6666718f, 1396.66675f);
|
||||
pathB.cubicTo(77.6666718f, 1394.82568f, 79.15905f, 1393.33337f, 81, 1393.33337f);
|
||||
pathB.close();
|
||||
testPathOp(reporter, path, pathB, kIntersect_PathOp, filename);
|
||||
}
|
||||
|
||||
static void (*firstTest)(skiatest::Reporter* , const char* filename) = 0;
|
||||
|
||||
static struct TestDesc tests[] = {
|
||||
TEST(skpwww_lptemp_com_3),
|
||||
TEST(skpwww_shinydemos_com_5),
|
||||
#if TEST_NEW_FAILURES
|
||||
TEST(skpwww_familysurvivalprotocol_wordpress_com_61),
|
||||
TEST(skpwww_alamdi_com_3),
|
||||
TEST(skpwww_devbridge_com_22),
|
||||
TEST(skpwww_googleventures_com_32),
|
||||
#endif
|
||||
TEST(skpwww_9to5mac_com_64),
|
||||
TEST(skpwww_wartepop_blogspot_com_br_6),
|
||||
TEST(skpwww_wartepop_blogspot_com_br_6a),
|
||||
TEST(skpwww_cooksnaps_com_32a),
|
||||
|
@ -953,11 +953,17 @@ op intersect
|
||||
{{{1020, 672}, {1020, 640.93395999999996}, {998.03301999999996, 618.96698000000004}}}
|
||||
</div>
|
||||
|
||||
<div id="skpwww_9to5mac_com_64">
|
||||
{{{{365.848175,5081.15186}, {368,5103}}},
|
||||
{{{367.967712,5102.61084}, {368.278717,5105.71045}}}},
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
var testDivs = [
|
||||
skpwww_9to5mac_com_64,
|
||||
skpcarrot_is24x,
|
||||
skpwww_wartepop_blogspot_com_br_6,
|
||||
skpwww_wartepop_blogspot_com_br_6a,
|
||||
|
@ -2,85 +2,139 @@
|
||||
<head>
|
||||
<div height="0" hidden="true">
|
||||
|
||||
<div id="skpwww_argus_presse_fr_41">
|
||||
RunTestSet [skpwww_argus_presse_fr_41]
|
||||
|
||||
{{1000,343}, {165,343}},
|
||||
{{165,343}, {165,364.869873}},
|
||||
{{165,364.869873}, {1000,364.869873}},
|
||||
{{1000,364.869873}, {1000,343}},
|
||||
op intersect
|
||||
{{165,343.000031}, {1000,343.000031}},
|
||||
{{1000,343.000031}, {1000,364.869904}},
|
||||
{{1000,364.869904}, {165,364.869904}},
|
||||
{{165,364.869904}, {165,343.000031}},
|
||||
debugShowLineIntersection wtTs[0]=0 {{165,343}, {165,364.869873}} {{165,343}} wnTs[0]=1 {{1000,343}, {165,343}}
|
||||
debugShowLineIntersection wtTs[0]=1 {{1000,364.869873}, {1000,343}} {{1000,343}} wnTs[0]=0 {{1000,343}, {165,343}}
|
||||
debugShowLineIntersection wtTs[0]=0 {{165,364.869873}, {1000,364.869873}} {{165,364.869873}} wnTs[0]=1 {{165,343}, {165,364.869873}}
|
||||
debugShowLineIntersection wtTs[0]=0 {{1000,364.869873}, {1000,343}} {{1000,364.869873}} wnTs[0]=1 {{165,364.869873}, {1000,364.869873}}
|
||||
debugShowLineIntersection wtTs[0]=0 {{165,343.000031}, {1000,343.000031}} {{165,343}} wtTs[1]=1 {{1000,343}} wnTs[0]=1 {{1000,343}, {165,343}} wnTs[1]=0
|
||||
debugShowLineIntersection wtTs[0]=0 {{1000,343.000031}, {1000,364.869904}} {{1000,343.000031}} wnTs[0]=0 {{1000,343}, {165,343}}
|
||||
debugShowLineIntersection wtTs[0]=1 {{165,364.869904}, {165,343.000031}} {{165,343.000031}} wnTs[0]=1 {{1000,343}, {165,343}}
|
||||
debugShowLineIntersection wtTs[0]=0 {{165,343.000031}, {1000,343.000031}} {{165,343}} wnTs[0]=0 {{165,343}, {165,364.869873}}
|
||||
debugShowLineIntersection wtTs[0]=1 {{1000,364.869904}, {165,364.869904}} {{165,364.869873}} wnTs[0]=1 {{165,343}, {165,364.869873}}
|
||||
debugShowLineIntersection wtTs[0]=0 {{165,364.869904}, {165,343.000031}} {{165,364.869904}} wtTs[1]=1 {{165,343.000031}} wnTs[0]=1 {{165,343}, {165,364.869873}} wnTs[1]=1.39541634e-006
|
||||
debugShowLineIntersection wtTs[0]=1 {{1000,343.000031}, {1000,364.869904}} {{1000,364.869904}} wnTs[0]=1 {{165,364.869873}, {1000,364.869873}}
|
||||
debugShowLineIntersection wtTs[0]=0 {{1000,364.869904}, {165,364.869904}} {{1000,364.869873}} wtTs[1]=1 {{165,364.869873}} wnTs[0]=1 {{165,364.869873}, {1000,364.869873}} wnTs[1]=0
|
||||
debugShowLineIntersection wtTs[0]=0 {{165,364.869904}, {165,343.000031}} {{165,364.869904}} wnTs[0]=0 {{165,364.869873}, {1000,364.869873}}
|
||||
debugShowLineIntersection wtTs[0]=1 {{165,343.000031}, {1000,343.000031}} {{1000,343}} wnTs[0]=1 {{1000,364.869873}, {1000,343}}
|
||||
debugShowLineIntersection wtTs[0]=0 {{1000,343.000031}, {1000,364.869904}} {{1000,343.000031}} wtTs[1]=1 {{1000,364.869904}} wnTs[0]=0.999999 {{1000,364.869873}, {1000,343}} wnTs[1]=0
|
||||
debugShowLineIntersection wtTs[0]=0 {{1000,364.869904}, {165,364.869904}} {{1000,364.869873}} wnTs[0]=0 {{1000,364.869873}, {1000,343}}
|
||||
debugShowLineIntersection wtTs[0]=0 {{1000,343.000031}, {1000,364.869904}} {{1000,343.000031}} wnTs[0]=1 {{165,343.000031}, {1000,343.000031}}
|
||||
debugShowLineIntersection wtTs[0]=1 {{165,364.869904}, {165,343.000031}} {{165,343.000031}} wnTs[0]=0 {{165,343.000031}, {1000,343.000031}}
|
||||
debugShowLineIntersection wtTs[0]=0 {{1000,364.869904}, {165,364.869904}} {{1000,364.869904}} wnTs[0]=1 {{1000,343.000031}, {1000,364.869904}}
|
||||
debugShowLineIntersection wtTs[0]=0 {{165,364.869904}, {165,343.000031}} {{165,364.869904}} wnTs[0]=1 {{1000,364.869904}, {165,364.869904}}
|
||||
SkOpSegment::debugShowTs - id=0 [o=3,5 t=0 1000,343.000031 w=1 o=0] [o=7,1 t=1 165,343 w=1 o=0]
|
||||
SkOpSegment::debugShowTs o id=4 [o=7,1 t=0 165,343 w=1 o=0] [o=3,5 t=1 1000,343.000031 w=1 o=0] operand
|
||||
SkOpSegment::debugShowTs + id=0 [o=3,5 t=0 1000,343.000031 w=1 o=0] [o=7,1 t=1 165,343 w=1 o=0]
|
||||
SkOpSegment::debugShowTs o id=4 [o=7,1 t=0 165,343 w=1 o=0] [o=3,5 t=1 1000,343.000031 w=1 o=0] operand
|
||||
SkOpSegment::debugShowTs - id=1 [o=4,0 t=0 165,343 w=1 o=0] [o=6,2 t=1 165,364.869873 w=1 o=0]
|
||||
SkOpSegment::debugShowTs o id=7 [o=6,2 t=0 165,364.869904 w=1 o=0] [o=4,0 t=1 165,343.000031 w=1 o=0] operand
|
||||
SkOpSegment::addTPair addTPair this=1 1.39541634e-006 other=7 1
|
||||
SkOpSegment::addTPair addTPair this=7 0 other=1 1
|
||||
SkOpSegment::debugShowTs + id=1 [o=4,0 t=0 165,343 w=1 o=0] [o=7 t=1.4e-006 165,343.000031 w=1 o=0] [o=7,6,2 t=1 165,364.869873 w=1 o=0]
|
||||
SkOpSegment::debugShowTs o id=7 [o=1,6,2 t=0 165,364.869904 w=1 o=0] [o=1,4,0 t=1 165,343.000031 w=1 o=0] operand
|
||||
SkOpSegment::debugShowTs - id=2 [o=1,7 t=0 165,364.869904 w=1 o=0] [o=5,3 t=1 1000,364.869873 w=1 o=0]
|
||||
SkOpSegment::debugShowTs o id=6 [o=5,3 t=0 1000,364.869873 w=1 o=0] [o=1,7 t=1 165,364.869904 w=1 o=0] operand
|
||||
SkOpSegment::debugShowTs + id=2 [o=1,7 t=0 165,364.869904 w=1 o=0] [o=5,3 t=1 1000,364.869873 w=1 o=0]
|
||||
SkOpSegment::debugShowTs o id=6 [o=5,3 t=0 1000,364.869873 w=1 o=0] [o=1,7 t=1 165,364.869904 w=1 o=0] operand
|
||||
SkOpSegment::debugShowTs - id=3 [o=6,2 t=0 1000,364.869873 w=1 o=0] [o=4,0 t=1 1000,343 w=1 o=0]
|
||||
SkOpSegment::debugShowTs o id=5 [o=4,0 t=0 1000,343.000031 w=1 o=0] [o=6,2 t=1 1000,364.869904 w=1 o=0] operand
|
||||
SkOpSegment::addTPair addTPair this=3 0 other=5 1
|
||||
SkOpSegment::addTPair addTPair this=5 0 other=3 0.999998605
|
||||
SkOpSegment::debugShowTs + id=3 [o=6,2,5 t=0 1000,364.869904 w=1 o=0] [o=5 t=1 1000,343.000031 w=1 o=0] [o=4,0 t=1 1000,343 w=1 o=0]
|
||||
SkOpSegment::debugShowTs o id=5 [o=3,4,0 t=0 1000,343.000031 w=1 o=0] [o=3,6,2 t=1 1000,364.869904 w=1 o=0] operand
|
||||
SkOpContour::calcCoincidentWinding count=4
|
||||
SkOpSegment::debugShowTs p id=0 [o=3,5 t=0 1000,343.000031 w=1 o=-1] [o=7,1 t=1 165,343 w=1 o=0]
|
||||
SkOpSegment::debugShowTs o id=4 [o=7,1 t=0 165,343 w=0 o=0] [o=3,5 t=1 1000,343.000031 w=1 o=0] operand done
|
||||
SkOpSegment::debugShowTs p id=1 [o=4,0 t=0 165,343 w=1 o=0] [o=7 t=1.4e-006 165,343.000031 w=1 o=-1] [o=7,6,2 t=1 165,364.869873 w=1 o=0]
|
||||
SkOpSegment::debugShowTs o id=7 [o=1,6,2 t=0 165,364.869904 w=0 o=0] [o=1,4,0 t=1 165,343.000031 w=1 o=0] operand done
|
||||
SkOpSegment::debugShowTs p id=2 [o=1,7 t=0 165,364.869904 w=1 o=-1] [o=5,3 t=1 1000,364.869873 w=1 o=0]
|
||||
SkOpSegment::debugShowTs o id=6 [o=5,3 t=0 1000,364.869873 w=0 o=0] [o=1,7 t=1 165,364.869904 w=1 o=0] operand done
|
||||
SkOpSegment::debugShowTs p id=3 [o=6,2,5 t=0 1000,364.869904 w=1 o=-1] [o=5 t=1 1000,343.000031 w=1 o=0] [o=4,0 t=1 1000,343 w=1 o=0]
|
||||
SkOpSegment::debugShowTs o id=5 [o=3,4,0 t=0 1000,343.000031 w=0 o=0] [o=3,6,2 t=1 1000,364.869904 w=1 o=0] operand done
|
||||
SkOpSegment::addTPair addTPair this=0 0 other=4 1
|
||||
SkOpSegment::addTPair addTPair this=0 1 other=4 0
|
||||
SkOpSegment::addTPair addTPair this=6 1 other=2 0
|
||||
SkOpSegment::addTPair addTPair duplicate this=2 0 other=6 1
|
||||
SkOpSegment::addTPair addTPair this=2 1 other=6 0
|
||||
SkOpContour::joinCoincidence count=4
|
||||
SkOpSegment::sortAngles [0] tStart=0 [0]
|
||||
SkOpSegment::sortAngles [0] tStart=1 [5]
|
||||
SkOpSegment::sortAngles [1] tStart=1.39541634e-006 [2]
|
||||
SkOpSegment::sortAngles [1] tStart=1 [5]
|
||||
SkOpSegment::sortAngles [2] tStart=1 [5]
|
||||
SkOpSegment::sortAngles [3] tStart=0.999998605 [3]
|
||||
SkOpSegment::debugShowActiveSpans id=0 (1000,343 165,343) t=0 (1000,343) tEnd=1 other=3 otherT=1 otherIndex=5 windSum=? windValue=1 oppValue=-1
|
||||
SkOpSegment::debugShowActiveSpans id=1 (165,343 165,364.869873) t=1.39541634e-006 (165,343.000031) tEnd=1 other=7 otherT=1 otherIndex=3 windSum=? windValue=1 oppValue=-1
|
||||
SkOpSegment::debugShowActiveSpans id=2 (165,364.869873 1000,364.869873) t=0 (165,364.869873) tEnd=1 other=6 otherT=1 otherIndex=3 windSum=? windValue=1 oppValue=-1
|
||||
SkOpSegment::debugShowActiveSpans id=3 (1000,364.869873 1000,343) t=0 (1000,364.869873) tEnd=0.999998605 other=6 otherT=0 otherIndex=2 windSum=? windValue=1 oppValue=-1
|
||||
Assemble
|
||||
<div id="issue2753">
|
||||
RunTestSet [issue2753]
|
||||
|
||||
{{142.701004,110.568001}, {142.957001,100}},
|
||||
{{142.957001,100}, {153.835007,100}},
|
||||
{{153.835007,100}, {154.591995,108.188004}},
|
||||
{{154.591995,108.188004}, {154.591995,108.188004}, {153.173004,108.483002}, {152.830002,109.412003}},
|
||||
{{152.830002,109.412003}, {152.830002,109.412003}, {142.701004,110.568001}, {142.701004,110.568001}},
|
||||
op union
|
||||
{{39,124.000999}, {39,124.000999}, {50.5999985,117.000999}, {50.5999985,117.000999}},
|
||||
{{50.5999985,117.000999}, {50.5999985,117.000999}, {164.600998,85.1999969}, {188.201004,117.600998}},
|
||||
{{188.201004,117.600998}, {188.201004,117.600998}, {174.800995,93}, {39,124.000999}},
|
||||
debugShowCubicIntersection no self intersect {{154.591995,108.188004}, {154.591995,108.188004}, {153.173004,108.483002}, {152.830002,109.412003}}
|
||||
debugShowLineIntersection wtTs[0]=1 {{142.701004,110.568001}, {142.957001,100}} {{142.957001,100}} wnTs[0]=0 {{142.957001,100}, {153.835007,100}}
|
||||
debugShowLineIntersection wtTs[0]=0 {{142.701004,110.568001}, {142.957001,100}} {{142.701004,110.568001}} wnTs[0]=1 {{152.830002,109.412003}, {142.701004,110.568001}}
|
||||
debugShowLineIntersection wtTs[0]=0 {{153.835007,100}, {154.591995,108.188004}} {{153.835007,100}} wnTs[0]=1 {{142.957001,100}, {153.835007,100}}
|
||||
debugShowCubicLineIntersection wtTs[0]=0 {{154.591995,108.188004}, {154.591995,108.188004}, {153.173004,108.483002}, {152.830002,109.412003}} {{154.591995,108.188004}} wnTs[0]=1 {{153.835007,100}, {154.591995,108.188004}}
|
||||
debugShowCubicLineIntersection wtTs[0]=1 {{154.591995,108.188004}, {154.591995,108.188004}, {153.173004,108.483002}, {152.830002,109.412003}} {{152.830002,109.412003}} wnTs[0]=0 {{152.830002,109.412003}, {142.701004,110.568001}}
|
||||
debugShowCubicLineIntersection wtTs[0]=0.671281996 {{50.5999985,117.000999}, {50.5999985,117.000999}, {164.600998,85.1999969}, {188.201004,117.600998}} {{142.883102,103.050758}} wnTs[0]=0.711321 {{142.701004,110.568001}, {142.957001,100}}
|
||||
debugShowCubicLineIntersection wtTs[0]=0.642192755 {{188.201004,117.600998}, {188.201004,117.600998}, {174.800995,93}, {39,124.000999}} {{142.753387,108.405373}} wnTs[0]=0.204639 {{142.701004,110.568001}, {142.957001,100}}
|
||||
debugShowCubicLineIntersection wtTs[0]=0.734814757 {{50.5999985,117.000999}, {50.5999985,117.000999}, {164.600998,85.1999969}, {188.201004,117.600998}} {{154.165848,103.578537}} wnTs[0]=0.437047 {{153.835007,100}, {154.591995,108.188004}}
|
||||
debugShowCubicIntersection no intersect {{154.591995,108.188004}, {154.591995,108.188004}, {153.173004,108.483002}, {152.830002,109.412003}} {{50.5999985,117.000999}, {50.5999985,117.000999}, {164.600998,85.1999969}, {188.201004,117.600998}}
|
||||
debugShowCubicIntersection no intersect {{154.591995,108.188004}, {154.591995,108.188004}, {153.173004,108.483002}, {152.830002,109.412003}} {{188.201004,117.600998}, {188.201004,117.600998}, {174.800995,93}, {39,124.000999}}
|
||||
debugShowCubicLineIntersection no intersect {{50.5999985,117.000999}, {50.5999985,117.000999}, {164.600998,85.1999969}, {188.201004,117.600998}} {{152.830002,109.412003}, {142.701004,110.568001}}
|
||||
debugShowCubicLineIntersection no intersect {{188.201004,117.600998}, {188.201004,117.600998}, {174.800995,93}, {39,124.000999}} {{152.830002,109.412003}, {142.701004,110.568001}}
|
||||
debugShowCubicIntersection no self intersect {{50.5999985,117.000999}, {50.5999985,117.000999}, {164.600998,85.1999969}, {188.201004,117.600998}}
|
||||
debugShowCubicIntersection no self intersect {{188.201004,117.600998}, {188.201004,117.600998}, {174.800995,93}, {39,124.000999}}
|
||||
debugShowCubicLineIntersection wtTs[0]=0 {{50.5999985,117.000999}, {50.5999985,117.000999}, {164.600998,85.1999969}, {188.201004,117.600998}} {{50.5999985,117.000999}} wnTs[0]=1 {{39,124.000999}, {50.5999985,117.000999}}
|
||||
debugShowCubicLineIntersection wtTs[0]=1 {{188.201004,117.600998}, {188.201004,117.600998}, {174.800995,93}, {39,124.000999}} {{39,124.000999}} wnTs[0]=0 {{39,124.000999}, {50.5999985,117.000999}}
|
||||
debugShowCubicIntersection wtTs[0]=1 {{50.5999985,117.000999}, {50.5999985,117.000999}, {164.600998,85.1999969}, {188.201004,117.600998}} {{188.201004,117.600998}} wnTs[0]=0 {{188.201004,117.600998}, {188.201004,117.600998}, {174.800995,93}, {39,124.000999}}
|
||||
SkOpSegment::sortAngles [0] tStart=0.204639461 [1]
|
||||
SkOpAngle::after [0/1] 21/21 tStart=0.204639461 tEnd=0 < [7/1] 1/29 tStart=0.642192755 tEnd=0 < [0/2] 5/5 tStart=0.204639461 tEnd=0.711321242 T 4
|
||||
SkOpAngle::after [0/1] 21/21 tStart=0.204639461 tEnd=0 < [7/2] 17/17 tStart=0.642192755 tEnd=1 < [7/1] 1/29 tStart=0.642192755 tEnd=0 F 4
|
||||
SkOpAngle::after [7/1] 1/29 tStart=0.642192755 tEnd=0 < [7/2] 17/17 tStart=0.642192755 tEnd=1 < [0/2] 5/5 tStart=0.204639461 tEnd=0.711321242 F 4
|
||||
SkOpAngle::after [0/2] 5/5 tStart=0.204639461 tEnd=0.711321242 < [7/2] 17/17 tStart=0.642192755 tEnd=1 < [0/1] 21/21 tStart=0.204639461 tEnd=0 T 4
|
||||
SkOpSegment::sortAngles [0] tStart=0.711321242 [2]
|
||||
SkOpAngle::after [0/3] 21/21 tStart=0.711321242 tEnd=0.204639461 < [6/1] 13/17 tStart=0.671281996 tEnd=0 < [0/4] 5/5 tStart=0.711321242 tEnd=1 F 4
|
||||
SkOpAngle::after [0/3] 21/21 tStart=0.711321242 tEnd=0.204639461 < [6/2] 29/29 tStart=0.671281996 tEnd=0.734814757 < [0/4] 5/5 tStart=0.711321242 tEnd=1 T 4
|
||||
SkOpSegment::sortAngles [2] tStart=0.437046747 [1]
|
||||
SkOpAngle::after [2/1] 9/9 tStart=0.437046747 tEnd=0 < [6/3] 13/13 tStart=0.734814757 tEnd=0.671281996 < [2/2] 25/25 tStart=0.437046747 tEnd=1 T 4
|
||||
SkOpAngle::after [2/1] 9/9 tStart=0.437046747 tEnd=0 < [6/4] 29/29 tStart=0.734814757 tEnd=1 < [6/3] 13/13 tStart=0.734814757 tEnd=0.671281996 F 4
|
||||
SkOpAngle::after [6/3] 13/13 tStart=0.734814757 tEnd=0.671281996 < [6/4] 29/29 tStart=0.734814757 tEnd=1 < [2/2] 25/25 tStart=0.437046747 tEnd=1 F 4
|
||||
SkOpAngle::after [2/2] 25/25 tStart=0.437046747 tEnd=1 < [6/4] 29/29 tStart=0.734814757 tEnd=1 < [2/1] 9/9 tStart=0.437046747 tEnd=0 T 4
|
||||
SkOpSegment::debugShowActiveSpans id=0 (142.701004,110.568001 142.957001,100) t=0 (142.701004,110.568001) tEnd=0.204639461 other=4 otherT=1 otherIndex=1 windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::debugShowActiveSpans id=0 (142.701004,110.568001 142.957001,100) t=0.204639461 (142.753387,108.405373) tEnd=0.711321242 other=7 otherT=0.642192755 otherIndex=1 windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::debugShowActiveSpans id=0 (142.701004,110.568001 142.957001,100) t=0.711321242 (142.883102,103.050758) tEnd=1 other=6 otherT=0.671281996 otherIndex=1 windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::debugShowActiveSpans id=1 (142.957001,100 153.835007,100) t=0 (142.957001,100) tEnd=1 other=0 otherT=1 otherIndex=3 windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::debugShowActiveSpans id=2 (153.835007,100 154.591995,108.188004) t=0 (153.835007,100) tEnd=0.437046747 other=1 otherT=1 otherIndex=1 windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::debugShowActiveSpans id=2 (153.835007,100 154.591995,108.188004) t=0.437046747 (154.165848,103.578537) tEnd=1 other=6 otherT=0.734814757 otherIndex=2 windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::debugShowActiveSpans id=3 (154.591995,108.188004 154.591995,108.188004 153.173004,108.483002 152.830002,109.412003) t=0 (154.591995,108.188004) tEnd=1 other=2 otherT=1 otherIndex=2 windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::debugShowActiveSpans id=4 (152.830002,109.412003 142.701004,110.568001) t=0 (152.830002,109.412003) tEnd=1 other=3 otherT=1 otherIndex=1 windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::debugShowActiveSpans id=5 (39,124.000999 50.5999985,117.000999) t=0 (39,124.000999) tEnd=1 other=7 otherT=1 otherIndex=2 windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::debugShowActiveSpans id=6 (50.5999985,117.000999 50.5999985,117.000999 164.600998,85.1999969 188.201004,117.600998) t=0 (50.5999985,117.000999) tEnd=0.671281996 other=5 otherT=1 otherIndex=1 windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::debugShowActiveSpans id=6 (50.5999985,117.000999 50.5999985,117.000999 164.600998,85.1999969 188.201004,117.600998) t=0.671281996 (142.883102,103.050758) tEnd=0.734814757 other=0 otherT=0.711321242 otherIndex=2 windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::debugShowActiveSpans id=6 (50.5999985,117.000999 50.5999985,117.000999 164.600998,85.1999969 188.201004,117.600998) t=0.734814757 (154.165848,103.578537) tEnd=1 other=2 otherT=0.437046747 otherIndex=1 windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::debugShowActiveSpans id=7 (188.201004,117.600998 188.201004,117.600998 174.800995,93 39,124.000999) t=0 (188.201004,117.600998) tEnd=0.642192755 other=6 otherT=1 otherIndex=3 windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::debugShowActiveSpans id=7 (188.201004,117.600998 188.201004,117.600998 174.800995,93 39,124.000999) t=0.642192755 (142.753387,108.405373) tEnd=1 other=0 otherT=0.204639461 otherIndex=1 windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::findTop
|
||||
SkOpAngle::dumpOne [0/5] next=1/1 sect=21/21 s=1 [3] e=0.711321242 [2] sgn=1 windVal=1 windSum=?
|
||||
SkOpAngle::dumpOne [1/1] next=0/5 sect=31/31 s=0 [0] e=1 [1] sgn=-1 windVal=1 windSum=? stop
|
||||
SkOpSegment::markWinding id=0 (142.701004,110.568001 142.957001,100) t=0.711321242 [2] (142.883102,103.050758) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::nextChase mismatched signs
|
||||
SkOpSegment::markWinding id=1 (142.957001,100 153.835007,100) t=0 [0] (142.957001,100) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::markWinding id=2 (153.835007,100 154.591995,108.188004) t=0 [0] (153.835007,100) tEnd=0.437046747 newWindSum=-1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::markWinding id=0 (142.701004,110.568001 142.957001,100) t=0.711321242 [2] (142.883102,103.050758) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
|
||||
SkOpSegment::activeOp id=0 t=0.711321242 tEnd=1 op=union miFrom=1 miTo=0 suFrom=0 suTo=0 result=1
|
||||
SkOpSegment::nextChase mismatched signs
|
||||
SkOpSegment::findNextOp simple
|
||||
SkOpSegment::markDoneBinary id=0 (142.701004,110.568001 142.957001,100) t=0.711321242 [2] (142.883102,103.050758) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
|
||||
bridgeOp current id=0 from=(142.883102,103.050758) to=(142.957001,100)
|
||||
SkOpSegment::findNextOp simple
|
||||
SkOpSegment::markDoneBinary id=1 (142.957001,100 153.835007,100) t=0 [0] (142.957001,100) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
|
||||
bridgeOp current id=1 from=(142.957001,100) to=(153.835007,100)
|
||||
path.moveTo(142.883102,103.050758);
|
||||
path.lineTo(142.957001,100);
|
||||
SkOpSegment::markWinding id=6 (50.5999985,117.000999 50.5999985,117.000999 164.600998,85.1999969 188.201004,117.600998) t=0.671281996 [1] (142.883102,103.050758) tEnd=0.734814757 newWindSum=-1 newOppSum=-1 oppSum=? windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::markAngle last id=6 windSum=-1 small=0
|
||||
SkOpSegment::markWinding id=2 (153.835007,100 154.591995,108.188004) t=0.437046747 [1] (154.165848,103.578537) tEnd=1 newWindSum=-1 newOppSum=-1 oppSum=? windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::markWinding id=3 (154.591995,108.188004 154.591995,108.188004 153.173004,108.483002 152.830002,109.412003) t=0 [0] (154.591995,108.188004) tEnd=1 newWindSum=-1 newOppSum=-1 oppSum=? windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::markWinding id=4 (152.830002,109.412003 142.701004,110.568001) t=0 [0] (152.830002,109.412003) tEnd=1 newWindSum=-1 newOppSum=-1 oppSum=? windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::markWinding id=0 (142.701004,110.568001 142.957001,100) t=0 [0] (142.701004,110.568001) tEnd=0.204639461 newWindSum=-1 newOppSum=-1 oppSum=? windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::markAngle last id=0 windSum=? small=0
|
||||
SkOpSegment::markWinding id=6 (50.5999985,117.000999 50.5999985,117.000999 164.600998,85.1999969 188.201004,117.600998) t=0.734814757 [2] (154.165848,103.578537) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::markWinding id=7 (188.201004,117.600998 188.201004,117.600998 174.800995,93 39,124.000999) t=0 [0] (188.201004,117.600998) tEnd=0.642192755 newWindSum=-1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::markAngle last id=7 windSum=? small=0
|
||||
SkOpSegment::findNextOp
|
||||
SkOpAngle::dumpOne [2/1] next=6/3 sect=9/9 s=0.437046747 [1] e=0 [0] sgn=1 windVal=1 windSum=-1 oppVal=0 oppSum=0
|
||||
SkOpAngle::dumpOne [6/3] next=2/2 sect=13/13 s=0.734814757 [2] e=0.671281996 [1] sgn=1 windVal=1 windSum=-1 oppVal=0 oppSum=-1 operand
|
||||
SkOpAngle::dumpOne [2/2] next=6/4 sect=25/25 s=0.437046747 [1] e=1 [2] sgn=-1 windVal=1 windSum=-1 oppVal=0 oppSum=-1
|
||||
SkOpAngle::dumpOne [6/4] next=2/1 sect=29/29 s=0.734814757 [2] e=1 [3] sgn=-1 windVal=1 windSum=-1 oppVal=0 oppSum=0 operand
|
||||
SkOpSegment::activeOp id=6 t=0.734814757 tEnd=0.671281996 op=union miFrom=1 miTo=1 suFrom=0 suTo=1 result=0
|
||||
SkOpSegment::markDoneBinary id=6 (50.5999985,117.000999 50.5999985,117.000999 164.600998,85.1999969 188.201004,117.600998) t=0.671281996 [1] (142.883102,103.050758) tEnd=0.734814757 newWindSum=-1 newOppSum=-1 oppSum=-1 windSum=-1 windValue=1 oppValue=0
|
||||
SkOpSegment::findNextOp chase.append id=6 windSum=-1 small=0
|
||||
SkOpSegment::activeOp id=2 t=0.437046747 tEnd=1 op=union miFrom=1 miTo=0 suFrom=1 suTo=1 result=0
|
||||
SkOpSegment::markDoneBinary id=2 (153.835007,100 154.591995,108.188004) t=0.437046747 [1] (154.165848,103.578537) tEnd=1 newWindSum=-1 newOppSum=-1 oppSum=-1 windSum=-1 windValue=1 oppValue=0
|
||||
SkOpSegment::markDoneBinary id=3 (154.591995,108.188004 154.591995,108.188004 153.173004,108.483002 152.830002,109.412003) t=0 [0] (154.591995,108.188004) tEnd=1 newWindSum=-1 newOppSum=-1 oppSum=-1 windSum=-1 windValue=1 oppValue=0
|
||||
SkOpSegment::markDoneBinary id=4 (152.830002,109.412003 142.701004,110.568001) t=0 [0] (152.830002,109.412003) tEnd=1 newWindSum=-1 newOppSum=-1 oppSum=-1 windSum=-1 windValue=1 oppValue=0
|
||||
SkOpSegment::markDoneBinary id=0 (142.701004,110.568001 142.957001,100) t=0 [0] (142.701004,110.568001) tEnd=0.204639461 newWindSum=-1 newOppSum=-1 oppSum=-1 windSum=-1 windValue=1 oppValue=0
|
||||
SkOpSegment::findNextOp chase.append id=0 windSum=-2147483647 small=0
|
||||
SkOpSegment::activeOp id=6 t=0.734814757 tEnd=1 op=union miFrom=0 miTo=0 suFrom=1 suTo=0 result=1
|
||||
SkOpSegment::findNextOp chase.append id=7 windSum=-2147483647 small=0
|
||||
SkOpSegment::markDoneBinary id=2 (153.835007,100 154.591995,108.188004) t=0 [0] (153.835007,100) tEnd=0.437046747 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
|
||||
SkOpSegment::findNextOp from:[2] to:[6] start=2 end=3
|
||||
bridgeOp current id=2 from=(153.835007,100) to=(154.165848,103.578537)
|
||||
path.lineTo(153.835007,100);
|
||||
SkOpSegment::findNextOp simple
|
||||
SkOpSegment::markDoneBinary id=6 (50.5999985,117.000999 50.5999985,117.000999 164.600998,85.1999969 188.201004,117.600998) t=0.734814757 [2] (154.165848,103.578537) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
|
||||
bridgeOp current id=6 from=(154.165848,103.578537) to=(188.201004,117.600998)
|
||||
path.lineTo(154.165848,103.578537);
|
||||
path.cubicTo(169.326965,104.931351, 181.942627,109.008728, 188.201004,117.600998);
|
||||
SkOpSegment::markWinding id=0 (142.701004,110.568001 142.957001,100) t=0.204639461 [1] (142.753387,108.405373) tEnd=0.711321242 newWindSum=1 newOppSum=-1 oppSum=? windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::markAngle last id=0 windSum=-1 small=0
|
||||
SkOpSegment::markWinding id=7 (188.201004,117.600998 188.201004,117.600998 174.800995,93 39,124.000999) t=0.642192755 [1] (142.753387,108.405373) tEnd=1 newWindSum=-1 newOppSum=1 oppSum=? windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::markWinding id=5 (39,124.000999 50.5999985,117.000999) t=0 [0] (39,124.000999) tEnd=1 newWindSum=-1 newOppSum=1 oppSum=? windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::markWinding id=6 (50.5999985,117.000999 50.5999985,117.000999 164.600998,85.1999969 188.201004,117.600998) t=0 [0] (50.5999985,117.000999) tEnd=0.671281996 newWindSum=-1 newOppSum=1 oppSum=? windSum=? windValue=1 oppValue=0
|
||||
SkOpSegment::markAngle last id=6 windSum=-1 small=0
|
||||
SkOpSegment::findNextOp
|
||||
SkOpAngle::dumpOne [7/1] next=0/2 sect=1/29 s=0.642192755 [1] e=0 [0] sgn=1 windVal=1 windSum=-1 oppVal=0 oppSum=0 operand
|
||||
SkOpAngle::dumpOne [0/2] next=7/2 sect=5/5 s=0.204639461 [1] e=0.711321242 [2] sgn=-1 windVal=1 windSum=1 oppVal=0 oppSum=-1
|
||||
SkOpAngle::dumpOne [7/2] next=0/1 sect=17/17 s=0.642192755 [1] e=1 [2] sgn=-1 windVal=1 windSum=-1 oppVal=0 oppSum=1 operand
|
||||
SkOpAngle::dumpOne [0/1] next=7/1 sect=21/21 s=0.204639461 [1] e=0 [0] sgn=1 windVal=1 windSum=-1 oppVal=0 oppSum=-1 done
|
||||
SkOpSegment::activeOp id=0 t=0.204639461 tEnd=0.711321242 op=union miFrom=0 miTo=1 suFrom=1 suTo=1 result=0
|
||||
SkOpSegment::markDoneBinary id=0 (142.701004,110.568001 142.957001,100) t=0.204639461 [1] (142.753387,108.405373) tEnd=0.711321242 newWindSum=1 newOppSum=-1 oppSum=-1 windSum=1 windValue=1 oppValue=0
|
||||
SkOpSegment::findNextOp chase.append id=0 windSum=-1 small=0
|
||||
SkOpSegment::activeOp id=7 t=0.642192755 tEnd=1 op=union miFrom=1 miTo=1 suFrom=1 suTo=0 result=0
|
||||
SkOpSegment::markDoneBinary id=7 (188.201004,117.600998 188.201004,117.600998 174.800995,93 39,124.000999) t=0.642192755 [1] (142.753387,108.405373) tEnd=1 newWindSum=-1 newOppSum=1 oppSum=1 windSum=-1 windValue=1 oppValue=0
|
||||
SkOpSegment::markDoneBinary id=5 (39,124.000999 50.5999985,117.000999) t=0 [0] (39,124.000999) tEnd=1 newWindSum=-1 newOppSum=1 oppSum=1 windSum=-1 windValue=1 oppValue=0
|
||||
SkOpSegment::markDoneBinary id=6 (50.5999985,117.000999 50.5999985,117.000999 164.600998,85.1999969 188.201004,117.600998) t=0 [0] (50.5999985,117.000999) tEnd=0.671281996 newWindSum=-1 newOppSum=1 oppSum=1 windSum=-1 windValue=1 oppValue=0
|
||||
SkOpSegment::activeOp id=0 t=0.204639461 tEnd=0 op=union miFrom=1 miTo=0 suFrom=0 suTo=0 result=1
|
||||
SkOpSegment::markDoneBinary id=7 (188.201004,117.600998 188.201004,117.600998 174.800995,93 39,124.000999) t=0 [0] (188.201004,117.600998) tEnd=0.642192755 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
|
||||
SkOpSegment::findNextOp from:[7] to:[0] start=1 end=0
|
||||
bridgeOp current id=7 from=(188.201004,117.600998) to=(142.753387,108.405373)
|
||||
path.cubicTo(188.201004,117.600998, 182.674683,107.455261, 142.753387,108.405373);
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@ -88,7 +142,7 @@ Assemble
|
||||
<script type="text/javascript">
|
||||
|
||||
var testDivs = [
|
||||
skpwww_argus_presse_fr_41,
|
||||
issue2753,
|
||||
];
|
||||
|
||||
var decimal_places = 3; // make this 3 to show more precision
|
||||
|
Loading…
Reference in New Issue
Block a user