1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2019 Google Inc. 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 #ifndef sktext_StrikeForGPU_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define sktext_StrikeForGPU_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkGlyph.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 17*c8dee2aaSAndroid Build Coastguard Worker #include <optional> 18*c8dee2aaSAndroid Build Coastguard Worker #include <variant> 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker class SkDescriptor; 21*c8dee2aaSAndroid Build Coastguard Worker class SkDrawable; 22*c8dee2aaSAndroid Build Coastguard Worker class SkReadBuffer; 23*c8dee2aaSAndroid Build Coastguard Worker class SkStrike; 24*c8dee2aaSAndroid Build Coastguard Worker class SkStrikeCache; 25*c8dee2aaSAndroid Build Coastguard Worker class SkStrikeClient; 26*c8dee2aaSAndroid Build Coastguard Worker class SkStrikeSpec; 27*c8dee2aaSAndroid Build Coastguard Worker class SkWriteBuffer; 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker namespace sktext { 30*c8dee2aaSAndroid Build Coastguard Worker // -- SkStrikePromise ------------------------------------------------------------------------------ 31*c8dee2aaSAndroid Build Coastguard Worker // SkStrikePromise produces an SkStrike when needed by GPU glyph rendering. In ordinary 32*c8dee2aaSAndroid Build Coastguard Worker // operation, it just wraps an SkStrike. When used for remote glyph cache operation, the promise is 33*c8dee2aaSAndroid Build Coastguard Worker // serialized to an SkDescriptor. When SkStrikePromise is deserialized, it uses the descriptor to 34*c8dee2aaSAndroid Build Coastguard Worker // look up the SkStrike. 35*c8dee2aaSAndroid Build Coastguard Worker // 36*c8dee2aaSAndroid Build Coastguard Worker // When deserializing some care must be taken; if the needed SkStrike is removed from the cache, 37*c8dee2aaSAndroid Build Coastguard Worker // then looking up using the descriptor will fail resulting in a deserialization failure. The 38*c8dee2aaSAndroid Build Coastguard Worker // Renderer/GPU system solves this problem by pinning all the strikes needed into the cache. 39*c8dee2aaSAndroid Build Coastguard Worker class SkStrikePromise { 40*c8dee2aaSAndroid Build Coastguard Worker public: 41*c8dee2aaSAndroid Build Coastguard Worker SkStrikePromise() = delete; 42*c8dee2aaSAndroid Build Coastguard Worker SkStrikePromise(const SkStrikePromise&) = delete; 43*c8dee2aaSAndroid Build Coastguard Worker SkStrikePromise& operator=(const SkStrikePromise&) = delete; 44*c8dee2aaSAndroid Build Coastguard Worker SkStrikePromise(SkStrikePromise&&); 45*c8dee2aaSAndroid Build Coastguard Worker SkStrikePromise& operator=(SkStrikePromise&&); 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker explicit SkStrikePromise(sk_sp<SkStrike>&& strike); 48*c8dee2aaSAndroid Build Coastguard Worker explicit SkStrikePromise(const SkStrikeSpec& spec); 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker // This only works when the GPU code is compiled in. 51*c8dee2aaSAndroid Build Coastguard Worker static std::optional<SkStrikePromise> MakeFromBuffer(SkReadBuffer& buffer, 52*c8dee2aaSAndroid Build Coastguard Worker const SkStrikeClient* client, 53*c8dee2aaSAndroid Build Coastguard Worker SkStrikeCache* strikeCache); 54*c8dee2aaSAndroid Build Coastguard Worker void flatten(SkWriteBuffer& buffer) const; 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker // Do what is needed to return a strike. 57*c8dee2aaSAndroid Build Coastguard Worker SkStrike* strike(); 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker // Reset the sk_sp<SkStrike> to nullptr. 60*c8dee2aaSAndroid Build Coastguard Worker void resetStrike(); 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker // Return a descriptor used to look up the SkStrike. 63*c8dee2aaSAndroid Build Coastguard Worker const SkDescriptor& descriptor() const; 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker private: 66*c8dee2aaSAndroid Build Coastguard Worker std::variant<sk_sp<SkStrike>, std::unique_ptr<SkStrikeSpec>> fStrikeOrSpec; 67*c8dee2aaSAndroid Build Coastguard Worker }; 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker // -- StrikeForGPU --------------------------------------------------------------------------------- 70*c8dee2aaSAndroid Build Coastguard Worker class StrikeForGPU : public SkRefCnt { 71*c8dee2aaSAndroid Build Coastguard Worker public: 72*c8dee2aaSAndroid Build Coastguard Worker virtual void lock() = 0; 73*c8dee2aaSAndroid Build Coastguard Worker virtual void unlock() = 0; 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker // Generate a digest for a given packed glyph ID as drawn using the give action type. 76*c8dee2aaSAndroid Build Coastguard Worker virtual SkGlyphDigest digestFor(skglyph::ActionType, SkPackedGlyphID) = 0; 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker // Prepare the glyph to draw an image, and return if the image exists. 79*c8dee2aaSAndroid Build Coastguard Worker virtual bool prepareForImage(SkGlyph*) = 0; 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker // Prepare the glyph to draw a path, and return if the path exists. 82*c8dee2aaSAndroid Build Coastguard Worker virtual bool prepareForPath(SkGlyph*) = 0; 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker // Prepare the glyph to draw a drawable, and return if the drawable exists. 85*c8dee2aaSAndroid Build Coastguard Worker virtual bool prepareForDrawable(SkGlyph*) = 0; 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker virtual const SkDescriptor& getDescriptor() const = 0; 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker virtual const SkGlyphPositionRoundingSpec& roundingSpec() const = 0; 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker // Return a strike promise. 93*c8dee2aaSAndroid Build Coastguard Worker virtual SkStrikePromise strikePromise() = 0; 94*c8dee2aaSAndroid Build Coastguard Worker }; 95*c8dee2aaSAndroid Build Coastguard Worker 96*c8dee2aaSAndroid Build Coastguard Worker // prepareForPathDrawing uses this union to convert glyph ids to paths. 97*c8dee2aaSAndroid Build Coastguard Worker union IDOrPath { IDOrPath()98*c8dee2aaSAndroid Build Coastguard Worker IDOrPath() {} IDOrPath(SkGlyphID glyphID)99*c8dee2aaSAndroid Build Coastguard Worker IDOrPath(SkGlyphID glyphID) : fGlyphID{glyphID} {} 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker // PathOpSubmitter takes care of destroying the paths. ~IDOrPath()102*c8dee2aaSAndroid Build Coastguard Worker ~IDOrPath() {} 103*c8dee2aaSAndroid Build Coastguard Worker SkGlyphID fGlyphID; 104*c8dee2aaSAndroid Build Coastguard Worker SkPath fPath; 105*c8dee2aaSAndroid Build Coastguard Worker }; 106*c8dee2aaSAndroid Build Coastguard Worker 107*c8dee2aaSAndroid Build Coastguard Worker // prepareForDrawableDrawing uses this union to convert glyph ids to drawables. 108*c8dee2aaSAndroid Build Coastguard Worker union IDOrDrawable { 109*c8dee2aaSAndroid Build Coastguard Worker SkGlyphID fGlyphID; 110*c8dee2aaSAndroid Build Coastguard Worker SkDrawable* fDrawable; 111*c8dee2aaSAndroid Build Coastguard Worker }; 112*c8dee2aaSAndroid Build Coastguard Worker 113*c8dee2aaSAndroid Build Coastguard Worker // -- StrikeMutationMonitor ------------------------------------------------------------------------ 114*c8dee2aaSAndroid Build Coastguard Worker class StrikeMutationMonitor { 115*c8dee2aaSAndroid Build Coastguard Worker public: 116*c8dee2aaSAndroid Build Coastguard Worker StrikeMutationMonitor(StrikeForGPU* strike); 117*c8dee2aaSAndroid Build Coastguard Worker ~StrikeMutationMonitor(); 118*c8dee2aaSAndroid Build Coastguard Worker 119*c8dee2aaSAndroid Build Coastguard Worker private: 120*c8dee2aaSAndroid Build Coastguard Worker StrikeForGPU* fStrike; 121*c8dee2aaSAndroid Build Coastguard Worker }; 122*c8dee2aaSAndroid Build Coastguard Worker 123*c8dee2aaSAndroid Build Coastguard Worker // -- StrikeForGPUCacheInterface ------------------------------------------------------------------- 124*c8dee2aaSAndroid Build Coastguard Worker class StrikeForGPUCacheInterface { 125*c8dee2aaSAndroid Build Coastguard Worker public: 126*c8dee2aaSAndroid Build Coastguard Worker virtual ~StrikeForGPUCacheInterface() = default; 127*c8dee2aaSAndroid Build Coastguard Worker virtual sk_sp<StrikeForGPU> findOrCreateScopedStrike(const SkStrikeSpec& strikeSpec) = 0; 128*c8dee2aaSAndroid Build Coastguard Worker }; 129*c8dee2aaSAndroid Build Coastguard Worker } // namespace sktext 130*c8dee2aaSAndroid Build Coastguard Worker #endif // sktext_StrikeForGPU_DEFINED 131