| /* |
| * 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 allows the transform used by the shader to change without regenerating the |
| // jitted code. This supports the drawVertices call to change the mapping as the texture |
| // coordinates associated with each vertex change with each new triangle. |
| class SkTransformShader : public SkUpdatableShader { |
| public: |
| explicit SkTransformShader(const SkShaderBase& shader); |
| |
| // 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 onProgram |
| // along with the identity matrix. |
| skvm::Color onProgram(skvm::Builder* b, |
| skvm::Coord device, skvm::Coord local, skvm::Color color, |
| const SkMatrixProvider& matrices, const SkMatrix* localM, |
| const SkColorInfo& dst, |
| skvm::Uniforms* uniforms, SkArenaAlloc* alloc) const override; |
| |
| // Add code to calculate a new coordinate given local using the mapping in fMatrix. |
| skvm::Coord applyMatrix( |
| skvm::Builder* b, const SkMatrix& matrix, skvm::Coord local, |
| skvm::Uniforms* uniforms) const; |
| void appendMatrix(const SkMatrix& matrix, SkRasterPipeline* p) const; |
| |
| // Change the values represented by the uniforms in fMatrix. |
| bool update(const SkMatrix& ctm) const override; |
| bool onAppendStages(const SkStageRec& rec) const override; |
| |
| private: |
| const SkShaderBase& fShader; |
| mutable SkScalar fMatrixStorage[9]; |
| mutable skvm::Uniform fMatrix; |
| mutable bool fProcessingAsPerspective{false}; |
| |
| }; |
| #endif //SkTextCoordShader_DEFINED |