gfx/skia/trunk/src/gpu/GrTextStrike_impl.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 2010 Google Inc.
     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 GrTextStrike_impl_DEFINED
    12 #define GrTextStrike_impl_DEFINED
    14 class GrFontCache::Key {
    15 public:
    16     explicit Key(const GrKey* fontScalarKey) {
    17         fFontScalerKey = fontScalarKey;
    18     }
    20     intptr_t getHash() const { return fFontScalerKey->getHash(); }
    22     static bool LessThan(const GrTextStrike& strike, const Key& key) {
    23         return *strike.getFontScalerKey() < *key.fFontScalerKey;
    24     }
    25     static bool Equals(const GrTextStrike& strike, const Key& key) {
    26         return *strike.getFontScalerKey() == *key.fFontScalerKey;
    27     }
    29 private:
    30     const GrKey* fFontScalerKey;
    31 };
    33 void GrFontCache::detachStrikeFromList(GrTextStrike* strike) {
    34     if (strike->fPrev) {
    35         SkASSERT(fHead != strike);
    36         strike->fPrev->fNext = strike->fNext;
    37     } else {
    38         SkASSERT(fHead == strike);
    39         fHead = strike->fNext;
    40     }
    42     if (strike->fNext) {
    43         SkASSERT(fTail != strike);
    44         strike->fNext->fPrev = strike->fPrev;
    45     } else {
    46         SkASSERT(fTail == strike);
    47         fTail = strike->fPrev;
    48     }
    49 }
    51 GrTextStrike* GrFontCache::getStrike(GrFontScaler* scaler, bool useDistanceField) {
    52     this->validate();
    54     const Key key(scaler->getKey());
    55     GrTextStrike* strike = fCache.find(key);
    56     if (NULL == strike) {
    57         strike = this->generateStrike(scaler, key);
    58     } else if (strike->fPrev) {
    59         // Need to put the strike at the head of its dllist, since that is how
    60         // we age the strikes for purging (we purge from the back of the list
    61         this->detachStrikeFromList(strike);
    62         // attach at the head
    63         fHead->fPrev = strike;
    64         strike->fNext = fHead;
    65         strike->fPrev = NULL;
    66         fHead = strike;
    67     }
    68     strike->fUseDistanceField = useDistanceField;
    69     this->validate();
    70     return strike;
    71 }
    73 ///////////////////////////////////////////////////////////////////////////////
    75 /**
    76  *  This Key just wraps a glyphID, and matches the protocol need for
    77  *  GrTHashTable
    78  */
    79 class GrTextStrike::Key {
    80 public:
    81     Key(GrGlyph::PackedID id) : fPackedID(id) {}
    83     uint32_t getHash() const { return fPackedID; }
    85     static bool LessThan(const GrGlyph& glyph, const Key& key) {
    86         return glyph.fPackedID < key.fPackedID;
    87     }
    88     static bool Equals(const GrGlyph& glyph, const Key& key) {
    89         return glyph.fPackedID == key.fPackedID;
    90     }
    92 private:
    93     GrGlyph::PackedID fPackedID;
    94 };
    96 GrGlyph* GrTextStrike::getGlyph(GrGlyph::PackedID packed,
    97                                 GrFontScaler* scaler) {
    98     GrGlyph* glyph = fCache.find(packed);
    99     if (NULL == glyph) {
   100         glyph = this->generateGlyph(packed, scaler);
   101     }
   102     return glyph;
   103 }
   105 #endif

mercurial