diff options
Diffstat (limited to 'src/effects/SkPerlinNoiseShader.cpp')
-rw-r--r-- | src/effects/SkPerlinNoiseShader.cpp | 90 |
1 files changed, 58 insertions, 32 deletions
diff --git a/src/effects/SkPerlinNoiseShader.cpp b/src/effects/SkPerlinNoiseShader.cpp index 40da2db14a..af6622be4d 100644 --- a/src/effects/SkPerlinNoiseShader.cpp +++ b/src/effects/SkPerlinNoiseShader.cpp @@ -19,8 +19,6 @@ #include "GrCoordTransform.h" #include "GrInvariantOutput.h" #include "SkGr.h" -#include "effects/GrConstColorProcessor.h" -#include "effects/GrExtractAlphaFragmentProcessor.h" #include "gl/GrGLFragmentProcessor.h" #include "gl/builders/GrGLProgramBuilder.h" #endif @@ -502,6 +500,7 @@ private: bool fStitchTiles; int fNumOctaves; GrGLProgramDataManager::UniformHandle fBaseFrequencyUni; + GrGLProgramDataManager::UniformHandle fAlphaUni; private: typedef GrGLFragmentProcessor INHERITED; @@ -516,9 +515,9 @@ public: int numOctaves, bool stitchTiles, SkPerlinNoiseShader::PaintingData* paintingData, GrTexture* permutationsTexture, GrTexture* noiseTexture, - const SkMatrix& matrix) { + const SkMatrix& matrix, uint8_t alpha) { return new GrPerlinNoiseEffect(procDataManager, type, numOctaves, stitchTiles, paintingData, - permutationsTexture, noiseTexture, matrix); + permutationsTexture, noiseTexture, matrix, alpha); } virtual ~GrPerlinNoiseEffect() { delete fPaintingData; } @@ -532,6 +531,7 @@ public: const SkVector& baseFrequency() const { return fPaintingData->fBaseFrequency; } int numOctaves() const { return fNumOctaves; } const SkMatrix& matrix() const { return fCoordTransform.getMatrix(); } + uint8_t alpha() const { return fAlpha; } private: GrGLFragmentProcessor* onCreateGLInstance() const override { @@ -549,6 +549,7 @@ private: fPaintingData->fBaseFrequency == s.fPaintingData->fBaseFrequency && fNumOctaves == s.fNumOctaves && fStitchTiles == s.fStitchTiles && + fAlpha == s.fAlpha && fPaintingData->fStitchDataInit == s.fPaintingData->fStitchDataInit; } @@ -560,10 +561,11 @@ private: int numOctaves, bool stitchTiles, SkPerlinNoiseShader::PaintingData* paintingData, GrTexture* permutationsTexture, GrTexture* noiseTexture, - const SkMatrix& matrix) + const SkMatrix& matrix, uint8_t alpha) : fType(type) , fNumOctaves(numOctaves) , fStitchTiles(stitchTiles) + , fAlpha(alpha) , fPermutationsAccess(permutationsTexture) , fNoiseAccess(noiseTexture) , fPaintingData(paintingData) { @@ -580,6 +582,7 @@ private: GrCoordTransform fCoordTransform; int fNumOctaves; bool fStitchTiles; + uint8_t fAlpha; GrTextureAccess fPermutationsAccess; GrTextureAccess fNoiseAccess; SkPerlinNoiseShader::PaintingData *fPaintingData; @@ -591,7 +594,7 @@ private: ///////////////////////////////////////////////////////////////////// GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrPerlinNoiseEffect); -const GrFragmentProcessor* GrPerlinNoiseEffect::TestCreate(GrProcessorTestData* d) { +GrFragmentProcessor* GrPerlinNoiseEffect::TestCreate(GrProcessorTestData* d) { int numOctaves = d->fRandom->nextRangeU(2, 10); bool stitchTiles = d->fRandom->nextBool(); SkScalar seed = SkIntToScalar(d->fRandom->nextU()); @@ -608,12 +611,14 @@ const GrFragmentProcessor* GrPerlinNoiseEffect::TestCreate(GrProcessorTestData* SkPerlinNoiseShader::CreateTurbulence(baseFrequencyX, baseFrequencyY, numOctaves, seed, stitchTiles ? &tileSize : nullptr); + SkPaint paint; + GrColor paintColor; GrFragmentProcessor* effect; GrPaint grPaint; - return shader->asFragmentProcessor(d->fContext, - GrTest::TestMatrix(d->fRandom), NULL, - kNone_SkFilterQuality, - grPaint.getProcessorDataManager()); + SkAssertResult(shader->asFragmentProcessor(d->fContext, paint, + GrTest::TestMatrix(d->fRandom), nullptr, + &paintColor, grPaint.getProcessorDataManager(), + &effect)); delete shader; @@ -634,6 +639,10 @@ void GrGLPerlinNoise::emitCode(EmitArgs& args) { kVec2f_GrSLType, kDefault_GrSLPrecision, "baseFrequency"); const char* baseFrequencyUni = args.fBuilder->getUniformCStr(fBaseFrequencyUni); + fAlphaUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_Visibility, + kFloat_GrSLType, kDefault_GrSLPrecision, + "alpha"); + const char* alphaUni = args.fBuilder->getUniformCStr(fAlphaUni); const char* stitchDataUni = nullptr; if (fStitchTiles) { @@ -866,6 +875,8 @@ void GrGLPerlinNoise::emitCode(EmitArgs& args) { args.fOutputColor,args.fOutputColor); } + fsBuilder->codeAppendf("\n\t\t%s.a *= %s;", args.fOutputColor, alphaUni); + // Clamp values fsBuilder->codeAppendf("\n\t\t%s = clamp(%s, 0.0, 1.0);", args.fOutputColor, args.fOutputColor); @@ -909,6 +920,7 @@ void GrGLPerlinNoise::onSetData(const GrGLProgramDataManager& pdman, const GrPro const SkVector& baseFrequency = turbulence.baseFrequency(); pdman.set2f(fBaseFrequencyUni, baseFrequency.fX, baseFrequency.fY); + pdman.set1f(fAlphaUni, SkIntToScalar(turbulence.alpha()) / 255); if (turbulence.stitchTiles()) { const SkPerlinNoiseShader::StitchData& stitchData = turbulence.stitchData(); @@ -918,11 +930,17 @@ void GrGLPerlinNoise::onSetData(const GrGLProgramDataManager& pdman, const GrPro } ///////////////////////////////////////////////////////////////////// -const GrFragmentProcessor* SkPerlinNoiseShader::asFragmentProcessor(GrContext* context, - const SkMatrix& viewM, const SkMatrix* externalLocalMatrix, SkFilterQuality, - GrProcessorDataManager* procDataManager) const { + +bool SkPerlinNoiseShader::asFragmentProcessor(GrContext* context, const SkPaint& paint, + const SkMatrix& viewM, + const SkMatrix* externalLocalMatrix, + GrColor* paintColor, + GrProcessorDataManager* procDataManager, + GrFragmentProcessor** fp) const { SkASSERT(context); + *paintColor = SkColor2GrColorJustAlpha(paint.getColor()); + SkMatrix localMatrix = this->getLocalMatrix(); if (externalLocalMatrix) { localMatrix.preConcat(*externalLocalMatrix); @@ -933,14 +951,13 @@ const GrFragmentProcessor* SkPerlinNoiseShader::asFragmentProcessor(GrContext* c if (0 == fNumOctaves) { if (kFractalNoise_Type == fType) { - // Extract the incoming alpha and emit rgba = (a/4, a/4, a/4, a/2) - SkAutoTUnref<const GrFragmentProcessor> inner( - GrConstColorProcessor::Create(0x80404040, - GrConstColorProcessor::kModulateRGBA_InputMode)); - return GrExtractAlphaFragmentProcessor::Create(inner); + uint32_t alpha = paint.getAlpha() >> 1; + uint32_t rgb = alpha >> 1; + *paintColor = GrColorPackRGBA(rgb, rgb, rgb, alpha); + } else { + *paintColor = 0; } - // Emit zero. - return GrConstColorProcessor::Create(0x0, GrConstColorProcessor::kIgnore_InputMode); + return true; } // Either we don't stitch tiles, either we have a valid tile size @@ -957,18 +974,27 @@ const GrFragmentProcessor* SkPerlinNoiseShader::asFragmentProcessor(GrContext* c m.setTranslateX(-localMatrix.getTranslateX() + SK_Scalar1); m.setTranslateY(-localMatrix.getTranslateY() + SK_Scalar1); if ((permutationsTexture) && (noiseTexture)) { - SkAutoTUnref<GrFragmentProcessor> inner( - GrPerlinNoiseEffect::Create(procDataManager, - fType, - fNumOctaves, - fStitchTiles, - paintingData, - permutationsTexture, noiseTexture, - m)); - return GrExtractAlphaFragmentProcessor::Create(inner); - } - delete paintingData; - return nullptr; + *fp = GrPerlinNoiseEffect::Create(procDataManager, + fType, + fNumOctaves, + fStitchTiles, + paintingData, + permutationsTexture, noiseTexture, + m, paint.getAlpha()); + } else { + delete paintingData; + *fp = nullptr; + } + return true; +} + +#else + +bool SkPerlinNoiseShader::asFragmentProcessor(GrContext*, const SkPaint&, const SkMatrix&, + const SkMatrix*, GrColor*, GrProcessorDataManager*, + GrFragmentProcessor**) const { + SkDEBUGFAIL("Should not call in GPU-less build"); + return false; } #endif |