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 "src/core/SkDescriptor.h" 11 #include "src/core/SkStrike.h" 12 #include "src/core/SkStrikeCache.h" 13 #include "src/core/SkStrikeSpec.h" 14 15 #include <memory> 16 #include <utility> 17 18 namespace sktext { 19 // -- SkStrikePromise ------------------------------------------------------------------------------ 20 SkStrikePromise::SkStrikePromise(sktext::SkStrikePromise&&) = default; 21 SkStrikePromise& SkStrikePromise::operator=(sktext::SkStrikePromise&&) = default; SkStrikePromise(sk_sp<SkStrike> && strike)22SkStrikePromise::SkStrikePromise(sk_sp<SkStrike>&& strike) 23 : fStrikeOrSpec{std::move(strike)} {} SkStrikePromise(const SkStrikeSpec & spec)24SkStrikePromise::SkStrikePromise(const SkStrikeSpec& spec) 25 : fStrikeOrSpec{std::make_unique<SkStrikeSpec>(spec)} {} 26 strike()27SkStrike* SkStrikePromise::strike() { 28 if (std::holds_alternative<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec)) { 29 // Turn the strike spec into a strike. 30 std::unique_ptr<SkStrikeSpec> spec = 31 std::exchange(std::get<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec), nullptr); 32 33 fStrikeOrSpec = SkStrikeCache::GlobalStrikeCache()->findOrCreateStrike(*spec); 34 } 35 return std::get<sk_sp<SkStrike>>(fStrikeOrSpec).get(); 36 } 37 resetStrike()38void SkStrikePromise::resetStrike() { 39 fStrikeOrSpec = sk_sp<SkStrike>(); 40 } 41 descriptor() const42const SkDescriptor& SkStrikePromise::descriptor() const { 43 if (std::holds_alternative<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec)) { 44 return std::get<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec)->descriptor(); 45 } 46 47 return std::get<sk_sp<SkStrike>>(fStrikeOrSpec)->getDescriptor(); 48 } 49 flatten(SkWriteBuffer & buffer) const50void SkStrikePromise::flatten(SkWriteBuffer& buffer) const { 51 this->descriptor().flatten(buffer); 52 } 53 54 // -- StrikeMutationMonitor ------------------------------------------------------------------------ StrikeMutationMonitor(StrikeForGPU * strike)55StrikeMutationMonitor::StrikeMutationMonitor(StrikeForGPU* strike) 56 : fStrike{strike} { 57 fStrike->lock(); 58 } 59 ~StrikeMutationMonitor()60StrikeMutationMonitor::~StrikeMutationMonitor() { 61 fStrike->unlock(); 62 } 63 } // namespace sktext 64