gfx/skia/patches/0007-Bug-848491-Re-apply-bug-687188-Expand-the-gradient-c.patch

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 From: George Wright <gw@gwright.org.uk>
     2 Date: Thu, 25 Apr 2013 20:47:06 -0400
     3 Subject: Bug 848491 - Re-apply bug 687188 - Expand the gradient cache by 2 to store 0/1 colour stop values for clamping.
     6 diff --git a/gfx/skia/src/effects/gradients/SkGradientShader.cpp b/gfx/skia/src/effects/gradients/SkGradientShader.cpp
     7 index 684355d..27a9c46 100644
     8 --- a/gfx/skia/src/effects/gradients/SkGradientShader.cpp
     9 +++ b/gfx/skia/src/effects/gradients/SkGradientShader.cpp
    10 @@ -453,15 +453,15 @@ const uint16_t* SkGradientShaderBase::getCache16() const {
    12  const SkPMColor* SkGradientShaderBase::getCache32() const {
    13      if (fCache32 == NULL) {
    14 -        // double the count for dither entries
    15 -        const int entryCount = kCache32Count * 4;
    16 +        // double the count for dither entries, and have an extra two entries for clamp values
    17 +        const int entryCount = kCache32Count * 4 + 2;
    18          const size_t allocSize = sizeof(SkPMColor) * entryCount;
    20          if (NULL == fCache32PixelRef) {
    21              fCache32PixelRef = SkNEW_ARGS(SkMallocPixelRef,
    22                                            (NULL, allocSize, NULL));
    23          }
    24 -        fCache32 = (SkPMColor*)fCache32PixelRef->getAddr();
    25 +        fCache32 = (SkPMColor*)fCache32PixelRef->getAddr() + 1;
    26          if (fColorCount == 2) {
    27              Build32bitCache(fCache32, fOrigColors[0], fOrigColors[1],
    28                              kCache32Count, fCacheAlpha);
    29 @@ -484,7 +484,7 @@ const SkPMColor* SkGradientShaderBase::getCache32() const {
    30              SkMallocPixelRef* newPR = SkNEW_ARGS(SkMallocPixelRef,
    31                                                   (NULL, allocSize, NULL));
    32              SkPMColor* linear = fCache32;           // just computed linear data
    33 -            SkPMColor* mapped = (SkPMColor*)newPR->getAddr();    // storage for mapped data
    34 +            SkPMColor* mapped = (SkPMColor*)newPR->getAddr() + 1;    // storage for mapped data
    35              SkUnitMapper* map = fMapper;
    36              for (int i = 0; i < kCache32Count; i++) {
    37                  int index = map->mapUnit16((i << 8) | i) >> 8;
    38 @@ -495,9 +495,21 @@ const SkPMColor* SkGradientShaderBase::getCache32() const {
    39              }
    40              fCache32PixelRef->unref();
    41              fCache32PixelRef = newPR;
    42 -            fCache32 = (SkPMColor*)newPR->getAddr();
    43 +            fCache32 = (SkPMColor*)newPR->getAddr() + 1;
    44          }
    45      }
    46 +
    47 +    // Write the clamp colours into the first and last entries of fCache32
    48 +    fCache32[kCache32ClampLower] = SkPackARGB32(fCacheAlpha,
    49 +                                                SkColorGetR(fOrigColors[0]),
    50 +                                                SkColorGetG(fOrigColors[0]),
    51 +                                                SkColorGetB(fOrigColors[0]));
    52 +
    53 +    fCache32[kCache32ClampUpper] = SkPackARGB32(fCacheAlpha,
    54 +                                                SkColorGetR(fOrigColors[fColorCount - 1]),
    55 +                                                SkColorGetG(fOrigColors[fColorCount - 1]),
    56 +                                                SkColorGetB(fOrigColors[fColorCount - 1]));
    57 +
    58      return fCache32;
    59  }
    61 diff --git a/gfx/skia/src/effects/gradients/SkGradientShaderPriv.h b/gfx/skia/src/effects/gradients/SkGradientShaderPriv.h
    62 index 729ce4e..2cb6a9d 100644
    63 --- a/gfx/skia/src/effects/gradients/SkGradientShaderPriv.h
    64 +++ b/gfx/skia/src/effects/gradients/SkGradientShaderPriv.h
    65 @@ -86,6 +86,9 @@ public:
    66          /// if dithering is disabled.
    67          kDitherStride32 = kCache32Count,
    68          kDitherStride16 = kCache16Count,
    69 +
    70 +        kCache32ClampLower = -1,
    71 +        kCache32ClampUpper = kCache32Count * 4
    72      };
    75 diff --git a/gfx/skia/src/effects/gradients/SkLinearGradient.cpp b/gfx/skia/src/effects/gradients/SkLinearGradient.cpp
    76 index e0f216c..40ab918 100644
    77 --- a/gfx/skia/src/effects/gradients/SkLinearGradient.cpp
    78 +++ b/gfx/skia/src/effects/gradients/SkLinearGradient.cpp
    79 @@ -127,6 +127,17 @@ void shadeSpan_linear_vertical_lerp(TileProc proc, SkFixed dx, SkFixed fx,
    80                                      SkPMColor* SK_RESTRICT dstC,
    81                                      const SkPMColor* SK_RESTRICT cache,
    82                                      int toggle, int count) {
    83 +    if (proc == clamp_tileproc) {
    84 +        // No need to lerp or dither for clamp values
    85 +        if (fx < 0) {
    86 +            sk_memset32(dstC, cache[SkGradientShaderBase::kCache32ClampLower], count);
    87 +            return;
    88 +        } else if (fx > 0xffff) {
    89 +            sk_memset32(dstC, cache[SkGradientShaderBase::kCache32ClampUpper], count);
    90 +            return;
    91 +        }
    92 +    }
    93 +
    94      // We're a vertical gradient, so no change in a span.
    95      // If colors change sharply across the gradient, dithering is
    96      // insufficient (it subsamples the color space) and we need to lerp.
    97 @@ -154,10 +165,7 @@ void shadeSpan_linear_clamp(TileProc proc, SkFixed dx, SkFixed fx,
    98      range.init(fx, dx, count, 0, SkGradientShaderBase::kCache32Count - 1);
   100      if ((count = range.fCount0) > 0) {
   101 -        sk_memset32_dither(dstC,
   102 -            cache[toggle + range.fV0],
   103 -            cache[next_dither_toggle(toggle) + range.fV0],
   104 -            count);
   105 +        sk_memset32(dstC, cache[SkGradientShaderBase::kCache32ClampLower], count);
   106          dstC += count;
   107      }
   108      if ((count = range.fCount1) > 0) {
   109 @@ -176,10 +184,7 @@ void shadeSpan_linear_clamp(TileProc proc, SkFixed dx, SkFixed fx,
   110          }
   111      }
   112      if ((count = range.fCount2) > 0) {
   113 -        sk_memset32_dither(dstC,
   114 -            cache[toggle + range.fV1],
   115 -            cache[next_dither_toggle(toggle) + range.fV1],
   116 -            count);
   117 +        sk_memset32(dstC, cache[SkGradientShaderBase::kCache32ClampUpper], count);
   118      }
   119  }
   121 diff --git a/gfx/skia/src/effects/gradients/SkTwoPointConicalGradient.cpp b/gfx/skia/src/effects/gradients/SkTwoPointConicalGradient.cpp
   122 index abd974b..601fff4 100644
   123 --- a/gfx/skia/src/effects/gradients/SkTwoPointConicalGradient.cpp
   124 +++ b/gfx/skia/src/effects/gradients/SkTwoPointConicalGradient.cpp
   125 @@ -124,10 +124,14 @@ static void twopoint_clamp(TwoPtRadial* rec, SkPMColor* SK_RESTRICT dstC,
   126          if (TwoPtRadial::DontDrawT(t)) {
   127              *dstC++ = 0;
   128          } else {
   129 -            SkFixed index = SkClampMax(t, 0xFFFF);
   130 -            SkASSERT(index <= 0xFFFF);
   131 -            *dstC++ = cache[toggle +
   132 -                            (index >> SkGradientShaderBase::kCache32Shift)];
   133 +            if (t < 0) {
   134 +                *dstC++ = cache[SkGradientShaderBase::kCache32ClampLower];
   135 +            } else if (t > 0xFFFF) {
   136 +                *dstC++ = cache[SkGradientShaderBase::kCache32ClampUpper];
   137 +            } else {
   138 +                SkASSERT(t <= 0xFFFF);
   139 +                *dstC++ = cache[t >> SkGradientShaderBase::kCache32Shift];
   140 +            }
   141          }
   142          toggle = next_dither_toggle(toggle);
   143      }
   144 diff --git a/gfx/skia/src/effects/gradients/SkTwoPointRadialGradient.cpp b/gfx/skia/src/effects/gradients/SkTwoPointRadialGradient.cpp
   145 index f70b67d..ec2ae75 100644
   146 --- a/gfx/skia/src/effects/gradients/SkTwoPointRadialGradient.cpp
   147 +++ b/gfx/skia/src/effects/gradients/SkTwoPointRadialGradient.cpp
   148 @@ -120,9 +120,14 @@ void shadeSpan_twopoint_clamp(SkScalar fx, SkScalar dx,
   149      for (; count > 0; --count) {
   150          SkFixed t = two_point_radial(b, fx, fy, fSr2D2, foura,
   151                                       fOneOverTwoA, posRoot);
   152 -        SkFixed index = SkClampMax(t, 0xFFFF);
   153 -        SkASSERT(index <= 0xFFFF);
   154 -        *dstC++ = cache[index >> SkGradientShaderBase::kCache32Shift];
   155 +        if (t < 0) {
   156 +            *dstC++ = cache[SkGradientShaderBase::kCache32ClampLower];
   157 +        } else if (t > 0xFFFF) {
   158 +            *dstC++ = cache[SkGradientShaderBase::kCache32ClampUpper];
   159 +        } else {
   160 +            SkASSERT(t <= 0xFFFF);
   161 +            *dstC++ = cache[t >> SkGradientShaderBase::kCache32Shift];
   162 +        }
   163          fx += dx;
   164          fy += dy;
   165          b += db;
   166 -- 
   167 1.7.11.7

mercurial