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