handle overflow
note: gradient caller doesn't so we can still draw wrong when the caller
converts its initial fx from float->fixed. Perhaps SkClampRange should offer
a float interface as well.
git-svn-id: http://skia.googlecode.com/svn/trunk@1149 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/effects/SkGradientShader.cpp b/src/effects/SkGradientShader.cpp
index 068913f..5af0486 100644
--- a/src/effects/SkGradientShader.cpp
+++ b/src/effects/SkGradientShader.cpp
@@ -27,7 +27,7 @@
#define USE_DITHER_32BIT_GRADIENT
#endif
-//#define SK_ENABLE_FAST_LINEAR_GRADIENTS
+#define SK_ENABLE_FAST_LINEAR_GRADIENTS
#ifdef SK_ENABLE_FAST_LINEAR_GRADIENTS
static void sk_memset32_dither(uint32_t dst[], uint32_t v0, uint32_t v1,
@@ -819,11 +819,13 @@
#include "SkClampRange.h"
#define NO_CHECK_ITER \
- fi = fx >> 8; \
+ do { \
+ unsigned fi = fx >> 8; \
SkASSERT(fi <= 0xFF); \
fx += dx; \
*dstC++ = cache[toggle + fi]; \
- toggle ^= TOGGLE_MASK
+ toggle ^= TOGGLE_MASK; \
+ } while (0)
void Linear_Gradient::shadeSpan(int x, int y, SkPMColor dstC[], int count) {
@@ -874,9 +876,9 @@
dstC += count;
}
if ((count = range.fCount1) > 0) {
- unsigned fi;
- int i, unroll = count >> 3;
- for (i = 0; i < unroll; i++) {
+ int unroll = count >> 3;
+ fx = range.fFx1;
+ for (int i = 0; i < unroll; i++) {
NO_CHECK_ITER; NO_CHECK_ITER;
NO_CHECK_ITER; NO_CHECK_ITER;
NO_CHECK_ITER; NO_CHECK_ITER;
@@ -978,11 +980,13 @@
}
#define NO_CHECK_ITER_16 \
- fi = fx >> kCache16Shift; \
+ do { \
+ unsigned fi = fx >> kCache16Shift; \
SkASSERT(fi <= kCache16Mask); \
fx += dx; \
*dstC++ = cache[toggle + fi]; \
- toggle ^= TOGGLE_MASK
+ toggle ^= TOGGLE_MASK; \
+ } while (0)
void Linear_Gradient::shadeSpan16(int x, int y, uint16_t dstC[], int count) {
@@ -1028,9 +1032,9 @@
dstC += count;
}
if ((count = range.fCount1) > 0) {
- unsigned fi;
- int i, unroll = count >> 3;
- for (i = 0; i < unroll; i++) {
+ int unroll = count >> 3;
+ fx = range.fFx1;
+ for (int i = 0; i < unroll; i++) {
NO_CHECK_ITER_16; NO_CHECK_ITER_16;
NO_CHECK_ITER_16; NO_CHECK_ITER_16;
NO_CHECK_ITER_16; NO_CHECK_ITER_16;