| 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 "SkDither.h" | 8 #include "SkDither.h" |
| 9 #include "SkPerlinNoiseShader2.h" | 9 #include "SkPerlinNoiseShader2.h" |
| 10 #include "SkColorFilter.h" | 10 #include "SkColorFilter.h" |
| (...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 623 GrGLSLProgramDataManager::UniformHandle fStitchDataUni; | 623 GrGLSLProgramDataManager::UniformHandle fStitchDataUni; |
| 624 GrGLSLProgramDataManager::UniformHandle fBaseFrequencyUni; | 624 GrGLSLProgramDataManager::UniformHandle fBaseFrequencyUni; |
| 625 | 625 |
| 626 typedef GrGLSLFragmentProcessor INHERITED; | 626 typedef GrGLSLFragmentProcessor INHERITED; |
| 627 }; | 627 }; |
| 628 | 628 |
| 629 ///////////////////////////////////////////////////////////////////// | 629 ///////////////////////////////////////////////////////////////////// |
| 630 | 630 |
| 631 class GrPerlinNoise2Effect : public GrFragmentProcessor { | 631 class GrPerlinNoise2Effect : public GrFragmentProcessor { |
| 632 public: | 632 public: |
| 633 static GrFragmentProcessor* Create(SkPerlinNoiseShader2::Type type, | 633 static sk_sp<GrFragmentProcessor> Make(SkPerlinNoiseShader2::Type type, |
| 634 int numOctaves, bool stitchTiles, | 634 int numOctaves, bool stitchTiles, |
| 635 SkPerlinNoiseShader2::PaintingData* paint
ingData, | 635 SkPerlinNoiseShader2::PaintingData* p
aintingData, |
| 636 GrTexture* permutationsTexture, GrTexture
* noiseTexture, | 636 GrTexture* permutationsTexture, GrTex
ture* noiseTexture, |
| 637 const SkMatrix& matrix) { | 637 const SkMatrix& matrix) { |
| 638 return new GrPerlinNoise2Effect(type, numOctaves, stitchTiles, paintingD
ata, | 638 return sk_sp<GrFragmentProcessor>( |
| 639 permutationsTexture, noiseTexture, matrix
); | 639 new GrPerlinNoise2Effect(type, numOctaves, stitchTiles, paintingData
, |
| 640 permutationsTexture, noiseTexture, matrix))
; |
| 640 } | 641 } |
| 641 | 642 |
| 642 virtual ~GrPerlinNoise2Effect() { delete fPaintingData; } | 643 virtual ~GrPerlinNoise2Effect() { delete fPaintingData; } |
| 643 | 644 |
| 644 const char* name() const override { return "PerlinNoise"; } | 645 const char* name() const override { return "PerlinNoise"; } |
| 645 | 646 |
| 646 const SkPerlinNoiseShader2::StitchData& stitchData() const { return fPaintin
gData->fStitchDataInit; } | 647 const SkPerlinNoiseShader2::StitchData& stitchData() const { return fPaintin
gData->fStitchDataInit; } |
| 647 | 648 |
| 648 SkPerlinNoiseShader2::Type type() const { return fType; } | 649 SkPerlinNoiseShader2::Type type() const { return fType; } |
| 649 bool stitchTiles() const { return fStitchTiles; } | 650 bool stitchTiles() const { return fStitchTiles; } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 702 GrTextureAccess fNoiseAccess; | 703 GrTextureAccess fNoiseAccess; |
| 703 SkPerlinNoiseShader2::PaintingData *fPaintingData; | 704 SkPerlinNoiseShader2::PaintingData *fPaintingData; |
| 704 | 705 |
| 705 private: | 706 private: |
| 706 typedef GrFragmentProcessor INHERITED; | 707 typedef GrFragmentProcessor INHERITED; |
| 707 }; | 708 }; |
| 708 | 709 |
| 709 ///////////////////////////////////////////////////////////////////// | 710 ///////////////////////////////////////////////////////////////////// |
| 710 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrPerlinNoise2Effect); | 711 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrPerlinNoise2Effect); |
| 711 | 712 |
| 712 const GrFragmentProcessor* GrPerlinNoise2Effect::TestCreate(GrProcessorTestData*
d) { | 713 sk_sp<GrFragmentProcessor> GrPerlinNoise2Effect::TestCreate(GrProcessorTestData*
d) { |
| 713 int numOctaves = d->fRandom->nextRangeU(2, 10); | 714 int numOctaves = d->fRandom->nextRangeU(2, 10); |
| 714 bool stitchTiles = d->fRandom->nextBool(); | 715 bool stitchTiles = d->fRandom->nextBool(); |
| 715 SkScalar seed = SkIntToScalar(d->fRandom->nextU()); | 716 SkScalar seed = SkIntToScalar(d->fRandom->nextU()); |
| 716 SkISize tileSize = SkISize::Make(d->fRandom->nextRangeU(4, 4096), | 717 SkISize tileSize = SkISize::Make(d->fRandom->nextRangeU(4, 4096), |
| 717 d->fRandom->nextRangeU(4, 4096)); | 718 d->fRandom->nextRangeU(4, 4096)); |
| 718 SkScalar baseFrequencyX = d->fRandom->nextRangeScalar(0.01f, | 719 SkScalar baseFrequencyX = d->fRandom->nextRangeScalar(0.01f, |
| 719 0.99f); | 720 0.99f); |
| 720 SkScalar baseFrequencyY = d->fRandom->nextRangeScalar(0.01f, | 721 SkScalar baseFrequencyY = d->fRandom->nextRangeScalar(0.01f, |
| 721 0.99f); | 722 0.99f); |
| 722 | 723 |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1043 GrGLSLProgramDataManager::UniformHandle fOctavesUni; | 1044 GrGLSLProgramDataManager::UniformHandle fOctavesUni; |
| 1044 GrGLSLProgramDataManager::UniformHandle fBaseFrequencyUni; | 1045 GrGLSLProgramDataManager::UniformHandle fBaseFrequencyUni; |
| 1045 | 1046 |
| 1046 typedef GrGLSLFragmentProcessor INHERITED; | 1047 typedef GrGLSLFragmentProcessor INHERITED; |
| 1047 }; | 1048 }; |
| 1048 | 1049 |
| 1049 ///////////////////////////////////////////////////////////////////// | 1050 ///////////////////////////////////////////////////////////////////// |
| 1050 | 1051 |
| 1051 class GrImprovedPerlinNoiseEffect : public GrFragmentProcessor { | 1052 class GrImprovedPerlinNoiseEffect : public GrFragmentProcessor { |
| 1052 public: | 1053 public: |
| 1053 static GrFragmentProcessor* Create(int octaves, SkScalar z, | 1054 static sk_sp<GrFragmentProcessor> Make(int octaves, SkScalar z, |
| 1054 SkPerlinNoiseShader2::PaintingData* paint
ingData, | 1055 SkPerlinNoiseShader2::PaintingData* p
aintingData, |
| 1055 GrTexture* permutationsTexture, GrTexture
* gradientTexture, | 1056 GrTexture* permutationsTexture, |
| 1056 const SkMatrix& matrix) { | 1057 GrTexture* gradientTexture, |
| 1057 return new GrImprovedPerlinNoiseEffect(octaves, z, paintingData, permuta
tionsTexture, | 1058 const SkMatrix& matrix) { |
| 1058 gradientTexture, matrix); | 1059 return sk_sp<GrFragmentProcessor>( |
| 1060 new GrImprovedPerlinNoiseEffect(octaves, z, paintingData, permutatio
nsTexture, |
| 1061 gradientTexture, matrix)); |
| 1059 } | 1062 } |
| 1060 | 1063 |
| 1061 virtual ~GrImprovedPerlinNoiseEffect() { delete fPaintingData; } | 1064 virtual ~GrImprovedPerlinNoiseEffect() { delete fPaintingData; } |
| 1062 | 1065 |
| 1063 const char* name() const override { return "ImprovedPerlinNoise"; } | 1066 const char* name() const override { return "ImprovedPerlinNoise"; } |
| 1064 | 1067 |
| 1065 const SkVector& baseFrequency() const { return fPaintingData->fBaseFrequency
; } | 1068 const SkVector& baseFrequency() const { return fPaintingData->fBaseFrequency
; } |
| 1066 SkScalar z() const { return fZ; } | 1069 SkScalar z() const { return fZ; } |
| 1067 int octaves() const { return fOctaves; } | 1070 int octaves() const { return fOctaves; } |
| 1068 const SkMatrix& matrix() const { return fCoordTransform.getMatrix(); } | 1071 const SkMatrix& matrix() const { return fCoordTransform.getMatrix(); } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1111 GrTextureAccess fGradientAccess; | 1114 GrTextureAccess fGradientAccess; |
| 1112 SkPerlinNoiseShader2::PaintingData *fPaintingData; | 1115 SkPerlinNoiseShader2::PaintingData *fPaintingData; |
| 1113 | 1116 |
| 1114 private: | 1117 private: |
| 1115 typedef GrFragmentProcessor INHERITED; | 1118 typedef GrFragmentProcessor INHERITED; |
| 1116 }; | 1119 }; |
| 1117 | 1120 |
| 1118 ///////////////////////////////////////////////////////////////////// | 1121 ///////////////////////////////////////////////////////////////////// |
| 1119 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrImprovedPerlinNoiseEffect); | 1122 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrImprovedPerlinNoiseEffect); |
| 1120 | 1123 |
| 1121 const GrFragmentProcessor* GrImprovedPerlinNoiseEffect::TestCreate(GrProcessorTe
stData* d) { | 1124 sk_sp<GrFragmentProcessor> GrImprovedPerlinNoiseEffect::TestCreate(GrProcessorTe
stData* d) { |
| 1122 SkScalar baseFrequencyX = d->fRandom->nextRangeScalar(0.01f, | 1125 SkScalar baseFrequencyX = d->fRandom->nextRangeScalar(0.01f, |
| 1123 0.99f); | 1126 0.99f); |
| 1124 SkScalar baseFrequencyY = d->fRandom->nextRangeScalar(0.01f, | 1127 SkScalar baseFrequencyY = d->fRandom->nextRangeScalar(0.01f, |
| 1125 0.99f); | 1128 0.99f); |
| 1126 int numOctaves = d->fRandom->nextRangeU(2, 10); | 1129 int numOctaves = d->fRandom->nextRangeU(2, 10); |
| 1127 SkScalar z = SkIntToScalar(d->fRandom->nextU()); | 1130 SkScalar z = SkIntToScalar(d->fRandom->nextU()); |
| 1128 | 1131 |
| 1129 sk_sp<SkShader> shader(SkPerlinNoiseShader2::MakeImprovedNoise(baseFrequency
X, | 1132 sk_sp<SkShader> shader(SkPerlinNoiseShader2::MakeImprovedNoise(baseFrequency
X, |
| 1130 baseFrequency
Y, | 1133 baseFrequency
Y, |
| 1131 numOctaves, | 1134 numOctaves, |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1291 | 1294 |
| 1292 const SkVector& baseFrequency = noise.baseFrequency(); | 1295 const SkVector& baseFrequency = noise.baseFrequency(); |
| 1293 pdman.set2f(fBaseFrequencyUni, baseFrequency.fX, baseFrequency.fY); | 1296 pdman.set2f(fBaseFrequencyUni, baseFrequency.fX, baseFrequency.fY); |
| 1294 | 1297 |
| 1295 pdman.set1f(fOctavesUni, SkIntToScalar(noise.octaves())); | 1298 pdman.set1f(fOctavesUni, SkIntToScalar(noise.octaves())); |
| 1296 | 1299 |
| 1297 pdman.set1f(fZUni, noise.z()); | 1300 pdman.set1f(fZUni, noise.z()); |
| 1298 } | 1301 } |
| 1299 | 1302 |
| 1300 ///////////////////////////////////////////////////////////////////// | 1303 ///////////////////////////////////////////////////////////////////// |
| 1301 const GrFragmentProcessor* SkPerlinNoiseShader2::asFragmentProcessor( | 1304 sk_sp<GrFragmentProcessor> SkPerlinNoiseShader2::asFragmentProcessor( |
| 1302 GrContext* context, | 1305 GrContext* context, |
| 1303 const SkMatrix& viewM, | 1306 const SkMatrix& viewM, |
| 1304 const SkMatrix* externalLoca
lMatrix, | 1307 const SkMatrix* externalLoca
lMatrix, |
| 1305 SkFilterQuality, | 1308 SkFilterQuality, |
| 1306 SkSourceGammaTreatment gamma
Treatment) const { | 1309 SkSourceGammaTreatment gamma
Treatment) const { |
| 1307 SkASSERT(context); | 1310 SkASSERT(context); |
| 1308 | 1311 |
| 1309 SkMatrix localMatrix = this->getLocalMatrix(); | 1312 SkMatrix localMatrix = this->getLocalMatrix(); |
| 1310 if (externalLocalMatrix) { | 1313 if (externalLocalMatrix) { |
| 1311 localMatrix.preConcat(*externalLocalMatrix); | 1314 localMatrix.preConcat(*externalLocalMatrix); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1326 | 1329 |
| 1327 if (fType == kImprovedNoise_Type) { | 1330 if (fType == kImprovedNoise_Type) { |
| 1328 GrTextureParams textureParams(SkShader::TileMode::kRepeat_TileMode, | 1331 GrTextureParams textureParams(SkShader::TileMode::kRepeat_TileMode, |
| 1329 GrTextureParams::FilterMode::kNone_FilterM
ode); | 1332 GrTextureParams::FilterMode::kNone_FilterM
ode); |
| 1330 SkAutoTUnref<GrTexture> permutationsTexture( | 1333 SkAutoTUnref<GrTexture> permutationsTexture( |
| 1331 GrRefCachedBitmapTexture(context, paintingData->getImprovedPermutati
onsBitmap(), | 1334 GrRefCachedBitmapTexture(context, paintingData->getImprovedPermutati
onsBitmap(), |
| 1332 textureParams, gammaTreatment)); | 1335 textureParams, gammaTreatment)); |
| 1333 SkAutoTUnref<GrTexture> gradientTexture( | 1336 SkAutoTUnref<GrTexture> gradientTexture( |
| 1334 GrRefCachedBitmapTexture(context, paintingData->getGradientBitmap(), | 1337 GrRefCachedBitmapTexture(context, paintingData->getGradientBitmap(), |
| 1335 textureParams, gammaTreatment)); | 1338 textureParams, gammaTreatment)); |
| 1336 return GrImprovedPerlinNoiseEffect::Create(fNumOctaves, fSeed, paintingD
ata, | 1339 return GrImprovedPerlinNoiseEffect::Make(fNumOctaves, fSeed, paintingDat
a, |
| 1337 permutationsTexture, gradient
Texture, m); | 1340 permutationsTexture, gradient
Texture, m); |
| 1338 } | 1341 } |
| 1339 | 1342 |
| 1340 if (0 == fNumOctaves) { | 1343 if (0 == fNumOctaves) { |
| 1341 if (kFractalNoise_Type == fType) { | 1344 if (kFractalNoise_Type == fType) { |
| 1342 // Extract the incoming alpha and emit rgba = (a/4, a/4, a/4, a/2) | 1345 // Extract the incoming alpha and emit rgba = (a/4, a/4, a/4, a/2) |
| 1343 SkAutoTUnref<const GrFragmentProcessor> inner( | 1346 sk_sp<GrFragmentProcessor> inner( |
| 1344 GrConstColorProcessor::Create(0x80404040, | 1347 GrConstColorProcessor::Make(0x80404040, |
| 1345 GrConstColorProcessor::kModulateRG
BA_InputMode)); | 1348 GrConstColorProcessor::kModulateRGBA
_InputMode)); |
| 1346 return GrFragmentProcessor::MulOutputByInputAlpha(inner); | 1349 return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner)); |
| 1347 } | 1350 } |
| 1348 // Emit zero. | 1351 // Emit zero. |
| 1349 return GrConstColorProcessor::Create(0x0, GrConstColorProcessor::kIgnore
_InputMode); | 1352 return GrConstColorProcessor::Make(0x0, GrConstColorProcessor::kIgnore_I
nputMode); |
| 1350 } | 1353 } |
| 1351 | 1354 |
| 1352 SkAutoTUnref<GrTexture> permutationsTexture( | 1355 SkAutoTUnref<GrTexture> permutationsTexture( |
| 1353 GrRefCachedBitmapTexture(context, paintingData->getPermutationsBitmap(), | 1356 GrRefCachedBitmapTexture(context, paintingData->getPermutationsBitmap(), |
| 1354 GrTextureParams::ClampNoFilter(), gammaTreatmen
t)); | 1357 GrTextureParams::ClampNoFilter(), gammaTreatmen
t)); |
| 1355 SkAutoTUnref<GrTexture> noiseTexture( | 1358 SkAutoTUnref<GrTexture> noiseTexture( |
| 1356 GrRefCachedBitmapTexture(context, paintingData->getNoiseBitmap(), | 1359 GrRefCachedBitmapTexture(context, paintingData->getNoiseBitmap(), |
| 1357 GrTextureParams::ClampNoFilter(), gammaTreatmen
t)); | 1360 GrTextureParams::ClampNoFilter(), gammaTreatmen
t)); |
| 1358 | 1361 |
| 1359 if ((permutationsTexture) && (noiseTexture)) { | 1362 if ((permutationsTexture) && (noiseTexture)) { |
| 1360 SkAutoTUnref<GrFragmentProcessor> inner( | 1363 sk_sp<GrFragmentProcessor> inner( |
| 1361 GrPerlinNoise2Effect::Create(fType, | 1364 GrPerlinNoise2Effect::Make(fType, |
| 1362 fNumOctaves, | 1365 fNumOctaves, |
| 1363 fStitchTiles, | 1366 fStitchTiles, |
| 1364 paintingData, | 1367 paintingData, |
| 1365 permutationsTexture, noiseTexture, | 1368 permutationsTexture, noiseTexture, |
| 1366 m)); | 1369 m)); |
| 1367 return GrFragmentProcessor::MulOutputByInputAlpha(inner); | 1370 return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner)); |
| 1368 } | 1371 } |
| 1369 delete paintingData; | 1372 delete paintingData; |
| 1370 return nullptr; | 1373 return nullptr; |
| 1371 } | 1374 } |
| 1372 | 1375 |
| 1373 #endif | 1376 #endif |
| 1374 | 1377 |
| 1375 #ifndef SK_IGNORE_TO_STRING | 1378 #ifndef SK_IGNORE_TO_STRING |
| 1376 void SkPerlinNoiseShader2::toString(SkString* str) const { | 1379 void SkPerlinNoiseShader2::toString(SkString* str) const { |
| 1377 str->append("SkPerlinNoiseShader2: ("); | 1380 str->append("SkPerlinNoiseShader2: ("); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1397 str->append(" seed: "); | 1400 str->append(" seed: "); |
| 1398 str->appendScalar(fSeed); | 1401 str->appendScalar(fSeed); |
| 1399 str->append(" stitch tiles: "); | 1402 str->append(" stitch tiles: "); |
| 1400 str->append(fStitchTiles ? "true " : "false "); | 1403 str->append(fStitchTiles ? "true " : "false "); |
| 1401 | 1404 |
| 1402 this->INHERITED::toString(str); | 1405 this->INHERITED::toString(str); |
| 1403 | 1406 |
| 1404 str->append(")"); | 1407 str->append(")"); |
| 1405 } | 1408 } |
| 1406 #endif | 1409 #endif |
| OLD | NEW |