gfx/skia/trunk/src/core/SkBitmapShaderTemplate.h

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.

     2 /*
     3  * Copyright 2006 The Android Open Source Project
     4  *
     5  * Use of this source code is governed by a BSD-style license that can be
     6  * found in the LICENSE file.
     7  */
    11 #ifndef NOFILTER_BITMAP_SHADER_PREAMBLE
    12     #define NOFILTER_BITMAP_SHADER_PREAMBLE(bitmap, rb)
    13 #endif
    14 #ifndef NOFILTER_BITMAP_SHADER_POSTAMBLE
    15     #define NOFILTER_BITMAP_SHADER_POSTAMBLE(bitmap)
    16 #endif
    17 #ifndef NOFILTER_BITMAP_SHADER_PREAMBLE16
    18     #define NOFILTER_BITMAP_SHADER_PREAMBLE16(bitmap, rb)
    19 #endif
    20 #ifndef NOFILTER_BITMAP_SHADER_POSTAMBLE16
    21     #define NOFILTER_BITMAP_SHADER_POSTAMBLE16(bitmap)
    22 #endif
    24 class NOFILTER_BITMAP_SHADER_CLASS : public HasSpan16_Sampler_BitmapShader {
    25 public:
    26     NOFILTER_BITMAP_SHADER_CLASS(const SkBitmap& src)
    27         : HasSpan16_Sampler_BitmapShader(src, false,
    28                                          NOFILTER_BITMAP_SHADER_TILEMODE,
    29                                          NOFILTER_BITMAP_SHADER_TILEMODE)
    30     {
    31     }
    33     virtual bool setContext(const SkBitmap& device, const SkPaint& paint, const SkMatrix& matrix)
    34     {
    35         if (!this->INHERITED::setContext(device, paint, matrix))
    36             return false;
    38 #ifdef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE
    39         this->computeUnitInverse();
    40 #endif
    41         return true;
    42     }
    44     virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count)
    45     {
    46         SkASSERT(count > 0);
    48 #ifdef NOFILTER_BITMAP_SHADER_SPRITEPROC32
    49         if ((this->getTotalInverse().getType() & ~SkMatrix::kTranslate_Mask) == 0)
    50         {
    51             NOFILTER_BITMAP_SHADER_SPRITEPROC32(this, x, y, dstC, count);
    52             return;
    53         }
    54 #endif
    56         unsigned        scale = SkAlpha255To256(this->getPaintAlpha());
    57 #ifdef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE
    58         const SkMatrix& inv = this->getUnitInverse();
    59         SkMatrix::MapPtProc invProc = this->getUnitInverseProc();
    60 #else
    61         const SkMatrix& inv = this->getTotalInverse();
    62         SkMatrix::MapPtProc invProc = this->getInverseMapPtProc();
    63 #endif
    64         const SkBitmap& srcBitmap = this->getSrcBitmap();
    65         unsigned        srcMaxX = srcBitmap.width() - 1;
    66         unsigned        srcMaxY = srcBitmap.height() - 1;
    67         unsigned        srcRB = srcBitmap.rowBytes();
    68         SkFixed         fx, fy, dx, dy;
    70         const NOFILTER_BITMAP_SHADER_TYPE* srcPixels = (const NOFILTER_BITMAP_SHADER_TYPE*)srcBitmap.getPixels();
    71         NOFILTER_BITMAP_SHADER_PREAMBLE(srcBitmap, srcRB);
    73         if (this->getInverseClass() == kPerspective_MatrixClass)
    74         {
    75             SkPerspIter   iter(inv, SkIntToScalar(x) + SK_ScalarHalf,
    76                                     SkIntToScalar(y) + SK_ScalarHalf, count);
    77             while ((count = iter.next()) != 0)
    78             {
    79                 const SkFixed* srcXY = iter.getXY();
    81 /*  Do I need this?
    82 #ifndef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE
    83             fx >>= level;
    84             fy >>= level;
    85 #endif
    86 */
    87                 if (256 == scale)
    88                 {
    89                     while (--count >= 0)
    90                     {
    91                         fx = *srcXY++;
    92                         fy = *srcXY++;
    93                         unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX);
    94                         unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY);
    95                         *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels, x, y, srcRB);
    96                     }
    97                 }
    98                 else
    99                 {
   100                     while (--count >= 0)
   101                     {
   102                         fx = *srcXY++;
   103                         fy = *srcXY++;
   104                         unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX);
   105                         unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY);
   106                         uint32_t c = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels, x, y, srcRB);
   107                         *dstC++ = SkAlphaMulQ(c, scale);
   108                     }
   109                 }
   110             }
   111             return;
   112         }
   114         // now init fx, fy, dx, dy
   115         {
   116             SkPoint srcPt;
   117             invProc(inv, SkIntToScalar(x) + SK_ScalarHalf,
   118                          SkIntToScalar(y) + SK_ScalarHalf, &srcPt);
   120             fx = SkScalarToFixed(srcPt.fX);
   121             fy = SkScalarToFixed(srcPt.fY);
   123             if (this->getInverseClass() == kFixedStepInX_MatrixClass)
   124                 (void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy);
   125             else
   126             {
   127                 dx = SkScalarToFixed(inv.getScaleX());
   128                 dy = SkScalarToFixed(inv.getSkewY());
   129             }
   130         }
   132 #ifndef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE
   133         {   int level = this->getMipLevel() >> 16;
   134             fx >>= level;
   135             fy >>= level;
   136             dx >>= level;
   137             dy >>= level;
   138         }
   139 #endif
   141         if (dy == 0)
   142         {
   143             int y_index = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY);
   144 //          SkDEBUGF(("fy = %g, srcMaxY = %d, y_index = %d\n", SkFixedToFloat(fy), srcMaxY, y_index));
   145             srcPixels = (const NOFILTER_BITMAP_SHADER_TYPE*)((const char*)srcPixels + y_index * srcRB);
   146             if (scale == 256)
   147                 while (--count >= 0)
   148                 {
   149                     unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX);
   150                     fx += dx;
   151                     *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_X(srcPixels, x);
   152                 }
   153             else
   154                 while (--count >= 0)
   155                 {
   156                     unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX);
   157                     SkPMColor c = NOFILTER_BITMAP_SHADER_SAMPLE_X(srcPixels, x);
   158                     fx += dx;
   159                     *dstC++ = SkAlphaMulQ(c, scale);
   160                 }
   161         }
   162         else    // dy != 0
   163         {
   164             if (scale == 256)
   165                 while (--count >= 0)
   166                 {
   167                     unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX);
   168                     unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY);
   169                     fx += dx;
   170                     fy += dy;
   171                     *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels, x, y, srcRB);
   172                 }
   173             else
   174                 while (--count >= 0)
   175                 {
   176                     unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX);
   177                     unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY);
   178                     SkPMColor c = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels, x, y, srcRB);
   179                     fx += dx;
   180                     fy += dy;
   181                     *dstC++ = SkAlphaMulQ(c, scale);
   182                 }
   183         }
   185         NOFILTER_BITMAP_SHADER_POSTAMBLE(srcBitmap);
   186     }
   188     virtual void shadeSpan16(int x, int y, uint16_t dstC[], int count)
   189     {
   190         SkASSERT(count > 0);
   191         SkASSERT(this->getFlags() & SkShader::kHasSpan16_Flag);
   193 #ifdef NOFILTER_BITMAP_SHADER_SPRITEPROC16
   194         if ((this->getTotalInverse().getType() & ~SkMatrix::kTranslate_Mask) == 0)
   195         {
   196             NOFILTER_BITMAP_SHADER_SPRITEPROC16(this, x, y, dstC, count);
   197             return;
   198         }
   199 #endif
   201 #ifdef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE
   202         const SkMatrix& inv = this->getUnitInverse();
   203         SkMatrix::MapPtProc invProc = this->getUnitInverseProc();
   204 #else
   205         const SkMatrix& inv = this->getTotalInverse();
   206         SkMatrix::MapPtProc invProc = this->getInverseMapPtProc();
   207 #endif
   208         const SkBitmap& srcBitmap = this->getSrcBitmap();
   209         unsigned        srcMaxX = srcBitmap.width() - 1;
   210         unsigned        srcMaxY = srcBitmap.height() - 1;
   211         unsigned        srcRB = srcBitmap.rowBytes();
   212         SkFixed         fx, fy, dx, dy;
   214         const NOFILTER_BITMAP_SHADER_TYPE* srcPixels = (const NOFILTER_BITMAP_SHADER_TYPE*)srcBitmap.getPixels();
   215         NOFILTER_BITMAP_SHADER_PREAMBLE16(srcBitmap, srcRB);
   217         if (this->getInverseClass() == kPerspective_MatrixClass)
   218         {
   219             SkPerspIter   iter(inv, SkIntToScalar(x) + SK_ScalarHalf,
   220                                     SkIntToScalar(y) + SK_ScalarHalf, count);
   221             while ((count = iter.next()) != 0)
   222             {
   223                 const SkFixed* srcXY = iter.getXY();
   225                 while (--count >= 0)
   226                 {
   227                     fx = *srcXY++;
   228                     fy = *srcXY++;
   229                     unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX);
   230                     unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY);
   231                     *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY16(srcPixels, x, y, srcRB);
   232                 }
   233             }
   234             return;
   235         }
   237         // now init fx, fy, dx, dy
   238         {
   239             SkPoint srcPt;
   240             invProc(inv, SkIntToScalar(x) + SK_ScalarHalf,
   241                          SkIntToScalar(y) + SK_ScalarHalf, &srcPt);
   243             fx = SkScalarToFixed(srcPt.fX);
   244             fy = SkScalarToFixed(srcPt.fY);
   246             if (this->getInverseClass() == kFixedStepInX_MatrixClass)
   247                 (void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy);
   248             else
   249             {
   250                 dx = SkScalarToFixed(inv.getScaleX());
   251                 dy = SkScalarToFixed(inv.getSkewY());
   252             }
   253         }
   255 #ifndef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE
   256         {   int level = this->getMipLevel() >> 16;
   257             fx >>= level;
   258             fy >>= level;
   259             dx >>= level;
   260             dy >>= level;
   261         }
   262 #endif
   264         if (dy == 0)
   265         {
   266             srcPixels = (const NOFILTER_BITMAP_SHADER_TYPE*)((const char*)srcPixels + NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY) * srcRB);
   267             do {
   268                 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX);
   269                 fx += dx;
   270                 *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_X16(srcPixels, x);
   271             } while (--count != 0);
   272         }
   273         else    // dy != 0
   274         {
   275             do {
   276                 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX);
   277                 unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY);
   278                 fx += dx;
   279                 fy += dy;
   280                 *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY16(srcPixels, x, y, srcRB);
   281             } while (--count != 0);
   282         }
   284         NOFILTER_BITMAP_SHADER_POSTAMBLE16(srcBitmap);
   285     }
   286 private:
   287     typedef HasSpan16_Sampler_BitmapShader INHERITED;
   288 };
   290 #undef NOFILTER_BITMAP_SHADER_CLASS
   291 #undef NOFILTER_BITMAP_SHADER_TYPE
   292 #undef NOFILTER_BITMAP_SHADER_PREAMBLE
   293 #undef NOFILTER_BITMAP_SHADER_POSTAMBLE
   294 #undef NOFILTER_BITMAP_SHADER_SAMPLE_X      //(x)
   295 #undef NOFILTER_BITMAP_SHADER_SAMPLE_XY     //(x, y, rowBytes)
   296 #undef NOFILTER_BITMAP_SHADER_TILEMODE
   297 #undef NOFILTER_BITMAP_SHADER_TILEPROC
   299 #undef NOFILTER_BITMAP_SHADER_PREAMBLE16
   300 #undef NOFILTER_BITMAP_SHADER_POSTAMBLE16
   301 #undef NOFILTER_BITMAP_SHADER_SAMPLE_X16        //(x)
   302 #undef NOFILTER_BITMAP_SHADER_SAMPLE_XY16       //(x, y, rowBytes)
   304 #undef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE
   305 #undef NOFILTER_BITMAP_SHADER_SPRITEPROC16
   306 #undef NOFILTER_BITMAP_SHADER_SPRITEPROC32

mercurial