1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef GrStrikeCache_DEFINED 9cb93a386Sopenharmony_ci#define GrStrikeCache_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/private/SkTHash.h" 12cb93a386Sopenharmony_ci#include "src/core/SkArenaAlloc.h" 13cb93a386Sopenharmony_ci#include "src/core/SkStrikeSpec.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ciclass GrGlyph; 16cb93a386Sopenharmony_ciclass GrStrikeCache; 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ci// The GrTextStrike manages an SkArenaAlloc for GrGlyphs. The SkStrike is what actually creates 20cb93a386Sopenharmony_ci// the mask. The GrTextStrike may outlive the generating SkStrike. However, it retains a copy 21cb93a386Sopenharmony_ci// of it's SkDescriptor as a key to access (or regenerate) the SkStrike. GrTextStrikes are 22cb93a386Sopenharmony_ci// created by and owned by a GrStrikeCache. 23cb93a386Sopenharmony_ciclass GrTextStrike : public SkNVRefCnt<GrTextStrike> { 24cb93a386Sopenharmony_cipublic: 25cb93a386Sopenharmony_ci GrTextStrike(const SkStrikeSpec& strikeSpec); 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci GrGlyph* getGlyph(SkPackedGlyphID); 28cb93a386Sopenharmony_ci const SkStrikeSpec& strikeSpec() const { return fStrikeSpec; } 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ciprivate: 31cb93a386Sopenharmony_ci // Key for retrieving the SkStrike for creating new atlas data. 32cb93a386Sopenharmony_ci const SkStrikeSpec fStrikeSpec; 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci struct HashTraits { 35cb93a386Sopenharmony_ci static const SkPackedGlyphID& GetKey(const GrGlyph* glyph); 36cb93a386Sopenharmony_ci static uint32_t Hash(SkPackedGlyphID key); 37cb93a386Sopenharmony_ci }; 38cb93a386Sopenharmony_ci // Map SkPackedGlyphID -> GrGlyph*. 39cb93a386Sopenharmony_ci SkTHashTable<GrGlyph*, SkPackedGlyphID, HashTraits> fCache; 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci // Store for the glyph information. 42cb93a386Sopenharmony_ci SkArenaAlloc fAlloc{512}; 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci friend class GrStrikeCache; 45cb93a386Sopenharmony_ci}; 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci// GrStrikeCache manages strikes which are indexed by a SkStrike. These strikes can then be 48cb93a386Sopenharmony_ci// used to generate individual Glyph Masks. 49cb93a386Sopenharmony_ciclass GrStrikeCache { 50cb93a386Sopenharmony_cipublic: 51cb93a386Sopenharmony_ci ~GrStrikeCache(); 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci // The user of the cache may hold a long-lived ref to the returned strike. 54cb93a386Sopenharmony_ci sk_sp<GrTextStrike> findOrCreateStrike(const SkStrikeSpec& strikeSpec); 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci void freeAll(); 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ciprivate: 59cb93a386Sopenharmony_ci sk_sp<GrTextStrike> generateStrike(const SkStrikeSpec& strikeSpec); 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci struct HashTraits { 62cb93a386Sopenharmony_ci static const SkDescriptor& GetKey(const sk_sp<GrTextStrike>& strike); 63cb93a386Sopenharmony_ci static uint32_t Hash(const SkDescriptor& strikeSpec); 64cb93a386Sopenharmony_ci }; 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci using StrikeHash = SkTHashTable<sk_sp<GrTextStrike>, const SkDescriptor&, HashTraits>; 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci StrikeHash fCache; 69cb93a386Sopenharmony_ci}; 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci#endif // GrStrikeCache_DEFINED 72