xref: /aosp_15_r20/external/skia/src/text/gpu/TextBlob.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2015 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_gpu_TextBlob_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define sktext_gpu_TextBlob_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurfaceProps.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkTInternalLList.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkMaskFilterBase.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/text/gpu/SubRunAllocator.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/text/gpu/SubRunContainer.h"
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
24*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
25*c8dee2aaSAndroid Build Coastguard Worker #include <tuple>
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker class SkCanvas;
28*c8dee2aaSAndroid Build Coastguard Worker struct SkPoint;
29*c8dee2aaSAndroid Build Coastguard Worker struct SkStrikeDeviceInfo;
30*c8dee2aaSAndroid Build Coastguard Worker 
31*c8dee2aaSAndroid Build Coastguard Worker namespace sktext {
32*c8dee2aaSAndroid Build Coastguard Worker class GlyphRunList;
33*c8dee2aaSAndroid Build Coastguard Worker class StrikeForGPUCacheInterface;
34*c8dee2aaSAndroid Build Coastguard Worker }
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker namespace sktext::gpu {
37*c8dee2aaSAndroid Build Coastguard Worker class Slug;
38*c8dee2aaSAndroid Build Coastguard Worker 
39*c8dee2aaSAndroid Build Coastguard Worker // -- TextBlob -----------------------------------------------------------------------------------
40*c8dee2aaSAndroid Build Coastguard Worker // A TextBlob contains a fully processed SkTextBlob, suitable for nearly immediate drawing
41*c8dee2aaSAndroid Build Coastguard Worker // on the GPU.  These are initially created with valid positions and colors, but with invalid
42*c8dee2aaSAndroid Build Coastguard Worker // texture coordinates.
43*c8dee2aaSAndroid Build Coastguard Worker //
44*c8dee2aaSAndroid Build Coastguard Worker // A TextBlob contains a number of SubRuns that are created in the blob's arena. Each SubRun
45*c8dee2aaSAndroid Build Coastguard Worker // tracks its own glyph and position data.
46*c8dee2aaSAndroid Build Coastguard Worker //
47*c8dee2aaSAndroid Build Coastguard Worker // In these classes, I'm trying to follow the convention about matrices and origins.
48*c8dee2aaSAndroid Build Coastguard Worker // * drawMatrix and drawOrigin - describes transformations for the current draw command.
49*c8dee2aaSAndroid Build Coastguard Worker // * positionMatrix - is equal to drawMatrix * [drawOrigin-as-translation-matrix]
50*c8dee2aaSAndroid Build Coastguard Worker // * initial Matrix - describes the combined initial matrix and origin the TextBlob was created
51*c8dee2aaSAndroid Build Coastguard Worker //                    with.
52*c8dee2aaSAndroid Build Coastguard Worker //
53*c8dee2aaSAndroid Build Coastguard Worker //
54*c8dee2aaSAndroid Build Coastguard Worker class TextBlob final : public SkRefCnt {
55*c8dee2aaSAndroid Build Coastguard Worker public:
56*c8dee2aaSAndroid Build Coastguard Worker     // Key is not used as part of a hash map, so the hash is never taken. It's only used in a
57*c8dee2aaSAndroid Build Coastguard Worker     // list search using operator =().
58*c8dee2aaSAndroid Build Coastguard Worker     struct Key {
59*c8dee2aaSAndroid Build Coastguard Worker         static std::tuple<bool, Key> Make(const GlyphRunList& glyphRunList,
60*c8dee2aaSAndroid Build Coastguard Worker                                           const SkPaint& paint,
61*c8dee2aaSAndroid Build Coastguard Worker                                           const SkMatrix& drawMatrix,
62*c8dee2aaSAndroid Build Coastguard Worker                                           const SkStrikeDeviceInfo& strikeDevice);
63*c8dee2aaSAndroid Build Coastguard Worker         uint32_t fUniqueID;
64*c8dee2aaSAndroid Build Coastguard Worker         // Color may affect the gamma of the mask we generate, but in a fairly limited way.
65*c8dee2aaSAndroid Build Coastguard Worker         // Each color is assigned to on of a fixed number of buckets based on its
66*c8dee2aaSAndroid Build Coastguard Worker         // luminance. For each luminance bucket there is a "canonical color" that
67*c8dee2aaSAndroid Build Coastguard Worker         // represents the bucket.  This functionality is currently only supported for A8
68*c8dee2aaSAndroid Build Coastguard Worker         SkColor fCanonicalColor;
69*c8dee2aaSAndroid Build Coastguard Worker         SkScalar fFrameWidth;
70*c8dee2aaSAndroid Build Coastguard Worker         SkScalar fMiterLimit;
71*c8dee2aaSAndroid Build Coastguard Worker         SkPixelGeometry fPixelGeometry;
72*c8dee2aaSAndroid Build Coastguard Worker         SkMaskFilterBase::BlurRec fBlurRec;
73*c8dee2aaSAndroid Build Coastguard Worker         uint32_t fScalerContextFlags;
74*c8dee2aaSAndroid Build Coastguard Worker         SkMatrix fPositionMatrix;
75*c8dee2aaSAndroid Build Coastguard Worker         // Below here fields are of size 1 byte.
76*c8dee2aaSAndroid Build Coastguard Worker         bool fHasSomeDirectSubRuns;
77*c8dee2aaSAndroid Build Coastguard Worker         bool fHasBlur;
78*c8dee2aaSAndroid Build Coastguard Worker         SkPaint::Style fStyle;
79*c8dee2aaSAndroid Build Coastguard Worker         SkPaint::Join fJoin;
80*c8dee2aaSAndroid Build Coastguard Worker 
81*c8dee2aaSAndroid Build Coastguard Worker         bool operator==(const Key& other) const;
82*c8dee2aaSAndroid Build Coastguard Worker     };
83*c8dee2aaSAndroid Build Coastguard Worker 
84*c8dee2aaSAndroid Build Coastguard Worker     SK_DECLARE_INTERNAL_LLIST_INTERFACE(TextBlob);
85*c8dee2aaSAndroid Build Coastguard Worker 
86*c8dee2aaSAndroid Build Coastguard Worker     // Make a TextBlob and its sub runs.
87*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<TextBlob> Make(const sktext::GlyphRunList& glyphRunList,
88*c8dee2aaSAndroid Build Coastguard Worker                                 const SkPaint& paint,
89*c8dee2aaSAndroid Build Coastguard Worker                                 const SkMatrix& positionMatrix,
90*c8dee2aaSAndroid Build Coastguard Worker                                 SkStrikeDeviceInfo strikeDeviceInfo,
91*c8dee2aaSAndroid Build Coastguard Worker                                 StrikeForGPUCacheInterface* strikeCache);
92*c8dee2aaSAndroid Build Coastguard Worker 
93*c8dee2aaSAndroid Build Coastguard Worker     TextBlob(SubRunAllocator&& alloc,
94*c8dee2aaSAndroid Build Coastguard Worker              SubRunContainerOwner subRuns,
95*c8dee2aaSAndroid Build Coastguard Worker              int totalMemorySize,
96*c8dee2aaSAndroid Build Coastguard Worker              SkColor initialLuminance);
97*c8dee2aaSAndroid Build Coastguard Worker 
98*c8dee2aaSAndroid Build Coastguard Worker     ~TextBlob() override;
99*c8dee2aaSAndroid Build Coastguard Worker 
100*c8dee2aaSAndroid Build Coastguard Worker     // Change memory management to handle the data after TextBlob, but in the same allocation
101*c8dee2aaSAndroid Build Coastguard Worker     // of memory. Only allow placement new.
102*c8dee2aaSAndroid Build Coastguard Worker     void operator delete(void* p);
103*c8dee2aaSAndroid Build Coastguard Worker     void* operator new(size_t);
104*c8dee2aaSAndroid Build Coastguard Worker     void* operator new(size_t, void* p);
105*c8dee2aaSAndroid Build Coastguard Worker 
key()106*c8dee2aaSAndroid Build Coastguard Worker     const Key& key() { return fKey; }
107*c8dee2aaSAndroid Build Coastguard Worker 
108*c8dee2aaSAndroid Build Coastguard Worker     void addKey(const Key& key);
109*c8dee2aaSAndroid Build Coastguard Worker 
110*c8dee2aaSAndroid Build Coastguard Worker     bool canReuse(const SkPaint& paint, const SkMatrix& positionMatrix) const;
111*c8dee2aaSAndroid Build Coastguard Worker 
112*c8dee2aaSAndroid Build Coastguard Worker     const Key& key() const;
size()113*c8dee2aaSAndroid Build Coastguard Worker     size_t size() const { return SkTo<size_t>(fSize); }
114*c8dee2aaSAndroid Build Coastguard Worker 
115*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas*,
116*c8dee2aaSAndroid Build Coastguard Worker               SkPoint drawOrigin,
117*c8dee2aaSAndroid Build Coastguard Worker               const SkPaint& paint,
118*c8dee2aaSAndroid Build Coastguard Worker               const AtlasDrawDelegate&);
119*c8dee2aaSAndroid Build Coastguard Worker 
120*c8dee2aaSAndroid Build Coastguard Worker private:
121*c8dee2aaSAndroid Build Coastguard Worker     friend class TextBlobTools;
122*c8dee2aaSAndroid Build Coastguard Worker     // The allocator must come first because it needs to be destroyed last. Other fields of this
123*c8dee2aaSAndroid Build Coastguard Worker     // structure may have pointers into it.
124*c8dee2aaSAndroid Build Coastguard Worker     SubRunAllocator fAlloc;
125*c8dee2aaSAndroid Build Coastguard Worker 
126*c8dee2aaSAndroid Build Coastguard Worker     SubRunContainerOwner fSubRuns;
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker     // Overall size of this struct plus vertices and glyphs at the end.
129*c8dee2aaSAndroid Build Coastguard Worker     const int fSize;
130*c8dee2aaSAndroid Build Coastguard Worker 
131*c8dee2aaSAndroid Build Coastguard Worker     const SkColor fInitialLuminance;
132*c8dee2aaSAndroid Build Coastguard Worker 
133*c8dee2aaSAndroid Build Coastguard Worker     Key fKey;
134*c8dee2aaSAndroid Build Coastguard Worker };
135*c8dee2aaSAndroid Build Coastguard Worker 
136*c8dee2aaSAndroid Build Coastguard Worker sk_sp<sktext::gpu::Slug> MakeSlug(const SkMatrix& drawMatrix,
137*c8dee2aaSAndroid Build Coastguard Worker                                   const sktext::GlyphRunList& glyphRunList,
138*c8dee2aaSAndroid Build Coastguard Worker                                   const SkPaint& paint,
139*c8dee2aaSAndroid Build Coastguard Worker                                   SkStrikeDeviceInfo strikeDeviceInfo,
140*c8dee2aaSAndroid Build Coastguard Worker                                   sktext::StrikeForGPUCacheInterface* strikeCache);
141*c8dee2aaSAndroid Build Coastguard Worker }  // namespace sktext::gpu
142*c8dee2aaSAndroid Build Coastguard Worker #endif  // sktext_gpu_TextBlob_DEFINED
143