tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

0007-Bug-848491-Re-apply-bug-687188-Expand-the-gradient-c.patch (7934B)


      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.
      4 
      5 
      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 {
     11 
     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;
     19 
     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 }
     60 
     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     };
     73 
     74 
     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);
     99 
    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 }
    120 
    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