| /* |
| * 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 <memory> |
| #include <utility> |
| |
| #include "include/private/chromium/SkChromeRemoteGlyphCache.h" |
| #include "src/core/SkDescriptor.h" |
| #include "src/core/SkReadBuffer.h" |
| #include "src/core/SkStrike.h" |
| #include "src/core/SkStrikeCache.h" |
| #include "src/core/SkWriteBuffer.h" |
| |
| namespace sktext { |
| // -- SkStrikePromise ------------------------------------------------------------------------------ |
| SkStrikePromise::SkStrikePromise(sktext::SkStrikePromise&&) = default; |
| SkStrikePromise& SkStrikePromise::operator=(sktext::SkStrikePromise&&) = default; |
| SkStrikePromise::SkStrikePromise(sk_sp<SkStrike>&& strike) |
| : fStrikeOrSpec{std::move(strike)} {} |
| SkStrikePromise::SkStrikePromise(const SkStrikeSpec& spec) |
| : fStrikeOrSpec{std::make_unique<SkStrikeSpec>(spec)} {} |
| |
| SkStrike* SkStrikePromise::strike() { |
| if (std::holds_alternative<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec)) { |
| // Turn the strike spec into a strike. |
| std::unique_ptr<SkStrikeSpec> spec = |
| std::exchange(std::get<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec), nullptr); |
| |
| fStrikeOrSpec = SkStrikeCache::GlobalStrikeCache()->findOrCreateStrike(*spec); |
| } |
| return std::get<sk_sp<SkStrike>>(fStrikeOrSpec).get(); |
| } |
| |
| void SkStrikePromise::resetStrike() { |
| fStrikeOrSpec = sk_sp<SkStrike>(); |
| } |
| |
| const SkDescriptor& SkStrikePromise::descriptor() const { |
| if (std::holds_alternative<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec)) { |
| return std::get<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec)->descriptor(); |
| } |
| |
| return std::get<sk_sp<SkStrike>>(fStrikeOrSpec)->getDescriptor(); |
| } |
| |
| void SkStrikePromise::flatten(SkWriteBuffer& buffer) const { |
| this->descriptor().flatten(buffer); |
| } |
| |
| std::optional<SkStrikePromise> SkStrikePromise::MakeFromBuffer( |
| SkReadBuffer& buffer, const SkStrikeClient* client, SkStrikeCache* strikeCache) { |
| std::optional<SkAutoDescriptor> descriptor = SkAutoDescriptor::MakeFromBuffer(buffer); |
| if (!buffer.validate(descriptor.has_value())) { |
| return std::nullopt; |
| } |
| |
| // If there is a client, then this from a different process. Translate the SkTypefaceID from |
| // the strike server (Renderer) process to strike client (GPU) process. |
| if (client != nullptr) { |
| if (!client->translateTypefaceID(&descriptor.value())) { |
| return std::nullopt; |
| } |
| } |
| |
| sk_sp<SkStrike> strike = strikeCache->findStrike(*descriptor->getDesc()); |
| SkASSERT(strike != nullptr); |
| if (!buffer.validate(strike != nullptr)) { |
| return std::nullopt; |
| } |
| |
| return SkStrikePromise{std::move(strike)}; |
| } |
| } // namespace sktext |