1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "src/text/StrikeForGPU.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkDescriptor.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkStrike.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkStrikeCache.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkStrikeSpec.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 16*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker namespace sktext { 19*c8dee2aaSAndroid Build Coastguard Worker // -- SkStrikePromise ------------------------------------------------------------------------------ 20*c8dee2aaSAndroid Build Coastguard Worker SkStrikePromise::SkStrikePromise(sktext::SkStrikePromise&&) = default; 21*c8dee2aaSAndroid Build Coastguard Worker SkStrikePromise& SkStrikePromise::operator=(sktext::SkStrikePromise&&) = default; SkStrikePromise(sk_sp<SkStrike> && strike)22*c8dee2aaSAndroid Build Coastguard WorkerSkStrikePromise::SkStrikePromise(sk_sp<SkStrike>&& strike) 23*c8dee2aaSAndroid Build Coastguard Worker : fStrikeOrSpec{std::move(strike)} {} SkStrikePromise(const SkStrikeSpec & spec)24*c8dee2aaSAndroid Build Coastguard WorkerSkStrikePromise::SkStrikePromise(const SkStrikeSpec& spec) 25*c8dee2aaSAndroid Build Coastguard Worker : fStrikeOrSpec{std::make_unique<SkStrikeSpec>(spec)} {} 26*c8dee2aaSAndroid Build Coastguard Worker strike()27*c8dee2aaSAndroid Build Coastguard WorkerSkStrike* SkStrikePromise::strike() { 28*c8dee2aaSAndroid Build Coastguard Worker if (std::holds_alternative<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec)) { 29*c8dee2aaSAndroid Build Coastguard Worker // Turn the strike spec into a strike. 30*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkStrikeSpec> spec = 31*c8dee2aaSAndroid Build Coastguard Worker std::exchange(std::get<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec), nullptr); 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker fStrikeOrSpec = SkStrikeCache::GlobalStrikeCache()->findOrCreateStrike(*spec); 34*c8dee2aaSAndroid Build Coastguard Worker } 35*c8dee2aaSAndroid Build Coastguard Worker return std::get<sk_sp<SkStrike>>(fStrikeOrSpec).get(); 36*c8dee2aaSAndroid Build Coastguard Worker } 37*c8dee2aaSAndroid Build Coastguard Worker resetStrike()38*c8dee2aaSAndroid Build Coastguard Workervoid SkStrikePromise::resetStrike() { 39*c8dee2aaSAndroid Build Coastguard Worker fStrikeOrSpec = sk_sp<SkStrike>(); 40*c8dee2aaSAndroid Build Coastguard Worker } 41*c8dee2aaSAndroid Build Coastguard Worker descriptor() const42*c8dee2aaSAndroid Build Coastguard Workerconst SkDescriptor& SkStrikePromise::descriptor() const { 43*c8dee2aaSAndroid Build Coastguard Worker if (std::holds_alternative<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec)) { 44*c8dee2aaSAndroid Build Coastguard Worker return std::get<std::unique_ptr<SkStrikeSpec>>(fStrikeOrSpec)->descriptor(); 45*c8dee2aaSAndroid Build Coastguard Worker } 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker return std::get<sk_sp<SkStrike>>(fStrikeOrSpec)->getDescriptor(); 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker flatten(SkWriteBuffer & buffer) const50*c8dee2aaSAndroid Build Coastguard Workervoid SkStrikePromise::flatten(SkWriteBuffer& buffer) const { 51*c8dee2aaSAndroid Build Coastguard Worker this->descriptor().flatten(buffer); 52*c8dee2aaSAndroid Build Coastguard Worker } 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker // -- StrikeMutationMonitor ------------------------------------------------------------------------ StrikeMutationMonitor(StrikeForGPU * strike)55*c8dee2aaSAndroid Build Coastguard WorkerStrikeMutationMonitor::StrikeMutationMonitor(StrikeForGPU* strike) 56*c8dee2aaSAndroid Build Coastguard Worker : fStrike{strike} { 57*c8dee2aaSAndroid Build Coastguard Worker fStrike->lock(); 58*c8dee2aaSAndroid Build Coastguard Worker } 59*c8dee2aaSAndroid Build Coastguard Worker ~StrikeMutationMonitor()60*c8dee2aaSAndroid Build Coastguard WorkerStrikeMutationMonitor::~StrikeMutationMonitor() { 61*c8dee2aaSAndroid Build Coastguard Worker fStrike->unlock(); 62*c8dee2aaSAndroid Build Coastguard Worker } 63*c8dee2aaSAndroid Build Coastguard Worker } // namespace sktext 64