/* * 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 GrStrikeCache::findOrCreateStrike(const SkStrikeSpec& strikeSpec) { if (sk_sp* cached = fCache.find(strikeSpec.descriptor())) { return *cached; } return this->generateStrike(strikeSpec); } sk_sp GrStrikeCache::generateStrike(const SkStrikeSpec& strikeSpec) { sk_sp strike = sk_make_sp(strikeSpec); fCache.set(strike); return strike; } const SkDescriptor& GrStrikeCache::HashTraits::GetKey(const sk_sp& 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(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(); }