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

Side by Side Diff: src/pathops/SkPathOpsTypes.cpp

Issue 2128633003: pathops coincidence and security rewrite (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: require resulting t to be between 0 and 1 Created 4 years, 5 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
OLDNEW
1 /* 1 /*
2 * Copyright 2012 Google Inc. 2 * Copyright 2012 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 #include "SkFloatBits.h" 7 #include "SkFloatBits.h"
8 #include "SkOpCoincidence.h" 8 #include "SkOpCoincidence.h"
9 #include "SkPathOpsTypes.h" 9 #include "SkPathOpsTypes.h"
10 10
11 static bool arguments_denormalized(float a, float b, int epsilon) { 11 static bool arguments_denormalized(float a, float b, int epsilon) {
12 float denormalizedCheck = FLT_EPSILON * epsilon / 2; 12 float denormalizedCheck = FLT_EPSILON * epsilon / 2;
13 return fabsf(a) <= denormalizedCheck && fabsf(b) <= denormalizedCheck; 13 return fabsf(a) <= denormalizedCheck && fabsf(b) <= denormalizedCheck;
14 } 14 }
15 15
16 // from http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-num bers-2012-edition/ 16 // from http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-num bers-2012-edition/
17 // FIXME: move to SkFloatBits.h 17 // FIXME: move to SkFloatBits.h
18 static bool equal_ulps(float a, float b, int epsilon, int depsilon) { 18 static bool equal_ulps(float a, float b, int epsilon, int depsilon) {
19 if (arguments_denormalized(a, b, depsilon)) { 19 if (arguments_denormalized(a, b, depsilon)) {
20 return true; 20 return true;
21 } 21 }
22 int aBits = SkFloatAs2sCompliment(a); 22 int aBits = SkFloatAs2sCompliment(a);
23 int bBits = SkFloatAs2sCompliment(b); 23 int bBits = SkFloatAs2sCompliment(b);
24 // Find the difference in ULPs. 24 // Find the difference in ULPs.
25 return aBits < bBits + epsilon && bBits < aBits + epsilon; 25 return aBits < bBits + epsilon && bBits < aBits + epsilon;
26 } 26 }
27 27
28 static bool equal_ulps_no_normal_check(float a, float b, int epsilon, int depsil on) {
29 int aBits = SkFloatAs2sCompliment(a);
30 int bBits = SkFloatAs2sCompliment(b);
31 // Find the difference in ULPs.
32 return aBits < bBits + epsilon && bBits < aBits + epsilon;
33 }
34
28 static bool equal_ulps_pin(float a, float b, int epsilon, int depsilon) { 35 static bool equal_ulps_pin(float a, float b, int epsilon, int depsilon) {
29 if (!SkScalarIsFinite(a) || !SkScalarIsFinite(b)) { 36 if (!SkScalarIsFinite(a) || !SkScalarIsFinite(b)) {
30 return false; 37 return false;
31 } 38 }
32 if (arguments_denormalized(a, b, depsilon)) { 39 if (arguments_denormalized(a, b, depsilon)) {
33 return true; 40 return true;
34 } 41 }
35 int aBits = SkFloatAs2sCompliment(a); 42 int aBits = SkFloatAs2sCompliment(a);
36 int bBits = SkFloatAs2sCompliment(b); 43 int bBits = SkFloatAs2sCompliment(b);
37 // Find the difference in ULPs. 44 // Find the difference in ULPs.
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 120
114 bool AlmostDequalUlps(double a, double b) { 121 bool AlmostDequalUlps(double a, double b) {
115 return AlmostDequalUlps(SkDoubleToScalar(a), SkDoubleToScalar(b)); 122 return AlmostDequalUlps(SkDoubleToScalar(a), SkDoubleToScalar(b));
116 } 123 }
117 124
118 bool AlmostEqualUlps(float a, float b) { 125 bool AlmostEqualUlps(float a, float b) {
119 const int UlpsEpsilon = 16; 126 const int UlpsEpsilon = 16;
120 return equal_ulps(a, b, UlpsEpsilon, UlpsEpsilon); 127 return equal_ulps(a, b, UlpsEpsilon, UlpsEpsilon);
121 } 128 }
122 129
130 bool AlmostEqualUlpsNoNormalCheck(float a, float b) {
131 const int UlpsEpsilon = 16;
132 return equal_ulps_no_normal_check(a, b, UlpsEpsilon, UlpsEpsilon);
133 }
134
123 bool AlmostEqualUlps_Pin(float a, float b) { 135 bool AlmostEqualUlps_Pin(float a, float b) {
124 const int UlpsEpsilon = 16; 136 const int UlpsEpsilon = 16;
125 return equal_ulps_pin(a, b, UlpsEpsilon, UlpsEpsilon); 137 return equal_ulps_pin(a, b, UlpsEpsilon, UlpsEpsilon);
126 } 138 }
127 139
128 bool NotAlmostEqualUlps(float a, float b) { 140 bool NotAlmostEqualUlps(float a, float b) {
129 const int UlpsEpsilon = 16; 141 const int UlpsEpsilon = 16;
130 return not_equal_ulps(a, b, UlpsEpsilon); 142 return not_equal_ulps(a, b, UlpsEpsilon);
131 } 143 }
132 144
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 if (approximately_zero_cubed(x)) { 217 if (approximately_zero_cubed(x)) {
206 return 0; 218 return 0;
207 } 219 }
208 double result = halley_cbrt3d(fabs(x)); 220 double result = halley_cbrt3d(fabs(x));
209 if (x < 0) { 221 if (x < 0) {
210 result = -result; 222 result = -result;
211 } 223 }
212 return result; 224 return result;
213 } 225 }
214 226
215 SkOpGlobalState::SkOpGlobalState(SkOpCoincidence* coincidence, SkOpContourHead* head 227 SkOpGlobalState::SkOpGlobalState(SkOpContourHead* head,
228 SkChunkAlloc* allocator
216 SkDEBUGPARAMS(bool debugSkipAssert) 229 SkDEBUGPARAMS(bool debugSkipAssert)
217 SkDEBUGPARAMS(const char* testName)) 230 SkDEBUGPARAMS(const char* testName))
218 : fCoincidence(coincidence) 231 : fAllocator(allocator)
232 , fCoincidence(nullptr)
219 , fContourHead(head) 233 , fContourHead(head)
220 , fNested(0) 234 , fNested(0)
221 , fWindingFailed(false) 235 , fWindingFailed(false)
222 , fAngleCoincidence(false) 236 , fAngleCoincidence(false)
223 , fPhase(kIntersecting) 237 , fPhase(kIntersecting)
224 SkDEBUGPARAMS(fDebugTestName(testName)) 238 SkDEBUGPARAMS(fDebugTestName(testName))
225 SkDEBUGPARAMS(fAngleID(0)) 239 SkDEBUGPARAMS(fAngleID(0))
226 SkDEBUGPARAMS(fCoinID(0)) 240 SkDEBUGPARAMS(fCoinID(0))
227 SkDEBUGPARAMS(fContourID(0)) 241 SkDEBUGPARAMS(fContourID(0))
228 SkDEBUGPARAMS(fPtTID(0)) 242 SkDEBUGPARAMS(fPtTID(0))
229 SkDEBUGPARAMS(fSegmentID(0)) 243 SkDEBUGPARAMS(fSegmentID(0))
230 SkDEBUGPARAMS(fSpanID(0)) 244 SkDEBUGPARAMS(fSpanID(0))
231 SkDEBUGPARAMS(fDebugSkipAssert(debugSkipAssert)) { 245 SkDEBUGPARAMS(fDebugSkipAssert(debugSkipAssert)) {
232 if (coincidence) {
233 coincidence->debugSetGlobalState(this);
234 }
235 #if DEBUG_T_SECT_LOOP_COUNT 246 #if DEBUG_T_SECT_LOOP_COUNT
236 debugResetLoopCounts(); 247 debugResetLoopCounts();
237 #endif 248 #endif
238 } 249 }
239
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698