Coverage Report

Created: 2024-09-14 07:19

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