| Index: src/gpu/effects/GrBicubicEffect.cpp
|
| diff --git a/src/gpu/effects/GrBicubicEffect.cpp b/src/gpu/effects/GrBicubicEffect.cpp
|
| index 5e6967ce4bbaebf6776c07e15f742b2d2474f896..db42f356698a6b09fd74fb510d09fa6f978024f9 100644
|
| --- a/src/gpu/effects/GrBicubicEffect.cpp
|
| +++ b/src/gpu/effects/GrBicubicEffect.cpp
|
| @@ -7,6 +7,7 @@
|
|
|
| #include "GrBicubicEffect.h"
|
| #include "GrInvariantOutput.h"
|
| +#include "glsl/GrGLSLColorSpaceXformHelper.h"
|
| #include "glsl/GrGLSLFragmentShaderBuilder.h"
|
| #include "glsl/GrGLSLProgramDataManager.h"
|
| #include "glsl/GrGLSLUniformHandler.h"
|
| @@ -27,8 +28,9 @@ public:
|
|
|
| static inline void GenKey(const GrProcessor& effect, const GrGLSLCaps&,
|
| GrProcessorKeyBuilder* b) {
|
| - const GrTextureDomain& domain = effect.cast<GrBicubicEffect>().domain();
|
| - b->add32(GrTextureDomain::GLDomain::DomainKey(domain));
|
| + const GrBicubicEffect& bicubicEffect = effect.cast<GrBicubicEffect>();
|
| + b->add32(GrTextureDomain::GLDomain::DomainKey(bicubicEffect.domain()));
|
| + b->add32(SkToInt(SkToBool(bicubicEffect.colorSpaceXform())));
|
| }
|
|
|
| protected:
|
| @@ -39,13 +41,14 @@ private:
|
|
|
| UniformHandle fCoefficientsUni;
|
| UniformHandle fImageIncrementUni;
|
| + UniformHandle fColorSpaceXformUni;
|
| GrTextureDomain::GLDomain fDomain;
|
|
|
| typedef GrGLSLFragmentProcessor INHERITED;
|
| };
|
|
|
| void GrGLBicubicEffect::emitCode(EmitArgs& args) {
|
| - const GrTextureDomain& domain = args.fFp.cast<GrBicubicEffect>().domain();
|
| + const GrBicubicEffect& bicubicEffect = args.fFp.cast<GrBicubicEffect>();
|
|
|
| GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
|
| fCoefficientsUni = uniformHandler->addUniform(kFragment_GrShaderFlag,
|
| @@ -58,6 +61,9 @@ void GrGLBicubicEffect::emitCode(EmitArgs& args) {
|
| const char* imgInc = uniformHandler->getUniformCStr(fImageIncrementUni);
|
| const char* coeff = uniformHandler->getUniformCStr(fCoefficientsUni);
|
|
|
| + GrGLSLColorSpaceXformHelper colorSpaceHelper(uniformHandler, bicubicEffect.colorSpaceXform(),
|
| + &fColorSpaceXformUni);
|
| +
|
| SkString cubicBlendName;
|
|
|
| static const GrGLSLShaderVar gCubicBlendArgs[] = {
|
| @@ -96,7 +102,7 @@ void GrGLBicubicEffect::emitCode(EmitArgs& args) {
|
| fDomain.sampleTexture(fragBuilder,
|
| args.fUniformHandler,
|
| args.fGLSLCaps,
|
| - domain,
|
| + bicubicEffect.domain(),
|
| sampleVar.c_str(),
|
| coord,
|
| args.fTexSamplers[0]);
|
| @@ -107,6 +113,9 @@ void GrGLBicubicEffect::emitCode(EmitArgs& args) {
|
| }
|
| SkString bicubicColor;
|
| bicubicColor.printf("%s(%s, f.y, s0, s1, s2, s3)", cubicBlendName.c_str(), coeff);
|
| + if (colorSpaceHelper.getXformMatrix()) {
|
| + bicubicColor.appendf(" * %s", colorSpaceHelper.getXformMatrix());
|
| + }
|
| fragBuilder->codeAppendf("\t%s = %s;\n",
|
| args.fOutputColor, (GrGLSLExpr4(bicubicColor.c_str()) *
|
| GrGLSLExpr4(args.fInputColor)).c_str());
|
| @@ -122,6 +131,11 @@ void GrGLBicubicEffect::onSetData(const GrGLSLProgramDataManager& pdman,
|
| pdman.set2fv(fImageIncrementUni, 1, imageIncrement);
|
| pdman.setMatrix4f(fCoefficientsUni, bicubicEffect.coefficients());
|
| fDomain.setData(pdman, bicubicEffect.domain(), texture.origin());
|
| + if (SkToBool(bicubicEffect.colorSpaceXform())) {
|
| + float xformMatrix[16];
|
| + bicubicEffect.colorSpaceXform()->srcToDst().asColMajorf(xformMatrix);
|
| + pdman.setMatrix4f(fColorSpaceXformUni, xformMatrix);
|
| + }
|
| }
|
|
|
| static inline void convert_row_major_scalar_coeffs_to_column_major_floats(float dst[16],
|
| @@ -134,22 +148,27 @@ static inline void convert_row_major_scalar_coeffs_to_column_major_floats(float
|
| }
|
|
|
| GrBicubicEffect::GrBicubicEffect(GrTexture* texture,
|
| + sk_sp<GrColorSpaceXform> colorSpaceXform,
|
| const SkScalar coefficients[16],
|
| const SkMatrix &matrix,
|
| const SkShader::TileMode tileModes[2])
|
| - : INHERITED(texture, matrix, GrTextureParams(tileModes, GrTextureParams::kNone_FilterMode))
|
| - , fDomain(GrTextureDomain::IgnoredDomain()) {
|
| + : INHERITED(texture, nullptr, matrix,
|
| + GrTextureParams(tileModes, GrTextureParams::kNone_FilterMode))
|
| + , fDomain(GrTextureDomain::IgnoredDomain())
|
| + , fColorSpaceXform(std::move(colorSpaceXform)) {
|
| this->initClassID<GrBicubicEffect>();
|
| convert_row_major_scalar_coeffs_to_column_major_floats(fCoefficients, coefficients);
|
| }
|
|
|
| GrBicubicEffect::GrBicubicEffect(GrTexture* texture,
|
| + sk_sp<GrColorSpaceXform> colorSpaceXform,
|
| const SkScalar coefficients[16],
|
| const SkMatrix &matrix,
|
| const SkRect& domain)
|
| - : INHERITED(texture, matrix,
|
| + : INHERITED(texture, nullptr, matrix,
|
| GrTextureParams(SkShader::kClamp_TileMode, GrTextureParams::kNone_FilterMode))
|
| - , fDomain(domain, GrTextureDomain::kClamp_Mode) {
|
| + , fDomain(domain, GrTextureDomain::kClamp_Mode)
|
| + , fColorSpaceXform(std::move(colorSpaceXform)) {
|
| this->initClassID<GrBicubicEffect>();
|
| convert_row_major_scalar_coeffs_to_column_major_floats(fCoefficients, coefficients);
|
| }
|
| @@ -186,7 +205,7 @@ sk_sp<GrFragmentProcessor> GrBicubicEffect::TestCreate(GrProcessorTestData* d) {
|
| for (int i = 0; i < 16; i++) {
|
| coefficients[i] = d->fRandom->nextSScalar1();
|
| }
|
| - return GrBicubicEffect::Make(d->fTextures[texIdx], coefficients);
|
| + return GrBicubicEffect::Make(d->fTextures[texIdx], nullptr, coefficients);
|
| }
|
|
|
| //////////////////////////////////////////////////////////////////////////////
|
|
|