• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)24 SkStrikePromise::SkStrikePromise(sk_sp<SkStrike>&& strike)
25         : fStrikeOrSpec{std::move(strike)} {}
SkStrikePromise(const SkStrikeSpec & spec)26 SkStrikePromise::SkStrikePromise(const SkStrikeSpec& spec)
27         : fStrikeOrSpec{std::make_unique<SkStrikeSpec>(spec)} {}
28 
strike()29 SkStrike* 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()40 void SkStrikePromise::resetStrike() {
41     fStrikeOrSpec = sk_sp<SkStrike>();
42 }
43 
descriptor() const44 const 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) const52 void SkStrikePromise::flatten(SkWriteBuffer& buffer) const {
53     this->descriptor().flatten(buffer);
54 }
55 
MakeFromBuffer(SkReadBuffer & buffer,const SkStrikeClient * client,SkStrikeCache * strikeCache)56 std::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)81 StrikeMutationMonitor::StrikeMutationMonitor(StrikeForGPU* strike)
82         : fStrike{strike} {
83     fStrike->lock();
84 }
85 
~StrikeMutationMonitor()86 StrikeMutationMonitor::~StrikeMutationMonitor() {
87     fStrike->unlock();
88 }
89 }  // namespace sktext
90