1 /* 2 * Copyright 2022 Google LLC 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "src/text/StrikeForGPU.h" 9 10 #include <memory> 11 #include <utility> 12 13 #include "include/private/chromium/SkChromeRemoteGlyphCache.h" 14 #include "src/core/SkDescriptor.h" 15 #include "src/core/SkReadBuffer.h" 16 #include "src/core/SkStrike.h" 17 #include "src/core/SkStrikeCache.h" 18 #include "src/core/SkWriteBuffer.h" 19 20 namespace sktext { 21 // -- SkStrikePromise ------------------------------------------------------------------------------ 22 SkStrikePromise::SkStrikePromise(sktext::SkStrikePromise&&) = default; 23 SkStrikePromise& SkStrikePromise::operator=(sktext::SkStrikePromise&&) = default; SkStrikePromise(sk_sp<SkStrike> && strike)24SkStrikePromise::SkStrikePromise(sk_sp<SkStrike>&& strike) 25 : fStrikeOrSpec{std::move(strike)} {} SkStrikePromise(const SkStrikeSpec & spec)26SkStrikePromise::SkStrikePromise(const SkStrikeSpec& spec) 27 : fStrikeOrSpec{std::make_unique<SkStrikeSpec>(spec)} {} 28 strike()29SkStrike* SkStrikePromise::strike() { 30 if (std::holds_alternative<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec)) { 31 // Turn the strike spec into a strike. 32 std::unique_ptr<SkStrikeSpec> spec = 33 std::exchange(std::get<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec), nullptr); 34 35 fStrikeOrSpec = SkStrikeCache::GlobalStrikeCache()->findOrCreateStrike(*spec); 36 } 37 return std::get<sk_sp<SkStrike>>(fStrikeOrSpec).get(); 38 } 39 resetStrike()40void SkStrikePromise::resetStrike() { 41 fStrikeOrSpec = sk_sp<SkStrike>(); 42 } 43 descriptor() const44const SkDescriptor& SkStrikePromise::descriptor() const { 45 if (std::holds_alternative<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec)) { 46 return std::get<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec)->descriptor(); 47 } 48 49 return std::get<sk_sp<SkStrike>>(fStrikeOrSpec)->getDescriptor(); 50 } 51 flatten(SkWriteBuffer & buffer) const52void SkStrikePromise::flatten(SkWriteBuffer& buffer) const { 53 this->descriptor().flatten(buffer); 54 } 55 MakeFromBuffer(SkReadBuffer & buffer,const SkStrikeClient * client,SkStrikeCache * strikeCache)56std::optional<SkStrikePromise> SkStrikePromise::MakeFromBuffer( 57 SkReadBuffer& buffer, const SkStrikeClient* client, SkStrikeCache* strikeCache) { 58 std::optional<SkAutoDescriptor> descriptor = SkAutoDescriptor::MakeFromBuffer(buffer); 59 if (!buffer.validate(descriptor.has_value())) { 60 return std::nullopt; 61 } 62 63 // If there is a client, then this from a different process. Translate the SkTypefaceID from 64 // the strike server (Renderer) process to strike client (GPU) process. 65 if (client != nullptr) { 66 if (!client->translateTypefaceID(&descriptor.value())) { 67 return std::nullopt; 68 } 69 } 70 71 sk_sp<SkStrike> strike = strikeCache->findStrike(*descriptor->getDesc()); 72 SkASSERT(strike != nullptr); 73 if (!buffer.validate(strike != nullptr)) { 74 return std::nullopt; 75 } 76 77 return SkStrikePromise{std::move(strike)}; 78 } 79 80 // -- StrikeMutationMonitor ------------------------------------------------------------------------ StrikeMutationMonitor(StrikeForGPU * strike)81StrikeMutationMonitor::StrikeMutationMonitor(StrikeForGPU* strike) 82 : fStrike{strike} { 83 fStrike->lock(); 84 } 85 ~StrikeMutationMonitor()86StrikeMutationMonitor::~StrikeMutationMonitor() { 87 fStrike->unlock(); 88 } 89 } // namespace sktext 90