/*
 * Copyright 2025 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "src/gpu/graphite/text/TextStrike.h"

#include "src/core/SkGlyph.h"
#include "src/core/SkStrikeSpec.h"
#include "src/gpu/graphite/text/GlyphData.h"

namespace skgpu::graphite {

TextStrike::TextStrike(sktext::gpu::StrikeCache* strikeCache, const SkStrikeSpec& strikeSpec)
        : TextStrikeBase(strikeCache, strikeSpec) {}

sk_sp<TextStrike> TextStrike::GetOrCreate(sktext::gpu::StrikeCache* strikeCache,
                                          const SkStrikeSpec& strikeSpec) {
    auto existingStrike = Find(strikeCache, strikeSpec.descriptor());
    if (existingStrike) {
        return sk_ref_sp(static_cast<TextStrike*>(existingStrike.get()));
    }

    auto newStrike = sk_make_sp<TextStrike>(strikeCache, strikeSpec);
    Add(strikeCache, newStrike);
    return newStrike;
}

GlyphEntry* TextStrike::getGlyph(SkPackedGlyphID packedGlyphID) {
    GlyphEntry* glyph = fCache.findOrNull(packedGlyphID);
    if (glyph == nullptr) {
        glyph = fAlloc.make<GlyphEntry>(packedGlyphID);
        fCache.set(glyph);
        this->addMemoryUsed(sizeof(Glyph));
    }
    return glyph;
}

const SkPackedGlyphID& TextStrike::HashTraits::GetKey(const GlyphEntry* glyph) {
    return glyph->fPackedID;
}

uint32_t TextStrike::HashTraits::Hash(SkPackedGlyphID key) { return key.hash(); }

}  // namespace skgpu::graphite
