| 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 "GrTessellatingPathRenderer.h" | 8 #include "GrTessellatingPathRenderer.h" |
| 9 | 9 |
| 10 #include "GrBatch.h" | 10 #include "GrBatch.h" |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 } | 178 } |
| 179 | 179 |
| 180 bool sweep_gt_horiz(const SkPoint& a, const SkPoint& b) { | 180 bool sweep_gt_horiz(const SkPoint& a, const SkPoint& b) { |
| 181 return a.fX == b.fX ? a.fY < b.fY : a.fX > b.fX; | 181 return a.fX == b.fX ? a.fY < b.fY : a.fX > b.fX; |
| 182 } | 182 } |
| 183 | 183 |
| 184 bool sweep_gt_vert(const SkPoint& a, const SkPoint& b) { | 184 bool sweep_gt_vert(const SkPoint& a, const SkPoint& b) { |
| 185 return a.fY == b.fY ? a.fX > b.fX : a.fY > b.fY; | 185 return a.fY == b.fY ? a.fX > b.fX : a.fY > b.fY; |
| 186 } | 186 } |
| 187 | 187 |
| 188 inline void* emit_vertex(Vertex* v, void* data) { | 188 inline SkPoint* emit_vertex(Vertex* v, SkPoint* data) { |
| 189 SkPoint* d = static_cast<SkPoint*>(data); | 189 *data++ = v->fPoint; |
| 190 *d++ = v->fPoint; | 190 return data; |
| 191 return d; | |
| 192 } | 191 } |
| 193 | 192 |
| 194 void* emit_triangle(Vertex* v0, Vertex* v1, Vertex* v2, void* data) { | 193 SkPoint* emit_triangle(Vertex* v0, Vertex* v1, Vertex* v2, SkPoint* data) { |
| 195 #if WIREFRAME | 194 #if WIREFRAME |
| 196 data = emit_vertex(v0, data); | 195 data = emit_vertex(v0, data); |
| 197 data = emit_vertex(v1, data); | 196 data = emit_vertex(v1, data); |
| 198 data = emit_vertex(v1, data); | 197 data = emit_vertex(v1, data); |
| 199 data = emit_vertex(v2, data); | 198 data = emit_vertex(v2, data); |
| 200 data = emit_vertex(v2, data); | 199 data = emit_vertex(v2, data); |
| 201 data = emit_vertex(v0, data); | 200 data = emit_vertex(v0, data); |
| 202 #else | 201 #else |
| 203 data = emit_vertex(v0, data); | 202 data = emit_vertex(v0, data); |
| 204 data = emit_vertex(v1, data); | 203 data = emit_vertex(v1, data); |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 fTail->fNext = newV; | 352 fTail->fNext = newV; |
| 354 fTail = newV; | 353 fTail = newV; |
| 355 } else { | 354 } else { |
| 356 newV->fNext = fHead; | 355 newV->fNext = fHead; |
| 357 fHead->fPrev = newV; | 356 fHead->fPrev = newV; |
| 358 fHead = newV; | 357 fHead = newV; |
| 359 } | 358 } |
| 360 return done; | 359 return done; |
| 361 } | 360 } |
| 362 | 361 |
| 363 void* emit(void* data) { | 362 SkPoint* emit(SkPoint* data) { |
| 364 Vertex* first = fHead; | 363 Vertex* first = fHead; |
| 365 Vertex* v = first->fNext; | 364 Vertex* v = first->fNext; |
| 366 while (v != fTail) { | 365 while (v != fTail) { |
| 367 SkASSERT(v && v->fPrev && v->fNext); | 366 SkASSERT(v && v->fPrev && v->fNext); |
| 368 Vertex* prev = v->fPrev; | 367 Vertex* prev = v->fPrev; |
| 369 Vertex* curr = v; | 368 Vertex* curr = v; |
| 370 Vertex* next = v->fNext; | 369 Vertex* next = v->fNext; |
| 371 double ax = static_cast<double>(curr->fPoint.fX) - prev->fPoint.
fX; | 370 double ax = static_cast<double>(curr->fPoint.fX) - prev->fPoint.
fX; |
| 372 double ay = static_cast<double>(curr->fPoint.fY) - prev->fPoint.
fY; | 371 double ay = static_cast<double>(curr->fPoint.fY) - prev->fPoint.
fY; |
| 373 double bx = static_cast<double>(next->fPoint.fX) - curr->fPoint.
fX; | 372 double bx = static_cast<double>(next->fPoint.fX) - curr->fPoint.
fX; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 fCount++; | 420 fCount++; |
| 422 return poly; | 421 return poly; |
| 423 } | 422 } |
| 424 void end(Vertex* v, SkChunkAlloc& alloc) { | 423 void end(Vertex* v, SkChunkAlloc& alloc) { |
| 425 LOG("end() %d at %g, %g\n", fID, v->fPoint.fX, v->fPoint.fY); | 424 LOG("end() %d at %g, %g\n", fID, v->fPoint.fX, v->fPoint.fY); |
| 426 if (fPartner) { | 425 if (fPartner) { |
| 427 fPartner = fPartner->fPartner = NULL; | 426 fPartner = fPartner->fPartner = NULL; |
| 428 } | 427 } |
| 429 addVertex(v, fActive->fSide == kLeft_Side ? kRight_Side : kLeft_Side, al
loc); | 428 addVertex(v, fActive->fSide == kLeft_Side ? kRight_Side : kLeft_Side, al
loc); |
| 430 } | 429 } |
| 431 void* emit(void *data) { | 430 SkPoint* emit(SkPoint *data) { |
| 432 if (fCount < 3) { | 431 if (fCount < 3) { |
| 433 return data; | 432 return data; |
| 434 } | 433 } |
| 435 LOG("emit() %d, size %d\n", fID, fCount); | 434 LOG("emit() %d, size %d\n", fID, fCount); |
| 436 for (MonotonePoly* m = fHead; m != NULL; m = m->fNext) { | 435 for (MonotonePoly* m = fHead; m != NULL; m = m->fNext) { |
| 437 data = m->emit(data); | 436 data = m->emit(data); |
| 438 } | 437 } |
| 439 return data; | 438 return data; |
| 440 } | 439 } |
| 441 int fWinding; | 440 int fWinding; |
| (...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1270 if (winding != 0) { | 1269 if (winding != 0) { |
| 1271 Poly* poly = new_poly(&polys, v, winding, alloc); | 1270 Poly* poly = new_poly(&polys, v, winding, alloc); |
| 1272 leftEdge->fRightPoly = rightEdge->fLeftPoly = poly; | 1271 leftEdge->fRightPoly = rightEdge->fLeftPoly = poly; |
| 1273 } | 1272 } |
| 1274 leftEdge = rightEdge; | 1273 leftEdge = rightEdge; |
| 1275 } | 1274 } |
| 1276 v->fLastEdgeBelow->fRightPoly = rightPoly; | 1275 v->fLastEdgeBelow->fRightPoly = rightPoly; |
| 1277 } | 1276 } |
| 1278 #if LOGGING_ENABLED | 1277 #if LOGGING_ENABLED |
| 1279 LOG("\nactive edges:\n"); | 1278 LOG("\nactive edges:\n"); |
| 1280 for (Edge* e = activeEdges->fHead; e != NULL; e = e->fRight) { | 1279 for (Edge* e = activeEdges.fHead; e != NULL; e = e->fRight) { |
| 1281 LOG("%g -> %g, lpoly %d, rpoly %d\n", e->fTop->fID, e->fBottom->fID, | 1280 LOG("%g -> %g, lpoly %d, rpoly %d\n", e->fTop->fID, e->fBottom->fID, |
| 1282 e->fLeftPoly ? e->fLeftPoly->fID : -1, e->fRightPoly ? e->fRight
Poly->fID : -1); | 1281 e->fLeftPoly ? e->fLeftPoly->fID : -1, e->fRightPoly ? e->fRight
Poly->fID : -1); |
| 1283 } | 1282 } |
| 1284 #endif | 1283 #endif |
| 1285 } | 1284 } |
| 1286 return polys; | 1285 return polys; |
| 1287 } | 1286 } |
| 1288 | 1287 |
| 1289 // This is a driver function which calls stages 2-5 in turn. | 1288 // This is a driver function which calls stages 2-5 in turn. |
| 1290 | 1289 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1313 static float gID = 0.0f; | 1312 static float gID = 0.0f; |
| 1314 v->fID = gID++; | 1313 v->fID = gID++; |
| 1315 } | 1314 } |
| 1316 #endif | 1315 #endif |
| 1317 simplify(vertices, c, alloc); | 1316 simplify(vertices, c, alloc); |
| 1318 return tessellate(vertices, alloc); | 1317 return tessellate(vertices, alloc); |
| 1319 } | 1318 } |
| 1320 | 1319 |
| 1321 // Stage 6: Triangulate the monotone polygons into a vertex buffer. | 1320 // Stage 6: Triangulate the monotone polygons into a vertex buffer. |
| 1322 | 1321 |
| 1323 void* polys_to_triangles(Poly* polys, SkPath::FillType fillType, void* data) { | 1322 SkPoint* polys_to_triangles(Poly* polys, SkPath::FillType fillType, SkPoint* dat
a) { |
| 1324 void* d = data; | 1323 SkPoint* d = data; |
| 1325 for (Poly* poly = polys; poly; poly = poly->fNext) { | 1324 for (Poly* poly = polys; poly; poly = poly->fNext) { |
| 1326 if (apply_fill_type(fillType, poly->fWinding)) { | 1325 if (apply_fill_type(fillType, poly->fWinding)) { |
| 1327 d = poly->emit(d); | 1326 d = poly->emit(d); |
| 1328 } | 1327 } |
| 1329 } | 1328 } |
| 1330 return d; | 1329 return d; |
| 1331 } | 1330 } |
| 1332 | 1331 |
| 1333 }; | 1332 }; |
| 1334 | 1333 |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1431 for (Poly* poly = polys; poly; poly = poly->fNext) { | 1430 for (Poly* poly = polys; poly; poly = poly->fNext) { |
| 1432 if (apply_fill_type(fillType, poly->fWinding) && poly->fCount >= 3)
{ | 1431 if (apply_fill_type(fillType, poly->fWinding) && poly->fCount >= 3)
{ |
| 1433 count += (poly->fCount - 2) * (WIREFRAME ? 6 : 3); | 1432 count += (poly->fCount - 2) * (WIREFRAME ? 6 : 3); |
| 1434 } | 1433 } |
| 1435 } | 1434 } |
| 1436 if (0 == count) { | 1435 if (0 == count) { |
| 1437 return; | 1436 return; |
| 1438 } | 1437 } |
| 1439 | 1438 |
| 1440 size_t stride = gp->getVertexStride(); | 1439 size_t stride = gp->getVertexStride(); |
| 1440 SkASSERT(stride == sizeof(SkPoint)); |
| 1441 const GrVertexBuffer* vertexBuffer; | 1441 const GrVertexBuffer* vertexBuffer; |
| 1442 int firstVertex; | 1442 int firstVertex; |
| 1443 void* verts = batchTarget->makeVertSpace(stride, count, &vertexBuffer, &
firstVertex); | 1443 SkPoint* verts = static_cast<SkPoint*>( |
| 1444 batchTarget->makeVertSpace(stride, count, &vertexBuffer, &firstVerte
x)); |
| 1444 if (!verts) { | 1445 if (!verts) { |
| 1445 SkDebugf("Could not allocate vertices\n"); | 1446 SkDebugf("Could not allocate vertices\n"); |
| 1446 return; | 1447 return; |
| 1447 } | 1448 } |
| 1448 | 1449 |
| 1449 LOG("emitting %d verts\n", count); | 1450 LOG("emitting %d verts\n", count); |
| 1450 void* end = polys_to_triangles(polys, fillType, verts); | 1451 SkPoint* end = polys_to_triangles(polys, fillType, verts); |
| 1451 int actualCount = static_cast<int>( | 1452 int actualCount = static_cast<int>(end - verts); |
| 1452 (static_cast<char*>(end) - static_cast<char*>(verts)) / stride); | |
| 1453 LOG("actual count: %d\n", actualCount); | 1453 LOG("actual count: %d\n", actualCount); |
| 1454 SkASSERT(actualCount <= count); | 1454 SkASSERT(actualCount <= count); |
| 1455 | 1455 |
| 1456 GrPrimitiveType primitiveType = WIREFRAME ? kLines_GrPrimitiveType | 1456 GrPrimitiveType primitiveType = WIREFRAME ? kLines_GrPrimitiveType |
| 1457 : kTriangles_GrPrimitiveType; | 1457 : kTriangles_GrPrimitiveType; |
| 1458 GrVertices vertices; | 1458 GrVertices vertices; |
| 1459 vertices.init(primitiveType, vertexBuffer, firstVertex, actualCount); | 1459 vertices.init(primitiveType, vertexBuffer, firstVertex, actualCount); |
| 1460 batchTarget->draw(vertices); | 1460 batchTarget->draw(vertices); |
| 1461 | 1461 |
| 1462 batchTarget->putBackVertices((size_t)(count - actualCount), stride); | 1462 batchTarget->putBackVertices((size_t)(count - actualCount), stride); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1528 SkMatrix vmi; | 1528 SkMatrix vmi; |
| 1529 bool result = viewMatrix.invert(&vmi); | 1529 bool result = viewMatrix.invert(&vmi); |
| 1530 if (!result) { | 1530 if (!result) { |
| 1531 SkFAIL("Cannot invert matrix\n"); | 1531 SkFAIL("Cannot invert matrix\n"); |
| 1532 } | 1532 } |
| 1533 vmi.mapRect(&clipBounds); | 1533 vmi.mapRect(&clipBounds); |
| 1534 return TessellatingPathBatch::Create(color, path, viewMatrix, clipBounds); | 1534 return TessellatingPathBatch::Create(color, path, viewMatrix, clipBounds); |
| 1535 } | 1535 } |
| 1536 | 1536 |
| 1537 #endif | 1537 #endif |
| OLD | NEW |