blob: f04d4baad6092e80c5c166f3b74447b6eb6ec2ed [file] [log] [blame]
/*
* 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