xref: /aosp_15_r20/external/skia/src/text/StrikeForGPU.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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)22 SkStrikePromise::SkStrikePromise(sk_sp<SkStrike>&& strike)
23         : fStrikeOrSpec{std::move(strike)} {}
SkStrikePromise(const SkStrikeSpec & spec)24 SkStrikePromise::SkStrikePromise(const SkStrikeSpec& spec)
25         : fStrikeOrSpec{std::make_unique<SkStrikeSpec>(spec)} {}
26 
strike()27 SkStrike* 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()38 void SkStrikePromise::resetStrike() {
39     fStrikeOrSpec = sk_sp<SkStrike>();
40 }
41 
descriptor() const42 const 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) const50 void SkStrikePromise::flatten(SkWriteBuffer& buffer) const {
51     this->descriptor().flatten(buffer);
52 }
53 
54 // -- StrikeMutationMonitor ------------------------------------------------------------------------
StrikeMutationMonitor(StrikeForGPU * strike)55 StrikeMutationMonitor::StrikeMutationMonitor(StrikeForGPU* strike)
56         : fStrike{strike} {
57     fStrike->lock();
58 }
59 
~StrikeMutationMonitor()60 StrikeMutationMonitor::~StrikeMutationMonitor() {
61     fStrike->unlock();
62 }
63 }  // namespace sktext
64