| /* |
| * Copyright 2021 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| #ifndef SkTextCoordShader_DEFINED |
| #define SkTextCoordShader_DEFINED |
| |
| #include "src/core/SkVM.h" |
| #include "src/shaders/SkShaderBase.h" |
| |
| // SkTransformShader applies a matrix transform to the shader coordinates, like a local matrix |
| // shader. The difference with a typical local matrix shader is that this shader's matrix is |
| // not combined with the inverse CTM or other local matrices in order to facilitate modifying the |
| // matrix between uses of the SkVM or SkRasterPipeline. This supports drawVertices and drawAtlas, in |
| // which the mapping from each triangle (when explicit texture coords are used) or atlas quad to |
| // shader space is different. |
| class SkTransformShader : public SkShaderBase { |
| public: |
| explicit SkTransformShader(const SkShaderBase& shader, bool allowPerspective); |
| |
| // Adds instructions to use the mapping stored in the uniforms represented by fMatrix. After |
| // generating a new skvm::Coord, it passes the mapped coordinates to fShader's program |
| // along with the identity matrix. |
| skvm::Color program(skvm::Builder* b, |
| skvm::Coord device, |
| skvm::Coord local, |
| skvm::Color color, |
| const MatrixRec& mRec, |
| const SkColorInfo& dst, |
| skvm::Uniforms* uniforms, |
| SkArenaAlloc* alloc) const override; |
| |
| // Adds a pipestage to multiply the incoming coords in 'r' and 'g' by the matrix. The child |
| // shader is called with no pending local matrix and the total transform as unknowable. |
| bool appendStages(const SkStageRec& rec, const MatrixRec&) const override; |
| |
| // Change the matrix used by the generated SkRasterpipeline or SkVM. |
| bool update(const SkMatrix& matrix); |
| |
| // These are never serialized/deserialized |
| Factory getFactory() const override { |
| SkDEBUGFAIL("SkTransformShader shouldn't be serialized."); |
| return {}; |
| } |
| const char* getTypeName() const override { |
| SkDEBUGFAIL("SkTransformShader shouldn't be serialized."); |
| return nullptr; |
| } |
| |
| bool isOpaque() const override { return fShader.isOpaque(); } |
| |
| private: |
| const SkShaderBase& fShader; |
| SkScalar fMatrixStorage[9]; // actual memory used by generated RP or VM |
| bool fAllowPerspective; |
| }; |
| #endif //SkTextCoordShader_DEFINED |