/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrGLEffectMatrix_DEFINED #define GrGLEffectMatrix_DEFINED #include "GrGLEffect.h" #include "SkMatrix.h" class GrTexture; class SkRandom; /** * This is a helper to implement a texture matrix in a GrGLEffect. */ class GrGLEffectMatrix { public: typedef GrGLEffect::EffectKey EffectKey; /** * The matrix uses kKeyBits of the effect's EffectKey. A GrGLEffect may place these bits at an * arbitrary shift in its final key. However, when GrGLEffectMatrix::emitCode*() code is called * the relevant bits must be in the lower kKeyBits of the key parameter. */ enum { kKeyBits = 2, kKeyMask = (1 << kKeyBits) - 1, }; GrGLEffectMatrix() : fUni(GrGLUniformManager::kInvalidUniformHandle) { fPrevMatrix = SkMatrix::InvalidMatrix(); } /** * Generates the key for the portion of the code emitted by this class's emitCode() function. * Pass a texture to make GrGLEffectMatrix automatically adjust for the texture's origin. Pass * NULL when not using the EffectMatrix for a texture lookups, or if the GrGLEffect subclass * wants to handle origin adjustments in some other manner. coordChangeMatrix is the matrix * from GrEffectStage. */ static EffectKey GenKey(const SkMatrix& effectMatrix, const SkMatrix& coordChangeMatrix, const GrTexture*); /** * Emits code to implement the matrix in the VS. A varying is added as an output of the VS and * input to the FS. The varying may be either a vec2f or vec3f depending upon whether * perspective interpolation is required or not. The names of the varying in the VS and FS are * are returned as output parameters and the type of the varying is the return value. The suffix * is an optional parameter that can be used to make all variables emitted by the object * unique within a stage. It is only necessary if multiple GrGLEffectMatrix objects are used by * a GrGLEffect. */ GrSLType emitCode(GrGLShaderBuilder*, EffectKey, const char* vertexCoords, const char** fsCoordName, /* optional */ const char** vsCoordName = NULL, const char* suffix = NULL); /** * This is similar to emitCode except that it performs perspective division in the FS if the * texture coordinates have a w coordinate. The fsCoordName always refers to a vec2f. */ void emitCodeMakeFSCoords2D(GrGLShaderBuilder*, EffectKey, const char* vertexCoords, const char** fsCoordName, /* optional */ const char** vsVaryingName = NULL, GrSLType* vsVaryingType = NULL, const char* suffix = NULL); /** * Call from a GrGLEffect's subclass to update the texture matrix. The matrix, * coordChangeMatrix, and texture params should match those used with GenKey. */ void setData(const GrGLUniformManager& uniformManager, const SkMatrix& effectMatrix, const SkMatrix& coordChangeMatrix, const GrTexture*); private: enum { kIdentity_Key = 0, kTrans_Key = 1, kNoPersp_Key = 2, kGeneral_Key = 3, }; GrGLUniformManager::UniformHandle fUni; GrSLType fUniType; SkMatrix fPrevMatrix; }; #endif