208 if (!this->someAssemblyRequired()) {
211#if DEBUG_PATH_CONSTRUCTION
215 int endCount = fEndPtTs.
size();
219 for (
int index = 0; index < endCount; index += 2) {
220 const SkOpPtT* eStart = runs[index];
221 const SkOpPtT* eEnd = runs[index + 1];
224 SkDebugf(
"%s contour start=(%1.9g,%1.9g) end=(%1.9g,%1.9g)\n", __FUNCTION__,
229 for (
int pIndex = 0; pIndex < endCount; pIndex++) {
239 int step = opPtT->
fT ? 1 : -1;
246 if (
start->starter(opSpanEnd)->alreadyAdded()) {
250 opPtT = opSpanEnd->
ptT();
256 if (partPartials.
empty()) {
260 SkPath& partial =
const_cast<SkPath&
>(fPartials[pIndex >> 1]);
261 const SkPath& part = partPartials[0];
266 reverse.reverseAddPath(part);
272 int linkCount = endCount / 2;
276 for (rIndex = 0; rIndex < linkCount; ++rIndex) {
277 sLink[rIndex] = eLink[rIndex] =
SK_MaxS32;
279 const int entries = endCount * (endCount - 1) / 2;
285 for (rIndex = 0; rIndex < endCount - 1; ++rIndex) {
286 const SkOpPtT* oPtT = runs[rIndex];
287 for (iIndex = rIndex + 1; iIndex < endCount; ++iIndex) {
288 const SkOpPtT* iPtT = runs[iIndex];
291 double dist = dx * dx + dy * dy;
293 distances.push_back(dist);
300 int remaining = linkCount;
301 for (rIndex = 0; rIndex < entries; ++rIndex) {
302 int pair = sortedDist[rIndex];
303 pair = distLookup[pair];
304 int row = pair / endCount;
305 int col = pair - row * endCount;
306 int ndxOne = row >> 1;
307 bool endOne = row & 1;
308 int* linkOne = endOne ? eLink.
begin() : sLink.
begin();
312 int ndxTwo = col >> 1;
313 bool endTwo = col & 1;
314 int* linkTwo = endTwo ? eLink.
begin() : sLink.
begin();
318 SkASSERT(&linkOne[ndxOne] != &linkTwo[ndxTwo]);
319 bool flip = endOne == endTwo;
320 linkOne[ndxOne] = flip ? ~ndxTwo : ndxTwo;
321 linkTwo[ndxTwo] = flip ? ~ndxOne : ndxOne;
328 for (rIndex = 0; rIndex < linkCount; ++rIndex) {
329 int s = sLink[rIndex];
330 int e = eLink[rIndex];
331 SkDebugf(
"%s %c%d <- s%d - e%d -> %c%d\n", __FUNCTION__,
s < 0 ?
's' :
'e',
332 s < 0 ? ~s :
s, rIndex, rIndex, e < 0 ?
'e' :
's', e < 0 ? ~e : e);
339 int sIndex = sLink[rIndex];
344 eIndex = sLink[~sIndex];
347 eIndex = eLink[sIndex];
352 SkDebugf(
"%s sIndex=%c%d eIndex=%c%d\n", __FUNCTION__, sIndex < 0 ?
's' :
'e',
353 sIndex < 0 ? ~sIndex : sIndex, eIndex < 0 ?
's' :
'e',
354 eIndex < 0 ? ~eIndex : eIndex);
380 fPathPtr->reversePathTo(
contour);
386 SkDebugf(
"%s rIndex=%d eIndex=%s%d close=%d\n", __FUNCTION__, rIndex,
387 eIndex < 0 ?
"~" :
"", eIndex < 0 ? ~eIndex : eIndex,
388 sIndex == ((rIndex != eIndex) ^ forward ? eIndex : ~eIndex));
390 if (sIndex == ((rIndex != eIndex) ^ forward ? eIndex : ~eIndex)) {
395 eIndex = eLink[rIndex];
402 SkASSERT(eLink[~eIndex] == ~rIndex);
406 eIndex = sLink[rIndex];
413 SkASSERT(sLink[~eIndex] == ~rIndex);
423 for (rIndex = 0; rIndex < linkCount; ++rIndex) {
428 }
while (rIndex < linkCount);
430 for (rIndex = 0; rIndex < linkCount; ++rIndex) {
SkPath & cubicTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2, SkScalar x3, SkScalar y3)