diff options
Diffstat (limited to 'chromium/third_party/skia/src/core/SkRect.cpp')
-rw-r--r-- | chromium/third_party/skia/src/core/SkRect.cpp | 67 |
1 files changed, 26 insertions, 41 deletions
diff --git a/chromium/third_party/skia/src/core/SkRect.cpp b/chromium/third_party/skia/src/core/SkRect.cpp index c62f2f3cf6d..3cff5d81e5a 100644 --- a/chromium/third_party/skia/src/core/SkRect.cpp +++ b/chromium/third_party/skia/src/core/SkRect.cpp @@ -55,21 +55,6 @@ void SkRect::toQuad(SkPoint quad[4]) const { quad[3].set(fLeft, fBottom); } -#ifdef SK_SCALAR_IS_FLOAT - #define SkFLOATCODE(code) code -#else - #define SkFLOATCODE(code) -#endif - -// For float compares (at least on x86, by removing the else from the min/max -// computation, we get MAXSS and MINSS instructions, and no branches. -// Fixed point has no such opportunity (afaik), so we leave the else in that case -#ifdef SK_SCALAR_IS_FLOAT - #define MINMAX_ELSE -#else - #define MINMAX_ELSE else -#endif - bool SkRect::setBoundsCheck(const SkPoint pts[], int count) { SkASSERT((pts && count > 0) || count == 0); @@ -78,24 +63,6 @@ bool SkRect::setBoundsCheck(const SkPoint pts[], int count) { if (count <= 0) { sk_bzero(this, sizeof(SkRect)); } else { -#ifdef SK_SCALAR_SLOW_COMPARES - int32_t l, t, r, b; - - l = r = SkScalarAs2sCompliment(pts[0].fX); - t = b = SkScalarAs2sCompliment(pts[0].fY); - - for (int i = 1; i < count; i++) { - int32_t x = SkScalarAs2sCompliment(pts[i].fX); - int32_t y = SkScalarAs2sCompliment(pts[i].fY); - - if (x < l) l = x; else if (x > r) r = x; - if (y < t) t = y; else if (y > b) b = y; - } - this->set(Sk2sComplimentAsScalar(l), - Sk2sComplimentAsScalar(t), - Sk2sComplimentAsScalar(r), - Sk2sComplimentAsScalar(b)); -#else SkScalar l, t, r, b; l = r = pts[0].fX; @@ -103,28 +70,30 @@ bool SkRect::setBoundsCheck(const SkPoint pts[], int count) { // If all of the points are finite, accum should stay 0. If we encounter // a NaN or infinity, then accum should become NaN. - SkFLOATCODE(float accum = 0;) - SkFLOATCODE(accum *= l; accum *= t;) + float accum = 0; + accum *= l; accum *= t; for (int i = 1; i < count; i++) { SkScalar x = pts[i].fX; SkScalar y = pts[i].fY; - SkFLOATCODE(accum *= x; accum *= y;) + accum *= x; accum *= y; - if (x < l) l = x; MINMAX_ELSE if (x > r) r = x; - if (y < t) t = y; MINMAX_ELSE if (y > b) b = y; + // we use if instead of if/else, so we can generate min/max + // float instructions (at least on SSE) + if (x < l) l = x; + if (x > r) r = x; + + if (y < t) t = y; + if (y > b) b = y; } -#ifdef SK_SCALAR_IS_FLOAT SkASSERT(!accum || !SkScalarIsFinite(accum)); if (accum) { l = t = r = b = 0; isFinite = false; } -#endif this->set(l, t, r, b); -#endif } return isFinite; @@ -149,6 +118,22 @@ bool SkRect::intersect(const SkRect& r) { return this->intersect(r.fLeft, r.fTop, r.fRight, r.fBottom); } +bool SkRect::intersect2(const SkRect& r) { + SkASSERT(&r); + SkScalar L = SkMaxScalar(fLeft, r.fLeft); + SkScalar R = SkMinScalar(fRight, r.fRight); + if (L >= R) { + return false; + } + SkScalar T = SkMaxScalar(fTop, r.fTop); + SkScalar B = SkMinScalar(fBottom, r.fBottom); + if (T >= B) { + return false; + } + this->set(L, T, R, B); + return true; +} + bool SkRect::intersect(const SkRect& a, const SkRect& b) { SkASSERT(&a && &b); |