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

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

Issue 49693002: Use SkPathRef gen id for SkPath::getGenerationID (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: upload again, rietveld diff failed. Created 7 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « include/core/SkPathRef.h ('k') | src/core/SkPathRef.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 /* 2 /*
3 * Copyright 2006 The Android Open Source Project 3 * Copyright 2006 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkBuffer.h" 10 #include "SkBuffer.h"
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 */ 140 */
141 141
142 //////////////////////////////////////////////////////////////////////////// 142 ////////////////////////////////////////////////////////////////////////////
143 143
144 // flag to require a moveTo if we begin with something else, like lineTo etc. 144 // flag to require a moveTo if we begin with something else, like lineTo etc.
145 #define INITIAL_LASTMOVETOINDEX_VALUE ~0 145 #define INITIAL_LASTMOVETOINDEX_VALUE ~0
146 146
147 SkPath::SkPath() 147 SkPath::SkPath()
148 : fPathRef(SkPathRef::CreateEmpty()) 148 : fPathRef(SkPathRef::CreateEmpty())
149 #ifdef SK_BUILD_FOR_ANDROID 149 #ifdef SK_BUILD_FOR_ANDROID
150 , fGenerationID(0) 150 , fSourcePath(NULL)
151 #endif 151 #endif
152 { 152 {
153 this->resetFields(); 153 this->resetFields();
154 } 154 }
155 155
156 void SkPath::resetFields() { 156 void SkPath::resetFields() {
157 //fPathRef is assumed to have been emptied by the caller. 157 //fPathRef is assumed to have been emptied by the caller.
158 fLastMoveToIndex = INITIAL_LASTMOVETOINDEX_VALUE; 158 fLastMoveToIndex = INITIAL_LASTMOVETOINDEX_VALUE;
159 fFillType = kWinding_FillType; 159 fFillType = kWinding_FillType;
160 fSegmentMask = 0; 160 fSegmentMask = 0;
161 fConvexity = kUnknown_Convexity; 161 fConvexity = kUnknown_Convexity;
162 fDirection = kUnknown_Direction; 162 fDirection = kUnknown_Direction;
163 fIsOval = false; 163 fIsOval = false;
164 #ifdef SK_BUILD_FOR_ANDROID 164
165 GEN_ID_INC; 165 // We don't touch Android's fSourcePath. It's used to track texture garbage collection, so we
166 // We don't touch fSourcePath. It's used to track texture garbage collectio n, so we don't 166 // don't want to muck with it if it's been set to something non-NULL.
167 // want to muck with it if it's been set to something non-NULL.
168 #endif
169 } 167 }
170 168
171 SkPath::SkPath(const SkPath& that) 169 SkPath::SkPath(const SkPath& that)
172 : fPathRef(SkRef(that.fPathRef.get())) { 170 : fPathRef(SkRef(that.fPathRef.get())) {
173 this->copyFields(that); 171 this->copyFields(that);
174 #ifdef SK_BUILD_FOR_ANDROID 172 #ifdef SK_BUILD_FOR_ANDROID
175 fGenerationID = that.fGenerationID;
176 fSourcePath = that.fSourcePath; 173 fSourcePath = that.fSourcePath;
177 #endif 174 #endif
178 SkDEBUGCODE(that.validate();) 175 SkDEBUGCODE(that.validate();)
179 } 176 }
180 177
181 SkPath::~SkPath() { 178 SkPath::~SkPath() {
182 SkDEBUGCODE(this->validate();) 179 SkDEBUGCODE(this->validate();)
183 } 180 }
184 181
185 SkPath& SkPath::operator=(const SkPath& that) { 182 SkPath& SkPath::operator=(const SkPath& that) {
186 SkDEBUGCODE(that.validate();) 183 SkDEBUGCODE(that.validate();)
187 184
188 if (this != &that) { 185 if (this != &that) {
189 fPathRef.reset(SkRef(that.fPathRef.get())); 186 fPathRef.reset(SkRef(that.fPathRef.get()));
190 this->copyFields(that); 187 this->copyFields(that);
191 #ifdef SK_BUILD_FOR_ANDROID 188 #ifdef SK_BUILD_FOR_ANDROID
192 GEN_ID_INC; // Similar to swap, we can't just copy this or it could go back in time.
193 fSourcePath = that.fSourcePath; 189 fSourcePath = that.fSourcePath;
194 #endif 190 #endif
195 } 191 }
196 SkDEBUGCODE(this->validate();) 192 SkDEBUGCODE(this->validate();)
197 return *this; 193 return *this;
198 } 194 }
199 195
200 void SkPath::copyFields(const SkPath& that) { 196 void SkPath::copyFields(const SkPath& that) {
201 //fPathRef is assumed to have been set by the caller. 197 //fPathRef is assumed to have been set by the caller.
202 fLastMoveToIndex = that.fLastMoveToIndex; 198 fLastMoveToIndex = that.fLastMoveToIndex;
(...skipping 22 matching lines...) Expand all
225 221
226 if (this != &that) { 222 if (this != &that) {
227 fPathRef.swap(&that.fPathRef); 223 fPathRef.swap(&that.fPathRef);
228 SkTSwap<int>(fLastMoveToIndex, that.fLastMoveToIndex); 224 SkTSwap<int>(fLastMoveToIndex, that.fLastMoveToIndex);
229 SkTSwap<uint8_t>(fFillType, that.fFillType); 225 SkTSwap<uint8_t>(fFillType, that.fFillType);
230 SkTSwap<uint8_t>(fSegmentMask, that.fSegmentMask); 226 SkTSwap<uint8_t>(fSegmentMask, that.fSegmentMask);
231 SkTSwap<uint8_t>(fConvexity, that.fConvexity); 227 SkTSwap<uint8_t>(fConvexity, that.fConvexity);
232 SkTSwap<uint8_t>(fDirection, that.fDirection); 228 SkTSwap<uint8_t>(fDirection, that.fDirection);
233 SkTSwap<SkBool8>(fIsOval, that.fIsOval); 229 SkTSwap<SkBool8>(fIsOval, that.fIsOval);
234 #ifdef SK_BUILD_FOR_ANDROID 230 #ifdef SK_BUILD_FOR_ANDROID
235 // It doesn't really make sense to swap the generation IDs here, because they might go
236 // backwards. To be safe we increment both to mark them both as changed .
237 GEN_ID_INC;
238 GEN_ID_PTR_INC(&that);
239 SkTSwap<const SkPath*>(fSourcePath, that.fSourcePath); 231 SkTSwap<const SkPath*>(fSourcePath, that.fSourcePath);
240 #endif 232 #endif
241 } 233 }
242 } 234 }
243 235
244 static inline bool check_edge_against_rect(const SkPoint& p0, 236 static inline bool check_edge_against_rect(const SkPoint& p0,
245 const SkPoint& p1, 237 const SkPoint& p1,
246 const SkRect& rect, 238 const SkRect& rect,
247 SkPath::Direction dir) { 239 SkPath::Direction dir) {
248 const SkPoint* edgeBegin; 240 const SkPoint* edgeBegin;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 if (!check_edge_against_rect(prevPt, pts[nextPt], rect, direction)) { 313 if (!check_edge_against_rect(prevPt, pts[nextPt], rect, direction)) {
322 return false; 314 return false;
323 } 315 }
324 prevPt = pts[nextPt]; 316 prevPt = pts[nextPt];
325 } 317 }
326 } 318 }
327 319
328 return check_edge_against_rect(prevPt, firstPt, rect, direction); 320 return check_edge_against_rect(prevPt, firstPt, rect, direction);
329 } 321 }
330 322
323 uint32_t SkPath::getGenerationID() const {
324 uint32_t genID = fPathRef->genID();
331 #ifdef SK_BUILD_FOR_ANDROID 325 #ifdef SK_BUILD_FOR_ANDROID
332 uint32_t SkPath::getGenerationID() const { 326 SkASSERT((unsigned)fFillType < (1 << (32 - kPathRefGenIDBitCnt)));
333 return fGenerationID; 327 genID |= static_cast<uint32_t>(fFillType) << kPathRefGenIDBitCnt;
328 #endif
329 return genID;
334 } 330 }
335 331
332 #ifdef SK_BUILD_FOR_ANDROID
336 const SkPath* SkPath::getSourcePath() const { 333 const SkPath* SkPath::getSourcePath() const {
337 return fSourcePath; 334 return fSourcePath;
338 } 335 }
339 336
340 void SkPath::setSourcePath(const SkPath* path) { 337 void SkPath::setSourcePath(const SkPath* path) {
341 fSourcePath = path; 338 fSourcePath = path;
342 } 339 }
343 #endif 340 #endif
344 341
345 void SkPath::reset() { 342 void SkPath::reset() {
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 void SkPath::setLastPt(SkScalar x, SkScalar y) { 623 void SkPath::setLastPt(SkScalar x, SkScalar y) {
627 SkDEBUGCODE(this->validate();) 624 SkDEBUGCODE(this->validate();)
628 625
629 int count = fPathRef->countPoints(); 626 int count = fPathRef->countPoints();
630 if (count == 0) { 627 if (count == 0) {
631 this->moveTo(x, y); 628 this->moveTo(x, y);
632 } else { 629 } else {
633 fIsOval = false; 630 fIsOval = false;
634 SkPathRef::Editor ed(&fPathRef); 631 SkPathRef::Editor ed(&fPathRef);
635 ed.atPoint(count-1)->set(x, y); 632 ed.atPoint(count-1)->set(x, y);
636 GEN_ID_INC;
637 } 633 }
638 } 634 }
639 635
640 void SkPath::setConvexity(Convexity c) { 636 void SkPath::setConvexity(Convexity c) {
641 if (fConvexity != c) { 637 if (fConvexity != c) {
642 fConvexity = c; 638 fConvexity = c;
643 GEN_ID_INC;
644 } 639 }
645 } 640 }
646 641
647 ////////////////////////////////////////////////////////////////////////////// 642 //////////////////////////////////////////////////////////////////////////////
648 // Construction methods 643 // Construction methods
649 644
650 #define DIRTY_AFTER_EDIT \ 645 #define DIRTY_AFTER_EDIT \
651 do { \ 646 do { \
652 fConvexity = kUnknown_Convexity; \ 647 fConvexity = kUnknown_Convexity; \
653 fDirection = kUnknown_Direction; \ 648 fDirection = kUnknown_Direction; \
654 fIsOval = false; \ 649 fIsOval = false; \
655 } while (0) 650 } while (0)
656 651
657 void SkPath::incReserve(U16CPU inc) { 652 void SkPath::incReserve(U16CPU inc) {
658 SkDEBUGCODE(this->validate();) 653 SkDEBUGCODE(this->validate();)
659 SkPathRef::Editor(&fPathRef, inc, inc); 654 SkPathRef::Editor(&fPathRef, inc, inc);
660 SkDEBUGCODE(this->validate();) 655 SkDEBUGCODE(this->validate();)
661 } 656 }
662 657
663 void SkPath::moveTo(SkScalar x, SkScalar y) { 658 void SkPath::moveTo(SkScalar x, SkScalar y) {
664 SkDEBUGCODE(this->validate();) 659 SkDEBUGCODE(this->validate();)
665 660
666 SkPathRef::Editor ed(&fPathRef); 661 SkPathRef::Editor ed(&fPathRef);
667 662
668 // remember our index 663 // remember our index
669 fLastMoveToIndex = ed.pathRef()->countPoints(); 664 fLastMoveToIndex = ed.pathRef()->countPoints();
670 665
671 ed.growForVerb(kMove_Verb)->set(x, y); 666 ed.growForVerb(kMove_Verb)->set(x, y);
672
673 GEN_ID_INC;
674 } 667 }
675 668
676 void SkPath::rMoveTo(SkScalar x, SkScalar y) { 669 void SkPath::rMoveTo(SkScalar x, SkScalar y) {
677 SkPoint pt; 670 SkPoint pt;
678 this->getLastPt(&pt); 671 this->getLastPt(&pt);
679 this->moveTo(pt.fX + x, pt.fY + y); 672 this->moveTo(pt.fX + x, pt.fY + y);
680 } 673 }
681 674
682 void SkPath::injectMoveToIfNeeded() { 675 void SkPath::injectMoveToIfNeeded() {
683 if (fLastMoveToIndex < 0) { 676 if (fLastMoveToIndex < 0) {
(...skipping 11 matching lines...) Expand all
695 688
696 void SkPath::lineTo(SkScalar x, SkScalar y) { 689 void SkPath::lineTo(SkScalar x, SkScalar y) {
697 SkDEBUGCODE(this->validate();) 690 SkDEBUGCODE(this->validate();)
698 691
699 this->injectMoveToIfNeeded(); 692 this->injectMoveToIfNeeded();
700 693
701 SkPathRef::Editor ed(&fPathRef); 694 SkPathRef::Editor ed(&fPathRef);
702 ed.growForVerb(kLine_Verb)->set(x, y); 695 ed.growForVerb(kLine_Verb)->set(x, y);
703 fSegmentMask |= kLine_SegmentMask; 696 fSegmentMask |= kLine_SegmentMask;
704 697
705 GEN_ID_INC;
706 DIRTY_AFTER_EDIT; 698 DIRTY_AFTER_EDIT;
707 } 699 }
708 700
709 void SkPath::rLineTo(SkScalar x, SkScalar y) { 701 void SkPath::rLineTo(SkScalar x, SkScalar y) {
710 this->injectMoveToIfNeeded(); // This can change the result of this->getLas tPt(). 702 this->injectMoveToIfNeeded(); // This can change the result of this->getLas tPt().
711 SkPoint pt; 703 SkPoint pt;
712 this->getLastPt(&pt); 704 this->getLastPt(&pt);
713 this->lineTo(pt.fX + x, pt.fY + y); 705 this->lineTo(pt.fX + x, pt.fY + y);
714 } 706 }
715 707
716 void SkPath::quadTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2) { 708 void SkPath::quadTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2) {
717 SkDEBUGCODE(this->validate();) 709 SkDEBUGCODE(this->validate();)
718 710
719 this->injectMoveToIfNeeded(); 711 this->injectMoveToIfNeeded();
720 712
721 SkPathRef::Editor ed(&fPathRef); 713 SkPathRef::Editor ed(&fPathRef);
722 SkPoint* pts = ed.growForVerb(kQuad_Verb); 714 SkPoint* pts = ed.growForVerb(kQuad_Verb);
723 pts[0].set(x1, y1); 715 pts[0].set(x1, y1);
724 pts[1].set(x2, y2); 716 pts[1].set(x2, y2);
725 fSegmentMask |= kQuad_SegmentMask; 717 fSegmentMask |= kQuad_SegmentMask;
726 718
727 GEN_ID_INC;
728 DIRTY_AFTER_EDIT; 719 DIRTY_AFTER_EDIT;
729 } 720 }
730 721
731 void SkPath::rQuadTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2) { 722 void SkPath::rQuadTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2) {
732 this->injectMoveToIfNeeded(); // This can change the result of this->getLas tPt(). 723 this->injectMoveToIfNeeded(); // This can change the result of this->getLas tPt().
733 SkPoint pt; 724 SkPoint pt;
734 this->getLastPt(&pt); 725 this->getLastPt(&pt);
735 this->quadTo(pt.fX + x1, pt.fY + y1, pt.fX + x2, pt.fY + y2); 726 this->quadTo(pt.fX + x1, pt.fY + y1, pt.fX + x2, pt.fY + y2);
736 } 727 }
737 728
(...skipping 11 matching lines...) Expand all
749 SkDEBUGCODE(this->validate();) 740 SkDEBUGCODE(this->validate();)
750 741
751 this->injectMoveToIfNeeded(); 742 this->injectMoveToIfNeeded();
752 743
753 SkPathRef::Editor ed(&fPathRef); 744 SkPathRef::Editor ed(&fPathRef);
754 SkPoint* pts = ed.growForConic(w); 745 SkPoint* pts = ed.growForConic(w);
755 pts[0].set(x1, y1); 746 pts[0].set(x1, y1);
756 pts[1].set(x2, y2); 747 pts[1].set(x2, y2);
757 fSegmentMask |= kConic_SegmentMask; 748 fSegmentMask |= kConic_SegmentMask;
758 749
759 GEN_ID_INC;
760 DIRTY_AFTER_EDIT; 750 DIRTY_AFTER_EDIT;
761 } 751 }
762 } 752 }
763 753
764 void SkPath::rConicTo(SkScalar dx1, SkScalar dy1, SkScalar dx2, SkScalar dy2, 754 void SkPath::rConicTo(SkScalar dx1, SkScalar dy1, SkScalar dx2, SkScalar dy2,
765 SkScalar w) { 755 SkScalar w) {
766 this->injectMoveToIfNeeded(); // This can change the result of this->getLas tPt(). 756 this->injectMoveToIfNeeded(); // This can change the result of this->getLas tPt().
767 SkPoint pt; 757 SkPoint pt;
768 this->getLastPt(&pt); 758 this->getLastPt(&pt);
769 this->conicTo(pt.fX + dx1, pt.fY + dy1, pt.fX + dx2, pt.fY + dy2, w); 759 this->conicTo(pt.fX + dx1, pt.fY + dy1, pt.fX + dx2, pt.fY + dy2, w);
770 } 760 }
771 761
772 void SkPath::cubicTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2, 762 void SkPath::cubicTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2,
773 SkScalar x3, SkScalar y3) { 763 SkScalar x3, SkScalar y3) {
774 SkDEBUGCODE(this->validate();) 764 SkDEBUGCODE(this->validate();)
775 765
776 this->injectMoveToIfNeeded(); 766 this->injectMoveToIfNeeded();
777 767
778 SkPathRef::Editor ed(&fPathRef); 768 SkPathRef::Editor ed(&fPathRef);
779 SkPoint* pts = ed.growForVerb(kCubic_Verb); 769 SkPoint* pts = ed.growForVerb(kCubic_Verb);
780 pts[0].set(x1, y1); 770 pts[0].set(x1, y1);
781 pts[1].set(x2, y2); 771 pts[1].set(x2, y2);
782 pts[2].set(x3, y3); 772 pts[2].set(x3, y3);
783 fSegmentMask |= kCubic_SegmentMask; 773 fSegmentMask |= kCubic_SegmentMask;
784 774
785 GEN_ID_INC;
786 DIRTY_AFTER_EDIT; 775 DIRTY_AFTER_EDIT;
787 } 776 }
788 777
789 void SkPath::rCubicTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2, 778 void SkPath::rCubicTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2,
790 SkScalar x3, SkScalar y3) { 779 SkScalar x3, SkScalar y3) {
791 this->injectMoveToIfNeeded(); // This can change the result of this->getLas tPt(). 780 this->injectMoveToIfNeeded(); // This can change the result of this->getLas tPt().
792 SkPoint pt; 781 SkPoint pt;
793 this->getLastPt(&pt); 782 this->getLastPt(&pt);
794 this->cubicTo(pt.fX + x1, pt.fY + y1, pt.fX + x2, pt.fY + y2, 783 this->cubicTo(pt.fX + x1, pt.fY + y1, pt.fX + x2, pt.fY + y2,
795 pt.fX + x3, pt.fY + y3); 784 pt.fX + x3, pt.fY + y3);
796 } 785 }
797 786
798 void SkPath::close() { 787 void SkPath::close() {
799 SkDEBUGCODE(this->validate();) 788 SkDEBUGCODE(this->validate();)
800 789
801 int count = fPathRef->countVerbs(); 790 int count = fPathRef->countVerbs();
802 if (count > 0) { 791 if (count > 0) {
803 switch (fPathRef->atVerb(count - 1)) { 792 switch (fPathRef->atVerb(count - 1)) {
804 case kLine_Verb: 793 case kLine_Verb:
805 case kQuad_Verb: 794 case kQuad_Verb:
806 case kConic_Verb: 795 case kConic_Verb:
807 case kCubic_Verb: 796 case kCubic_Verb:
808 case kMove_Verb: { 797 case kMove_Verb: {
809 SkPathRef::Editor ed(&fPathRef); 798 SkPathRef::Editor ed(&fPathRef);
810 ed.growForVerb(kClose_Verb); 799 ed.growForVerb(kClose_Verb);
811 GEN_ID_INC;
812 break; 800 break;
813 } 801 }
814 case kClose_Verb: 802 case kClose_Verb:
815 // don't add a close if it's the first verb or a repeat 803 // don't add a close if it's the first verb or a repeat
816 break; 804 break;
817 default: 805 default:
818 SkDEBUGFAIL("unexpected verb"); 806 SkDEBUGFAIL("unexpected verb");
819 break; 807 break;
820 } 808 }
821 } 809 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
887 for (int i = 1; i < count; ++i) { 875 for (int i = 1; i < count; ++i) {
888 vb[~i] = kLine_Verb; 876 vb[~i] = kLine_Verb;
889 } 877 }
890 } 878 }
891 fSegmentMask |= kLine_SegmentMask; 879 fSegmentMask |= kLine_SegmentMask;
892 } 880 }
893 if (close) { 881 if (close) {
894 vb[~count] = kClose_Verb; 882 vb[~count] = kClose_Verb;
895 } 883 }
896 884
897 GEN_ID_INC;
898 DIRTY_AFTER_EDIT; 885 DIRTY_AFTER_EDIT;
899 SkDEBUGCODE(this->validate();) 886 SkDEBUGCODE(this->validate();)
900 } 887 }
901 888
902 #include "SkGeometry.h" 889 #include "SkGeometry.h"
903 890
904 static int build_arc_points(const SkRect& oval, SkScalar startAngle, 891 static int build_arc_points(const SkRect& oval, SkScalar startAngle,
905 SkScalar sweepAngle, 892 SkScalar sweepAngle,
906 SkPoint pts[kSkBuildQuadArcStorage]) { 893 SkPoint pts[kSkBuildQuadArcStorage]) {
907 894
(...skipping 805 matching lines...) Expand 10 before | Expand all | Expand 10 after
1713 dst->fDirection = kUnknown_Direction; 1700 dst->fDirection = kUnknown_Direction;
1714 } else { 1701 } else {
1715 SkPathRef::CreateTransformedCopy(&dst->fPathRef, *fPathRef.get(), matrix ); 1702 SkPathRef::CreateTransformedCopy(&dst->fPathRef, *fPathRef.get(), matrix );
1716 1703
1717 if (this != dst) { 1704 if (this != dst) {
1718 dst->fFillType = fFillType; 1705 dst->fFillType = fFillType;
1719 dst->fSegmentMask = fSegmentMask; 1706 dst->fSegmentMask = fSegmentMask;
1720 dst->fConvexity = fConvexity; 1707 dst->fConvexity = fConvexity;
1721 } 1708 }
1722 1709
1723 #ifdef SK_BUILD_FOR_ANDROID
1724 if (!matrix.isIdentity() && !dst->hasComputedBounds()) {
1725 GEN_ID_PTR_INC(dst);
1726 }
1727 #endif
1728
1729 if (kUnknown_Direction == fDirection) { 1710 if (kUnknown_Direction == fDirection) {
1730 dst->fDirection = kUnknown_Direction; 1711 dst->fDirection = kUnknown_Direction;
1731 } else { 1712 } else {
1732 SkScalar det2x2 = 1713 SkScalar det2x2 =
1733 SkScalarMul(matrix.get(SkMatrix::kMScaleX), matrix.get(SkMatrix: :kMScaleY)) - 1714 SkScalarMul(matrix.get(SkMatrix::kMScaleX), matrix.get(SkMatrix: :kMScaleY)) -
1734 SkScalarMul(matrix.get(SkMatrix::kMSkewX), matrix.get(SkMatrix:: kMSkewY)); 1715 SkScalarMul(matrix.get(SkMatrix::kMSkewX), matrix.get(SkMatrix:: kMSkewY));
1735 if (det2x2 < 0) { 1716 if (det2x2 < 0) {
1736 dst->fDirection = SkPath::OppositeDirection(static_cast<Directio n>(fDirection)); 1717 dst->fDirection = SkPath::OppositeDirection(static_cast<Directio n>(fDirection));
1737 } else if (det2x2 > 0) { 1718 } else if (det2x2 > 0) {
1738 dst->fDirection = fDirection; 1719 dst->fDirection = fDirection;
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
2127 #endif 2108 #endif
2128 2109
2129 fPathRef.reset(SkPathRef::CreateFromBuffer(&buffer 2110 fPathRef.reset(SkPathRef::CreateFromBuffer(&buffer
2130 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO O 2111 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO O
2131 , newFormat, packed) 2112 , newFormat, packed)
2132 #endif 2113 #endif
2133 ); 2114 );
2134 2115
2135 buffer.skipToAlign4(); 2116 buffer.skipToAlign4();
2136 2117
2137 GEN_ID_INC;
2138
2139 SkDEBUGCODE(this->validate();) 2118 SkDEBUGCODE(this->validate();)
2140 return SkToU32(buffer.pos()); 2119 return SkToU32(buffer.pos());
2141 } 2120 }
2142 2121
2143 /////////////////////////////////////////////////////////////////////////////// 2122 ///////////////////////////////////////////////////////////////////////////////
2144 2123
2145 #include "SkString.h" 2124 #include "SkString.h"
2146 2125
2147 static void append_scalar(SkString* str, SkScalar value) { 2126 static void append_scalar(SkString* str, SkScalar value) {
2148 SkString tmp; 2127 SkString tmp;
(...skipping 853 matching lines...) Expand 10 before | Expand all | Expand 10 after
3002 switch (this->getFillType()) { 2981 switch (this->getFillType()) {
3003 case SkPath::kEvenOdd_FillType: 2982 case SkPath::kEvenOdd_FillType:
3004 case SkPath::kInverseEvenOdd_FillType: 2983 case SkPath::kInverseEvenOdd_FillType:
3005 w &= 1; 2984 w &= 1;
3006 break; 2985 break;
3007 default: 2986 default:
3008 break; 2987 break;
3009 } 2988 }
3010 return SkToBool(w); 2989 return SkToBool(w);
3011 } 2990 }
OLDNEW
« no previous file with comments | « include/core/SkPathRef.h ('k') | src/core/SkPathRef.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698