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

Side by Side Diff: src/core/SkPathRef.cpp

Issue 2388903006: validate using nx to match bounds (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 | tests/PathOpsOpTest.cpp » ('j') | 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 2013 Google Inc. 2 * Copyright 2013 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 "SkBuffer.h" 8 #include "SkBuffer.h"
9 #include "SkOnce.h" 9 #include "SkOnce.h"
10 #include "SkPath.h" 10 #include "SkPath.h"
(...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 fPts = srcPts; 670 fPts = srcPts;
671 return (uint8_t) verb; 671 return (uint8_t) verb;
672 } 672 }
673 673
674 uint8_t SkPathRef::Iter::peek() const { 674 uint8_t SkPathRef::Iter::peek() const {
675 const uint8_t* next = fVerbs - 1; 675 const uint8_t* next = fVerbs - 1;
676 return next <= fVerbStop ? (uint8_t) SkPath::kDone_Verb : *next; 676 return next <= fVerbStop ? (uint8_t) SkPath::kDone_Verb : *next;
677 } 677 }
678 678
679 #ifdef SK_DEBUG 679 #ifdef SK_DEBUG
680
681 #include "SkNx.h"
682
680 void SkPathRef::validate() const { 683 void SkPathRef::validate() const {
681 SkASSERT(static_cast<ptrdiff_t>(fFreeSpace) >= 0); 684 SkASSERT(static_cast<ptrdiff_t>(fFreeSpace) >= 0);
682 SkASSERT(reinterpret_cast<intptr_t>(fVerbs) - reinterpret_cast<intptr_t>(fPo ints) >= 0); 685 SkASSERT(reinterpret_cast<intptr_t>(fVerbs) - reinterpret_cast<intptr_t>(fPo ints) >= 0);
683 SkASSERT((nullptr == fPoints) == (nullptr == fVerbs)); 686 SkASSERT((nullptr == fPoints) == (nullptr == fVerbs));
684 SkASSERT(!(nullptr == fPoints && 0 != fFreeSpace)); 687 SkASSERT(!(nullptr == fPoints && 0 != fFreeSpace));
685 SkASSERT(!(nullptr == fPoints && 0 != fFreeSpace)); 688 SkASSERT(!(nullptr == fPoints && 0 != fFreeSpace));
686 SkASSERT(!(nullptr == fPoints && fPointCnt)); 689 SkASSERT(!(nullptr == fPoints && fPointCnt));
687 SkASSERT(!(nullptr == fVerbs && fVerbCnt)); 690 SkASSERT(!(nullptr == fVerbs && fVerbCnt));
688 SkASSERT(this->currSize() == 691 SkASSERT(this->currSize() ==
689 fFreeSpace + sizeof(SkPoint) * fPointCnt + sizeof(uint8_t) * fVe rbCnt); 692 fFreeSpace + sizeof(SkPoint) * fPointCnt + sizeof(uint8_t) * fVe rbCnt);
690 693
691 if (fIsOval || fIsRRect) { 694 if (fIsOval || fIsRRect) {
692 // Currently we don't allow both of these to be set, even though ovals a re round rects. 695 // Currently we don't allow both of these to be set, even though ovals a re round rects.
693 SkASSERT(fIsOval != fIsRRect); 696 SkASSERT(fIsOval != fIsRRect);
694 if (fIsOval) { 697 if (fIsOval) {
695 SkASSERT(fRRectOrOvalStartIdx < 4); 698 SkASSERT(fRRectOrOvalStartIdx < 4);
696 } else { 699 } else {
697 SkASSERT(fRRectOrOvalStartIdx < 8); 700 SkASSERT(fRRectOrOvalStartIdx < 8);
698 } 701 }
699 } 702 }
700 703
701 if (!fBoundsIsDirty && !fBounds.isEmpty()) { 704 if (!fBoundsIsDirty && !fBounds.isEmpty()) {
702 bool isFinite = true; 705 bool isFinite = true;
706 Sk2s leftTop = Sk2s(fBounds.fLeft, fBounds.fTop);
707 Sk2s rightBot = Sk2s(fBounds.fRight, fBounds.fBottom);
703 for (int i = 0; i < fPointCnt; ++i) { 708 for (int i = 0; i < fPointCnt; ++i) {
709 Sk2s point = Sk2s(fPoints[i].fX, fPoints[i].fY);
704 #ifdef SK_DEBUG 710 #ifdef SK_DEBUG
705 if (fPoints[i].isFinite() && 711 if (fPoints[i].isFinite() &&
706 (fPoints[i].fX < fBounds.fLeft || fPoints[i].fX > fBounds.fRight || 712 ((point < leftTop).anyTrue() || (point > rightBot).anyTrue())) {
707 fPoints[i].fY < fBounds.fTop || fPoints[i].fY > fBounds.fBottom )) {
708 SkDebugf("bounds: %f %f %f %f\n", 713 SkDebugf("bounds: %f %f %f %f\n",
709 fBounds.fLeft, fBounds.fTop, fBounds.fRight, fBounds.fB ottom); 714 fBounds.fLeft, fBounds.fTop, fBounds.fRight, fBounds.fB ottom);
710 for (int j = 0; j < fPointCnt; ++j) { 715 for (int j = 0; j < fPointCnt; ++j) {
711 if (i == j) { 716 if (i == j) {
712 SkDebugf("*"); 717 SkDebugf("*");
713 } 718 }
714 SkDebugf("%f %f\n", fPoints[j].fX, fPoints[j].fY); 719 SkDebugf("%f %f\n", fPoints[j].fX, fPoints[j].fY);
715 } 720 }
716 } 721 }
717 #endif 722 #endif
718 723
719 SkASSERT(!fPoints[i].isFinite() || 724 SkASSERT(!fPoints[i].isFinite() ||
720 » » (fPoints[i].fX >= fBounds.fLeft && fPoints[i].fX <= fBounds .fRight && 725 (!(point < leftTop).anyTrue() && !(point > rightBot).anyTrue ()));
721 » » fPoints[i].fY >= fBounds.fTop && fPoints[i].fY <= fBounds. fBottom));
722 if (!fPoints[i].isFinite()) { 726 if (!fPoints[i].isFinite()) {
723 isFinite = false; 727 isFinite = false;
724 } 728 }
725 } 729 }
726 SkASSERT(SkToBool(fIsFinite) == isFinite); 730 SkASSERT(SkToBool(fIsFinite) == isFinite);
727 } 731 }
728 732
729 #ifdef SK_DEBUG_PATH 733 #ifdef SK_DEBUG_PATH
730 uint32_t mask = 0; 734 uint32_t mask = 0;
731 for (int i = 0; i < fVerbCnt; ++i) { 735 for (int i = 0; i < fVerbCnt; ++i) {
(...skipping 19 matching lines...) Expand all
751 break; 755 break;
752 default: 756 default:
753 SkDEBUGFAIL("Unknown Verb"); 757 SkDEBUGFAIL("Unknown Verb");
754 break; 758 break;
755 } 759 }
756 } 760 }
757 SkASSERT(mask == fSegmentMask); 761 SkASSERT(mask == fSegmentMask);
758 #endif // SK_DEBUG_PATH 762 #endif // SK_DEBUG_PATH
759 } 763 }
760 #endif 764 #endif
OLDNEW
« no previous file with comments | « no previous file | tests/PathOpsOpTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698