| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkPerlinNoiseShader.h" | 8 #include "SkPerlinNoiseShader.h" |
| 9 #include "SkColorFilter.h" | 9 #include "SkColorFilter.h" |
| 10 #include "SkReadBuffer.h" | 10 #include "SkReadBuffer.h" |
| (...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 GrGLSLProgramDataManager::UniformHandle fStitchDataUni; | 488 GrGLSLProgramDataManager::UniformHandle fStitchDataUni; |
| 489 GrGLSLProgramDataManager::UniformHandle fBaseFrequencyUni; | 489 GrGLSLProgramDataManager::UniformHandle fBaseFrequencyUni; |
| 490 | 490 |
| 491 typedef GrGLSLFragmentProcessor INHERITED; | 491 typedef GrGLSLFragmentProcessor INHERITED; |
| 492 }; | 492 }; |
| 493 | 493 |
| 494 ///////////////////////////////////////////////////////////////////// | 494 ///////////////////////////////////////////////////////////////////// |
| 495 | 495 |
| 496 class GrPerlinNoiseEffect : public GrFragmentProcessor { | 496 class GrPerlinNoiseEffect : public GrFragmentProcessor { |
| 497 public: | 497 public: |
| 498 static GrFragmentProcessor* Create(SkPerlinNoiseShader::Type type, | 498 static sk_sp<GrFragmentProcessor> Make(SkPerlinNoiseShader::Type type, |
| 499 int numOctaves, bool stitchTiles, | 499 int numOctaves, bool stitchTiles, |
| 500 SkPerlinNoiseShader::PaintingData* painti
ngData, | 500 SkPerlinNoiseShader::PaintingData* pa
intingData, |
| 501 GrTexture* permutationsTexture, GrTexture
* noiseTexture, | 501 GrTexture* permutationsTexture, GrTex
ture* noiseTexture, |
| 502 const SkMatrix& matrix) { | 502 const SkMatrix& matrix) { |
| 503 return new GrPerlinNoiseEffect(type, numOctaves, stitchTiles, paintingDa
ta, | 503 return sk_sp<GrFragmentProcessor>( |
| 504 permutationsTexture, noiseTexture, matrix
); | 504 new GrPerlinNoiseEffect(type, numOctaves, stitchTiles, paintingData, |
| 505 permutationsTexture, noiseTexture, matrix)); |
| 505 } | 506 } |
| 506 | 507 |
| 507 virtual ~GrPerlinNoiseEffect() { delete fPaintingData; } | 508 virtual ~GrPerlinNoiseEffect() { delete fPaintingData; } |
| 508 | 509 |
| 509 const char* name() const override { return "PerlinNoise"; } | 510 const char* name() const override { return "PerlinNoise"; } |
| 510 | 511 |
| 511 const SkPerlinNoiseShader::StitchData& stitchData() const { return fPainting
Data->fStitchDataInit; } | 512 const SkPerlinNoiseShader::StitchData& stitchData() const { return fPainting
Data->fStitchDataInit; } |
| 512 | 513 |
| 513 SkPerlinNoiseShader::Type type() const { return fType; } | 514 SkPerlinNoiseShader::Type type() const { return fType; } |
| 514 bool stitchTiles() const { return fStitchTiles; } | 515 bool stitchTiles() const { return fStitchTiles; } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 567 GrTextureAccess fNoiseAccess; | 568 GrTextureAccess fNoiseAccess; |
| 568 SkPerlinNoiseShader::PaintingData *fPaintingData; | 569 SkPerlinNoiseShader::PaintingData *fPaintingData; |
| 569 | 570 |
| 570 private: | 571 private: |
| 571 typedef GrFragmentProcessor INHERITED; | 572 typedef GrFragmentProcessor INHERITED; |
| 572 }; | 573 }; |
| 573 | 574 |
| 574 ///////////////////////////////////////////////////////////////////// | 575 ///////////////////////////////////////////////////////////////////// |
| 575 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrPerlinNoiseEffect); | 576 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrPerlinNoiseEffect); |
| 576 | 577 |
| 577 const GrFragmentProcessor* GrPerlinNoiseEffect::TestCreate(GrProcessorTestData*
d) { | 578 sk_sp<GrFragmentProcessor> GrPerlinNoiseEffect::TestCreate(GrProcessorTestData*
d) { |
| 578 int numOctaves = d->fRandom->nextRangeU(2, 10); | 579 int numOctaves = d->fRandom->nextRangeU(2, 10); |
| 579 bool stitchTiles = d->fRandom->nextBool(); | 580 bool stitchTiles = d->fRandom->nextBool(); |
| 580 SkScalar seed = SkIntToScalar(d->fRandom->nextU()); | 581 SkScalar seed = SkIntToScalar(d->fRandom->nextU()); |
| 581 SkISize tileSize = SkISize::Make(d->fRandom->nextRangeU(4, 4096), | 582 SkISize tileSize = SkISize::Make(d->fRandom->nextRangeU(4, 4096), |
| 582 d->fRandom->nextRangeU(4, 4096)); | 583 d->fRandom->nextRangeU(4, 4096)); |
| 583 SkScalar baseFrequencyX = d->fRandom->nextRangeScalar(0.01f, | 584 SkScalar baseFrequencyX = d->fRandom->nextRangeScalar(0.01f, |
| 584 0.99f); | 585 0.99f); |
| 585 SkScalar baseFrequencyY = d->fRandom->nextRangeScalar(0.01f, | 586 SkScalar baseFrequencyY = d->fRandom->nextRangeScalar(0.01f, |
| 586 0.99f); | 587 0.99f); |
| 587 | 588 |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 885 pdman.set2f(fBaseFrequencyUni, baseFrequency.fX, baseFrequency.fY); | 886 pdman.set2f(fBaseFrequencyUni, baseFrequency.fX, baseFrequency.fY); |
| 886 | 887 |
| 887 if (turbulence.stitchTiles()) { | 888 if (turbulence.stitchTiles()) { |
| 888 const SkPerlinNoiseShader::StitchData& stitchData = turbulence.stitchDat
a(); | 889 const SkPerlinNoiseShader::StitchData& stitchData = turbulence.stitchDat
a(); |
| 889 pdman.set2f(fStitchDataUni, SkIntToScalar(stitchData.fWidth), | 890 pdman.set2f(fStitchDataUni, SkIntToScalar(stitchData.fWidth), |
| 890 SkIntToScalar(stitchData.fHeight)); | 891 SkIntToScalar(stitchData.fHeight)); |
| 891 } | 892 } |
| 892 } | 893 } |
| 893 | 894 |
| 894 ///////////////////////////////////////////////////////////////////// | 895 ///////////////////////////////////////////////////////////////////// |
| 895 const GrFragmentProcessor* SkPerlinNoiseShader::asFragmentProcessor( | 896 sk_sp<GrFragmentProcessor> SkPerlinNoiseShader::asFragmentProcessor( |
| 896 GrContext* context, | 897 GrContext* context, |
| 897 const SkMatrix& viewM, | 898 const SkMatrix& viewM, |
| 898 const SkMatrix* externalLoc
alMatrix, | 899 const SkMatrix* externalLoc
alMatrix, |
| 899 SkFilterQuality, | 900 SkFilterQuality, |
| 900 SkSourceGammaTreatment gamm
aTreatment) const { | 901 SkSourceGammaTreatment gamm
aTreatment) const { |
| 901 SkASSERT(context); | 902 SkASSERT(context); |
| 902 | 903 |
| 903 SkMatrix localMatrix = this->getLocalMatrix(); | 904 SkMatrix localMatrix = this->getLocalMatrix(); |
| 904 if (externalLocalMatrix) { | 905 if (externalLocalMatrix) { |
| 905 localMatrix.preConcat(*externalLocalMatrix); | 906 localMatrix.preConcat(*externalLocalMatrix); |
| 906 } | 907 } |
| 907 | 908 |
| 908 SkMatrix matrix = viewM; | 909 SkMatrix matrix = viewM; |
| 909 matrix.preConcat(localMatrix); | 910 matrix.preConcat(localMatrix); |
| 910 | 911 |
| 911 if (0 == fNumOctaves) { | 912 if (0 == fNumOctaves) { |
| 912 if (kFractalNoise_Type == fType) { | 913 if (kFractalNoise_Type == fType) { |
| 913 // Extract the incoming alpha and emit rgba = (a/4, a/4, a/4, a/2) | 914 // Extract the incoming alpha and emit rgba = (a/4, a/4, a/4, a/2) |
| 914 SkAutoTUnref<const GrFragmentProcessor> inner( | 915 sk_sp<GrFragmentProcessor> inner( |
| 915 GrConstColorProcessor::Create(0x80404040, | 916 GrConstColorProcessor::Make(0x80404040, |
| 916 GrConstColorProcessor::kModulateRG
BA_InputMode)); | 917 GrConstColorProcessor::kModulateRGBA
_InputMode)); |
| 917 return GrFragmentProcessor::MulOutputByInputAlpha(inner); | 918 return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner)); |
| 918 } | 919 } |
| 919 // Emit zero. | 920 // Emit zero. |
| 920 return GrConstColorProcessor::Create(0x0, GrConstColorProcessor::kIgnore
_InputMode); | 921 return GrConstColorProcessor::Make(0x0, GrConstColorProcessor::kIgnore_I
nputMode); |
| 921 } | 922 } |
| 922 | 923 |
| 923 // Either we don't stitch tiles, either we have a valid tile size | 924 // Either we don't stitch tiles, either we have a valid tile size |
| 924 SkASSERT(!fStitchTiles || !fTileSize.isEmpty()); | 925 SkASSERT(!fStitchTiles || !fTileSize.isEmpty()); |
| 925 | 926 |
| 926 SkPerlinNoiseShader::PaintingData* paintingData = | 927 SkPerlinNoiseShader::PaintingData* paintingData = |
| 927 new PaintingData(fTileSize, fSeed, fBaseFrequencyX, fBaseFrequencyY,
matrix); | 928 new PaintingData(fTileSize, fSeed, fBaseFrequencyX, fBaseFrequencyY,
matrix); |
| 928 SkAutoTUnref<GrTexture> permutationsTexture( | 929 SkAutoTUnref<GrTexture> permutationsTexture( |
| 929 GrRefCachedBitmapTexture(context, paintingData->getPermutationsBitmap(), | 930 GrRefCachedBitmapTexture(context, paintingData->getPermutationsBitmap(), |
| 930 GrTextureParams::ClampNoFilter(), gammaTreatmen
t)); | 931 GrTextureParams::ClampNoFilter(), gammaTreatmen
t)); |
| 931 SkAutoTUnref<GrTexture> noiseTexture( | 932 SkAutoTUnref<GrTexture> noiseTexture( |
| 932 GrRefCachedBitmapTexture(context, paintingData->getNoiseBitmap(), | 933 GrRefCachedBitmapTexture(context, paintingData->getNoiseBitmap(), |
| 933 GrTextureParams::ClampNoFilter(), gammaTreatmen
t)); | 934 GrTextureParams::ClampNoFilter(), gammaTreatmen
t)); |
| 934 | 935 |
| 935 SkMatrix m = viewM; | 936 SkMatrix m = viewM; |
| 936 m.setTranslateX(-localMatrix.getTranslateX() + SK_Scalar1); | 937 m.setTranslateX(-localMatrix.getTranslateX() + SK_Scalar1); |
| 937 m.setTranslateY(-localMatrix.getTranslateY() + SK_Scalar1); | 938 m.setTranslateY(-localMatrix.getTranslateY() + SK_Scalar1); |
| 938 if ((permutationsTexture) && (noiseTexture)) { | 939 if ((permutationsTexture) && (noiseTexture)) { |
| 939 SkAutoTUnref<GrFragmentProcessor> inner( | 940 sk_sp<GrFragmentProcessor> inner( |
| 940 GrPerlinNoiseEffect::Create(fType, | 941 GrPerlinNoiseEffect::Make(fType, |
| 941 fNumOctaves, | 942 fNumOctaves, |
| 942 fStitchTiles, | 943 fStitchTiles, |
| 943 paintingData, | 944 paintingData, |
| 944 permutationsTexture, noiseTexture, | 945 permutationsTexture, noiseTexture, |
| 945 m)); | 946 m)); |
| 946 return GrFragmentProcessor::MulOutputByInputAlpha(inner); | 947 return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner)); |
| 947 } | 948 } |
| 948 delete paintingData; | 949 delete paintingData; |
| 949 return nullptr; | 950 return nullptr; |
| 950 } | 951 } |
| 951 | 952 |
| 952 #endif | 953 #endif |
| 953 | 954 |
| 954 #ifndef SK_IGNORE_TO_STRING | 955 #ifndef SK_IGNORE_TO_STRING |
| 955 void SkPerlinNoiseShader::toString(SkString* str) const { | 956 void SkPerlinNoiseShader::toString(SkString* str) const { |
| 956 str->append("SkPerlinNoiseShader: ("); | 957 str->append("SkPerlinNoiseShader: ("); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 976 str->append(" seed: "); | 977 str->append(" seed: "); |
| 977 str->appendScalar(fSeed); | 978 str->appendScalar(fSeed); |
| 978 str->append(" stitch tiles: "); | 979 str->append(" stitch tiles: "); |
| 979 str->append(fStitchTiles ? "true " : "false "); | 980 str->append(fStitchTiles ? "true " : "false "); |
| 980 | 981 |
| 981 this->INHERITED::toString(str); | 982 this->INHERITED::toString(str); |
| 982 | 983 |
| 983 str->append(")"); | 984 str->append(")"); |
| 984 } | 985 } |
| 985 #endif | 986 #endif |
| OLD | NEW |