From 13a847a82c8c72555c03c610fa6f4d2761cba428 Mon Sep 17 00:00:00 2001 From: "tomhudson@google.com" Date: Fri, 20 Jan 2012 13:59:14 +0000 Subject: [PATCH] Temporarily allow linear interpolation of 2-color vertical gradients to be turned off. With a Chromium gyp change to add SK_SIMPLE_TWOCOLOR_VERTICAL_GRADIENTS, this reduces the rebaselining from r3073 from ~200 to ~20. codereview.appspot.com/5558055/ git-svn-id: http://skia.googlecode.com/svn/trunk@3077 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/effects/SkGradientShader.cpp | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/effects/SkGradientShader.cpp b/src/effects/SkGradientShader.cpp index 8c6bcfb..240a7a4 100644 --- a/src/effects/SkGradientShader.cpp +++ b/src/effects/SkGradientShader.cpp @@ -896,9 +896,26 @@ typedef void (*LinearShadeProc)(TileProc proc, SkFixed dx, SkFixed fx, SkPMColor* dstC, const SkPMColor* cache, int toggle, int count); -// lerp is unnecessary if there are no sharp discontinuities in the -// gradient - which must be true if there are only 2 colors - but for -// vertical gradients it's so cheap we do it anyway. +// This function is deprecated, and will be replaced by +// shadeSpan_linear_vertical_lerp() once Chrome has been weaned off of it. +void shadeSpan_linear_vertical(TileProc proc, SkFixed dx, SkFixed fx, + SkPMColor* SK_RESTRICT dstC, + const SkPMColor* SK_RESTRICT cache, + int toggle, int count) { + // We're a vertical gradient, so no change in a span. + // If colors change sharply across the gradient, dithering is + // insufficient (it subsamples the color space) and we need to lerp. + unsigned fullIndex = proc(fx); + unsigned fi = fullIndex >> (16 - Gradient_Shader::kCache32Bits); + sk_memset32_dither(dstC, + cache[toggle + fi], + cache[(toggle ^ Gradient_Shader::kDitherStride32) + fi], + count); +} + +// Linear interpolation (lerp) is unnecessary if there are no sharp +// discontinuities in the gradient - which must be true if there are +// only 2 colors - but it's cheap. void shadeSpan_linear_vertical_lerp(TileProc proc, SkFixed dx, SkFixed fx, SkPMColor* SK_RESTRICT dstC, const SkPMColor* SK_RESTRICT cache, @@ -1015,7 +1032,15 @@ void Linear_Gradient::shadeSpan(int x, int y, SkPMColor* SK_RESTRICT dstC, LinearShadeProc shadeProc = shadeSpan_linear_repeat; if (SkFixedNearlyZero(dx)) { +#ifdef SK_SIMPLE_TWOCOLOR_VERTICAL_GRADIENTS + if (fColorCount > 2) { + shadeProc = shadeSpan_linear_vertical_lerp; + } else { + shadeProc = shadeSpan_linear_vertical; + } +#else shadeProc = shadeSpan_linear_vertical_lerp; +#endif } else if (proc == clamp_tileproc) { shadeProc = shadeSpan_linear_clamp; } else if (proc == mirror_tileproc) { -- 2.7.4