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

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

Issue 1151623002: Fix for bisector computation bug in GrAAConvexTessellator (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 7 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 | « src/gpu/GrAAConvexTessellator.h ('k') | 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 "GrAAConvexTessellator.h" 8 #include "GrAAConvexTessellator.h"
9 #include "SkCanvas.h" 9 #include "SkCanvas.h"
10 #include "SkPath.h" 10 #include "SkPath.h"
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 fRings[1].rewind(); 118 fRings[1].rewind();
119 #endif 119 #endif
120 } 120 }
121 121
122 void GrAAConvexTessellator::computeBisectors() { 122 void GrAAConvexTessellator::computeBisectors() {
123 fBisectors.setCount(fNorms.count()); 123 fBisectors.setCount(fNorms.count());
124 124
125 int prev = fBisectors.count() - 1; 125 int prev = fBisectors.count() - 1;
126 for (int cur = 0; cur < fBisectors.count(); prev = cur, ++cur) { 126 for (int cur = 0; cur < fBisectors.count(); prev = cur, ++cur) {
127 fBisectors[cur] = fNorms[cur] + fNorms[prev]; 127 fBisectors[cur] = fNorms[cur] + fNorms[prev];
128 fBisectors[cur].normalize(); 128 if (!fBisectors[cur].normalize()) {
129 fBisectors[cur].negate(); // make the bisector face in 129 SkASSERT(SkPoint::kLeft_Side == fSide || SkPoint::kRight_Side == fSi de);
130 fBisectors[cur].setOrthog(fNorms[cur], (SkPoint::Side)-fSide);
131 SkVector other;
132 other.setOrthog(fNorms[prev], fSide);
133 fBisectors[cur] += other;
134 SkAssertResult(fBisectors[cur].normalize());
135 } else {
136 fBisectors[cur].negate(); // make the bisector face in
137 }
130 138
131 SkASSERT(SkScalarNearlyEqual(1.0f, fBisectors[cur].length())); 139 SkASSERT(SkScalarNearlyEqual(1.0f, fBisectors[cur].length()));
132 } 140 }
133 } 141 }
134 142
135 // The general idea here is to, conceptually, start with the original polygon an d slide 143 // The general idea here is to, conceptually, start with the original polygon an d slide
136 // the vertices along the bisectors until the first intersection. At that 144 // the vertices along the bisectors until the first intersection. At that
137 // point two of the edges collapse and the process repeats on the new polygon. 145 // point two of the edges collapse and the process repeats on the new polygon.
138 // The polygon state is captured in the Ring class while the GrAAConvexTessellat or 146 // The polygon state is captured in the Ring class while the GrAAConvexTessellat or
139 // controls the iteration. The CandidateVerts holds the formative points for the 147 // controls the iteration. The CandidateVerts holds the formative points for the
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 628
621 void GrAAConvexTessellator::validate() const { 629 void GrAAConvexTessellator::validate() const {
622 SkASSERT(fPts.count() == fDepths.count()); 630 SkASSERT(fPts.count() == fDepths.count());
623 SkASSERT(fPts.count() == fMovable.count()); 631 SkASSERT(fPts.count() == fMovable.count());
624 SkASSERT(0 == (fIndices.count() % 3)); 632 SkASSERT(0 == (fIndices.count() % 3));
625 } 633 }
626 634
627 ////////////////////////////////////////////////////////////////////////////// 635 //////////////////////////////////////////////////////////////////////////////
628 void GrAAConvexTessellator::Ring::init(const GrAAConvexTessellator& tess) { 636 void GrAAConvexTessellator::Ring::init(const GrAAConvexTessellator& tess) {
629 this->computeNormals(tess); 637 this->computeNormals(tess);
630 this->computeBisectors(); 638 this->computeBisectors(tess);
631 SkASSERT(this->isConvex(tess)); 639 SkASSERT(this->isConvex(tess));
632 } 640 }
633 641
634 void GrAAConvexTessellator::Ring::init(const SkTDArray<SkVector>& norms, 642 void GrAAConvexTessellator::Ring::init(const SkTDArray<SkVector>& norms,
635 const SkTDArray<SkVector>& bisectors) { 643 const SkTDArray<SkVector>& bisectors) {
636 for (int i = 0; i < fPts.count(); ++i) { 644 for (int i = 0; i < fPts.count(); ++i) {
637 fPts[i].fNorm = norms[i]; 645 fPts[i].fNorm = norms[i];
638 fPts[i].fBisector = bisectors[i]; 646 fPts[i].fBisector = bisectors[i];
639 } 647 }
640 } 648 }
641 649
642 // Compute the outward facing normal at each vertex. 650 // Compute the outward facing normal at each vertex.
643 void GrAAConvexTessellator::Ring::computeNormals(const GrAAConvexTessellator& te ss) { 651 void GrAAConvexTessellator::Ring::computeNormals(const GrAAConvexTessellator& te ss) {
644 for (int cur = 0; cur < fPts.count(); ++cur) { 652 for (int cur = 0; cur < fPts.count(); ++cur) {
645 int next = (cur + 1) % fPts.count(); 653 int next = (cur + 1) % fPts.count();
646 654
647 fPts[cur].fNorm = tess.point(fPts[next].fIndex) - tess.point(fPts[cur].f Index); 655 fPts[cur].fNorm = tess.point(fPts[next].fIndex) - tess.point(fPts[cur].f Index);
648 SkDEBUGCODE(SkScalar len =) SkPoint::Normalize(&fPts[cur].fNorm); 656 SkDEBUGCODE(SkScalar len =) SkPoint::Normalize(&fPts[cur].fNorm);
649 SkASSERT(len > 0.0f); 657 SkASSERT(len > 0.0f);
650 fPts[cur].fNorm.setOrthog(fPts[cur].fNorm, tess.side()); 658 fPts[cur].fNorm.setOrthog(fPts[cur].fNorm, tess.side());
651 659
652 SkASSERT(SkScalarNearlyEqual(1.0f, fPts[cur].fNorm.length())); 660 SkASSERT(SkScalarNearlyEqual(1.0f, fPts[cur].fNorm.length()));
653 } 661 }
654 } 662 }
655 663
656 void GrAAConvexTessellator::Ring::computeBisectors() { 664 void GrAAConvexTessellator::Ring::computeBisectors(const GrAAConvexTessellator& tess) {
657 int prev = fPts.count() - 1; 665 int prev = fPts.count() - 1;
658 for (int cur = 0; cur < fPts.count(); prev = cur, ++cur) { 666 for (int cur = 0; cur < fPts.count(); prev = cur, ++cur) {
659 fPts[cur].fBisector = fPts[cur].fNorm + fPts[prev].fNorm; 667 fPts[cur].fBisector = fPts[cur].fNorm + fPts[prev].fNorm;
660 fPts[cur].fBisector.normalize(); 668 if (!fPts[cur].fBisector.normalize()) {
661 fPts[cur].fBisector.negate(); // make the bisector face in 669 SkASSERT(SkPoint::kLeft_Side == tess.side() || SkPoint::kRight_Side == tess.side());
670 fPts[cur].fBisector.setOrthog(fPts[cur].fNorm, (SkPoint::Side)-tess. side());
671 SkVector other;
672 other.setOrthog(fPts[prev].fNorm, tess.side());
673 fPts[cur].fBisector += other;
674 SkAssertResult(fPts[cur].fBisector.normalize());
675 } else {
676 fPts[cur].fBisector.negate(); // make the bisector face in
677 }
662 678
663 SkASSERT(SkScalarNearlyEqual(1.0f, fPts[cur].fBisector.length())); 679 SkASSERT(SkScalarNearlyEqual(1.0f, fPts[cur].fBisector.length()));
664 } 680 }
665 } 681 }
666 682
667 ////////////////////////////////////////////////////////////////////////////// 683 //////////////////////////////////////////////////////////////////////////////
668 #ifdef SK_DEBUG 684 #ifdef SK_DEBUG
669 // Is this ring convex? 685 // Is this ring convex?
670 bool GrAAConvexTessellator::Ring::isConvex(const GrAAConvexTessellator& tess) co nst { 686 bool GrAAConvexTessellator::Ring::isConvex(const GrAAConvexTessellator& tess) co nst {
671 if (fPts.count() < 3) { 687 if (fPts.count() < 3) {
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
865 SkString num; 881 SkString num;
866 num.printf("%d", i); 882 num.printf("%d", i);
867 canvas->drawText(num.c_str(), num.size(), 883 canvas->drawText(num.c_str(), num.size(),
868 this->point(i).fX, this->point(i).fY+(kPointRadius/2.0f ), 884 this->point(i).fX, this->point(i).fY+(kPointRadius/2.0f ),
869 paint); 885 paint);
870 } 886 }
871 } 887 }
872 888
873 #endif 889 #endif
874 890
OLDNEW
« no previous file with comments | « src/gpu/GrAAConvexTessellator.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698