xref: /aosp_15_r20/external/skia/src/gpu/graphite/geom/SubRunData.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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 #ifndef skgpu_graphite_geom_SubRunData_DEFINED
9 #define skgpu_graphite_geom_SubRunData_DEFINED
10 
11 #include "include/core/SkColor.h"
12 #include "include/core/SkM44.h"
13 #include "include/core/SkRefCnt.h"
14 #include "include/core/SkSurfaceProps.h"
15 #include "src/gpu/graphite/geom/Rect.h"
16 #include "src/text/gpu/SubRunContainer.h"
17 
18 #include <utility>
19 
20 namespace skgpu::graphite {
21 
22 class Recorder;
23 
24 /**
25  * SubRunData represents an AtlasSubRun subspan for which per-pixel coverage data comes from a
26  * persistent glyph atlas texture.
27  *
28  * The bounds() represent the bounds of the entire AtlasSubRun and does not directly map to the
29  * local coordinates of this particular subspan. Rather, the dimensions and offset coordinates of a
30  * subspan are defined in a coordinate space that is partially transformed by a decomposition of
31  * the local-to-device matrix computed by the AtlasSubRun per instance. The transform of the draw is
32  * the rest of the decomposed transform (often only a translation) that maps this intermediate space
33  * to the device-space coordinates of the draw.
34  *
35  * The local coordinates used in shading are derived by transforming the final device coordinates
36  * using the inverse of the local-to-device matrix.
37  */
38 class SubRunData {
39 public:
40     SubRunData() = delete;
41     SubRunData(const SubRunData& subRun) = default;
42     SubRunData(SubRunData&&) = delete;
43 
SubRunData(const sktext::gpu::AtlasSubRun * subRun,sk_sp<SkRefCnt> supportDataKeepAlive,Rect deviceBounds,const SkM44 & deviceToLocal,int startGlyphIndex,int glyphCount,SkColor luminanceColor,bool useGammaCorrectDistanceTable,SkPixelGeometry pixelGeometry,Recorder * recorder,sktext::gpu::RendererData rendererData)44     SubRunData(const sktext::gpu::AtlasSubRun* subRun,
45                sk_sp<SkRefCnt> supportDataKeepAlive,
46                Rect deviceBounds,
47                const SkM44& deviceToLocal,
48                int startGlyphIndex,
49                int glyphCount,
50                SkColor luminanceColor,
51                bool useGammaCorrectDistanceTable,
52                SkPixelGeometry pixelGeometry,
53                Recorder* recorder,
54                sktext::gpu::RendererData rendererData)
55         : fSubRun(subRun)
56         , fSupportDataKeepAlive(std::move(supportDataKeepAlive))
57         , fBounds(deviceBounds)
58         , fDeviceToLocal(deviceToLocal)
59         , fStartGlyphIndex(startGlyphIndex)
60         , fGlyphCount(glyphCount)
61         , fLuminanceColor(luminanceColor)
62         , fUseGammaCorrectDistanceTable(useGammaCorrectDistanceTable)
63         , fPixelGeometry(pixelGeometry)
64         , fRecorder(recorder)
65         , fRendererData(rendererData) {}
66 
67     ~SubRunData() = default;
68 
69     // NOTE: None of the geometry types benefit from move semantics, so we don't bother
70     // defining a move assignment operator for SubRunData.
71     SubRunData& operator=(SubRunData&&) = delete;
72     SubRunData& operator=(const SubRunData& that) = default;
73 
74     // The bounding box of the originating AtlasSubRun.
bounds()75     Rect bounds() const { return fBounds; }
76 
77     // The inverse local-to-device matrix.
deviceToLocal()78     const SkM44& deviceToLocal() const { return fDeviceToLocal; }
79 
80     // Access the individual elements of the subrun data.
subRun()81     const sktext::gpu::AtlasSubRun* subRun() const { return fSubRun; }
startGlyphIndex()82     int startGlyphIndex() const { return fStartGlyphIndex; }
glyphCount()83     int glyphCount() const { return fGlyphCount; }
luminanceColor()84     SkColor luminanceColor() const { return fLuminanceColor; }
useGammaCorrectDistanceTable()85     bool useGammaCorrectDistanceTable() const { return fUseGammaCorrectDistanceTable; }
pixelGeometry()86     SkPixelGeometry pixelGeometry() const { return fPixelGeometry; }
recorder()87     Recorder* recorder() const { return fRecorder; }
rendererData()88     const sktext::gpu::RendererData& rendererData() const { return fRendererData; }
89 
90 private:
91     const sktext::gpu::AtlasSubRun* fSubRun;
92     // Keep the TextBlob or Slug alive until we're done with the Geometry.
93     sk_sp<SkRefCnt> fSupportDataKeepAlive;
94 
95     Rect fBounds;  // bounds of the data stored in the SubRun
96     SkM44 fDeviceToLocal;
97     int fStartGlyphIndex;
98     int fGlyphCount;
99     SkColor fLuminanceColor;            // only used by SDFTextRenderStep
100     bool fUseGammaCorrectDistanceTable; // only used by SDFTextRenderStep
101     SkPixelGeometry fPixelGeometry;     // only used by SDFTextLCDRenderStep
102     Recorder* fRecorder; // this SubRun can only be associated with this Recorder's atlas
103     sktext::gpu::RendererData fRendererData;
104 };
105 
106 } // namespace skgpu::graphite
107 
108 #endif // skgpu_graphite_geom_SubRunData_DEFINED
109