| 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 710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 721 SkScalar baseFrequencyY = d->fRandom->nextRangeScalar(0.01f, | 721 SkScalar baseFrequencyY = d->fRandom->nextRangeScalar(0.01f, |
| 722 0.99f); | 722 0.99f); |
| 723 | 723 |
| 724 sk_sp<SkShader> shader(d->fRandom->nextBool() ? | 724 sk_sp<SkShader> shader(d->fRandom->nextBool() ? |
| 725 SkPerlinNoiseShader2::MakeFractalNoise(baseFrequencyX, baseFrequencyY, n
umOctaves, seed, | 725 SkPerlinNoiseShader2::MakeFractalNoise(baseFrequencyX, baseFrequencyY, n
umOctaves, seed, |
| 726 stitchTiles ? &tileSize : nullptr
) : | 726 stitchTiles ? &tileSize : nullptr
) : |
| 727 SkPerlinNoiseShader2::MakeTurbulence(baseFrequencyX, baseFrequencyY, num
Octaves, seed, | 727 SkPerlinNoiseShader2::MakeTurbulence(baseFrequencyX, baseFrequencyY, num
Octaves, seed, |
| 728 stitchTiles ? &tileSize : nullptr))
; | 728 stitchTiles ? &tileSize : nullptr))
; |
| 729 | 729 |
| 730 GrPaint grPaint; | 730 GrPaint grPaint; |
| 731 return shader->asFragmentProcessor(d->fContext, | 731 SkMatrix viewMatrix = GrTest::TestMatrix(d->fRandom); |
| 732 GrTest::TestMatrix(d->fRandom), nullptr, | 732 return shader->asFragmentProcessor(SkShader::AsFPArgs(d->fContext, &viewMatr
ix, nullptr, |
| 733 kNone_SkFilterQuality, SkSourceGammaTreat
ment::kRespect); | 733 kNone_SkFilterQuality, |
| 734 SkSourceGammaTreatment
::kRespect)); |
| 734 } | 735 } |
| 735 | 736 |
| 736 void GrGLPerlinNoise2::emitCode(EmitArgs& args) { | 737 void GrGLPerlinNoise2::emitCode(EmitArgs& args) { |
| 737 const GrPerlinNoise2Effect& pne = args.fFp.cast<GrPerlinNoise2Effect>(); | 738 const GrPerlinNoise2Effect& pne = args.fFp.cast<GrPerlinNoise2Effect>(); |
| 738 | 739 |
| 739 GrGLSLFragmentBuilder* fsBuilder = args.fFragBuilder; | 740 GrGLSLFragmentBuilder* fsBuilder = args.fFragBuilder; |
| 740 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; | 741 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
| 741 SkString vCoords = fsBuilder->ensureFSCoords2D(args.fCoords, 0); | 742 SkString vCoords = fsBuilder->ensureFSCoords2D(args.fCoords, 0); |
| 742 | 743 |
| 743 fBaseFrequencyUni = uniformHandler->addUniform(kFragment_GrShaderFlag, | 744 fBaseFrequencyUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1128 0.99f); | 1129 0.99f); |
| 1129 int numOctaves = d->fRandom->nextRangeU(2, 10); | 1130 int numOctaves = d->fRandom->nextRangeU(2, 10); |
| 1130 SkScalar z = SkIntToScalar(d->fRandom->nextU()); | 1131 SkScalar z = SkIntToScalar(d->fRandom->nextU()); |
| 1131 | 1132 |
| 1132 sk_sp<SkShader> shader(SkPerlinNoiseShader2::MakeImprovedNoise(baseFrequency
X, | 1133 sk_sp<SkShader> shader(SkPerlinNoiseShader2::MakeImprovedNoise(baseFrequency
X, |
| 1133 baseFrequency
Y, | 1134 baseFrequency
Y, |
| 1134 numOctaves, | 1135 numOctaves, |
| 1135 z)); | 1136 z)); |
| 1136 | 1137 |
| 1137 GrPaint grPaint; | 1138 GrPaint grPaint; |
| 1138 return shader->asFragmentProcessor(d->fContext, | 1139 SkMatrix viewMatrix = GrTest::TestMatrix(d->fRandom); |
| 1139 GrTest::TestMatrix(d->fRandom), nullptr, | 1140 return shader->asFragmentProcessor(SkShader::AsFPArgs(d->fContext, &viewMatr
ix, nullptr, |
| 1140 kNone_SkFilterQuality, SkSourceGammaTreat
ment::kRespect); | 1141 kNone_SkFilterQuality, |
| 1142 SkSourceGammaTreatment
::kRespect)); |
| 1141 } | 1143 } |
| 1142 | 1144 |
| 1143 void GrGLImprovedPerlinNoise::emitCode(EmitArgs& args) { | 1145 void GrGLImprovedPerlinNoise::emitCode(EmitArgs& args) { |
| 1144 GrGLSLFragmentBuilder* fsBuilder = args.fFragBuilder; | 1146 GrGLSLFragmentBuilder* fsBuilder = args.fFragBuilder; |
| 1145 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; | 1147 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
| 1146 SkString vCoords = fsBuilder->ensureFSCoords2D(args.fCoords, 0); | 1148 SkString vCoords = fsBuilder->ensureFSCoords2D(args.fCoords, 0); |
| 1147 | 1149 |
| 1148 fBaseFrequencyUni = uniformHandler->addUniform(kFragment_GrShaderFlag, | 1150 fBaseFrequencyUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
| 1149 kVec2f_GrSLType, kDefault_GrS
LPrecision, | 1151 kVec2f_GrSLType, kDefault_GrS
LPrecision, |
| 1150 "baseFrequency"); | 1152 "baseFrequency"); |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1294 | 1296 |
| 1295 const SkVector& baseFrequency = noise.baseFrequency(); | 1297 const SkVector& baseFrequency = noise.baseFrequency(); |
| 1296 pdman.set2f(fBaseFrequencyUni, baseFrequency.fX, baseFrequency.fY); | 1298 pdman.set2f(fBaseFrequencyUni, baseFrequency.fX, baseFrequency.fY); |
| 1297 | 1299 |
| 1298 pdman.set1f(fOctavesUni, SkIntToScalar(noise.octaves())); | 1300 pdman.set1f(fOctavesUni, SkIntToScalar(noise.octaves())); |
| 1299 | 1301 |
| 1300 pdman.set1f(fZUni, noise.z()); | 1302 pdman.set1f(fZUni, noise.z()); |
| 1301 } | 1303 } |
| 1302 | 1304 |
| 1303 ///////////////////////////////////////////////////////////////////// | 1305 ///////////////////////////////////////////////////////////////////// |
| 1304 sk_sp<GrFragmentProcessor> SkPerlinNoiseShader2::asFragmentProcessor( | 1306 sk_sp<GrFragmentProcessor> SkPerlinNoiseShader2::asFragmentProcessor(const AsFPA
rgs& args) const { |
| 1305 GrContext* context, | 1307 SkASSERT(args.fContext); |
| 1306 const SkMatrix& viewM, | |
| 1307 const SkMatrix* externalLoca
lMatrix, | |
| 1308 SkFilterQuality, | |
| 1309 SkSourceGammaTreatment gamma
Treatment) const { | |
| 1310 SkASSERT(context); | |
| 1311 | 1308 |
| 1312 SkMatrix localMatrix = this->getLocalMatrix(); | 1309 SkMatrix localMatrix = this->getLocalMatrix(); |
| 1313 if (externalLocalMatrix) { | 1310 if (args.fLocalMatrix) { |
| 1314 localMatrix.preConcat(*externalLocalMatrix); | 1311 localMatrix.preConcat(*args.fLocalMatrix); |
| 1315 } | 1312 } |
| 1316 | 1313 |
| 1317 SkMatrix matrix = viewM; | 1314 SkMatrix matrix = *args.fViewMatrix; |
| 1318 matrix.preConcat(localMatrix); | 1315 matrix.preConcat(localMatrix); |
| 1319 | 1316 |
| 1320 // Either we don't stitch tiles, either we have a valid tile size | 1317 // Either we don't stitch tiles, either we have a valid tile size |
| 1321 SkASSERT(!fStitchTiles || !fTileSize.isEmpty()); | 1318 SkASSERT(!fStitchTiles || !fTileSize.isEmpty()); |
| 1322 | 1319 |
| 1323 SkPerlinNoiseShader2::PaintingData* paintingData = | 1320 SkPerlinNoiseShader2::PaintingData* paintingData = |
| 1324 new PaintingData(fTileSize, fSeed, fBaseFrequencyX, fBaseFrequencyY,
matrix); | 1321 new PaintingData(fTileSize, fSeed, fBaseFrequencyX, fBaseFrequencyY,
matrix); |
| 1325 | 1322 |
| 1326 SkMatrix m = viewM; | 1323 SkMatrix m = *args.fViewMatrix; |
| 1327 m.setTranslateX(-localMatrix.getTranslateX() + SK_Scalar1); | 1324 m.setTranslateX(-localMatrix.getTranslateX() + SK_Scalar1); |
| 1328 m.setTranslateY(-localMatrix.getTranslateY() + SK_Scalar1); | 1325 m.setTranslateY(-localMatrix.getTranslateY() + SK_Scalar1); |
| 1329 | 1326 |
| 1330 if (fType == kImprovedNoise_Type) { | 1327 if (fType == kImprovedNoise_Type) { |
| 1331 GrTextureParams textureParams(SkShader::TileMode::kRepeat_TileMode, | 1328 GrTextureParams textureParams(SkShader::TileMode::kRepeat_TileMode, |
| 1332 GrTextureParams::FilterMode::kNone_FilterM
ode); | 1329 GrTextureParams::FilterMode::kNone_FilterM
ode); |
| 1333 SkAutoTUnref<GrTexture> permutationsTexture( | 1330 SkAutoTUnref<GrTexture> permutationsTexture( |
| 1334 GrRefCachedBitmapTexture(context, paintingData->getImprovedPermutati
onsBitmap(), | 1331 GrRefCachedBitmapTexture(args.fContext, paintingData->getImprovedPer
mutationsBitmap(), |
| 1335 textureParams, gammaTreatment)); | 1332 textureParams, args.fGammaTreatment)); |
| 1336 SkAutoTUnref<GrTexture> gradientTexture( | 1333 SkAutoTUnref<GrTexture> gradientTexture( |
| 1337 GrRefCachedBitmapTexture(context, paintingData->getGradientBitmap(), | 1334 GrRefCachedBitmapTexture(args.fContext, paintingData->getGradientBit
map(), |
| 1338 textureParams, gammaTreatment)); | 1335 textureParams, args.fGammaTreatment)); |
| 1339 return GrImprovedPerlinNoiseEffect::Make(fNumOctaves, fSeed, paintingDat
a, | 1336 return GrImprovedPerlinNoiseEffect::Make(fNumOctaves, fSeed, paintingDat
a, |
| 1340 permutationsTexture, gradient
Texture, m); | 1337 permutationsTexture, gradient
Texture, m); |
| 1341 } | 1338 } |
| 1342 | 1339 |
| 1343 if (0 == fNumOctaves) { | 1340 if (0 == fNumOctaves) { |
| 1344 if (kFractalNoise_Type == fType) { | 1341 if (kFractalNoise_Type == fType) { |
| 1345 // Extract the incoming alpha and emit rgba = (a/4, a/4, a/4, a/2) | 1342 // Extract the incoming alpha and emit rgba = (a/4, a/4, a/4, a/2) |
| 1346 sk_sp<GrFragmentProcessor> inner( | 1343 sk_sp<GrFragmentProcessor> inner( |
| 1347 GrConstColorProcessor::Make(0x80404040, | 1344 GrConstColorProcessor::Make(0x80404040, |
| 1348 GrConstColorProcessor::kModulateRGBA
_InputMode)); | 1345 GrConstColorProcessor::kModulateRGBA
_InputMode)); |
| 1349 return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner)); | 1346 return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner)); |
| 1350 } | 1347 } |
| 1351 // Emit zero. | 1348 // Emit zero. |
| 1352 return GrConstColorProcessor::Make(0x0, GrConstColorProcessor::kIgnore_I
nputMode); | 1349 return GrConstColorProcessor::Make(0x0, GrConstColorProcessor::kIgnore_I
nputMode); |
| 1353 } | 1350 } |
| 1354 | 1351 |
| 1355 SkAutoTUnref<GrTexture> permutationsTexture( | 1352 SkAutoTUnref<GrTexture> permutationsTexture( |
| 1356 GrRefCachedBitmapTexture(context, paintingData->getPermutationsBitmap(), | 1353 GrRefCachedBitmapTexture(args.fContext, paintingData->getPermutationsBit
map(), |
| 1357 GrTextureParams::ClampNoFilter(), gammaTreatmen
t)); | 1354 GrTextureParams::ClampNoFilter(), args.fGammaTr
eatment)); |
| 1358 SkAutoTUnref<GrTexture> noiseTexture( | 1355 SkAutoTUnref<GrTexture> noiseTexture( |
| 1359 GrRefCachedBitmapTexture(context, paintingData->getNoiseBitmap(), | 1356 GrRefCachedBitmapTexture(args.fContext, paintingData->getNoiseBitmap(), |
| 1360 GrTextureParams::ClampNoFilter(), gammaTreatmen
t)); | 1357 GrTextureParams::ClampNoFilter(), args.fGammaTr
eatment)); |
| 1361 | 1358 |
| 1362 if ((permutationsTexture) && (noiseTexture)) { | 1359 if ((permutationsTexture) && (noiseTexture)) { |
| 1363 sk_sp<GrFragmentProcessor> inner( | 1360 sk_sp<GrFragmentProcessor> inner( |
| 1364 GrPerlinNoise2Effect::Make(fType, | 1361 GrPerlinNoise2Effect::Make(fType, |
| 1365 fNumOctaves, | 1362 fNumOctaves, |
| 1366 fStitchTiles, | 1363 fStitchTiles, |
| 1367 paintingData, | 1364 paintingData, |
| 1368 permutationsTexture, noiseTexture, | 1365 permutationsTexture, noiseTexture, |
| 1369 m)); | 1366 m)); |
| 1370 return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner)); | 1367 return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner)); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1400 str->append(" seed: "); | 1397 str->append(" seed: "); |
| 1401 str->appendScalar(fSeed); | 1398 str->appendScalar(fSeed); |
| 1402 str->append(" stitch tiles: "); | 1399 str->append(" stitch tiles: "); |
| 1403 str->append(fStitchTiles ? "true " : "false "); | 1400 str->append(fStitchTiles ? "true " : "false "); |
| 1404 | 1401 |
| 1405 this->INHERITED::toString(str); | 1402 this->INHERITED::toString(str); |
| 1406 | 1403 |
| 1407 str->append(")"); | 1404 str->append(")"); |
| 1408 } | 1405 } |
| 1409 #endif | 1406 #endif |
| OLD | NEW |