| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef GrBatchFontCache_DEFINED | 8 #ifndef GrBatchFontCache_DEFINED |
| 9 #define GrBatchFontCache_DEFINED | 9 #define GrBatchFontCache_DEFINED |
| 10 | 10 |
| 11 #include "GrBatchAtlas.h" | 11 #include "GrBatchAtlas.h" |
| 12 #include "GrDrawTarget.h" | 12 #include "GrDrawTarget.h" |
| 13 #include "GrFontScaler.h" | 13 #include "GrFontScaler.h" |
| 14 #include "GrGlyph.h" | 14 #include "GrGlyph.h" |
| 15 #include "SkGlyph.h" |
| 15 #include "SkTDynamicHash.h" | 16 #include "SkTDynamicHash.h" |
| 16 #include "SkVarAlloc.h" | 17 #include "SkVarAlloc.h" |
| 17 | 18 |
| 18 class GrBatchFontCache; | 19 class GrBatchFontCache; |
| 19 class GrBatchTarget; | 20 class GrBatchTarget; |
| 20 class GrGpu; | 21 class GrGpu; |
| 21 | 22 |
| 22 /** | 23 /** |
| 23 * The GrBatchTextStrike manages a pool of CPU backing memory for Glyph Masks.
This backing memory | 24 * The GrBatchTextStrike manages a pool of CPU backing memory for Glyph Masks.
This backing memory |
| 24 * is abstracted by GrGlyph, and indexed by a PackedID and GrFontScaler. The G
rFontScaler is what | 25 * is abstracted by GrGlyph, and indexed by a PackedID and GrFontScaler. The G
rFontScaler is what |
| 25 * actually creates the mask. | 26 * actually creates the mask. |
| 26 */ | 27 */ |
| 27 class GrBatchTextStrike : public SkNVRefCnt<GrBatchTextStrike> { | 28 class GrBatchTextStrike : public SkNVRefCnt<GrBatchTextStrike> { |
| 28 public: | 29 public: |
| 29 GrBatchTextStrike(GrBatchFontCache*, const GrFontDescKey* fontScalerKey); | 30 GrBatchTextStrike(GrBatchFontCache*, const GrFontDescKey* fontScalerKey); |
| 30 ~GrBatchTextStrike(); | 31 ~GrBatchTextStrike(); |
| 31 | 32 |
| 32 const GrFontDescKey* getFontScalerKey() const { return fFontScalerKey; } | 33 const GrFontDescKey* getFontScalerKey() const { return fFontScalerKey; } |
| 33 GrBatchFontCache* getBatchFontCache() const { return fBatchFontCache; } | 34 GrBatchFontCache* getBatchFontCache() const { return fBatchFontCache; } |
| 34 | 35 |
| 35 inline GrGlyph* getGlyph(GrGlyph::PackedID packed, GrFontScaler* scaler) { | 36 inline GrGlyph* getGlyph(const SkGlyph& skGlyph, GrGlyph::PackedID packed, |
| 37 GrFontScaler* scaler) { |
| 36 GrGlyph* glyph = fCache.find(packed); | 38 GrGlyph* glyph = fCache.find(packed); |
| 37 if (NULL == glyph) { | 39 if (NULL == glyph) { |
| 38 glyph = this->generateGlyph(packed, scaler); | 40 glyph = this->generateGlyph(skGlyph, packed, scaler); |
| 39 } | 41 } |
| 40 return glyph; | 42 return glyph; |
| 41 } | 43 } |
| 42 | 44 |
| 43 // returns true if glyph successfully added to texture atlas, false otherwis
e | 45 // This variant of the above function is called by TextBatch. At this point
, it is possible |
| 44 bool addGlyphToAtlas(GrBatchTarget*, GrGlyph*, GrFontScaler*); | 46 // that the maskformat of the glyph differs from what we expect. In these c
ases we will just |
| 47 // draw a clear square. |
| 48 // skbug:4143 crbug:510931 |
| 49 inline GrGlyph* getGlyph(const SkGlyph& skGlyph, GrGlyph::PackedID packed, |
| 50 GrMaskFormat expectedMaskFormat, GrFontScaler* scal
er) { |
| 51 GrGlyph* glyph = fCache.find(packed); |
| 52 if (NULL == glyph) { |
| 53 glyph = this->generateGlyph(skGlyph, packed, scaler); |
| 54 glyph->fMaskFormat = expectedMaskFormat; |
| 55 } |
| 56 return glyph; |
| 57 } |
| 58 |
| 59 // returns true if glyph successfully added to texture atlas, false otherwis
e. If the glyph's |
| 60 // mask format has changed, then addGlyphToAtlas will draw a clear box. Thi
s will almost never |
| 61 // happen. |
| 62 // TODO we can handle some of these cases if we really want to, but the long
term solution is to |
| 63 // get the actual glyph image itself when we get the glyph metrics. |
| 64 bool addGlyphToAtlas(GrBatchTarget*, GrGlyph*, GrFontScaler*, const SkGlyph&
, |
| 65 GrMaskFormat expectedMaskFormat); |
| 45 | 66 |
| 46 // testing | 67 // testing |
| 47 int countGlyphs() const { return fCache.count(); } | 68 int countGlyphs() const { return fCache.count(); } |
| 48 | 69 |
| 49 // remove any references to this plot | 70 // remove any references to this plot |
| 50 void removeID(GrBatchAtlas::AtlasID); | 71 void removeID(GrBatchAtlas::AtlasID); |
| 51 | 72 |
| 52 // If a TextStrike is abandoned by the cache, then the caller must get a new
strike | 73 // If a TextStrike is abandoned by the cache, then the caller must get a new
strike |
| 53 bool isAbandoned() const { return fIsAbandoned; } | 74 bool isAbandoned() const { return fIsAbandoned; } |
| 54 | 75 |
| 55 static const GrFontDescKey& GetKey(const GrBatchTextStrike& ts) { | 76 static const GrFontDescKey& GetKey(const GrBatchTextStrike& ts) { |
| 56 return *(ts.fFontScalerKey); | 77 return *(ts.fFontScalerKey); |
| 57 } | 78 } |
| 58 static uint32_t Hash(const GrFontDescKey& key) { | 79 static uint32_t Hash(const GrFontDescKey& key) { |
| 59 return key.getHash(); | 80 return key.getHash(); |
| 60 } | 81 } |
| 61 | 82 |
| 62 private: | 83 private: |
| 63 SkTDynamicHash<GrGlyph, GrGlyph::PackedID> fCache; | 84 SkTDynamicHash<GrGlyph, GrGlyph::PackedID> fCache; |
| 64 SkAutoTUnref<const GrFontDescKey> fFontScalerKey; | 85 SkAutoTUnref<const GrFontDescKey> fFontScalerKey; |
| 65 SkVarAlloc fPool; | 86 SkVarAlloc fPool; |
| 66 | 87 |
| 67 GrBatchFontCache* fBatchFontCache; | 88 GrBatchFontCache* fBatchFontCache; |
| 68 int fAtlasedGlyphs; | 89 int fAtlasedGlyphs; |
| 69 bool fIsAbandoned; | 90 bool fIsAbandoned; |
| 70 | 91 |
| 71 GrGlyph* generateGlyph(GrGlyph::PackedID packed, GrFontScaler* scaler); | 92 GrGlyph* generateGlyph(const SkGlyph&, GrGlyph::PackedID, GrFontScaler*); |
| 72 | 93 |
| 73 friend class GrBatchFontCache; | 94 friend class GrBatchFontCache; |
| 74 }; | 95 }; |
| 75 | 96 |
| 76 /* | 97 /* |
| 77 * GrBatchFontCache manages strikes which are indexed by a GrFontScaler. These
strikes can then be | 98 * GrBatchFontCache manages strikes which are indexed by a GrFontScaler. These
strikes can then be |
| 78 * used to individual Glyph Masks. The GrBatchFontCache also manages GrBatchAtl
ases, though this is | 99 * used to individual Glyph Masks. The GrBatchFontCache also manages GrBatchAtl
ases, though this is |
| 79 * more or less transparent to the client(aside from atlasGeneration, described
below). | 100 * more or less transparent to the client(aside from atlasGeneration, described
below). |
| 80 * Note - we used to initialize the backing atlas for the GrBatchFontCache at in
itialization time. | 101 * Note - we used to initialize the backing atlas for the GrBatchFontCache at in
itialization time. |
| 81 * However, this caused a regression, even when the GrBatchFontCache was unused.
We now initialize | 102 * However, this caused a regression, even when the GrBatchFontCache was unused.
We now initialize |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 | 203 |
| 183 static void HandleEviction(GrBatchAtlas::AtlasID, void*); | 204 static void HandleEviction(GrBatchAtlas::AtlasID, void*); |
| 184 | 205 |
| 185 GrContext* fContext; | 206 GrContext* fContext; |
| 186 SkTDynamicHash<GrBatchTextStrike, GrFontDescKey> fCache; | 207 SkTDynamicHash<GrBatchTextStrike, GrFontDescKey> fCache; |
| 187 GrBatchAtlas* fAtlases[kMaskFormatCount]; | 208 GrBatchAtlas* fAtlases[kMaskFormatCount]; |
| 188 GrBatchTextStrike* fPreserveStrike; | 209 GrBatchTextStrike* fPreserveStrike; |
| 189 }; | 210 }; |
| 190 | 211 |
| 191 #endif | 212 #endif |
| OLD | NEW |