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