| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrTessellator.h" | 8 #include "GrTessellator.h" |
| 9 | 9 |
| 10 #include "GrPathUtils.h" | 10 #include "GrPathUtils.h" |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 246 , fRight(nullptr) | 246 , fRight(nullptr) |
| 247 , fPrevEdgeAbove(nullptr) | 247 , fPrevEdgeAbove(nullptr) |
| 248 , fNextEdgeAbove(nullptr) | 248 , fNextEdgeAbove(nullptr) |
| 249 , fPrevEdgeBelow(nullptr) | 249 , fPrevEdgeBelow(nullptr) |
| 250 , fNextEdgeBelow(nullptr) | 250 , fNextEdgeBelow(nullptr) |
| 251 , fLeftPoly(nullptr) | 251 , fLeftPoly(nullptr) |
| 252 , fRightPoly(nullptr) | 252 , fRightPoly(nullptr) |
| 253 , fLeftPolyPrev(nullptr) | 253 , fLeftPolyPrev(nullptr) |
| 254 , fLeftPolyNext(nullptr) | 254 , fLeftPolyNext(nullptr) |
| 255 , fRightPolyPrev(nullptr) | 255 , fRightPolyPrev(nullptr) |
| 256 , fRightPolyNext(nullptr) { | 256 , fRightPolyNext(nullptr) |
| 257 , fUsedInLeftPoly(false) |
| 258 , fUsedInRightPoly(false) { |
| 257 recompute(); | 259 recompute(); |
| 258 } | 260 } |
| 259 int fWinding; // 1 == edge goes downward; -1 = edge goes upwar
d. | 261 int fWinding; // 1 == edge goes downward; -1 = edge goes upwar
d. |
| 260 Vertex* fTop; // The top vertex in vertex-sort-order (sweep_lt
). | 262 Vertex* fTop; // The top vertex in vertex-sort-order (sweep_lt
). |
| 261 Vertex* fBottom; // The bottom vertex in vertex-sort-order. | 263 Vertex* fBottom; // The bottom vertex in vertex-sort-order. |
| 262 Edge* fLeft; // The linked list of edges in the active edge l
ist. | 264 Edge* fLeft; // The linked list of edges in the active edge l
ist. |
| 263 Edge* fRight; // " | 265 Edge* fRight; // " |
| 264 Edge* fPrevEdgeAbove; // The linked list of edges in the bottom Vertex
's "edges above". | 266 Edge* fPrevEdgeAbove; // The linked list of edges in the bottom Vertex
's "edges above". |
| 265 Edge* fNextEdgeAbove; // " | 267 Edge* fNextEdgeAbove; // " |
| 266 Edge* fPrevEdgeBelow; // The linked list of edges in the top Vertex's
"edges below". | 268 Edge* fPrevEdgeBelow; // The linked list of edges in the top Vertex's
"edges below". |
| 267 Edge* fNextEdgeBelow; // " | 269 Edge* fNextEdgeBelow; // " |
| 268 Poly* fLeftPoly; // The Poly to the left of this edge, if any. | 270 Poly* fLeftPoly; // The Poly to the left of this edge, if any. |
| 269 Poly* fRightPoly; // The Poly to the right of this edge, if any. | 271 Poly* fRightPoly; // The Poly to the right of this edge, if any. |
| 270 Edge* fLeftPolyPrev; | 272 Edge* fLeftPolyPrev; |
| 271 Edge* fLeftPolyNext; | 273 Edge* fLeftPolyNext; |
| 272 Edge* fRightPolyPrev; | 274 Edge* fRightPolyPrev; |
| 273 Edge* fRightPolyNext; | 275 Edge* fRightPolyNext; |
| 276 bool fUsedInLeftPoly; |
| 277 bool fUsedInRightPoly; |
| 274 double fDX; // The line equation for this edge, in implicit
form. | 278 double fDX; // The line equation for this edge, in implicit
form. |
| 275 double fDY; // fDY * x + fDX * y + fC = 0, for point (x, y)
on the line. | 279 double fDY; // fDY * x + fDX * y + fC = 0, for point (x, y)
on the line. |
| 276 double fC; | 280 double fC; |
| 277 double dist(const SkPoint& p) const { | 281 double dist(const SkPoint& p) const { |
| 278 return fDY * p.fX - fDX * p.fY + fC; | 282 return fDY * p.fX - fDX * p.fY + fC; |
| 279 } | 283 } |
| 280 bool isRightOf(Vertex* v) const { | 284 bool isRightOf(Vertex* v) const { |
| 281 return dist(v->fPoint) < 0.0; | 285 return dist(v->fPoint) < 0.0; |
| 282 } | 286 } |
| 283 bool isLeftOf(Vertex* v) const { | 287 bool isLeftOf(Vertex* v) const { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 , fNext(nullptr) { | 353 , fNext(nullptr) { |
| 350 this->addEdge(edge); | 354 this->addEdge(edge); |
| 351 } | 355 } |
| 352 Side fSide; | 356 Side fSide; |
| 353 Edge* fFirstEdge; | 357 Edge* fFirstEdge; |
| 354 Edge* fLastEdge; | 358 Edge* fLastEdge; |
| 355 MonotonePoly* fPrev; | 359 MonotonePoly* fPrev; |
| 356 MonotonePoly* fNext; | 360 MonotonePoly* fNext; |
| 357 void addEdge(Edge* edge) { | 361 void addEdge(Edge* edge) { |
| 358 if (fSide == kRight_Side) { | 362 if (fSide == kRight_Side) { |
| 363 if (edge->fUsedInRightPoly) { |
| 364 return; |
| 365 } |
| 359 list_insert<Edge, &Edge::fRightPolyPrev, &Edge::fRightPolyNext>( | 366 list_insert<Edge, &Edge::fRightPolyPrev, &Edge::fRightPolyNext>( |
| 360 edge, fLastEdge, nullptr, &fFirstEdge, &fLastEdge); | 367 edge, fLastEdge, nullptr, &fFirstEdge, &fLastEdge); |
| 368 edge->fUsedInRightPoly = true; |
| 361 } else { | 369 } else { |
| 370 if (edge->fUsedInLeftPoly) { |
| 371 return; |
| 372 } |
| 362 list_insert<Edge, &Edge::fLeftPolyPrev, &Edge::fLeftPolyNext>( | 373 list_insert<Edge, &Edge::fLeftPolyPrev, &Edge::fLeftPolyNext>( |
| 363 edge, fLastEdge, nullptr, &fFirstEdge, &fLastEdge); | 374 edge, fLastEdge, nullptr, &fFirstEdge, &fLastEdge); |
| 375 edge->fUsedInLeftPoly = true; |
| 364 } | 376 } |
| 365 } | 377 } |
| 366 | 378 |
| 367 SkPoint* emit(SkPoint* data) { | 379 SkPoint* emit(SkPoint* data) { |
| 368 Edge* e = fFirstEdge; | 380 Edge* e = fFirstEdge; |
| 369 e->fTop->fPrev = e->fTop->fNext = nullptr; | 381 e->fTop->fPrev = e->fTop->fNext = nullptr; |
| 370 VertexList vertices; | 382 VertexList vertices; |
| 371 vertices.append(e->fTop); | 383 vertices.append(e->fTop); |
| 372 while (e != nullptr) { | 384 while (e != nullptr) { |
| 373 e->fBottom->fPrev = e->fBottom->fNext = nullptr; | 385 e->fBottom->fPrev = e->fBottom->fNext = nullptr; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 400 v = v->fPrev; | 412 v = v->fPrev; |
| 401 } | 413 } |
| 402 } else { | 414 } else { |
| 403 v = v->fNext; | 415 v = v->fNext; |
| 404 } | 416 } |
| 405 } | 417 } |
| 406 return data; | 418 return data; |
| 407 } | 419 } |
| 408 }; | 420 }; |
| 409 Poly* addEdge(Edge* e, Side side, SkChunkAlloc& alloc) { | 421 Poly* addEdge(Edge* e, Side side, SkChunkAlloc& alloc) { |
| 410 LOG("addEdge (%g,%g)-(%g,%g) to poly %d, %s side\n", | 422 LOG("addEdge (%g -> %g) to poly %d, %s side\n", |
| 411 e->fTop->fPoint.fX, e->fTop->fPoint.fY, e->fBottom->fPoint.fX, e-
>fBottom->fPoint.fY, | 423 e->fTop->fID, e->fBottom->fID, fID, side == kLeft_Side ? "left" :
"right"); |
| 412 fID, side == kLeft_Side ? "left" : "right"); | |
| 413 Poly* partner = fPartner; | 424 Poly* partner = fPartner; |
| 414 Poly* poly = this; | 425 Poly* poly = this; |
| 415 if (partner) { | 426 if (partner) { |
| 416 fPartner = partner->fPartner = nullptr; | 427 fPartner = partner->fPartner = nullptr; |
| 417 } | 428 } |
| 418 if (!fTail) { | 429 if (!fTail) { |
| 419 fHead = fTail = ALLOC_NEW(MonotonePoly, (e, side), alloc); | 430 fHead = fTail = ALLOC_NEW(MonotonePoly, (e, side), alloc); |
| 420 fCount += 2; | 431 fCount += 2; |
| 421 } else if (e->fBottom == fTail->fLastEdge->fBottom) { | 432 } else if (e->fBottom == fTail->fLastEdge->fBottom) { |
| 422 return poly; | 433 return poly; |
| (...skipping 1017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1440 } | 1451 } |
| 1441 } | 1452 } |
| 1442 int actualCount = static_cast<int>(vertsEnd - *verts); | 1453 int actualCount = static_cast<int>(vertsEnd - *verts); |
| 1443 SkASSERT(actualCount <= count); | 1454 SkASSERT(actualCount <= count); |
| 1444 SkASSERT(pointsEnd - points == actualCount); | 1455 SkASSERT(pointsEnd - points == actualCount); |
| 1445 delete[] points; | 1456 delete[] points; |
| 1446 return actualCount; | 1457 return actualCount; |
| 1447 } | 1458 } |
| 1448 | 1459 |
| 1449 } // namespace | 1460 } // namespace |
| OLD | NEW |