xref: /aosp_15_r20/external/skia/src/text/gpu/VertexFiller.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 Google LLC
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 #ifndef sktext_gpu_VertexFiller_DEFINED
8*c8dee2aaSAndroid Build Coastguard Worker #define sktext_gpu_VertexFiller_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTLogic.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkVx.h"
18*c8dee2aaSAndroid Build Coastguard Worker 
19*c8dee2aaSAndroid Build Coastguard Worker #include <optional>
20*c8dee2aaSAndroid Build Coastguard Worker #include <tuple>
21*c8dee2aaSAndroid Build Coastguard Worker 
22*c8dee2aaSAndroid Build Coastguard Worker class SkReadBuffer;
23*c8dee2aaSAndroid Build Coastguard Worker class SkWriteBuffer;
24*c8dee2aaSAndroid Build Coastguard Worker 
25*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GANESH) || defined(SK_USE_LEGACY_GANESH_TEXT_APIS)
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrColor.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/AtlasTextOp.h"
28*c8dee2aaSAndroid Build Coastguard Worker 
29*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
30*c8dee2aaSAndroid Build Coastguard Worker #endif  // defined(SK_GANESH) || defined(SK_USE_LEGACY_GANESH_TEXT_APIS)
31*c8dee2aaSAndroid Build Coastguard Worker 
32*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu {
33*c8dee2aaSAndroid Build Coastguard Worker enum class MaskFormat : int;
34*c8dee2aaSAndroid Build Coastguard Worker 
35*c8dee2aaSAndroid Build Coastguard Worker namespace graphite {
36*c8dee2aaSAndroid Build Coastguard Worker class DrawWriter;
37*c8dee2aaSAndroid Build Coastguard Worker class Rect;
38*c8dee2aaSAndroid Build Coastguard Worker class Transform;
39*c8dee2aaSAndroid Build Coastguard Worker }
40*c8dee2aaSAndroid Build Coastguard Worker }
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker namespace sktext::gpu {
43*c8dee2aaSAndroid Build Coastguard Worker class Glyph;
44*c8dee2aaSAndroid Build Coastguard Worker class SubRunAllocator;
45*c8dee2aaSAndroid Build Coastguard Worker 
46*c8dee2aaSAndroid Build Coastguard Worker enum FillerType {
47*c8dee2aaSAndroid Build Coastguard Worker     kIsDirect,
48*c8dee2aaSAndroid Build Coastguard Worker     kIsTransformed
49*c8dee2aaSAndroid Build Coastguard Worker };
50*c8dee2aaSAndroid Build Coastguard Worker 
51*c8dee2aaSAndroid Build Coastguard Worker // -- VertexFiller ---------------------------------------------------------------------------------
52*c8dee2aaSAndroid Build Coastguard Worker // The VertexFiller assumes that all points, glyph atlas entries, and bounds are created with
53*c8dee2aaSAndroid Build Coastguard Worker // respect to the CreationMatrix. This assumes that mapping any point, mask or bounds through the
54*c8dee2aaSAndroid Build Coastguard Worker // CreationMatrix will result in the proper device position. In order to draw using an arbitrary
55*c8dee2aaSAndroid Build Coastguard Worker // PositionMatrix, calculate a
56*c8dee2aaSAndroid Build Coastguard Worker //
57*c8dee2aaSAndroid Build Coastguard Worker //    viewDifference = [PositionMatrix] * [CreationMatrix] ^ -1.
58*c8dee2aaSAndroid Build Coastguard Worker //
59*c8dee2aaSAndroid Build Coastguard Worker // The viewDifference is used to map all points, masks and bounds to position to the device
60*c8dee2aaSAndroid Build Coastguard Worker // respecting the PositionMatrix.
61*c8dee2aaSAndroid Build Coastguard Worker class VertexFiller {
62*c8dee2aaSAndroid Build Coastguard Worker public:
63*c8dee2aaSAndroid Build Coastguard Worker     VertexFiller(skgpu::MaskFormat maskFormat,
64*c8dee2aaSAndroid Build Coastguard Worker                  const SkMatrix &creationMatrix,
65*c8dee2aaSAndroid Build Coastguard Worker                  SkRect creationBounds,
66*c8dee2aaSAndroid Build Coastguard Worker                  SkSpan<const SkPoint> leftTop,
67*c8dee2aaSAndroid Build Coastguard Worker                  bool canDrawDirect);
68*c8dee2aaSAndroid Build Coastguard Worker 
69*c8dee2aaSAndroid Build Coastguard Worker     static VertexFiller Make(skgpu::MaskFormat maskType,
70*c8dee2aaSAndroid Build Coastguard Worker                              const SkMatrix &creationMatrix,
71*c8dee2aaSAndroid Build Coastguard Worker                              SkRect creationBounds,
72*c8dee2aaSAndroid Build Coastguard Worker                              SkSpan<const SkPoint> positions,
73*c8dee2aaSAndroid Build Coastguard Worker                              SubRunAllocator *alloc,
74*c8dee2aaSAndroid Build Coastguard Worker                              FillerType fillerType);
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker     static std::optional<VertexFiller> MakeFromBuffer(SkReadBuffer &buffer,
77*c8dee2aaSAndroid Build Coastguard Worker                                                       SubRunAllocator *alloc);
78*c8dee2aaSAndroid Build Coastguard Worker 
unflattenSize()79*c8dee2aaSAndroid Build Coastguard Worker     int unflattenSize() const { return fLeftTop.size_bytes(); }
80*c8dee2aaSAndroid Build Coastguard Worker 
81*c8dee2aaSAndroid Build Coastguard Worker     void flatten(SkWriteBuffer &buffer) const;
82*c8dee2aaSAndroid Build Coastguard Worker 
83*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GANESH) || defined(SK_USE_LEGACY_GANESH_TEXT_APIS)
84*c8dee2aaSAndroid Build Coastguard Worker     size_t vertexStride(const SkMatrix &matrix) const;
85*c8dee2aaSAndroid Build Coastguard Worker 
86*c8dee2aaSAndroid Build Coastguard Worker     void fillVertexData(int offset, int count,
87*c8dee2aaSAndroid Build Coastguard Worker                         SkSpan<const Glyph*> glyphs,
88*c8dee2aaSAndroid Build Coastguard Worker                         GrColor color,
89*c8dee2aaSAndroid Build Coastguard Worker                         const SkMatrix& positionMatrix,
90*c8dee2aaSAndroid Build Coastguard Worker                         SkIRect clip,
91*c8dee2aaSAndroid Build Coastguard Worker                         void* vertexBuffer) const;
92*c8dee2aaSAndroid Build Coastguard Worker 
93*c8dee2aaSAndroid Build Coastguard Worker     skgpu::ganesh::AtlasTextOp::MaskType opMaskType() const;
94*c8dee2aaSAndroid Build Coastguard Worker #endif  // defined(SK_GANESH) || defined(SK_USE_LEGACY_GANESH_TEXT_APIS)
95*c8dee2aaSAndroid Build Coastguard Worker 
96*c8dee2aaSAndroid Build Coastguard Worker     // This is only available if the graphite backend is compiled in (see GraphiteVertexFiller.cpp)
97*c8dee2aaSAndroid Build Coastguard Worker     void fillInstanceData(skgpu::graphite::DrawWriter* dw,
98*c8dee2aaSAndroid Build Coastguard Worker                           int offset, int count,
99*c8dee2aaSAndroid Build Coastguard Worker                           unsigned short flags,
100*c8dee2aaSAndroid Build Coastguard Worker                           skvx::uint2 ssboIndex,
101*c8dee2aaSAndroid Build Coastguard Worker                           SkSpan<const Glyph*> glyphs,
102*c8dee2aaSAndroid Build Coastguard Worker                           SkScalar depth) const;
103*c8dee2aaSAndroid Build Coastguard Worker 
104*c8dee2aaSAndroid Build Coastguard Worker     std::tuple<skgpu::graphite::Rect, skgpu::graphite::Transform> boundsAndDeviceMatrix(
105*c8dee2aaSAndroid Build Coastguard Worker             const skgpu::graphite::Transform& localToDevice, SkPoint drawOrigin) const;
106*c8dee2aaSAndroid Build Coastguard Worker 
107*c8dee2aaSAndroid Build Coastguard Worker     // Return true if the positionMatrix represents an integer translation. Return the device
108*c8dee2aaSAndroid Build Coastguard Worker     // bounding box of all the glyphs. If the bounding box is empty, then something went singular
109*c8dee2aaSAndroid Build Coastguard Worker     // and this operation should be dropped.
110*c8dee2aaSAndroid Build Coastguard Worker     std::tuple<bool, SkRect> deviceRectAndCheckTransform(const SkMatrix &positionMatrix) const;
111*c8dee2aaSAndroid Build Coastguard Worker 
grMaskType()112*c8dee2aaSAndroid Build Coastguard Worker     skgpu::MaskFormat grMaskType() const { return fMaskType; }
113*c8dee2aaSAndroid Build Coastguard Worker     bool isLCD() const;
114*c8dee2aaSAndroid Build Coastguard Worker 
count()115*c8dee2aaSAndroid Build Coastguard Worker     int count() const { return SkCount(fLeftTop); }
116*c8dee2aaSAndroid Build Coastguard Worker 
117*c8dee2aaSAndroid Build Coastguard Worker private:
118*c8dee2aaSAndroid Build Coastguard Worker     SkMatrix viewDifference(const SkMatrix &positionMatrix) const;
119*c8dee2aaSAndroid Build Coastguard Worker 
120*c8dee2aaSAndroid Build Coastguard Worker     const skgpu::MaskFormat fMaskType;
121*c8dee2aaSAndroid Build Coastguard Worker     const bool fCanDrawDirect;
122*c8dee2aaSAndroid Build Coastguard Worker     const SkMatrix fCreationMatrix;
123*c8dee2aaSAndroid Build Coastguard Worker     const SkRect fCreationBounds;
124*c8dee2aaSAndroid Build Coastguard Worker     const SkSpan<const SkPoint> fLeftTop;
125*c8dee2aaSAndroid Build Coastguard Worker };
126*c8dee2aaSAndroid Build Coastguard Worker 
127*c8dee2aaSAndroid Build Coastguard Worker }  // namespace sktext::gpu
128*c8dee2aaSAndroid Build Coastguard Worker 
129*c8dee2aaSAndroid Build Coastguard Worker #endif
130