Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Side by Side Diff: src/gpu/GrTessellator.cpp

Issue 2404403003: GrTessellator: make inverse fill types more sane. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "GrDefaultGeoProcFactory.h" 10 #include "GrDefaultGeoProcFactory.h"
(...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after
669 669
670 SkPoint pts[4]; 670 SkPoint pts[4];
671 bool done = false; 671 bool done = false;
672 *isLinear = true; 672 *isLinear = true;
673 SkPath::Iter iter(path, false); 673 SkPath::Iter iter(path, false);
674 Vertex* prev = nullptr; 674 Vertex* prev = nullptr;
675 Vertex* head = nullptr; 675 Vertex* head = nullptr;
676 if (path.isInverseFillType()) { 676 if (path.isInverseFillType()) {
677 SkPoint quad[4]; 677 SkPoint quad[4];
678 clipBounds.toQuad(quad); 678 clipBounds.toQuad(quad);
679 for (int i = 0; i < 4; i++) { 679 for (int i = 3; i >= 0; i--) {
680 prev = append_point_to_contour(quad[i], prev, &head, alloc); 680 prev = append_point_to_contour(quad[i], prev, &head, alloc);
681 } 681 }
682 head->fPrev = prev; 682 head->fPrev = prev;
683 prev->fNext = head; 683 prev->fNext = head;
684 *contours++ = head; 684 *contours++ = head;
685 head = prev = nullptr; 685 head = prev = nullptr;
686 } 686 }
687 SkAutoConicToQuads converter; 687 SkAutoConicToQuads converter;
688 while (!done) { 688 while (!done) {
689 SkPath::Verb verb = iter.next(pts); 689 SkPath::Verb verb = iter.next(pts);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 if (!poly) { 751 if (!poly) {
752 return false; 752 return false;
753 } 753 }
754 int winding = poly->fWinding; 754 int winding = poly->fWinding;
755 switch (fillType) { 755 switch (fillType) {
756 case SkPath::kWinding_FillType: 756 case SkPath::kWinding_FillType:
757 return winding != 0; 757 return winding != 0;
758 case SkPath::kEvenOdd_FillType: 758 case SkPath::kEvenOdd_FillType:
759 return (winding & 1) != 0; 759 return (winding & 1) != 0;
760 case SkPath::kInverseWinding_FillType: 760 case SkPath::kInverseWinding_FillType:
761 return winding == -1; 761 return winding == 1;
762 case SkPath::kInverseEvenOdd_FillType: 762 case SkPath::kInverseEvenOdd_FillType:
763 return (winding & 1) == 1; 763 return (winding & 1) == 1;
764 default: 764 default:
765 SkASSERT(false); 765 SkASSERT(false);
766 return false; 766 return false;
767 } 767 }
768 } 768 }
769 769
770 Edge* new_edge(Vertex* prev, Vertex* next, SkChunkAlloc& alloc, Comparator& c, 770 Edge* new_edge(Vertex* prev, Vertex* next, SkChunkAlloc& alloc, Comparator& c,
771 int winding_scale = 1) { 771 int winding_scale = 1) {
(...skipping 858 matching lines...) Expand 10 before | Expand all | Expand 10 after
1630 LOG("path.moveTo(%20.20g, %20.20g);\n", v->fPoint.fX, v->fPoint.fY); 1630 LOG("path.moveTo(%20.20g, %20.20g);\n", v->fPoint.fX, v->fPoint.fY);
1631 for (v = v->fNext; v != contours[i]; v = v->fNext) { 1631 for (v = v->fNext; v != contours[i]; v = v->fNext) {
1632 LOG("path.lineTo(%20.20g, %20.20g);\n", v->fPoint.fX, v->fPoint.fY); 1632 LOG("path.lineTo(%20.20g, %20.20g);\n", v->fPoint.fX, v->fPoint.fY);
1633 } 1633 }
1634 } 1634 }
1635 #endif 1635 #endif
1636 sanitize_contours(contours, contourCnt, antialias); 1636 sanitize_contours(contours, contourCnt, antialias);
1637 return build_edges(contours, contourCnt, c, alloc); 1637 return build_edges(contours, contourCnt, c, alloc);
1638 } 1638 }
1639 1639
1640 Poly* mesh_to_polys(Vertex** vertices, SkPath::FillType fillType, Comparator& c, 1640 Poly* mesh_to_polys(Vertex** vertices, Comparator& c, SkChunkAlloc& alloc) {
1641 SkChunkAlloc& alloc) {
1642 if (!vertices || !*vertices) { 1641 if (!vertices || !*vertices) {
1643 return nullptr; 1642 return nullptr;
1644 } 1643 }
1645 1644
1646 // Sort vertices in Y (secondarily in X). 1645 // Sort vertices in Y (secondarily in X).
1647 merge_sort(vertices, c); 1646 merge_sort(vertices, c);
1648 merge_coincident_vertices(vertices, c, alloc); 1647 merge_coincident_vertices(vertices, c, alloc);
1649 #if LOGGING_ENABLED 1648 #if LOGGING_ENABLED
1650 for (Vertex* v = *vertices; v != nullptr; v = v->fNext) { 1649 for (Vertex* v = *vertices; v != nullptr; v = v->fNext) {
1651 static float gID = 0.0f; 1650 static float gID = 0.0f;
1652 v->fID = gID++; 1651 v->fID = gID++;
1653 } 1652 }
1654 #endif 1653 #endif
1655 simplify(*vertices, c, alloc); 1654 simplify(*vertices, c, alloc);
1656 return tessellate(*vertices, alloc); 1655 return tessellate(*vertices, alloc);
1657 } 1656 }
1658 1657
1659 Poly* contours_to_polys(Vertex** contours, int contourCnt, SkPath::FillType fill Type, 1658 Poly* contours_to_polys(Vertex** contours, int contourCnt, SkPath::FillType fill Type,
1660 const SkRect& pathBounds, bool antialias, 1659 const SkRect& pathBounds, bool antialias,
1661 SkChunkAlloc& alloc) { 1660 SkChunkAlloc& alloc) {
1662 Comparator c; 1661 Comparator c;
1663 if (pathBounds.width() > pathBounds.height()) { 1662 if (pathBounds.width() > pathBounds.height()) {
1664 c.sweep_lt = sweep_lt_horiz; 1663 c.sweep_lt = sweep_lt_horiz;
1665 c.sweep_gt = sweep_gt_horiz; 1664 c.sweep_gt = sweep_gt_horiz;
1666 } else { 1665 } else {
1667 c.sweep_lt = sweep_lt_vert; 1666 c.sweep_lt = sweep_lt_vert;
1668 c.sweep_gt = sweep_gt_vert; 1667 c.sweep_gt = sweep_gt_vert;
1669 } 1668 }
1670 Vertex* mesh = contours_to_mesh(contours, contourCnt, antialias, c, alloc); 1669 Vertex* mesh = contours_to_mesh(contours, contourCnt, antialias, c, alloc);
1671 Poly* polys = mesh_to_polys(&mesh, fillType, c, alloc); 1670 Poly* polys = mesh_to_polys(&mesh, c, alloc);
1672 if (antialias) { 1671 if (antialias) {
1673 EdgeList* boundaries = extract_boundaries(mesh, fillType, alloc); 1672 EdgeList* boundaries = extract_boundaries(mesh, fillType, alloc);
1674 VertexList aaMesh; 1673 VertexList aaMesh;
1675 for (EdgeList* boundary = boundaries; boundary != nullptr; boundary = bo undary->fNext) { 1674 for (EdgeList* boundary = boundaries; boundary != nullptr; boundary = bo undary->fNext) {
1676 simplify_boundary(boundary, c, alloc); 1675 simplify_boundary(boundary, c, alloc);
1677 if (boundary->fCount > 2) { 1676 if (boundary->fCount > 2) {
1678 boundary_to_aa_mesh(boundary, &aaMesh, c, alloc); 1677 boundary_to_aa_mesh(boundary, &aaMesh, c, alloc);
1679 } 1678 }
1680 } 1679 }
1681 return mesh_to_polys(&aaMesh.fHead, SkPath::kWinding_FillType, c, alloc) ; 1680 return mesh_to_polys(&aaMesh.fHead, c, alloc);
1682 } 1681 }
1683 return polys; 1682 return polys;
1684 } 1683 }
1685 1684
1686 // Stage 6: Triangulate the monotone polygons into a vertex buffer. 1685 // Stage 6: Triangulate the monotone polygons into a vertex buffer.
1687 void* polys_to_triangles(Poly* polys, SkPath::FillType fillType, const AAParams* aaParams, 1686 void* polys_to_triangles(Poly* polys, SkPath::FillType fillType, const AAParams* aaParams,
1688 void* data) { 1687 void* data) {
1689 for (Poly* poly = polys; poly; poly = poly->fNext) { 1688 for (Poly* poly = polys; poly; poly = poly->fNext) {
1690 if (apply_fill_type(fillType, poly)) { 1689 if (apply_fill_type(fillType, poly)) {
1691 data = poly->emit(aaParams, data); 1690 data = poly->emit(aaParams, data);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1748 int contourCnt; 1747 int contourCnt;
1749 int sizeEstimate; 1748 int sizeEstimate;
1750 get_contour_count_and_size_estimate(path, tolerance, &contourCnt, &sizeEstim ate); 1749 get_contour_count_and_size_estimate(path, tolerance, &contourCnt, &sizeEstim ate);
1751 if (contourCnt <= 0) { 1750 if (contourCnt <= 0) {
1752 *isLinear = true; 1751 *isLinear = true;
1753 return 0; 1752 return 0;
1754 } 1753 }
1755 SkChunkAlloc alloc(sizeEstimate); 1754 SkChunkAlloc alloc(sizeEstimate);
1756 Poly* polys = path_to_polys(path, tolerance, clipBounds, contourCnt, alloc, antialias, 1755 Poly* polys = path_to_polys(path, tolerance, clipBounds, contourCnt, alloc, antialias,
1757 isLinear); 1756 isLinear);
1758 SkPath::FillType fillType = path.getFillType(); 1757 SkPath::FillType fillType = antialias ? SkPath::kWinding_FillType : path.get FillType();
1759 int count = count_points(polys, fillType); 1758 int count = count_points(polys, fillType);
1760 if (0 == count) { 1759 if (0 == count) {
1761 return 0; 1760 return 0;
1762 } 1761 }
1763 1762
1764 void* verts = vertexAllocator->lock(count); 1763 void* verts = vertexAllocator->lock(count);
1765 if (!verts) { 1764 if (!verts) {
1766 SkDebugf("Could not allocate vertices\n"); 1765 SkDebugf("Could not allocate vertices\n");
1767 return 0; 1766 return 0;
1768 } 1767 }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1815 } 1814 }
1816 } 1815 }
1817 int actualCount = static_cast<int>(vertsEnd - *verts); 1816 int actualCount = static_cast<int>(vertsEnd - *verts);
1818 SkASSERT(actualCount <= count); 1817 SkASSERT(actualCount <= count);
1819 SkASSERT(pointsEnd - points == actualCount); 1818 SkASSERT(pointsEnd - points == actualCount);
1820 delete[] points; 1819 delete[] points;
1821 return actualCount; 1820 return actualCount;
1822 } 1821 }
1823 1822
1824 } // namespace 1823 } // namespace
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698