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

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

Issue 677463002: Set temporary paths volatile so we don't cache them. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Init fIsVolatile Created 6 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
« no previous file with comments | « src/core/SkDraw.cpp ('k') | src/core/SkStroke.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 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 // flag to require a moveTo if we begin with something else, like lineTo etc. 125 // flag to require a moveTo if we begin with something else, like lineTo etc.
126 #define INITIAL_LASTMOVETOINDEX_VALUE ~0 126 #define INITIAL_LASTMOVETOINDEX_VALUE ~0
127 127
128 SkPath::SkPath() 128 SkPath::SkPath()
129 : fPathRef(SkPathRef::CreateEmpty()) 129 : fPathRef(SkPathRef::CreateEmpty())
130 #ifdef SK_BUILD_FOR_ANDROID 130 #ifdef SK_BUILD_FOR_ANDROID
131 , fSourcePath(NULL) 131 , fSourcePath(NULL)
132 #endif 132 #endif
133 { 133 {
134 this->resetFields(); 134 this->resetFields();
135 fIsVolatile = false;
135 } 136 }
136 137
137 void SkPath::resetFields() { 138 void SkPath::resetFields() {
138 //fPathRef is assumed to have been emptied by the caller. 139 //fPathRef is assumed to have been emptied by the caller.
139 fLastMoveToIndex = INITIAL_LASTMOVETOINDEX_VALUE; 140 fLastMoveToIndex = INITIAL_LASTMOVETOINDEX_VALUE;
140 fFillType = kWinding_FillType; 141 fFillType = kWinding_FillType;
141 fConvexity = kUnknown_Convexity; 142 fConvexity = kUnknown_Convexity;
142 fDirection = kUnknown_Direction; 143 fDirection = kUnknown_Direction;
143 144
144 // We don't touch Android's fSourcePath. It's used to track texture garbage collection, so we 145 // We don't touch Android's fSourcePath. It's used to track texture garbage collection, so we
(...skipping 26 matching lines...) Expand all
171 SkDEBUGCODE(this->validate();) 172 SkDEBUGCODE(this->validate();)
172 return *this; 173 return *this;
173 } 174 }
174 175
175 void SkPath::copyFields(const SkPath& that) { 176 void SkPath::copyFields(const SkPath& that) {
176 //fPathRef is assumed to have been set by the caller. 177 //fPathRef is assumed to have been set by the caller.
177 fLastMoveToIndex = that.fLastMoveToIndex; 178 fLastMoveToIndex = that.fLastMoveToIndex;
178 fFillType = that.fFillType; 179 fFillType = that.fFillType;
179 fConvexity = that.fConvexity; 180 fConvexity = that.fConvexity;
180 fDirection = that.fDirection; 181 fDirection = that.fDirection;
182 fIsVolatile = that.fIsVolatile;
181 } 183 }
182 184
183 bool operator==(const SkPath& a, const SkPath& b) { 185 bool operator==(const SkPath& a, const SkPath& b) {
184 // note: don't need to look at isConvex or bounds, since just comparing the 186 // note: don't need to look at isConvex or bounds, since just comparing the
185 // raw data is sufficient. 187 // raw data is sufficient.
186 return &a == &b || 188 return &a == &b ||
187 (a.fFillType == b.fFillType && *a.fPathRef.get() == *b.fPathRef.get()); 189 (a.fFillType == b.fFillType && *a.fPathRef.get() == *b.fPathRef.get());
188 } 190 }
189 191
190 void SkPath::swap(SkPath& that) { 192 void SkPath::swap(SkPath& that) {
191 SkASSERT(&that != NULL); 193 SkASSERT(&that != NULL);
192 194
193 if (this != &that) { 195 if (this != &that) {
194 fPathRef.swap(&that.fPathRef); 196 fPathRef.swap(&that.fPathRef);
195 SkTSwap<int>(fLastMoveToIndex, that.fLastMoveToIndex); 197 SkTSwap<int>(fLastMoveToIndex, that.fLastMoveToIndex);
196 SkTSwap<uint8_t>(fFillType, that.fFillType); 198 SkTSwap<uint8_t>(fFillType, that.fFillType);
197 SkTSwap<uint8_t>(fConvexity, that.fConvexity); 199 SkTSwap<uint8_t>(fConvexity, that.fConvexity);
198 SkTSwap<uint8_t>(fDirection, that.fDirection); 200 SkTSwap<uint8_t>(fDirection, that.fDirection);
201 SkTSwap<SkBool8>(fIsVolatile, that.fIsVolatile);
199 #ifdef SK_BUILD_FOR_ANDROID 202 #ifdef SK_BUILD_FOR_ANDROID
200 SkTSwap<const SkPath*>(fSourcePath, that.fSourcePath); 203 SkTSwap<const SkPath*>(fSourcePath, that.fSourcePath);
201 #endif 204 #endif
202 } 205 }
203 } 206 }
204 207
205 static inline bool check_edge_against_rect(const SkPoint& p0, 208 static inline bool check_edge_against_rect(const SkPoint& p0,
206 const SkPoint& p1, 209 const SkPoint& p1,
207 const SkRect& rect, 210 const SkRect& rect,
208 SkPath::Direction dir) { 211 SkPath::Direction dir) {
(...skipping 1390 matching lines...) Expand 10 before | Expand all | Expand 10 after
1599 dst->swap(tmp); 1602 dst->swap(tmp);
1600 SkPathRef::Editor ed(&dst->fPathRef); 1603 SkPathRef::Editor ed(&dst->fPathRef);
1601 matrix.mapPoints(ed.points(), ed.pathRef()->countPoints()); 1604 matrix.mapPoints(ed.points(), ed.pathRef()->countPoints());
1602 dst->fDirection = kUnknown_Direction; 1605 dst->fDirection = kUnknown_Direction;
1603 } else { 1606 } else {
1604 SkPathRef::CreateTransformedCopy(&dst->fPathRef, *fPathRef.get(), matrix ); 1607 SkPathRef::CreateTransformedCopy(&dst->fPathRef, *fPathRef.get(), matrix );
1605 1608
1606 if (this != dst) { 1609 if (this != dst) {
1607 dst->fFillType = fFillType; 1610 dst->fFillType = fFillType;
1608 dst->fConvexity = fConvexity; 1611 dst->fConvexity = fConvexity;
1612 dst->fIsVolatile = fIsVolatile;
1609 } 1613 }
1610 1614
1611 if (kUnknown_Direction == fDirection) { 1615 if (kUnknown_Direction == fDirection) {
1612 dst->fDirection = kUnknown_Direction; 1616 dst->fDirection = kUnknown_Direction;
1613 } else { 1617 } else {
1614 SkScalar det2x2 = 1618 SkScalar det2x2 =
1615 SkScalarMul(matrix.get(SkMatrix::kMScaleX), matrix.get(SkMatrix: :kMScaleY)) - 1619 SkScalarMul(matrix.get(SkMatrix::kMScaleX), matrix.get(SkMatrix: :kMScaleY)) -
1616 SkScalarMul(matrix.get(SkMatrix::kMSkewX), matrix.get(SkMatrix:: kMSkewY)); 1620 SkScalarMul(matrix.get(SkMatrix::kMSkewX), matrix.get(SkMatrix:: kMSkewY));
1617 if (det2x2 < 0) { 1621 if (det2x2 < 0) {
1618 dst->fDirection = SkPath::OppositeDirection(static_cast<Directio n>(fDirection)); 1622 dst->fDirection = SkPath::OppositeDirection(static_cast<Directio n>(fDirection));
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
1971 1975
1972 if (NULL == storage) { 1976 if (NULL == storage) {
1973 const int byteCount = sizeof(int32_t) + fPathRef->writeSize(); 1977 const int byteCount = sizeof(int32_t) + fPathRef->writeSize();
1974 return SkAlign4(byteCount); 1978 return SkAlign4(byteCount);
1975 } 1979 }
1976 1980
1977 SkWBuffer buffer(storage); 1981 SkWBuffer buffer(storage);
1978 1982
1979 int32_t packed = (fConvexity << kConvexity_SerializationShift) | 1983 int32_t packed = (fConvexity << kConvexity_SerializationShift) |
1980 (fFillType << kFillType_SerializationShift) | 1984 (fFillType << kFillType_SerializationShift) |
1981 (fDirection << kDirection_SerializationShift); 1985 (fDirection << kDirection_SerializationShift) |
1986 (fIsVolatile << kIsVolatile_SerializationShift);
1982 1987
1983 buffer.write32(packed); 1988 buffer.write32(packed);
1984 1989
1985 fPathRef->writeToBuffer(&buffer); 1990 fPathRef->writeToBuffer(&buffer);
1986 1991
1987 buffer.padToAlign4(); 1992 buffer.padToAlign4();
1988 return buffer.pos(); 1993 return buffer.pos();
1989 } 1994 }
1990 1995
1991 size_t SkPath::readFromMemory(const void* storage, size_t length) { 1996 size_t SkPath::readFromMemory(const void* storage, size_t length) {
1992 SkRBufferWithSizeCheck buffer(storage, length); 1997 SkRBufferWithSizeCheck buffer(storage, length);
1993 1998
1994 int32_t packed; 1999 int32_t packed;
1995 if (!buffer.readS32(&packed)) { 2000 if (!buffer.readS32(&packed)) {
1996 return 0; 2001 return 0;
1997 } 2002 }
1998 2003
1999 fConvexity = (packed >> kConvexity_SerializationShift) & 0xFF; 2004 fConvexity = (packed >> kConvexity_SerializationShift) & 0xFF;
2000 fFillType = (packed >> kFillType_SerializationShift) & 0xFF; 2005 fFillType = (packed >> kFillType_SerializationShift) & 0xFF;
2001 fDirection = (packed >> kDirection_SerializationShift) & 0x3; 2006 fDirection = (packed >> kDirection_SerializationShift) & 0x3;
2007 fIsVolatile = (packed >> kIsVolatile_SerializationShift) & 0x1;
2002 SkPathRef* pathRef = SkPathRef::CreateFromBuffer(&buffer); 2008 SkPathRef* pathRef = SkPathRef::CreateFromBuffer(&buffer);
2003 2009
2004 size_t sizeRead = 0; 2010 size_t sizeRead = 0;
2005 if (buffer.isValid()) { 2011 if (buffer.isValid()) {
2006 fPathRef.reset(pathRef); 2012 fPathRef.reset(pathRef);
2007 SkDEBUGCODE(this->validate();) 2013 SkDEBUGCODE(this->validate();)
2008 buffer.skipToAlign4(); 2014 buffer.skipToAlign4();
2009 sizeRead = buffer.pos(); 2015 sizeRead = buffer.pos();
2010 } else if (pathRef) { 2016 } else if (pathRef) {
2011 // If the buffer is not valid, pathRef should be NULL 2017 // If the buffer is not valid, pathRef should be NULL
(...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after
2858 switch (this->getFillType()) { 2864 switch (this->getFillType()) {
2859 case SkPath::kEvenOdd_FillType: 2865 case SkPath::kEvenOdd_FillType:
2860 case SkPath::kInverseEvenOdd_FillType: 2866 case SkPath::kInverseEvenOdd_FillType:
2861 w &= 1; 2867 w &= 1;
2862 break; 2868 break;
2863 default: 2869 default:
2864 break; 2870 break;
2865 } 2871 }
2866 return SkToBool(w); 2872 return SkToBool(w);
2867 } 2873 }
OLDNEW
« no previous file with comments | « src/core/SkDraw.cpp ('k') | src/core/SkStroke.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698