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

Side by Side Diff: include/core/SkPoint.h

Issue 60083014: Add sk_float_rsqrt with SSE + NEON fast paths. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: test 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/SkFloatingPoint.h ('k') | src/core/SkPoint.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 #ifndef SkPoint_DEFINED 8 #ifndef SkPoint_DEFINED
9 #define SkPoint_DEFINED 9 #define SkPoint_DEFINED
10 10
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 209
210 /** Return the euclidian distance from (0,0) to the point 210 /** Return the euclidian distance from (0,0) to the point
211 */ 211 */
212 SkScalar length() const { return SkPoint::Length(fX, fY); } 212 SkScalar length() const { return SkPoint::Length(fX, fY); }
213 SkScalar distanceToOrigin() const { return this->length(); } 213 SkScalar distanceToOrigin() const { return this->length(); }
214 214
215 /** 215 /**
216 * Return true if the computed length of the vector is >= the internal 216 * Return true if the computed length of the vector is >= the internal
217 * tolerance (used to avoid dividing by tiny values). 217 * tolerance (used to avoid dividing by tiny values).
218 */ 218 */
219 static bool CanNormalize(SkScalar dx, SkScalar dy) 219 static bool CanNormalize(SkScalar dx, SkScalar dy) {
220 #ifdef SK_SCALAR_IS_FLOAT 220 // Simple enough (and performance critical sometimes) so we inline it.
221 // Simple enough (and performance critical sometimes) so we inline it. 221 return (dx*dx + dy*dy) > (SK_ScalarNearlyZero * SK_ScalarNearlyZero);
222 { return (dx*dx + dy*dy) > (SK_ScalarNearlyZero * SK_ScalarNearlyZero); } 222 }
223 #else
224 ;
225 #endif
226 223
227 bool canNormalize() const { 224 bool canNormalize() const {
228 return CanNormalize(fX, fY); 225 return CanNormalize(fX, fY);
229 } 226 }
230 227
231 /** Set the point (vector) to be unit-length in the same direction as it 228 /** Set the point (vector) to be unit-length in the same direction as it
232 already points. If the point has a degenerate length (i.e. nearly 0) 229 already points. If the point has a degenerate length (i.e. nearly 0)
233 then return false and do nothing; otherwise return true. 230 then return false and do nothing; otherwise return true.
234 */ 231 */
235 bool normalize(); 232 bool normalize();
236 233
237 /** Set the point (vector) to be unit-length in the same direction as the 234 /** Set the point (vector) to be unit-length in the same direction as the
238 x,y params. If the vector (x,y) has a degenerate length (i.e. nearly 0) 235 x,y params. If the vector (x,y) has a degenerate length (i.e. nearly 0)
239 then return false and do nothing, otherwise return true. 236 then return false and do nothing, otherwise return true.
240 */ 237 */
241 bool setNormalize(SkScalar x, SkScalar y); 238 bool setNormalize(SkScalar x, SkScalar y);
242 239
243 /** Scale the point (vector) to have the specified length, and return that 240 /** Scale the point (vector) to have the specified length, and return that
244 length. If the original length is degenerately small (nearly zero), 241 length. If the original length is degenerately small (nearly zero),
245 do nothing and return false, otherwise return true. 242 do nothing and return false, otherwise return true.
246 */ 243 */
247 bool setLength(SkScalar length); 244 bool setLength(SkScalar length);
248 245
249 /** Set the point (vector) to have the specified length in the same 246 /** Set the point (vector) to have the specified length in the same
250 direction as (x,y). If the vector (x,y) has a degenerate length 247 direction as (x,y). If the vector (x,y) has a degenerate length
251 (i.e. nearly 0) then return false and do nothing, otherwise return true. 248 (i.e. nearly 0) then return false and do nothing, otherwise return true.
252 */ 249 */
253 bool setLength(SkScalar x, SkScalar y, SkScalar length); 250 bool setLength(SkScalar x, SkScalar y, SkScalar length);
254 251
252 /** Same as setLength, but favoring speed over accuracy.
253 */
254 bool setLengthFast(SkScalar length);
255
256 /** Same as setLength, but favoring speed over accuracy.
257 */
258 bool setLengthFast(SkScalar x, SkScalar y, SkScalar length);
259
255 /** Scale the point's coordinates by scale, writing the answer into dst. 260 /** Scale the point's coordinates by scale, writing the answer into dst.
256 It is legal for dst == this. 261 It is legal for dst == this.
257 */ 262 */
258 void scale(SkScalar scale, SkPoint* dst) const; 263 void scale(SkScalar scale, SkPoint* dst) const;
259 264
260 /** Scale the point's coordinates by scale, writing the answer back into 265 /** Scale the point's coordinates by scale, writing the answer back into
261 the point. 266 the point.
262 */ 267 */
263 void scale(SkScalar value) { this->scale(value, this); } 268 void scale(SkScalar value) { this->scale(value, this); }
264 269
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 */ 314 */
310 void operator-=(const SkPoint& v) { 315 void operator-=(const SkPoint& v) {
311 fX -= v.fX; 316 fX -= v.fX;
312 fY -= v.fY; 317 fY -= v.fY;
313 } 318 }
314 319
315 /** 320 /**
316 * Returns true if both X and Y are finite (not infinity or NaN) 321 * Returns true if both X and Y are finite (not infinity or NaN)
317 */ 322 */
318 bool isFinite() const { 323 bool isFinite() const {
319 #ifdef SK_SCALAR_IS_FLOAT
320 SkScalar accum = 0; 324 SkScalar accum = 0;
321 accum *= fX; 325 accum *= fX;
322 accum *= fY; 326 accum *= fY;
323 327
324 // accum is either NaN or it is finite (zero). 328 // accum is either NaN or it is finite (zero).
325 SkASSERT(0 == accum || !(accum == accum)); 329 SkASSERT(0 == accum || !(accum == accum));
326 330
327 // value==value will be true iff value is not NaN 331 // value==value will be true iff value is not NaN
328 // TODO: is it faster to say !accum or accum==accum? 332 // TODO: is it faster to say !accum or accum==accum?
329 return accum == accum; 333 return accum == accum;
330 #else
331 // use bit-or for speed, since we don't care about short-circuting the
332 // tests, and we expect the common case will be that we need to check al l.
333 int isNaN = (SK_FixedNaN == fX) | (SK_FixedNaN == fX));
334 return !isNaN;
335 #endif
336 } 334 }
337 335
338 /** 336 /**
339 * Returns true if the point's coordinates equal (x,y) 337 * Returns true if the point's coordinates equal (x,y)
340 */ 338 */
341 bool equals(SkScalar x, SkScalar y) const { 339 bool equals(SkScalar x, SkScalar y) const {
342 return fX == x && fY == y; 340 return fX == x && fY == y;
343 } 341 }
344 342
345 friend bool operator==(const SkPoint& a, const SkPoint& b) { 343 friend bool operator==(const SkPoint& a, const SkPoint& b) {
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 502
505 /** 503 /**
506 * cast-safe way to treat the point as an array of (2) SkScalars. 504 * cast-safe way to treat the point as an array of (2) SkScalars.
507 */ 505 */
508 const SkScalar* asScalars() const { return &fX; } 506 const SkScalar* asScalars() const { return &fX; }
509 }; 507 };
510 508
511 typedef SkPoint SkVector; 509 typedef SkPoint SkVector;
512 510
513 #endif 511 #endif
OLDNEW
« no previous file with comments | « include/core/SkFloatingPoint.h ('k') | src/core/SkPoint.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698