| /* | |
| * Copyright 2015 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "src/core/SkArenaAlloc.h" | |
| #include "src/core/SkStrikeSpec.h" | |
| #include "src/gpu/GrGlyph.h" | |
| #include "src/gpu/text/GrStrikeCache.h" | |
| GrStrikeCache::~GrStrikeCache() { | |
| this->freeAll(); | |
| } | |
| void GrStrikeCache::freeAll() { | |
| fCache.reset(); | |
| } | |
| sk_sp<GrTextStrike> GrStrikeCache::findOrCreateStrike(const SkStrikeSpec& strikeSpec) { | |
| if (sk_sp<GrTextStrike>* cached = fCache.find(strikeSpec.descriptor())) { | |
| return *cached; | |
| } | |
| return this->generateStrike(strikeSpec); | |
| } | |
| sk_sp<GrTextStrike> GrStrikeCache::generateStrike(const SkStrikeSpec& strikeSpec) { | |
| sk_sp<GrTextStrike> strike = sk_make_sp<GrTextStrike>(strikeSpec); | |
| fCache.set(strike); | |
| return strike; | |
| } | |
| const SkDescriptor& GrStrikeCache::HashTraits::GetKey(const sk_sp<GrTextStrike>& strike) { | |
| return strike->fStrikeSpec.descriptor(); | |
| } | |
| uint32_t GrStrikeCache::HashTraits::Hash(const SkDescriptor& descriptor) { | |
| return descriptor.getChecksum(); | |
| } | |
| GrTextStrike::GrTextStrike(const SkStrikeSpec& strikeSpec) : fStrikeSpec{strikeSpec} {} | |
| GrGlyph* GrTextStrike::getGlyph(SkPackedGlyphID packedGlyphID) { | |
| GrGlyph* grGlyph = fCache.findOrNull(packedGlyphID); | |
| if (grGlyph == nullptr) { | |
| grGlyph = fAlloc.make<GrGlyph>(packedGlyphID); | |
| fCache.set(grGlyph); | |
| } | |
| return grGlyph; | |
| } | |
| const SkPackedGlyphID& GrTextStrike::HashTraits::GetKey(const GrGlyph* glyph) { | |
| return glyph->fPackedID; | |
| } | |
| uint32_t GrTextStrike::HashTraits::Hash(SkPackedGlyphID key) { | |
| return key.hash(); | |
| } | |