/* * Copyright 2022 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "src/text/StrikeForGPU.h" #include "src/core/SkDescriptor.h" #include "src/core/SkStrike.h" #include "src/core/SkStrikeCache.h" #include "src/core/SkStrikeSpec.h" #include #include namespace sktext { // -- SkStrikePromise ------------------------------------------------------------------------------ SkStrikePromise::SkStrikePromise(sktext::SkStrikePromise&&) = default; SkStrikePromise& SkStrikePromise::operator=(sktext::SkStrikePromise&&) = default; SkStrikePromise::SkStrikePromise(sk_sp&& strike) : fStrikeOrSpec{std::move(strike)} {} SkStrikePromise::SkStrikePromise(const SkStrikeSpec& spec) : fStrikeOrSpec{std::make_unique(spec)} {} SkStrike* SkStrikePromise::strike() { if (std::holds_alternative>(fStrikeOrSpec)) { // Turn the strike spec into a strike. std::unique_ptr spec = std::exchange(std::get>(fStrikeOrSpec), nullptr); fStrikeOrSpec = SkStrikeCache::GlobalStrikeCache()->findOrCreateStrike(*spec); } return std::get>(fStrikeOrSpec).get(); } void SkStrikePromise::resetStrike() { fStrikeOrSpec = sk_sp(); } const SkDescriptor& SkStrikePromise::descriptor() const { if (std::holds_alternative>(fStrikeOrSpec)) { return std::get>(fStrikeOrSpec)->descriptor(); } return std::get>(fStrikeOrSpec)->getDescriptor(); } void SkStrikePromise::flatten(SkWriteBuffer& buffer) const { this->descriptor().flatten(buffer); } // -- StrikeMutationMonitor ------------------------------------------------------------------------ StrikeMutationMonitor::StrikeMutationMonitor(StrikeForGPU* strike) : fStrike{strike} { fStrike->lock(); } StrikeMutationMonitor::~StrikeMutationMonitor() { fStrike->unlock(); } } // namespace sktext