gfx/skia/trunk/src/core/SkAntiRun.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  */
    10 #ifndef SkAntiRun_DEFINED
    11 #define SkAntiRun_DEFINED
    13 #include "SkBlitter.h"
    15 /** Sparse array of run-length-encoded alpha (supersampling coverage) values.
    16     Sparseness allows us to independently compose several paths into the
    17     same SkAlphaRuns buffer.
    18 */
    20 class SkAlphaRuns {
    21 public:
    22     int16_t*    fRuns;
    23     uint8_t*     fAlpha;
    25     /// Returns true if the scanline contains only a single run,
    26     /// of alpha value 0.
    27     bool empty() const {
    28         SkASSERT(fRuns[0] > 0);
    29         return fAlpha[0] == 0 && fRuns[fRuns[0]] == 0;
    30     }
    32     /// Reinitialize for a new scanline.
    33     void    reset(int width);
    35     /**
    36      *  Insert into the buffer a run starting at (x-offsetX):
    37      *      if startAlpha > 0
    38      *          one pixel with value += startAlpha,
    39      *              max 255
    40      *      if middleCount > 0
    41      *          middleCount pixels with value += maxValue
    42      *      if stopAlpha > 0
    43      *          one pixel with value += stopAlpha
    44      *  Returns the offsetX value that should be passed on the next call,
    45      *  assuming we're on the same scanline. If the caller is switching
    46      *  scanlines, then offsetX should be 0 when this is called.
    47      */
    48     SK_ALWAYS_INLINE int add(int x, U8CPU startAlpha, int middleCount, U8CPU stopAlpha,
    49                              U8CPU maxValue, int offsetX) {
    50         SkASSERT(middleCount >= 0);
    51         SkASSERT(x >= 0 && x + (startAlpha != 0) + middleCount + (stopAlpha != 0) <= fWidth);
    53         SkASSERT(fRuns[offsetX] >= 0);
    55         int16_t*    runs = fRuns + offsetX;
    56         uint8_t*    alpha = fAlpha + offsetX;
    57         uint8_t*    lastAlpha = alpha;
    58         x -= offsetX;
    60         if (startAlpha) {
    61             SkAlphaRuns::Break(runs, alpha, x, 1);
    62             /*  I should be able to just add alpha[x] + startAlpha.
    63                 However, if the trailing edge of the previous span and the leading
    64                 edge of the current span round to the same super-sampled x value,
    65                 I might overflow to 256 with this add, hence the funny subtract (crud).
    66             */
    67             unsigned tmp = alpha[x] + startAlpha;
    68             SkASSERT(tmp <= 256);
    69             alpha[x] = SkToU8(tmp - (tmp >> 8));    // was (tmp >> 7), but that seems wrong if we're trying to catch 256
    71             runs += x + 1;
    72             alpha += x + 1;
    73             x = 0;
    74             lastAlpha += x; // we don't want the +1
    75             SkDEBUGCODE(this->validate();)
    76         }
    78         if (middleCount) {
    79             SkAlphaRuns::Break(runs, alpha, x, middleCount);
    80             alpha += x;
    81             runs += x;
    82             x = 0;
    83             do {
    84                 alpha[0] = SkToU8(alpha[0] + maxValue);
    85                 int n = runs[0];
    86                 SkASSERT(n <= middleCount);
    87                 alpha += n;
    88                 runs += n;
    89                 middleCount -= n;
    90             } while (middleCount > 0);
    91             SkDEBUGCODE(this->validate();)
    92             lastAlpha = alpha;
    93         }
    95         if (stopAlpha) {
    96             SkAlphaRuns::Break(runs, alpha, x, 1);
    97             alpha += x;
    98             alpha[0] = SkToU8(alpha[0] + stopAlpha);
    99             SkDEBUGCODE(this->validate();)
   100             lastAlpha = alpha;
   101         }
   103         return SkToS32(lastAlpha - fAlpha);  // new offsetX
   104     }
   106     SkDEBUGCODE(void assertValid(int y, int maxStep) const;)
   107     SkDEBUGCODE(void dump() const;)
   109     /**
   110      * Break the runs in the buffer at offsets x and x+count, properly
   111      * updating the runs to the right and left.
   112      *   i.e. from the state AAAABBBB, run-length encoded as A4B4,
   113      *   Break(..., 2, 5) would produce AAAABBBB rle as A2A2B3B1.
   114      * Allows add() to sum another run to some of the new sub-runs.
   115      *   i.e. adding ..CCCCC. would produce AADDEEEB, rle as A2D2E3B1.
   116      */
   117     static void Break(int16_t runs[], uint8_t alpha[], int x, int count) {
   118         SkASSERT(count > 0 && x >= 0);
   120         //  SkAlphaRuns::BreakAt(runs, alpha, x);
   121         //  SkAlphaRuns::BreakAt(&runs[x], &alpha[x], count);
   123         int16_t* next_runs = runs + x;
   124         uint8_t*  next_alpha = alpha + x;
   126         while (x > 0) {
   127             int n = runs[0];
   128             SkASSERT(n > 0);
   130             if (x < n) {
   131                 alpha[x] = alpha[0];
   132                 runs[0] = SkToS16(x);
   133                 runs[x] = SkToS16(n - x);
   134                 break;
   135             }
   136             runs += n;
   137             alpha += n;
   138             x -= n;
   139         }
   141         runs = next_runs;
   142         alpha = next_alpha;
   143         x = count;
   145         for (;;) {
   146             int n = runs[0];
   147             SkASSERT(n > 0);
   149             if (x < n) {
   150                 alpha[x] = alpha[0];
   151                 runs[0] = SkToS16(x);
   152                 runs[x] = SkToS16(n - x);
   153                 break;
   154             }
   155             x -= n;
   156             if (x <= 0) {
   157                 break;
   158             }
   159             runs += n;
   160             alpha += n;
   161         }
   162     }
   164     /**
   165      * Cut (at offset x in the buffer) a run into two shorter runs with
   166      * matching alpha values.
   167      * Used by the RectClipBlitter to trim a RLE encoding to match the
   168      * clipping rectangle.
   169      */
   170     static void BreakAt(int16_t runs[], uint8_t alpha[], int x) {
   171         while (x > 0) {
   172             int n = runs[0];
   173             SkASSERT(n > 0);
   175             if (x < n) {
   176                 alpha[x] = alpha[0];
   177                 runs[0] = SkToS16(x);
   178                 runs[x] = SkToS16(n - x);
   179                 break;
   180             }
   181             runs += n;
   182             alpha += n;
   183             x -= n;
   184         }
   185     }
   187 private:
   188     SkDEBUGCODE(int fWidth;)
   189     SkDEBUGCODE(void validate() const;)
   190 };
   192 #endif

mercurial