1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/patches/archive/0005-Bug-777614-Re-apply-bug-687188-Expand-the-gradient-c.patch Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,198 @@ 1.4 +From 1ab13a923399aa638388231baca784ba89f2c82b Mon Sep 17 00:00:00 2001 1.5 +From: George Wright <gw@gwright.org.uk> 1.6 +Date: Wed, 12 Sep 2012 12:30:29 -0400 1.7 +Subject: [PATCH 5/9] Bug 777614 - Re-apply bug 687188 - Expand the gradient 1.8 + cache by 2 to store 0/1 colour stop values for 1.9 + clamping. r=nrc 1.10 + 1.11 +--- 1.12 + .../src/effects/gradients/SkGradientShader.cpp | 22 +++++++++++---- 1.13 + .../src/effects/gradients/SkGradientShaderPriv.h | 5 +++- 1.14 + .../src/effects/gradients/SkLinearGradient.cpp | 32 ++++++++++++++++------ 1.15 + .../gradients/SkTwoPointConicalGradient.cpp | 11 ++++++-- 1.16 + .../effects/gradients/SkTwoPointRadialGradient.cpp | 11 ++++++-- 1.17 + 5 files changed, 61 insertions(+), 20 deletions(-) 1.18 + 1.19 +diff --git a/gfx/skia/src/effects/gradients/SkGradientShader.cpp b/gfx/skia/src/effects/gradients/SkGradientShader.cpp 1.20 +index f0dac4d..79e7202 100644 1.21 +--- a/gfx/skia/src/effects/gradients/SkGradientShader.cpp 1.22 ++++ b/gfx/skia/src/effects/gradients/SkGradientShader.cpp 1.23 +@@ -426,15 +426,15 @@ static void complete_32bit_cache(SkPMColor* cache, int stride) { 1.24 + 1.25 + const SkPMColor* SkGradientShaderBase::getCache32() const { 1.26 + if (fCache32 == NULL) { 1.27 +- // double the count for dither entries 1.28 +- const int entryCount = kCache32Count * 2; 1.29 ++ // double the count for dither entries, and have an extra two entries for clamp values 1.30 ++ const int entryCount = kCache32Count * 2 + 2; 1.31 + const size_t allocSize = sizeof(SkPMColor) * entryCount; 1.32 + 1.33 + if (NULL == fCache32PixelRef) { 1.34 + fCache32PixelRef = SkNEW_ARGS(SkMallocPixelRef, 1.35 + (NULL, allocSize, NULL)); 1.36 + } 1.37 +- fCache32 = (SkPMColor*)fCache32PixelRef->getAddr(); 1.38 ++ fCache32 = (SkPMColor*)fCache32PixelRef->getAddr() + 1; 1.39 + if (fColorCount == 2) { 1.40 + Build32bitCache(fCache32, fOrigColors[0], fOrigColors[1], 1.41 + kGradient32Length, fCacheAlpha); 1.42 +@@ -458,7 +458,7 @@ const SkPMColor* SkGradientShaderBase::getCache32() const { 1.43 + SkMallocPixelRef* newPR = SkNEW_ARGS(SkMallocPixelRef, 1.44 + (NULL, allocSize, NULL)); 1.45 + SkPMColor* linear = fCache32; // just computed linear data 1.46 +- SkPMColor* mapped = (SkPMColor*)newPR->getAddr(); // storage for mapped data 1.47 ++ SkPMColor* mapped = (SkPMColor*)newPR->getAddr() + 1; // storage for mapped data 1.48 + SkUnitMapper* map = fMapper; 1.49 + for (int i = 0; i < kGradient32Length; i++) { 1.50 + int index = map->mapUnit16((i << 8) | i) >> 8; 1.51 +@@ -467,10 +467,22 @@ const SkPMColor* SkGradientShaderBase::getCache32() const { 1.52 + } 1.53 + fCache32PixelRef->unref(); 1.54 + fCache32PixelRef = newPR; 1.55 +- fCache32 = (SkPMColor*)newPR->getAddr(); 1.56 ++ fCache32 = (SkPMColor*)newPR->getAddr() + 1; 1.57 + } 1.58 + complete_32bit_cache(fCache32, kCache32Count); 1.59 + } 1.60 ++ 1.61 ++ // Write the clamp colours into the first and last entries of fCache32 1.62 ++ fCache32[kCache32ClampLower] = SkPackARGB32(fCacheAlpha, 1.63 ++ SkColorGetR(fOrigColors[0]), 1.64 ++ SkColorGetG(fOrigColors[0]), 1.65 ++ SkColorGetB(fOrigColors[0])); 1.66 ++ 1.67 ++ fCache32[kCache32ClampUpper] = SkPackARGB32(fCacheAlpha, 1.68 ++ SkColorGetR(fOrigColors[fColorCount - 1]), 1.69 ++ SkColorGetG(fOrigColors[fColorCount - 1]), 1.70 ++ SkColorGetB(fOrigColors[fColorCount - 1])); 1.71 ++ 1.72 + return fCache32; 1.73 + } 1.74 + 1.75 +diff --git a/gfx/skia/src/effects/gradients/SkGradientShaderPriv.h b/gfx/skia/src/effects/gradients/SkGradientShaderPriv.h 1.76 +index 0e7c2fc..7427935 100644 1.77 +--- a/gfx/skia/src/effects/gradients/SkGradientShaderPriv.h 1.78 ++++ b/gfx/skia/src/effects/gradients/SkGradientShaderPriv.h 1.79 +@@ -133,7 +133,10 @@ public: 1.80 + kDitherStride32 = 0, 1.81 + #endif 1.82 + kDitherStride16 = kCache16Count, 1.83 +- kLerpRemainderMask32 = (1 << (16 - kCache32Bits)) - 1 1.84 ++ kLerpRemainderMask32 = (1 << (16 - kCache32Bits)) - 1, 1.85 ++ 1.86 ++ kCache32ClampLower = -1, 1.87 ++ kCache32ClampUpper = kCache32Count * 2 1.88 + }; 1.89 + 1.90 + 1.91 +diff --git a/gfx/skia/src/effects/gradients/SkLinearGradient.cpp b/gfx/skia/src/effects/gradients/SkLinearGradient.cpp 1.92 +index bcebc26..d400b4d 100644 1.93 +--- a/gfx/skia/src/effects/gradients/SkLinearGradient.cpp 1.94 ++++ b/gfx/skia/src/effects/gradients/SkLinearGradient.cpp 1.95 +@@ -126,6 +126,17 @@ void shadeSpan_linear_vertical(TileProc proc, SkFixed dx, SkFixed fx, 1.96 + SkPMColor* SK_RESTRICT dstC, 1.97 + const SkPMColor* SK_RESTRICT cache, 1.98 + int toggle, int count) { 1.99 ++ if (proc == clamp_tileproc) { 1.100 ++ // No need to lerp or dither for clamp values 1.101 ++ if (fx < 0) { 1.102 ++ sk_memset32(dstC, cache[SkGradientShaderBase::kCache32ClampLower], count); 1.103 ++ return; 1.104 ++ } else if (fx > 0xffff) { 1.105 ++ sk_memset32(dstC, cache[SkGradientShaderBase::kCache32ClampUpper], count); 1.106 ++ return; 1.107 ++ } 1.108 ++ } 1.109 ++ 1.110 + // We're a vertical gradient, so no change in a span. 1.111 + // If colors change sharply across the gradient, dithering is 1.112 + // insufficient (it subsamples the color space) and we need to lerp. 1.113 +@@ -144,6 +155,17 @@ void shadeSpan_linear_vertical_lerp(TileProc proc, SkFixed dx, SkFixed fx, 1.114 + SkPMColor* SK_RESTRICT dstC, 1.115 + const SkPMColor* SK_RESTRICT cache, 1.116 + int toggle, int count) { 1.117 ++ if (proc == clamp_tileproc) { 1.118 ++ // No need to lerp or dither for clamp values 1.119 ++ if (fx < 0) { 1.120 ++ sk_memset32(dstC, cache[SkGradientShaderBase::kCache32ClampLower], count); 1.121 ++ return; 1.122 ++ } else if (fx > 0xffff) { 1.123 ++ sk_memset32(dstC, cache[SkGradientShaderBase::kCache32ClampUpper], count); 1.124 ++ return; 1.125 ++ } 1.126 ++ } 1.127 ++ 1.128 + // We're a vertical gradient, so no change in a span. 1.129 + // If colors change sharply across the gradient, dithering is 1.130 + // insufficient (it subsamples the color space) and we need to lerp. 1.131 +@@ -169,10 +191,7 @@ void shadeSpan_linear_clamp(TileProc proc, SkFixed dx, SkFixed fx, 1.132 + range.init(fx, dx, count, 0, SkGradientShaderBase::kGradient32Length); 1.133 + 1.134 + if ((count = range.fCount0) > 0) { 1.135 +- sk_memset32_dither(dstC, 1.136 +- cache[toggle + range.fV0], 1.137 +- cache[(toggle ^ SkGradientShaderBase::kDitherStride32) + range.fV0], 1.138 +- count); 1.139 ++ sk_memset32(dstC, cache[SkGradientShaderBase::kCache32ClampLower], count); 1.140 + dstC += count; 1.141 + } 1.142 + if ((count = range.fCount1) > 0) { 1.143 +@@ -191,10 +210,7 @@ void shadeSpan_linear_clamp(TileProc proc, SkFixed dx, SkFixed fx, 1.144 + } 1.145 + } 1.146 + if ((count = range.fCount2) > 0) { 1.147 +- sk_memset32_dither(dstC, 1.148 +- cache[toggle + range.fV1], 1.149 +- cache[(toggle ^ SkGradientShaderBase::kDitherStride32) + range.fV1], 1.150 +- count); 1.151 ++ sk_memset32(dstC, cache[SkGradientShaderBase::kCache32ClampUpper], count); 1.152 + } 1.153 + } 1.154 + 1.155 +diff --git a/gfx/skia/src/effects/gradients/SkTwoPointConicalGradient.cpp b/gfx/skia/src/effects/gradients/SkTwoPointConicalGradient.cpp 1.156 +index 3466d2c..764a444 100644 1.157 +--- a/gfx/skia/src/effects/gradients/SkTwoPointConicalGradient.cpp 1.158 ++++ b/gfx/skia/src/effects/gradients/SkTwoPointConicalGradient.cpp 1.159 +@@ -123,9 +123,14 @@ static void twopoint_clamp(TwoPtRadial* rec, SkPMColor* SK_RESTRICT dstC, 1.160 + if (TwoPtRadial::DontDrawT(t)) { 1.161 + *dstC++ = 0; 1.162 + } else { 1.163 +- SkFixed index = SkClampMax(t, 0xFFFF); 1.164 +- SkASSERT(index <= 0xFFFF); 1.165 +- *dstC++ = cache[index >> SkGradientShaderBase::kCache32Shift]; 1.166 ++ if (t < 0) { 1.167 ++ *dstC++ = cache[SkGradientShaderBase::kCache32ClampLower]; 1.168 ++ } else if (t > 0xFFFF) { 1.169 ++ *dstC++ = cache[SkGradientShaderBase::kCache32ClampUpper]; 1.170 ++ } else { 1.171 ++ SkASSERT(t <= 0xFFFF); 1.172 ++ *dstC++ = cache[t >> SkGradientShaderBase::kCache32Shift]; 1.173 ++ } 1.174 + } 1.175 + } 1.176 + } 1.177 +diff --git a/gfx/skia/src/effects/gradients/SkTwoPointRadialGradient.cpp b/gfx/skia/src/effects/gradients/SkTwoPointRadialGradient.cpp 1.178 +index 9362ded..22b028e 100644 1.179 +--- a/gfx/skia/src/effects/gradients/SkTwoPointRadialGradient.cpp 1.180 ++++ b/gfx/skia/src/effects/gradients/SkTwoPointRadialGradient.cpp 1.181 +@@ -120,9 +120,14 @@ void shadeSpan_twopoint_clamp(SkScalar fx, SkScalar dx, 1.182 + for (; count > 0; --count) { 1.183 + SkFixed t = two_point_radial(b, fx, fy, fSr2D2, foura, 1.184 + fOneOverTwoA, posRoot); 1.185 +- SkFixed index = SkClampMax(t, 0xFFFF); 1.186 +- SkASSERT(index <= 0xFFFF); 1.187 +- *dstC++ = cache[index >> SkGradientShaderBase::kCache32Shift]; 1.188 ++ if (t < 0) { 1.189 ++ *dstC++ = cache[SkGradientShaderBase::kCache32ClampLower]; 1.190 ++ } else if (t > 0xFFFF) { 1.191 ++ *dstC++ = cache[SkGradientShaderBase::kCache32ClampUpper]; 1.192 ++ } else { 1.193 ++ SkASSERT(t <= 0xFFFF); 1.194 ++ *dstC++ = cache[t >> SkGradientShaderBase::kCache32Shift]; 1.195 ++ } 1.196 + fx += dx; 1.197 + fy += dy; 1.198 + b += db; 1.199 +-- 1.200 +1.7.11.4 1.201 +