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

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

Issue 971773002: treat backwards quads as not convex (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: add fall through comments Created 5 years, 9 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/PathTest.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 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
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 "SkErrorInternals.h" 9 #include "SkErrorInternals.h"
10 #include "SkGeometry.h" 10 #include "SkGeometry.h"
(...skipping 2111 matching lines...) Expand 10 before | Expand all | Expand 10 after
2122 2122
2123 return kStraight_DirChange; 2123 return kStraight_DirChange;
2124 } 2124 }
2125 2125
2126 // only valid for a single contour 2126 // only valid for a single contour
2127 struct Convexicator { 2127 struct Convexicator {
2128 Convexicator() 2128 Convexicator()
2129 : fPtCount(0) 2129 : fPtCount(0)
2130 , fConvexity(SkPath::kConvex_Convexity) 2130 , fConvexity(SkPath::kConvex_Convexity)
2131 , fDirection(SkPath::kUnknown_Direction) 2131 , fDirection(SkPath::kUnknown_Direction)
2132 , fIsFinite(true) { 2132 , fIsFinite(true)
2133 , fIsCurve(false) {
2133 fExpectedDir = kInvalid_DirChange; 2134 fExpectedDir = kInvalid_DirChange;
2134 // warnings 2135 // warnings
2135 fLastPt.set(0, 0); 2136 fLastPt.set(0, 0);
2136 fCurrPt.set(0, 0); 2137 fCurrPt.set(0, 0);
2137 fLastVec.set(0, 0); 2138 fLastVec.set(0, 0);
2138 fFirstVec.set(0, 0); 2139 fFirstVec.set(0, 0);
2139 2140
2140 fDx = fDy = 0; 2141 fDx = fDy = 0;
2141 fSx = fSy = kValueNeverReturnedBySign; 2142 fSx = fSy = kValueNeverReturnedBySign;
2142 } 2143 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2186 void close() { 2187 void close() {
2187 if (fPtCount > 2) { 2188 if (fPtCount > 2) {
2188 this->addVec(fFirstVec); 2189 this->addVec(fFirstVec);
2189 } 2190 }
2190 } 2191 }
2191 2192
2192 bool isFinite() const { 2193 bool isFinite() const {
2193 return fIsFinite; 2194 return fIsFinite;
2194 } 2195 }
2195 2196
2197 void setCurve(bool isCurve) {
2198 fIsCurve = isCurve;
2199 }
2200
2196 private: 2201 private:
2197 void addVec(const SkVector& vec) { 2202 void addVec(const SkVector& vec) {
2198 SkASSERT(vec.fX || vec.fY); 2203 SkASSERT(vec.fX || vec.fY);
2199 DirChange dir = direction_change(fLastPt, fCurrPt, fLastVec, vec); 2204 DirChange dir = direction_change(fLastPt, fCurrPt, fLastVec, vec);
2200 switch (dir) { 2205 switch (dir) {
2201 case kLeft_DirChange: // fall through 2206 case kLeft_DirChange: // fall through
2202 case kRight_DirChange: 2207 case kRight_DirChange:
2203 if (kInvalid_DirChange == fExpectedDir) { 2208 if (kInvalid_DirChange == fExpectedDir) {
2204 fExpectedDir = dir; 2209 fExpectedDir = dir;
2205 fDirection = (kRight_DirChange == dir) ? SkPath::kCW_Directi on 2210 fDirection = (kRight_DirChange == dir) ? SkPath::kCW_Directi on
2206 : SkPath::kCCW_Direct ion; 2211 : SkPath::kCCW_Direct ion;
2207 } else if (dir != fExpectedDir) { 2212 } else if (dir != fExpectedDir) {
2208 fConvexity = SkPath::kConcave_Convexity; 2213 fConvexity = SkPath::kConcave_Convexity;
2209 fDirection = SkPath::kUnknown_Direction; 2214 fDirection = SkPath::kUnknown_Direction;
2210 } 2215 }
2211 fLastVec = vec; 2216 fLastVec = vec;
2212 break; 2217 break;
2213 case kStraight_DirChange: 2218 case kStraight_DirChange:
2214 break; 2219 break;
2215 case kBackwards_DirChange: 2220 case kBackwards_DirChange:
2221 if (fIsCurve) {
2222 fConvexity = SkPath::kConcave_Convexity;
2223 fDirection = SkPath::kUnknown_Direction;
2224 }
2216 fLastVec = vec; 2225 fLastVec = vec;
2217 break; 2226 break;
2218 case kInvalid_DirChange: 2227 case kInvalid_DirChange:
2219 SkFAIL("Use of invalid direction change flag"); 2228 SkFAIL("Use of invalid direction change flag");
2220 break; 2229 break;
2221 } 2230 }
2222 } 2231 }
2223 2232
2224 SkPoint fLastPt; 2233 SkPoint fLastPt;
2225 SkPoint fCurrPt; 2234 SkPoint fCurrPt;
2226 // fLastVec does not necessarily start at fLastPt. We only advance it when t he cross product 2235 // fLastVec does not necessarily start at fLastPt. We only advance it when t he cross product
2227 // value with the current vec is deemed to be of a significant value. 2236 // value with the current vec is deemed to be of a significant value.
2228 SkVector fLastVec, fFirstVec; 2237 SkVector fLastVec, fFirstVec;
2229 int fPtCount; // non-degenerate points 2238 int fPtCount; // non-degenerate points
2230 DirChange fExpectedDir; 2239 DirChange fExpectedDir;
2231 SkPath::Convexity fConvexity; 2240 SkPath::Convexity fConvexity;
2232 SkPath::Direction fDirection; 2241 SkPath::Direction fDirection;
2233 int fDx, fDy, fSx, fSy; 2242 int fDx, fDy, fSx, fSy;
2234 bool fIsFinite; 2243 bool fIsFinite;
2244 bool fIsCurve;
2235 }; 2245 };
2236 2246
2237 SkPath::Convexity SkPath::internalGetConvexity() const { 2247 SkPath::Convexity SkPath::internalGetConvexity() const {
2238 SkASSERT(kUnknown_Convexity == fConvexity); 2248 SkASSERT(kUnknown_Convexity == fConvexity);
2239 SkPoint pts[4]; 2249 SkPoint pts[4];
2240 SkPath::Verb verb; 2250 SkPath::Verb verb;
2241 SkPath::Iter iter(*this, true); 2251 SkPath::Iter iter(*this, true);
2242 2252
2243 int contourCount = 0; 2253 int contourCount = 0;
2244 int count; 2254 int count;
2245 Convexicator state; 2255 Convexicator state;
2246 2256
2247 if (!isFinite()) { 2257 if (!isFinite()) {
2248 return kUnknown_Convexity; 2258 return kUnknown_Convexity;
2249 } 2259 }
2250 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { 2260 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
2251 switch (verb) { 2261 switch (verb) {
2252 case kMove_Verb: 2262 case kMove_Verb:
2253 if (++contourCount > 1) { 2263 if (++contourCount > 1) {
2254 fConvexity = kConcave_Convexity; 2264 fConvexity = kConcave_Convexity;
2255 return kConcave_Convexity; 2265 return kConcave_Convexity;
2256 } 2266 }
2257 pts[1] = pts[0]; 2267 pts[1] = pts[0];
2268 // fall through
2269 case kLine_Verb:
2258 count = 1; 2270 count = 1;
2271 state.setCurve(false);
2259 break; 2272 break;
2260 case kLine_Verb: count = 1; break; 2273 case kQuad_Verb:
2261 case kQuad_Verb: count = 2; break; 2274 // fall through
2262 case kConic_Verb: count = 2; break; 2275 case kConic_Verb:
2263 case kCubic_Verb: count = 3; break; 2276 // fall through
2277 case kCubic_Verb:
2278 count = 2 + (kCubic_Verb == verb);
2279 // As an additional enhancement, this could set curve true only
2280 // if the curve is nonlinear
2281 state.setCurve(true);
2282 break;
2264 case kClose_Verb: 2283 case kClose_Verb:
2284 state.setCurve(false);
2265 state.close(); 2285 state.close();
2266 count = 0; 2286 count = 0;
2267 break; 2287 break;
2268 default: 2288 default:
2269 SkDEBUGFAIL("bad verb"); 2289 SkDEBUGFAIL("bad verb");
2270 fConvexity = kConcave_Convexity; 2290 fConvexity = kConcave_Convexity;
2271 return kConcave_Convexity; 2291 return kConcave_Convexity;
2272 } 2292 }
2273 2293
2274 for (int i = 1; i <= count; i++) { 2294 for (int i = 1; i <= count; i++) {
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after
2792 switch (this->getFillType()) { 2812 switch (this->getFillType()) {
2793 case SkPath::kEvenOdd_FillType: 2813 case SkPath::kEvenOdd_FillType:
2794 case SkPath::kInverseEvenOdd_FillType: 2814 case SkPath::kInverseEvenOdd_FillType:
2795 w &= 1; 2815 w &= 1;
2796 break; 2816 break;
2797 default: 2817 default:
2798 break; 2818 break;
2799 } 2819 }
2800 return SkToBool(w); 2820 return SkToBool(w);
2801 } 2821 }
OLDNEW
« no previous file with comments | « no previous file | tests/PathTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698