1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "SkDither.h" 9 #include "SkPerlinNoiseShader2.h" 10 #include "SkColorFilter.h" 11 #include "SkReadBuffer.h" 12 #include "SkWriteBuffer.h" 13 #include "SkShader.h" 14 #include "SkUnPreMultiply.h" 15 #include "SkString.h" 16 17 #if SK_SUPPORT_GPU 18 #include "GrContext.h" 19 #include "GrCoordTransform.h" 20 #include "GrInvariantOutput.h" 21 #include "SkGr.h" 22 #include "effects/GrConstColorProcessor.h" 23 #include "glsl/GrGLSLFragmentProcessor.h" 24 #include "glsl/GrGLSLFragmentShaderBuilder.h" 25 #include "glsl/GrGLSLProgramDataManager.h" 26 #include "glsl/GrGLSLUniformHandler.h" 27 #endif 28 29 static const int kBlockSize = 256; 30 static const int kBlockMask = kBlockSize - 1; 31 static const int kPerlinNoise = 4096; 32 static const int kRandMaximum = SK_MaxS32; // 2**31 - 1 33 34 static uint8_t improved_noise_permutations[] = { 35 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 36 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 37 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 38 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 39 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 40 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 41 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 42 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 43 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 44 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 45 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 46 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 47 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 48 141, 128, 195, 78, 66, 215, 61, 156, 180, 49 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 50 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 51 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 52 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 53 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 55 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 56 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 57 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 58 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 59 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 60 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 61 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 62 141, 128, 195, 78, 66, 215, 61, 156, 180 63 }; 64 65 namespace { 66 67 // noiseValue is the color component's value (or color) 68 // limitValue is the maximum perlin noise array index value allowed 69 // newValue is the current noise dimension (either width or height) 70 inline int checkNoise(int noiseValue, int limitValue, int newValue) { 71 // If the noise value would bring us out of bounds of the current noise array while we are 72 // stiching noise tiles together, wrap the noise around the current dimension of the noise to 73 // stay within the array bounds in a continuous fashion (so that tiling lines are not visible) 74 if (noiseValue >= limitValue) { 75 noiseValue -= newValue; 76 } 77 return noiseValue; 78 } 79 80 inline SkScalar smoothCurve(SkScalar t) { 81 static const SkScalar SK_Scalar3 = 3.0f; 82 83 // returns t * t * (3 - 2 * t) 84 return SkScalarMul(SkScalarSquare(t), SK_Scalar3 - 2 * t); 85 } 86 87 } // end namespace 88 89 struct SkPerlinNoiseShader2::StitchData { 90 StitchData() 91 : fWidth(0) 92 , fWrapX(0) 93 , fHeight(0) 94 , fWrapY(0) 95 {} 96 97 bool operator==(const StitchData& other) const { 98 return fWidth == other.fWidth && 99 fWrapX == other.fWrapX && 100 fHeight == other.fHeight && 101 fWrapY == other.fWrapY; 102 } 103 104 int fWidth; // How much to subtract to wrap for stitching. 105 int fWrapX; // Minimum value to wrap. 106 int fHeight; 107 int fWrapY; 108 }; 109 110 struct SkPerlinNoiseShader2::PaintingData { 111 PaintingData(const SkISize& tileSize, SkScalar seed, 112 SkScalar baseFrequencyX, SkScalar baseFrequencyY, 113 const SkMatrix& matrix) 114 { 115 SkVector vec[2] = { 116 { SkScalarInvert(baseFrequencyX), SkScalarInvert(baseFrequencyY) }, 117 { SkIntToScalar(tileSize.fWidth), SkIntToScalar(tileSize.fHeight) }, 118 }; 119 matrix.mapVectors(vec, 2); 120 121 fBaseFrequency.set(SkScalarInvert(vec[0].fX), SkScalarInvert(vec[0].fY)); 122 fTileSize.set(SkScalarRoundToInt(vec[1].fX), SkScalarRoundToInt(vec[1].fY)); 123 this->init(seed); 124 if (!fTileSize.isEmpty()) { 125 this->stitch(); 126 } 127 128 #if SK_SUPPORT_GPU 129 fPermutationsBitmap.setInfo(SkImageInfo::MakeA8(kBlockSize, 1)); 130 fPermutationsBitmap.setPixels(fLatticeSelector); 131 132 fNoiseBitmap.setInfo(SkImageInfo::MakeN32Premul(kBlockSize, 4)); 133 fNoiseBitmap.setPixels(fNoise[0][0]); 134 135 fImprovedPermutationsBitmap.setInfo(SkImageInfo::MakeA8(256, 1)); 136 fImprovedPermutationsBitmap.setPixels(improved_noise_permutations); 137 138 fGradientBitmap.setInfo(SkImageInfo::MakeN32Premul(16, 1)); 139 static uint8_t gradients[] = { 2, 2, 1, 0, 140 0, 2, 1, 0, 141 2, 0, 1, 0, 142 0, 0, 1, 0, 143 2, 1, 2, 0, 144 0, 1, 2, 0, 145 2, 1, 0, 0, 146 0, 1, 0, 0, 147 1, 2, 2, 0, 148 1, 0, 2, 0, 149 1, 2, 0, 0, 150 1, 0, 0, 0, 151 2, 2, 1, 0, 152 1, 0, 2, 0, 153 0, 2, 1, 0, 154 1, 0, 0, 0 }; 155 fGradientBitmap.setPixels(gradients); 156 #endif 157 } 158 159 int fSeed; 160 uint8_t fLatticeSelector[kBlockSize]; 161 uint16_t fNoise[4][kBlockSize][2]; 162 SkPoint fGradient[4][kBlockSize]; 163 SkISize fTileSize; 164 SkVector fBaseFrequency; 165 StitchData fStitchDataInit; 166 167 private: 168 169 #if SK_SUPPORT_GPU 170 SkBitmap fPermutationsBitmap; 171 SkBitmap fNoiseBitmap; 172 SkBitmap fImprovedPermutationsBitmap; 173 SkBitmap fGradientBitmap; 174 #endif 175 176 inline int random() { 177 static const int gRandAmplitude = 16807; // 7**5; primitive root of m 178 static const int gRandQ = 127773; // m / a 179 static const int gRandR = 2836; // m % a 180 181 int result = gRandAmplitude * (fSeed % gRandQ) - gRandR * (fSeed / gRandQ); 182 if (result <= 0) 183 result += kRandMaximum; 184 fSeed = result; 185 return result; 186 } 187 188 // Only called once. Could be part of the constructor. 189 void init(SkScalar seed) 190 { 191 static const SkScalar gInvBlockSizef = SkScalarInvert(SkIntToScalar(kBlockSize)); 192 193 // According to the SVG spec, we must truncate (not round) the seed value. 194 fSeed = SkScalarTruncToInt(seed); 195 // The seed value clamp to the range [1, kRandMaximum - 1]. 196 if (fSeed <= 0) { 197 fSeed = -(fSeed % (kRandMaximum - 1)) + 1; 198 } 199 if (fSeed > kRandMaximum - 1) { 200 fSeed = kRandMaximum - 1; 201 } 202 for (int channel = 0; channel < 4; ++channel) { 203 for (int i = 0; i < kBlockSize; ++i) { 204 fLatticeSelector[i] = i; 205 fNoise[channel][i][0] = (random() % (2 * kBlockSize)); 206 fNoise[channel][i][1] = (random() % (2 * kBlockSize)); 207 } 208 } 209 for (int i = kBlockSize - 1; i > 0; --i) { 210 int k = fLatticeSelector[i]; 211 int j = random() % kBlockSize; 212 SkASSERT(j >= 0); 213 SkASSERT(j < kBlockSize); 214 fLatticeSelector[i] = fLatticeSelector[j]; 215 fLatticeSelector[j] = k; 216 } 217 218 // Perform the permutations now 219 { 220 // Copy noise data 221 uint16_t noise[4][kBlockSize][2]; 222 for (int i = 0; i < kBlockSize; ++i) { 223 for (int channel = 0; channel < 4; ++channel) { 224 for (int j = 0; j < 2; ++j) { 225 noise[channel][i][j] = fNoise[channel][i][j]; 226 } 227 } 228 } 229 // Do permutations on noise data 230 for (int i = 0; i < kBlockSize; ++i) { 231 for (int channel = 0; channel < 4; ++channel) { 232 for (int j = 0; j < 2; ++j) { 233 fNoise[channel][i][j] = noise[channel][fLatticeSelector[i]][j]; 234 } 235 } 236 } 237 } 238 239 // Half of the largest possible value for 16 bit unsigned int 240 static const SkScalar gHalfMax16bits = 32767.5f; 241 242 // Compute gradients from permutated noise data 243 for (int channel = 0; channel < 4; ++channel) { 244 for (int i = 0; i < kBlockSize; ++i) { 245 fGradient[channel][i] = SkPoint::Make( 246 SkScalarMul(SkIntToScalar(fNoise[channel][i][0] - kBlockSize), 247 gInvBlockSizef), 248 SkScalarMul(SkIntToScalar(fNoise[channel][i][1] - kBlockSize), 249 gInvBlockSizef)); 250 fGradient[channel][i].normalize(); 251 // Put the normalized gradient back into the noise data 252 fNoise[channel][i][0] = SkScalarRoundToInt(SkScalarMul( 253 fGradient[channel][i].fX + SK_Scalar1, gHalfMax16bits)); 254 fNoise[channel][i][1] = SkScalarRoundToInt(SkScalarMul( 255 fGradient[channel][i].fY + SK_Scalar1, gHalfMax16bits)); 256 } 257 } 258 } 259 260 // Only called once. Could be part of the constructor. 261 void stitch() { 262 SkScalar tileWidth = SkIntToScalar(fTileSize.width()); 263 SkScalar tileHeight = SkIntToScalar(fTileSize.height()); 264 SkASSERT(tileWidth > 0 && tileHeight > 0); 265 // When stitching tiled turbulence, the frequencies must be adjusted 266 // so that the tile borders will be continuous. 267 if (fBaseFrequency.fX) { 268 SkScalar lowFrequencx = 269 SkScalarFloorToScalar(tileWidth * fBaseFrequency.fX) / tileWidth; 270 SkScalar highFrequencx = 271 SkScalarCeilToScalar(tileWidth * fBaseFrequency.fX) / tileWidth; 272 // BaseFrequency should be non-negative according to the standard. 273 if (fBaseFrequency.fX / lowFrequencx < highFrequencx / fBaseFrequency.fX) { 274 fBaseFrequency.fX = lowFrequencx; 275 } else { 276 fBaseFrequency.fX = highFrequencx; 277 } 278 } 279 if (fBaseFrequency.fY) { 280 SkScalar lowFrequency = 281 SkScalarFloorToScalar(tileHeight * fBaseFrequency.fY) / tileHeight; 282 SkScalar highFrequency = 283 SkScalarCeilToScalar(tileHeight * fBaseFrequency.fY) / tileHeight; 284 if (fBaseFrequency.fY / lowFrequency < highFrequency / fBaseFrequency.fY) { 285 fBaseFrequency.fY = lowFrequency; 286 } else { 287 fBaseFrequency.fY = highFrequency; 288 } 289 } 290 // Set up TurbulenceInitial stitch values. 291 fStitchDataInit.fWidth = 292 SkScalarRoundToInt(tileWidth * fBaseFrequency.fX); 293 fStitchDataInit.fWrapX = kPerlinNoise + fStitchDataInit.fWidth; 294 fStitchDataInit.fHeight = 295 SkScalarRoundToInt(tileHeight * fBaseFrequency.fY); 296 fStitchDataInit.fWrapY = kPerlinNoise + fStitchDataInit.fHeight; 297 } 298 299 public: 300 301 #if SK_SUPPORT_GPU 302 const SkBitmap& getPermutationsBitmap() const { return fPermutationsBitmap; } 303 304 const SkBitmap& getNoiseBitmap() const { return fNoiseBitmap; } 305 306 const SkBitmap& getImprovedPermutationsBitmap() const { return fImprovedPermutationsBitmap; } 307 308 const SkBitmap& getGradientBitmap() const { return fGradientBitmap; } 309 #endif 310 }; 311 312 SkShader* SkPerlinNoiseShader2::CreateFractalNoise(SkScalar baseFrequencyX, SkScalar baseFrequencyY, 313 int numOctaves, SkScalar seed, 314 const SkISize* tileSize) { 315 return new SkPerlinNoiseShader2(kFractalNoise_Type, baseFrequencyX, baseFrequencyY, numOctaves, 316 seed, tileSize); 317 } 318 319 SkShader* SkPerlinNoiseShader2::CreateTurbulence(SkScalar baseFrequencyX, SkScalar baseFrequencyY, 320 int numOctaves, SkScalar seed, 321 const SkISize* tileSize) { 322 return new SkPerlinNoiseShader2(kTurbulence_Type, baseFrequencyX, baseFrequencyY, numOctaves, 323 seed, tileSize); 324 } 325 326 SkShader* SkPerlinNoiseShader2::CreateImprovedNoise(SkScalar baseFrequencyX, SkScalar baseFrequencyY, 327 int numOctaves, SkScalar z) { 328 return new SkPerlinNoiseShader2(kImprovedNoise_Type, baseFrequencyX, baseFrequencyY, numOctaves, 329 z, NULL); 330 } 331 332 SkPerlinNoiseShader2::SkPerlinNoiseShader2(SkPerlinNoiseShader2::Type type, 333 SkScalar baseFrequencyX, 334 SkScalar baseFrequencyY, 335 int numOctaves, 336 SkScalar seed, 337 const SkISize* tileSize) 338 : fType(type) 339 , fBaseFrequencyX(baseFrequencyX) 340 , fBaseFrequencyY(baseFrequencyY) 341 , fNumOctaves(numOctaves > 255 ? 255 : numOctaves/*[0,255] octaves allowed*/) 342 , fSeed(seed) 343 , fTileSize(nullptr == tileSize ? SkISize::Make(0, 0) : *tileSize) 344 , fStitchTiles(!fTileSize.isEmpty()) 345 { 346 SkASSERT(numOctaves >= 0 && numOctaves < 256); 347 } 348 349 SkPerlinNoiseShader2::~SkPerlinNoiseShader2() { 350 } 351 352 SkFlattenable* SkPerlinNoiseShader2::CreateProc(SkReadBuffer& buffer) { 353 Type type = (Type)buffer.readInt(); 354 SkScalar freqX = buffer.readScalar(); 355 SkScalar freqY = buffer.readScalar(); 356 int octaves = buffer.readInt(); 357 SkScalar seed = buffer.readScalar(); 358 SkISize tileSize; 359 tileSize.fWidth = buffer.readInt(); 360 tileSize.fHeight = buffer.readInt(); 361 362 switch (type) { 363 case kFractalNoise_Type: 364 return SkPerlinNoiseShader2::CreateFractalNoise(freqX, freqY, octaves, seed, &tileSize); 365 case kTurbulence_Type: 366 return SkPerlinNoiseShader2::CreateTubulence(freqX, freqY, octaves, seed, &tileSize); 367 case kImprovedNoise_Type: 368 return SkPerlinNoiseShader2::CreateImprovedNoise(freqX, freqY, octaves, seed); 369 default: 370 return nullptr; 371 } 372 } 373 374 void SkPerlinNoiseShader2::flatten(SkWriteBuffer& buffer) const { 375 buffer.writeInt((int) fType); 376 buffer.writeScalar(fBaseFrequencyX); 377 buffer.writeScalar(fBaseFrequencyY); 378 buffer.writeInt(fNumOctaves); 379 buffer.writeScalar(fSeed); 380 buffer.writeInt(fTileSize.fWidth); 381 buffer.writeInt(fTileSize.fHeight); 382 } 383 384 SkScalar SkPerlinNoiseShader2::PerlinNoiseShaderContext::noise2D( 385 int channel, const StitchData& stitchData, const SkPoint& noiseVector) const { 386 struct Noise { 387 int noisePositionIntegerValue; 388 int nextNoisePositionIntegerValue; 389 SkScalar noisePositionFractionValue; 390 Noise(SkScalar component) 391 { 392 SkScalar position = component + kPerlinNoise; 393 noisePositionIntegerValue = SkScalarFloorToInt(position); 394 noisePositionFractionValue = position - SkIntToScalar(noisePositionIntegerValue); 395 nextNoisePositionIntegerValue = noisePositionIntegerValue + 1; 396 } 397 }; 398 Noise noiseX(noiseVector.x()); 399 Noise noiseY(noiseVector.y()); 400 SkScalar u, v; 401 const SkPerlinNoiseShader2& perlinNoiseShader = static_cast<const SkPerlinNoiseShader2&>(fShader); 402 // If stitching, adjust lattice points accordingly. 403 if (perlinNoiseShader.fStitchTiles) { 404 noiseX.noisePositionIntegerValue = 405 checkNoise(noiseX.noisePositionIntegerValue, stitchData.fWrapX, stitchData.fWidth); 406 noiseY.noisePositionIntegerValue = 407 checkNoise(noiseY.noisePositionIntegerValue, stitchData.fWrapY, stitchData.fHeight); 408 noiseX.nextNoisePositionIntegerValue = 409 checkNoise(noiseX.nextNoisePositionIntegerValue, stitchData.fWrapX, stitchData.fWidth); 410 noiseY.nextNoisePositionIntegerValue = 411 checkNoise(noiseY.nextNoisePositionIntegerValue, stitchData.fWrapY, stitchData.fHeight); 412 } 413 noiseX.noisePositionIntegerValue &= kBlockMask; 414 noiseY.noisePositionIntegerValue &= kBlockMask; 415 noiseX.nextNoisePositionIntegerValue &= kBlockMask; 416 noiseY.nextNoisePositionIntegerValue &= kBlockMask; 417 int i = 418 fPaintingData->fLatticeSelector[noiseX.noisePositionIntegerValue]; 419 int j = 420 fPaintingData->fLatticeSelector[noiseX.nextNoisePositionIntegerValue]; 421 int b00 = (i + noiseY.noisePositionIntegerValue) & kBlockMask; 422 int b10 = (j + noiseY.noisePositionIntegerValue) & kBlockMask; 423 int b01 = (i + noiseY.nextNoisePositionIntegerValue) & kBlockMask; 424 int b11 = (j + noiseY.nextNoisePositionIntegerValue) & kBlockMask; 425 SkScalar sx = smoothCurve(noiseX.noisePositionFractionValue); 426 SkScalar sy = smoothCurve(noiseY.noisePositionFractionValue); 427 // This is taken 1:1 from SVG spec: http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement 428 SkPoint fractionValue = SkPoint::Make(noiseX.noisePositionFractionValue, 429 noiseY.noisePositionFractionValue); // Offset (0,0) 430 u = fPaintingData->fGradient[channel][b00].dot(fractionValue); 431 fractionValue.fX -= SK_Scalar1; // Offset (-1,0) 432 v = fPaintingData->fGradient[channel][b10].dot(fractionValue); 433 SkScalar a = SkScalarInterp(u, v, sx); 434 fractionValue.fY -= SK_Scalar1; // Offset (-1,-1) 435 v = fPaintingData->fGradient[channel][b11].dot(fractionValue); 436 fractionValue.fX = noiseX.noisePositionFractionValue; // Offset (0,-1) 437 u = fPaintingData->fGradient[channel][b01].dot(fractionValue); 438 SkScalar b = SkScalarInterp(u, v, sx); 439 return SkScalarInterp(a, b, sy); 440 } 441 442 SkScalar SkPerlinNoiseShader2::PerlinNoiseShaderContext::calculateTurbulenceValueForPoint( 443 int channel, StitchData& stitchData, const SkPoint& point) const { 444 const SkPerlinNoiseShader2& perlinNoiseShader = static_cast<const SkPerlinNoiseShader2&>(fShader); 445 if (perlinNoiseShader.fStitchTiles) { 446 // Set up TurbulenceInitial stitch values. 447 stitchData = fPaintingData->fStitchDataInit; 448 } 449 SkScalar turbulenceFunctionResult = 0; 450 SkPoint noiseVector(SkPoint::Make(SkScalarMul(point.x(), fPaintingData->fBaseFrequency.fX), 451 SkScalarMul(point.y(), fPaintingData->fBaseFrequency.fY))); 452 SkScalar ratio = SK_Scalar1; 453 for (int octave = 0; octave < perlinNoiseShader.fNumOctaves; ++octave) { 454 SkScalar noise = noise2D(channel, stitchData, noiseVector); 455 SkScalar numer = (perlinNoiseShader.fType == kFractalNoise_Type) ? 456 noise : SkScalarAbs(noise); 457 turbulenceFunctionResult += numer / ratio; 458 noiseVector.fX *= 2; 459 noiseVector.fY *= 2; 460 ratio *= 2; 461 if (perlinNoiseShader.fStitchTiles) { 462 // Update stitch values 463 stitchData.fWidth *= 2; 464 stitchData.fWrapX = stitchData.fWidth + kPerlinNoise; 465 stitchData.fHeight *= 2; 466 stitchData.fWrapY = stitchData.fHeight + kPerlinNoise; 467 } 468 } 469 470 // The value of turbulenceFunctionResult comes from ((turbulenceFunctionResult) + 1) / 2 471 // by fractalNoise and (turbulenceFunctionResult) by turbulence. 472 if (perlinNoiseShader.fType == kFractalNoise_Type) { 473 turbulenceFunctionResult = 474 SkScalarMul(turbulenceFunctionResult, SK_ScalarHalf) + SK_ScalarHalf; 475 } 476 477 if (channel == 3) { // Scale alpha by paint value 478 turbulenceFunctionResult *= SkIntToScalar(getPaintAlpha()) / 255; 479 } 480 481 // Clamp result 482 return SkScalarPin(turbulenceFunctionResult, 0, SK_Scalar1); 483 } 484 485 //////////////////////////////////////////////////////////////////////////////////////////////////// 486 // Improved Perlin Noise based on Java implementation found at http://mrl.nyu.edu/~perlin/noise/ 487 static SkScalar fade(SkScalar t) { 488 return t * t * t * (t * (t * 6 - 15) + 10); 489 } 490 491 static SkScalar lerp(SkScalar t, SkScalar a, SkScalar b) { 492 return a + t * (b - a); 493 } 494 495 static SkScalar grad(int hash, SkScalar x, SkScalar y, SkScalar z) { 496 int h = hash & 15; 497 SkScalar u = h < 8 ? x : y; 498 SkScalar v = h < 4 ? y : h == 12 || h == 14 ? x : z; 499 return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v); 500 } 501 502 SkScalar SkPerlinNoiseShader2::PerlinNoiseShaderContext::calculateImprovedNoiseValueForPoint( 503 int channel, const SkPoint& point) const { 504 const SkPerlinNoiseShader2& perlinNoiseShader = static_cast<const SkPerlinNoiseShader2&>(fShader); 505 SkScalar x = point.fX * perlinNoiseShader.fBaseFrequencyX; 506 SkScalar y = point.fY * perlinNoiseShader.fBaseFrequencyY; 507 // z offset between different channels, chosen arbitrarily 508 static const SkScalar CHANNEL_DELTA = 1000.0f; 509 SkScalar z = channel * CHANNEL_DELTA + perlinNoiseShader.fSeed; 510 SkScalar result = 0; 511 SkScalar ratio = SK_Scalar1; 512 for (int i = 0; i < perlinNoiseShader.fNumOctaves; i++) { 513 int X = SkScalarFloorToInt(x) & 255; 514 int Y = SkScalarFloorToInt(y) & 255; 515 int Z = SkScalarFloorToInt(z) & 255; 516 SkScalar px = x - SkScalarFloorToScalar(x); 517 SkScalar py = y - SkScalarFloorToScalar(y); 518 SkScalar pz = z - SkScalarFloorToScalar(z); 519 SkScalar u = fade(px); 520 SkScalar v = fade(py); 521 SkScalar w = fade(pz); 522 uint8_t* permutations = improved_noise_permutations; 523 int A = permutations[X] + Y; 524 int AA = permutations[A] + Z; 525 int AB = permutations[A + 1] + Z; 526 int B = permutations[X + 1] + Y; 527 int BA = permutations[B] + Z; 528 int BB = permutations[B + 1] + Z; 529 result += lerp(w, lerp(v, lerp(u, grad(permutations[AA ], px , py , pz ), 530 grad(permutations[BA ], px - 1, py , pz )), 531 lerp(u, grad(permutations[AB ], px , py - 1, pz ), 532 grad(permutations[BB ], px - 1, py - 1, pz ))), 533 lerp(v, lerp(u, grad(permutations[AA + 1], px , py , pz - 1), 534 grad(permutations[BA + 1], px - 1, py , pz - 1)), 535 lerp(u, grad(permutations[AB + 1], px , py - 1, pz - 1), 536 grad(permutations[BB + 1], px - 1, py - 1, pz - 1)))) / 537 ratio; 538 x *= 2; 539 y *= 2; 540 ratio *= 2; 541 } 542 result = SkScalarClampMax((result + 1.0f) / 2.0f, 1.0f); 543 return result; 544 } 545 //////////////////////////////////////////////////////////////////////////////////////////////////// 546 547 SkPMColor SkPerlinNoiseShader2::PerlinNoiseShaderContext::shade( 548 const SkPoint& point, StitchData& stitchData) const { 549 const SkPerlinNoiseShader2& perlinNoiseShader = static_cast<const SkPerlinNoiseShader2&>(fShader); 550 SkPoint newPoint; 551 fMatrix.mapPoints(&newPoint, &point, 1); 552 newPoint.fX = SkScalarRoundToScalar(newPoint.fX); 553 newPoint.fY = SkScalarRoundToScalar(newPoint.fY); 554 555 U8CPU rgba[4]; 556 for (int channel = 3; channel >= 0; --channel) { 557 SkScalar value; 558 if (perlinNoiseShader.fType == kImprovedNoise_Type) { 559 value = calculateImprovedNoiseValueForPoint(channel, newPoint); 560 } 561 else { 562 value = calculateTurbulenceValueForPoint(channel, stitchData, newPoint); 563 } 564 rgba[channel] = SkScalarFloorToInt(255 * value); 565 } 566 return SkPreMultiplyARGB(rgba[3], rgba[0], rgba[1], rgba[2]); 567 } 568 569 SkShader::Context* SkPerlinNoiseShader2::onCreateContext(const ContextRec& rec, 570 void* storage) const { 571 return new (storage) PerlinNoiseShaderContext(*this, rec); 572 } 573 574 size_t SkPerlinNoiseShader2::contextSize(const ContextRec&) const { 575 return sizeof(PerlinNoiseShaderContext); 576 } 577 578 SkPerlinNoiseShader2::PerlinNoiseShaderContext::PerlinNoiseShaderContext( 579 const SkPerlinNoiseShader2& shader, const ContextRec& rec) 580 : INHERITED(shader, rec) 581 { 582 SkMatrix newMatrix = *rec.fMatrix; 583 newMatrix.preConcat(shader.getLocalMatrix()); 584 if (rec.fLocalMatrix) { 585 newMatrix.preConcat(*rec.fLocalMatrix); 586 } 587 // This (1,1) translation is due to WebKit's 1 based coordinates for the noise 588 // (as opposed to 0 based, usually). The same adjustment is in the setData() function. 589 fMatrix.setTranslate(-newMatrix.getTranslateX() + SK_Scalar1, -newMatrix.getTranslateY() + SK_Scalar1); 590 fPaintingData = new PaintingData(shader.fTileSize, shader.fSeed, shader.fBaseFrequencyX, 591 shader.fBaseFrequencyY, newMatrix); 592 } 593 594 SkPerlinNoiseShader2::PerlinNoiseShaderContext::~PerlinNoiseShaderContext() { delete fPaintingData; } 595 596 void SkPerlinNoiseShader2::PerlinNoiseShaderContext::shadeSpan( 597 int x, int y, SkPMColor result[], int count) { 598 SkPoint point = SkPoint::Make(SkIntToScalar(x), SkIntToScalar(y)); 599 StitchData stitchData; 600 for (int i = 0; i < count; ++i) { 601 result[i] = shade(point, stitchData); 602 point.fX += SK_Scalar1; 603 } 604 } 605 606 ///////////////////////////////////////////////////////////////////// 607 608 #if SK_SUPPORT_GPU 609 610 class GrGLPerlinNoise2 : public GrGLSLFragmentProcessor { 611 public: 612 void emitCode(EmitArgs&) override; 613 614 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder* b); 615 616 protected: 617 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override; 618 619 private: 620 GrGLSLProgramDataManager::UniformHandle fStitchDataUni; 621 GrGLSLProgramDataManager::UniformHandle fBaseFrequencyUni; 622 623 typedef GrGLSLFragmentProcessor INHERITED; 624 }; 625 626 ///////////////////////////////////////////////////////////////////// 627 628 class GrPerlinNoise2Effect : public GrFragmentProcessor { 629 public: 630 static GrFragmentProcessor* Create(SkPerlinNoiseShader2::Type type, 631 int numOctaves, bool stitchTiles, 632 SkPerlinNoiseShader2::PaintingData* paintingData, 633 GrTexture* permutationsTexture, GrTexture* noiseTexture, 634 const SkMatrix& matrix) { 635 return new GrPerlinNoise2Effect(type, numOctaves, stitchTiles, paintingData, 636 permutationsTexture, noiseTexture, matrix); 637 } 638 639 virtual ~GrPerlinNoise2Effect() { delete fPaintingData; } 640 641 const char* name() const override { return "PerlinNoise"; } 642 643 const SkPerlinNoiseShader2::StitchData& stitchData() const { return fPaintingData->fStitchDataInit; } 644 645 SkPerlinNoiseShader2::Type type() const { return fType; } 646 bool stitchTiles() const { return fStitchTiles; } 647 const SkVector& baseFrequency() const { return fPaintingData->fBaseFrequency; } 648 int numOctaves() const { return fNumOctaves; } 649 const SkMatrix& matrix() const { return fCoordTransform.getMatrix(); } 650 651 private: 652 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override { 653 return new GrGLPerlinNoise2; 654 } 655 656 virtual void onGetGLSLProcessorKey(const GrGLSLCaps& caps, 657 GrProcessorKeyBuilder* b) const override { 658 GrGLPerlinNoise2::GenKey(*this, caps, b); 659 } 660 661 bool onIsEqual(const GrFragmentProcessor& sBase) const override { 662 const GrPerlinNoise2Effect& s = sBase.cast<GrPerlinNoise2Effect>(); 663 return fType == s.fType && 664 fPaintingData->fBaseFrequency == s.fPaintingData->fBaseFrequency && 665 fNumOctaves == s.fNumOctaves && 666 fStitchTiles == s.fStitchTiles && 667 fPaintingData->fStitchDataInit == s.fPaintingData->fStitchDataInit; 668 } 669 670 void onComputeInvariantOutput(GrInvariantOutput* inout) const override { 671 inout->setToUnknown(GrInvariantOutput::kWillNot_ReadInput); 672 } 673 674 GrPerlinNoise2Effect(SkPerlinNoiseShader2::Type type, 675 int numOctaves, bool stitchTiles, 676 SkPerlinNoiseShader2::PaintingData* paintingData, 677 GrTexture* permutationsTexture, GrTexture* noiseTexture, 678 const SkMatrix& matrix) 679 : fType(type) 680 , fNumOctaves(numOctaves) 681 , fStitchTiles(stitchTiles) 682 , fPermutationsAccess(permutationsTexture) 683 , fNoiseAccess(noiseTexture) 684 , fPaintingData(paintingData) { 685 this->initClassID<GrPerlinNoise2Effect>(); 686 this->addTextureAccess(&fPermutationsAccess); 687 this->addTextureAccess(&fNoiseAccess); 688 fCoordTransform.reset(kLocal_GrCoordSet, matrix); 689 this->addCoordTransform(&fCoordTransform); 690 } 691 692 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; 693 694 SkPerlinNoiseShader2::Type fType; 695 GrCoordTransform fCoordTransform; 696 int fNumOctaves; 697 bool fStitchTiles; 698 GrTextureAccess fPermutationsAccess; 699 GrTextureAccess fNoiseAccess; 700 SkPerlinNoiseShader2::PaintingData *fPaintingData; 701 702 private: 703 typedef GrFragmentProcessor INHERITED; 704 }; 705 706 ///////////////////////////////////////////////////////////////////// 707 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrPerlinNoise2Effect); 708 709 const GrFragmentProcessor* GrPerlinNoise2Effect::TestCreate(GrProcessorTestData* d) { 710 int numOctaves = d->fRandom->nextRangeU(2, 10); 711 bool stitchTiles = d->fRandom->nextBool(); 712 SkScalar seed = SkIntToScalar(d->fRandom->nextU()); 713 SkISize tileSize = SkISize::Make(d->fRandom->nextRangeU(4, 4096), 714 d->fRandom->nextRangeU(4, 4096)); 715 SkScalar baseFrequencyX = d->fRandom->nextRangeScalar(0.01f, 716 0.99f); 717 SkScalar baseFrequencyY = d->fRandom->nextRangeScalar(0.01f, 718 0.99f); 719 720 SkAutoTUnref<SkShader> shader(d->fRandom->nextBool() ? 721 SkPerlinNoiseShader2::CreateFractalNoise(baseFrequencyX, baseFrequencyY, numOctaves, seed, 722 stitchTiles ? &tileSize : nullptr) : 723 SkPerlinNoiseShader2::CreateTurbulence(baseFrequencyX, baseFrequencyY, numOctaves, seed, 724 stitchTiles ? &tileSize : nullptr)); 725 726 GrPaint grPaint; 727 return shader->asFragmentProcessor(d->fContext, 728 GrTest::TestMatrix(d->fRandom), nullptr, 729 kNone_SkFilterQuality); 730 } 731 732 void GrGLPerlinNoise2::emitCode(EmitArgs& args) { 733 const GrPerlinNoise2Effect& pne = args.fFp.cast<GrPerlinNoise2Effect>(); 734 735 GrGLSLFragmentBuilder* fsBuilder = args.fFragBuilder; 736 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; 737 SkString vCoords = fsBuilder->ensureFSCoords2D(args.fCoords, 0); 738 739 fBaseFrequencyUni = uniformHandler->addUniform(kFragment_GrShaderFlag, 740 kVec2f_GrSLType, kDefault_GrSLPrecision, 741 "baseFrequency"); 742 const char* baseFrequencyUni = uniformHandler->getUniformCStr(fBaseFrequencyUni); 743 744 const char* stitchDataUni = nullptr; 745 if (pne.stitchTiles()) { 746 fStitchDataUni = uniformHandler->addUniform(kFragment_GrShaderFlag, 747 kVec2f_GrSLType, kDefault_GrSLPrecision, 748 "stitchData"); 749 stitchDataUni = uniformHandler->getUniformCStr(fStitchDataUni); 750 } 751 752 // There are 4 lines, so the center of each line is 1/8, 3/8, 5/8 and 7/8 753 const char* chanCoordR = "0.125"; 754 const char* chanCoordG = "0.375"; 755 const char* chanCoordB = "0.625"; 756 const char* chanCoordA = "0.875"; 757 const char* chanCoord = "chanCoord"; 758 const char* stitchData = "stitchData"; 759 const char* ratio = "ratio"; 760 const char* noiseVec = "noiseVec"; 761 const char* noiseSmooth = "noiseSmooth"; 762 const char* floorVal = "floorVal"; 763 const char* fractVal = "fractVal"; 764 const char* uv = "uv"; 765 const char* ab = "ab"; 766 const char* latticeIdx = "latticeIdx"; 767 const char* bcoords = "bcoords"; 768 const char* lattice = "lattice"; 769 const char* inc8bit = "0.00390625"; // 1.0 / 256.0 770 // This is the math to convert the two 16bit integer packed into rgba 8 bit input into a 771 // [-1,1] vector and perform a dot product between that vector and the provided vector. 772 const char* dotLattice = "dot(((%s.ga + %s.rb * vec2(%s)) * vec2(2.0) - vec2(1.0)), %s);"; 773 774 // Add noise function 775 static const GrGLSLShaderVar gPerlinNoiseArgs[] = { 776 GrGLSLShaderVar(chanCoord, kFloat_GrSLType), 777 GrGLSLShaderVar(noiseVec, kVec2f_GrSLType) 778 }; 779 780 static const GrGLSLShaderVar gPerlinNoiseStitchArgs[] = { 781 GrGLSLShaderVar(chanCoord, kFloat_GrSLType), 782 GrGLSLShaderVar(noiseVec, kVec2f_GrSLType), 783 GrGLSLShaderVar(stitchData, kVec2f_GrSLType) 784 }; 785 786 SkString noiseCode; 787 788 noiseCode.appendf("\tvec4 %s;\n", floorVal); 789 noiseCode.appendf("\t%s.xy = floor(%s);\n", floorVal, noiseVec); 790 noiseCode.appendf("\t%s.zw = %s.xy + vec2(1.0);\n", floorVal, floorVal); 791 noiseCode.appendf("\tvec2 %s = fract(%s);\n", fractVal, noiseVec); 792 793 // smooth curve : t * t * (3 - 2 * t) 794 noiseCode.appendf("\n\tvec2 %s = %s * %s * (vec2(3.0) - vec2(2.0) * %s);", 795 noiseSmooth, fractVal, fractVal, fractVal); 796 797 // Adjust frequencies if we're stitching tiles 798 if (pne.stitchTiles()) { 799 noiseCode.appendf("\n\tif(%s.x >= %s.x) { %s.x -= %s.x; }", 800 floorVal, stitchData, floorVal, stitchData); 801 noiseCode.appendf("\n\tif(%s.y >= %s.y) { %s.y -= %s.y; }", 802 floorVal, stitchData, floorVal, stitchData); 803 noiseCode.appendf("\n\tif(%s.z >= %s.x) { %s.z -= %s.x; }", 804 floorVal, stitchData, floorVal, stitchData); 805 noiseCode.appendf("\n\tif(%s.w >= %s.y) { %s.w -= %s.y; }", 806 floorVal, stitchData, floorVal, stitchData); 807 } 808 809 // Get texture coordinates and normalize 810 noiseCode.appendf("\n\t%s = fract(floor(mod(%s, 256.0)) / vec4(256.0));\n", 811 floorVal, floorVal); 812 813 // Get permutation for x 814 { 815 SkString xCoords(""); 816 xCoords.appendf("vec2(%s.x, 0.5)", floorVal); 817 818 noiseCode.appendf("\n\tvec2 %s;\n\t%s.x = ", latticeIdx, latticeIdx); 819 fsBuilder->appendTextureLookup(&noiseCode, args.fSamplers[0], xCoords.c_str(), 820 kVec2f_GrSLType); 821 noiseCode.append(".r;"); 822 } 823 824 // Get permutation for x + 1 825 { 826 SkString xCoords(""); 827 xCoords.appendf("vec2(%s.z, 0.5)", floorVal); 828 829 noiseCode.appendf("\n\t%s.y = ", latticeIdx); 830 fsBuilder->appendTextureLookup(&noiseCode, args.fSamplers[0], xCoords.c_str(), 831 kVec2f_GrSLType); 832 noiseCode.append(".r;"); 833 } 834 835 #if defined(SK_BUILD_FOR_ANDROID) 836 // Android rounding for Tegra devices, like, for example: Xoom (Tegra 2), Nexus 7 (Tegra 3). 837 // The issue is that colors aren't accurate enough on Tegra devices. For example, if an 8 bit 838 // value of 124 (or 0.486275 here) is entered, we can get a texture value of 123.513725 839 // (or 0.484368 here). The following rounding operation prevents these precision issues from 840 // affecting the result of the noise by making sure that we only have multiples of 1/255. 841 // (Note that 1/255 is about 0.003921569, which is the value used here). 842 noiseCode.appendf("\n\t%s = floor(%s * vec2(255.0) + vec2(0.5)) * vec2(0.003921569);", 843 latticeIdx, latticeIdx); 844 #endif 845 846 // Get (x,y) coordinates with the permutated x 847 noiseCode.appendf("\n\tvec4 %s = fract(%s.xyxy + %s.yyww);", bcoords, latticeIdx, floorVal); 848 849 noiseCode.appendf("\n\n\tvec2 %s;", uv); 850 // Compute u, at offset (0,0) 851 { 852 SkString latticeCoords(""); 853 latticeCoords.appendf("vec2(%s.x, %s)", bcoords, chanCoord); 854 noiseCode.appendf("\n\tvec4 %s = ", lattice); 855 fsBuilder->appendTextureLookup(&noiseCode, args.fSamplers[1], latticeCoords.c_str(), 856 kVec2f_GrSLType); 857 noiseCode.appendf(".bgra;\n\t%s.x = ", uv); 858 noiseCode.appendf(dotLattice, lattice, lattice, inc8bit, fractVal); 859 } 860 861 noiseCode.appendf("\n\t%s.x -= 1.0;", fractVal); 862 // Compute v, at offset (-1,0) 863 { 864 SkString latticeCoords(""); 865 latticeCoords.appendf("vec2(%s.y, %s)", bcoords, chanCoord); 866 noiseCode.append("\n\tlattice = "); 867 fsBuilder->appendTextureLookup(&noiseCode, args.fSamplers[1], latticeCoords.c_str(), 868 kVec2f_GrSLType); 869 noiseCode.appendf(".bgra;\n\t%s.y = ", uv); 870 noiseCode.appendf(dotLattice, lattice, lattice, inc8bit, fractVal); 871 } 872 873 // Compute 'a' as a linear interpolation of 'u' and 'v' 874 noiseCode.appendf("\n\tvec2 %s;", ab); 875 noiseCode.appendf("\n\t%s.x = mix(%s.x, %s.y, %s.x);", ab, uv, uv, noiseSmooth); 876 877 noiseCode.appendf("\n\t%s.y -= 1.0;", fractVal); 878 // Compute v, at offset (-1,-1) 879 { 880 SkString latticeCoords(""); 881 latticeCoords.appendf("vec2(%s.w, %s)", bcoords, chanCoord); 882 noiseCode.append("\n\tlattice = "); 883 fsBuilder->appendTextureLookup(&noiseCode, args.fSamplers[1], latticeCoords.c_str(), 884 kVec2f_GrSLType); 885 noiseCode.appendf(".bgra;\n\t%s.y = ", uv); 886 noiseCode.appendf(dotLattice, lattice, lattice, inc8bit, fractVal); 887 } 888 889 noiseCode.appendf("\n\t%s.x += 1.0;", fractVal); 890 // Compute u, at offset (0,-1) 891 { 892 SkString latticeCoords(""); 893 latticeCoords.appendf("vec2(%s.z, %s)", bcoords, chanCoord); 894 noiseCode.append("\n\tlattice = "); 895 fsBuilder->appendTextureLookup(&noiseCode, args.fSamplers[1], latticeCoords.c_str(), 896 kVec2f_GrSLType); 897 noiseCode.appendf(".bgra;\n\t%s.x = ", uv); 898 noiseCode.appendf(dotLattice, lattice, lattice, inc8bit, fractVal); 899 } 900 901 // Compute 'b' as a linear interpolation of 'u' and 'v' 902 noiseCode.appendf("\n\t%s.y = mix(%s.x, %s.y, %s.x);", ab, uv, uv, noiseSmooth); 903 // Compute the noise as a linear interpolation of 'a' and 'b' 904 noiseCode.appendf("\n\treturn mix(%s.x, %s.y, %s.y);\n", ab, ab, noiseSmooth); 905 906 SkString noiseFuncName; 907 if (pne.stitchTiles()) { 908 fsBuilder->emitFunction(kFloat_GrSLType, 909 "perlinnoise", SK_ARRAY_COUNT(gPerlinNoiseStitchArgs), 910 gPerlinNoiseStitchArgs, noiseCode.c_str(), &noiseFuncName); 911 } else { 912 fsBuilder->emitFunction(kFloat_GrSLType, 913 "perlinnoise", SK_ARRAY_COUNT(gPerlinNoiseArgs), 914 gPerlinNoiseArgs, noiseCode.c_str(), &noiseFuncName); 915 } 916 917 // There are rounding errors if the floor operation is not performed here 918 fsBuilder->codeAppendf("\n\t\tvec2 %s = floor(%s.xy) * %s;", 919 noiseVec, vCoords.c_str(), baseFrequencyUni); 920 921 // Clear the color accumulator 922 fsBuilder->codeAppendf("\n\t\t%s = vec4(0.0);", args.fOutputColor); 923 924 if (pne.stitchTiles()) { 925 // Set up TurbulenceInitial stitch values. 926 fsBuilder->codeAppendf("\n\t\tvec2 %s = %s;", stitchData, stitchDataUni); 927 } 928 929 fsBuilder->codeAppendf("\n\t\tfloat %s = 1.0;", ratio); 930 931 // Loop over all octaves 932 fsBuilder->codeAppendf("for (int octave = 0; octave < %d; ++octave) {", pne.numOctaves()); 933 934 fsBuilder->codeAppendf("\n\t\t\t%s += ", args.fOutputColor); 935 if (pne.type() != SkPerlinNoiseShader2::kFractalNoise_Type) { 936 fsBuilder->codeAppend("abs("); 937 } 938 if (pne.stitchTiles()) { 939 fsBuilder->codeAppendf( 940 "vec4(\n\t\t\t\t%s(%s, %s, %s),\n\t\t\t\t%s(%s, %s, %s)," 941 "\n\t\t\t\t%s(%s, %s, %s),\n\t\t\t\t%s(%s, %s, %s))", 942 noiseFuncName.c_str(), chanCoordR, noiseVec, stitchData, 943 noiseFuncName.c_str(), chanCoordG, noiseVec, stitchData, 944 noiseFuncName.c_str(), chanCoordB, noiseVec, stitchData, 945 noiseFuncName.c_str(), chanCoordA, noiseVec, stitchData); 946 } else { 947 fsBuilder->codeAppendf( 948 "vec4(\n\t\t\t\t%s(%s, %s),\n\t\t\t\t%s(%s, %s)," 949 "\n\t\t\t\t%s(%s, %s),\n\t\t\t\t%s(%s, %s))", 950 noiseFuncName.c_str(), chanCoordR, noiseVec, 951 noiseFuncName.c_str(), chanCoordG, noiseVec, 952 noiseFuncName.c_str(), chanCoordB, noiseVec, 953 noiseFuncName.c_str(), chanCoordA, noiseVec); 954 } 955 if (pne.type() != SkPerlinNoiseShader2::kFractalNoise_Type) { 956 fsBuilder->codeAppendf(")"); // end of "abs(" 957 } 958 fsBuilder->codeAppendf(" * %s;", ratio); 959 960 fsBuilder->codeAppendf("\n\t\t\t%s *= vec2(2.0);", noiseVec); 961 fsBuilder->codeAppendf("\n\t\t\t%s *= 0.5;", ratio); 962 963 if (pne.stitchTiles()) { 964 fsBuilder->codeAppendf("\n\t\t\t%s *= vec2(2.0);", stitchData); 965 } 966 fsBuilder->codeAppend("\n\t\t}"); // end of the for loop on octaves 967 968 if (pne.type() == SkPerlinNoiseShader2::kFractalNoise_Type) { 969 // The value of turbulenceFunctionResult comes from ((turbulenceFunctionResult) + 1) / 2 970 // by fractalNoise and (turbulenceFunctionResult) by turbulence. 971 fsBuilder->codeAppendf("\n\t\t%s = %s * vec4(0.5) + vec4(0.5);", 972 args.fOutputColor,args.fOutputColor); 973 } 974 975 // Clamp values 976 fsBuilder->codeAppendf("\n\t\t%s = clamp(%s, 0.0, 1.0);", args.fOutputColor, args.fOutputColor); 977 978 // Pre-multiply the result 979 fsBuilder->codeAppendf("\n\t\t%s = vec4(%s.rgb * %s.aaa, %s.a);\n", 980 args.fOutputColor, args.fOutputColor, 981 args.fOutputColor, args.fOutputColor); 982 } 983 984 void GrGLPerlinNoise2::GenKey(const GrProcessor& processor, const GrGLSLCaps&, 985 GrProcessorKeyBuilder* b) { 986 const GrPerlinNoise2Effect& turbulence = processor.cast<GrPerlinNoise2Effect>(); 987 988 uint32_t key = turbulence.numOctaves(); 989 990 key = key << 3; // Make room for next 3 bits 991 992 switch (turbulence.type()) { 993 case SkPerlinNoiseShader2::kFractalNoise_Type: 994 key |= 0x1; 995 break; 996 case SkPerlinNoiseShader2::kTurbulence_Type: 997 key |= 0x2; 998 break; 999 default: 1000 // leave key at 0 1001 break; 1002 } 1003 1004 if (turbulence.stitchTiles()) { 1005 key |= 0x4; // Flip the 3rd bit if tile stitching is on 1006 } 1007 1008 b->add32(key); 1009 } 1010 1011 void GrGLPerlinNoise2::onSetData(const GrGLSLProgramDataManager& pdman, 1012 const GrProcessor& processor) { 1013 INHERITED::onSetData(pdman, processor); 1014 1015 const GrPerlinNoise2Effect& turbulence = processor.cast<GrPerlinNoise2Effect>(); 1016 1017 const SkVector& baseFrequency = turbulence.baseFrequency(); 1018 pdman.set2f(fBaseFrequencyUni, baseFrequency.fX, baseFrequency.fY); 1019 1020 if (turbulence.stitchTiles()) { 1021 const SkPerlinNoiseShader2::StitchData& stitchData = turbulence.stitchData(); 1022 pdman.set2f(fStitchDataUni, SkIntToScalar(stitchData.fWidth), 1023 SkIntToScalar(stitchData.fHeight)); 1024 } 1025 } 1026 1027 ///////////////////////////////////////////////////////////////////// 1028 1029 class GrGLImprovedPerlinNoise : public GrGLSLFragmentProcessor { 1030 public: 1031 void emitCode(EmitArgs&) override; 1032 1033 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*); 1034 1035 protected: 1036 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override; 1037 1038 private: 1039 GrGLSLProgramDataManager::UniformHandle fZUni; 1040 GrGLSLProgramDataManager::UniformHandle fOctavesUni; 1041 GrGLSLProgramDataManager::UniformHandle fBaseFrequencyUni; 1042 1043 typedef GrGLSLFragmentProcessor INHERITED; 1044 }; 1045 1046 ///////////////////////////////////////////////////////////////////// 1047 1048 class GrImprovedPerlinNoiseEffect : public GrFragmentProcessor { 1049 public: 1050 static GrFragmentProcessor* Create(int octaves, SkScalar z, 1051 SkPerlinNoiseShader2::PaintingData* paintingData, 1052 GrTexture* permutationsTexture, GrTexture* gradientTexture, 1053 const SkMatrix& matrix) { 1054 return new GrImprovedPerlinNoiseEffect(octaves, z, paintingData, permutationsTexture, 1055 gradientTexture, matrix); 1056 } 1057 1058 virtual ~GrImprovedPerlinNoiseEffect() { delete fPaintingData; } 1059 1060 const char* name() const override { return "ImprovedPerlinNoise"; } 1061 1062 const SkVector& baseFrequency() const { return fPaintingData->fBaseFrequency; } 1063 SkScalar z() const { return fZ; } 1064 int octaves() const { return fOctaves; } 1065 const SkMatrix& matrix() const { return fCoordTransform.getMatrix(); } 1066 1067 private: 1068 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override { 1069 return new GrGLImprovedPerlinNoise; 1070 } 1071 1072 void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override { 1073 GrGLImprovedPerlinNoise::GenKey(*this, caps, b); 1074 } 1075 1076 bool onIsEqual(const GrFragmentProcessor& sBase) const override { 1077 const GrImprovedPerlinNoiseEffect& s = sBase.cast<GrImprovedPerlinNoiseEffect>(); 1078 return fZ == fZ && 1079 fPaintingData->fBaseFrequency == s.fPaintingData->fBaseFrequency; 1080 } 1081 1082 void onComputeInvariantOutput(GrInvariantOutput* inout) const override { 1083 inout->setToUnknown(GrInvariantOutput::kWillNot_ReadInput); 1084 } 1085 1086 GrImprovedPerlinNoiseEffect(int octaves, SkScalar z, 1087 SkPerlinNoiseShader2::PaintingData* paintingData, 1088 GrTexture* permutationsTexture, GrTexture* gradientTexture, 1089 const SkMatrix& matrix) 1090 : fOctaves(octaves) 1091 , fZ(z) 1092 , fPermutationsAccess(permutationsTexture) 1093 , fGradientAccess(gradientTexture) 1094 , fPaintingData(paintingData) { 1095 this->initClassID<GrImprovedPerlinNoiseEffect>(); 1096 this->addTextureAccess(&fPermutationsAccess); 1097 this->addTextureAccess(&fGradientAccess); 1098 fCoordTransform.reset(kLocal_GrCoordSet, matrix); 1099 this->addCoordTransform(&fCoordTransform); 1100 } 1101 1102 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; 1103 1104 GrCoordTransform fCoordTransform; 1105 int fOctaves; 1106 SkScalar fZ; 1107 GrTextureAccess fPermutationsAccess; 1108 GrTextureAccess fGradientAccess; 1109 SkPerlinNoiseShader2::PaintingData *fPaintingData; 1110 1111 private: 1112 typedef GrFragmentProcessor INHERITED; 1113 }; 1114 1115 ///////////////////////////////////////////////////////////////////// 1116 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrImprovedPerlinNoiseEffect); 1117 1118 const GrFragmentProcessor* GrImprovedPerlinNoiseEffect::TestCreate(GrProcessorTestData* d) { 1119 SkScalar baseFrequencyX = d->fRandom->nextRangeScalar(0.01f, 1120 0.99f); 1121 SkScalar baseFrequencyY = d->fRandom->nextRangeScalar(0.01f, 1122 0.99f); 1123 int numOctaves = d->fRandom->nextRangeU(2, 10); 1124 SkScalar z = SkIntToScalar(d->fRandom->nextU()); 1125 1126 SkAutoTUnref<SkShader> shader(SkPerlinNoiseShader2::CreateImprovedNoise(baseFrequencyX, 1127 baseFrequencyY, 1128 numOctaves, 1129 z)); 1130 1131 GrPaint grPaint; 1132 return shader->asFragmentProcessor(d->fContext, 1133 GrTest::TestMatrix(d->fRandom), nullptr, 1134 kNone_SkFilterQuality); 1135 } 1136 1137 void GrGLImprovedPerlinNoise::emitCode(EmitArgs& args) { 1138 GrGLSLFragmentBuilder* fsBuilder = args.fFragBuilder; 1139 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; 1140 SkString vCoords = fsBuilder->ensureFSCoords2D(args.fCoords, 0); 1141 1142 fBaseFrequencyUni = uniformHandler->addUniform(kFragment_GrShaderFlag, 1143 kVec2f_GrSLType, kDefault_GrSLPrecision, 1144 "baseFrequency"); 1145 const char* baseFrequencyUni = uniformHandler->getUniformCStr(fBaseFrequencyUni); 1146 1147 fOctavesUni = uniformHandler->addUniform(kFragment_GrShaderFlag, 1148 kFloat_GrSLType, kDefault_GrSLPrecision, 1149 "octaves"); 1150 const char* octavesUni = uniformHandler->getUniformCStr(fOctavesUni); 1151 1152 fZUni = uniformHandler->addUniform(kFragment_GrShaderFlag, 1153 kFloat_GrSLType, kDefault_GrSLPrecision, 1154 "z"); 1155 const char* zUni = uniformHandler->getUniformCStr(fZUni); 1156 1157 // fade function 1158 static const GrGLSLShaderVar fadeArgs[] = { 1159 GrGLSLShaderVar("t", kVec3f_GrSLType) 1160 }; 1161 SkString fadeFuncName; 1162 fsBuilder->emitFunction(kVec3f_GrSLType, "fade", SK_ARRAY_COUNT(fadeArgs), 1163 fadeArgs, 1164 "return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);", 1165 &fadeFuncName); 1166 1167 // perm function 1168 static const GrGLSLShaderVar permArgs[] = { 1169 GrGLSLShaderVar("x", kFloat_GrSLType) 1170 }; 1171 SkString permFuncName; 1172 SkString permCode("return "); 1173 // FIXME even though I'm creating these textures with kRepeat_TileMode, they're clamped. Not 1174 // sure why. Using fract() (here and the next texture lookup) as a workaround. 1175 fsBuilder->appendTextureLookup(&permCode, args.fSamplers[0], "vec2(fract(x / 256.0), 0.0)", 1176 kVec2f_GrSLType); 1177 permCode.append(".r * 255.0;"); 1178 fsBuilder->emitFunction(kFloat_GrSLType, "perm", SK_ARRAY_COUNT(permArgs), permArgs, 1179 permCode.c_str(), &permFuncName); 1180 1181 // grad function 1182 static const GrGLSLShaderVar gradArgs[] = { 1183 GrGLSLShaderVar("x", kFloat_GrSLType), 1184 GrGLSLShaderVar("p", kVec3f_GrSLType) 1185 }; 1186 SkString gradFuncName; 1187 SkString gradCode("return dot("); 1188 fsBuilder->appendTextureLookup(&gradCode, args.fSamplers[1], "vec2(fract(x / 16.0), 0.0)", 1189 kVec2f_GrSLType); 1190 gradCode.append(".rgb * 255.0 - vec3(1.0), p);"); 1191 fsBuilder->emitFunction(kFloat_GrSLType, "grad", SK_ARRAY_COUNT(gradArgs), gradArgs, 1192 gradCode.c_str(), &gradFuncName); 1193 1194 // lerp function 1195 static const GrGLSLShaderVar lerpArgs[] = { 1196 GrGLSLShaderVar("a", kFloat_GrSLType), 1197 GrGLSLShaderVar("b", kFloat_GrSLType), 1198 GrGLSLShaderVar("w", kFloat_GrSLType) 1199 }; 1200 SkString lerpFuncName; 1201 fsBuilder->emitFunction(kFloat_GrSLType, "lerp", SK_ARRAY_COUNT(lerpArgs), lerpArgs, 1202 "return a + w * (b - a);", &lerpFuncName); 1203 1204 // noise function 1205 static const GrGLSLShaderVar noiseArgs[] = { 1206 GrGLSLShaderVar("p", kVec3f_GrSLType), 1207 }; 1208 SkString noiseFuncName; 1209 SkString noiseCode; 1210 noiseCode.append("vec3 P = mod(floor(p), 256.0);"); 1211 noiseCode.append("p -= floor(p);"); 1212 noiseCode.appendf("vec3 f = %s(p);", fadeFuncName.c_str()); 1213 noiseCode.appendf("float A = %s(P.x) + P.y;", permFuncName.c_str()); 1214 noiseCode.appendf("float AA = %s(A) + P.z;", permFuncName.c_str()); 1215 noiseCode.appendf("float AB = %s(A + 1.0) + P.z;", permFuncName.c_str()); 1216 noiseCode.appendf("float B = %s(P.x + 1.0) + P.y;", permFuncName.c_str()); 1217 noiseCode.appendf("float BA = %s(B) + P.z;", permFuncName.c_str()); 1218 noiseCode.appendf("float BB = %s(B + 1.0) + P.z;", permFuncName.c_str()); 1219 noiseCode.appendf("float result = %s(", lerpFuncName.c_str()); 1220 noiseCode.appendf("%s(%s(%s(%s(AA), p),", lerpFuncName.c_str(), lerpFuncName.c_str(), 1221 gradFuncName.c_str(), permFuncName.c_str()); 1222 noiseCode.appendf("%s(%s(BA), p + vec3(-1.0, 0.0, 0.0)), f.x),", gradFuncName.c_str(), 1223 permFuncName.c_str()); 1224 noiseCode.appendf("%s(%s(%s(AB), p + vec3(0.0, -1.0, 0.0)),", lerpFuncName.c_str(), 1225 gradFuncName.c_str(), permFuncName.c_str()); 1226 noiseCode.appendf("%s(%s(BB), p + vec3(-1.0, -1.0, 0.0)), f.x), f.y),", 1227 gradFuncName.c_str(), permFuncName.c_str()); 1228 noiseCode.appendf("%s(%s(%s(%s(AA + 1.0), p + vec3(0.0, 0.0, -1.0)),", 1229 lerpFuncName.c_str(), lerpFuncName.c_str(), gradFuncName.c_str(), 1230 permFuncName.c_str()); 1231 noiseCode.appendf("%s(%s(BA + 1.0), p + vec3(-1.0, 0.0, -1.0)), f.x),", 1232 gradFuncName.c_str(), permFuncName.c_str()); 1233 noiseCode.appendf("%s(%s(%s(AB + 1.0), p + vec3(0.0, -1.0, -1.0)),", 1234 lerpFuncName.c_str(), gradFuncName.c_str(), permFuncName.c_str()); 1235 noiseCode.appendf("%s(%s(BB + 1.0), p + vec3(-1.0, -1.0, -1.0)), f.x), f.y), f.z);", 1236 gradFuncName.c_str(), permFuncName.c_str()); 1237 noiseCode.append("return result;"); 1238 fsBuilder->emitFunction(kFloat_GrSLType, "noise", SK_ARRAY_COUNT(noiseArgs), noiseArgs, 1239 noiseCode.c_str(), &noiseFuncName); 1240 1241 // noiseOctaves function 1242 static const GrGLSLShaderVar noiseOctavesArgs[] = { 1243 GrGLSLShaderVar("p", kVec3f_GrSLType), 1244 GrGLSLShaderVar("octaves", kFloat_GrSLType), 1245 }; 1246 SkString noiseOctavesFuncName; 1247 SkString noiseOctavesCode; 1248 noiseOctavesCode.append("float result = 0.0;"); 1249 noiseOctavesCode.append("float ratio = 1.0;"); 1250 noiseOctavesCode.append("for (float i = 0.0; i < octaves; i++) {"); 1251 noiseOctavesCode.appendf("result += %s(p) / ratio;", noiseFuncName.c_str()); 1252 noiseOctavesCode.append("p *= 2.0;"); 1253 noiseOctavesCode.append("ratio *= 2.0;"); 1254 noiseOctavesCode.append("}"); 1255 noiseOctavesCode.append("return (result + 1.0) / 2.0;"); 1256 fsBuilder->emitFunction(kFloat_GrSLType, "noiseOctaves", SK_ARRAY_COUNT(noiseOctavesArgs), 1257 noiseOctavesArgs, noiseOctavesCode.c_str(), &noiseOctavesFuncName); 1258 1259 fsBuilder->codeAppendf("vec2 coords = %s * %s;", vCoords.c_str(), baseFrequencyUni); 1260 fsBuilder->codeAppendf("float r = %s(vec3(coords, %s), %s);", noiseOctavesFuncName.c_str(), 1261 zUni, octavesUni); 1262 fsBuilder->codeAppendf("float g = %s(vec3(coords, %s + 0000.0), %s);", 1263 noiseOctavesFuncName.c_str(), zUni, octavesUni); 1264 fsBuilder->codeAppendf("float b = %s(vec3(coords, %s + 0000.0), %s);", 1265 noiseOctavesFuncName.c_str(), zUni, octavesUni); 1266 fsBuilder->codeAppendf("float a = %s(vec3(coords, %s + 0000.0), %s);", 1267 noiseOctavesFuncName.c_str(), zUni, octavesUni); 1268 fsBuilder->codeAppendf("%s = vec4(r, g, b, a);", args.fOutputColor); 1269 1270 // Clamp values 1271 fsBuilder->codeAppendf("%s = clamp(%s, 0.0, 1.0);", args.fOutputColor, args.fOutputColor); 1272 1273 // Pre-multiply the result 1274 fsBuilder->codeAppendf("\n\t\t%s = vec4(%s.rgb * %s.aaa, %s.a);\n", 1275 args.fOutputColor, args.fOutputColor, 1276 args.fOutputColor, args.fOutputColor); 1277 } 1278 1279 void GrGLImprovedPerlinNoise::GenKey(const GrProcessor& processor, const GrGLSLCaps&, 1280 GrProcessorKeyBuilder* b) { 1281 } 1282 1283 void GrGLImprovedPerlinNoise::onSetData(const GrGLSLProgramDataManager& pdman, 1284 const GrProcessor& processor) { 1285 INHERITED::onSetData(pdman, processor); 1286 1287 const GrImprovedPerlinNoiseEffect& noise = processor.cast<GrImprovedPerlinNoiseEffect>(); 1288 1289 const SkVector& baseFrequency = noise.baseFrequency(); 1290 pdman.set2f(fBaseFrequencyUni, baseFrequency.fX, baseFrequency.fY); 1291 1292 pdman.set1f(fOctavesUni, SkIntToScalar(noise.octaves())); 1293 1294 pdman.set1f(fZUni, noise.z()); 1295 } 1296 1297 ///////////////////////////////////////////////////////////////////// 1298 const GrFragmentProcessor* SkPerlinNoiseShader2::asFragmentProcessor( 1299 GrContext* context, 1300 const SkMatrix& viewM, 1301 const SkMatrix* externalLocalMatrix, 1302 SkFilterQuality) const { 1303 SkASSERT(context); 1304 1305 SkMatrix localMatrix = this->getLocalMatrix(); 1306 if (externalLocalMatrix) { 1307 localMatrix.preConcat(*externalLocalMatrix); 1308 } 1309 1310 SkMatrix matrix = viewM; 1311 matrix.preConcat(localMatrix); 1312 1313 // Either we don't stitch tiles, either we have a valid tile size 1314 SkASSERT(!fStitchTiles || !fTileSize.isEmpty()); 1315 1316 SkPerlinNoiseShader2::PaintingData* paintingData = 1317 new PaintingData(fTileSize, fSeed, fBaseFrequencyX, fBaseFrequencyY, matrix); 1318 1319 SkMatrix m = viewM; 1320 m.setTranslateX(-localMatrix.getTranslateX() + SK_Scalar1); 1321 m.setTranslateY(-localMatrix.getTranslateY() + SK_Scalar1); 1322 1323 if (fType == kImprovedNoise_Type) { 1324 GrTextureParams textureParams(SkShader::TileMode::kRepeat_TileMode, 1325 GrTextureParams::FilterMode::kNone_FilterMode); 1326 SkAutoTUnref<GrTexture> permutationsTexture( 1327 GrRefCachedBitmapTexture(context, paintingData->getImprovedPermutationsBitmap(), 1328 textureParams)); 1329 SkAutoTUnref<GrTexture> gradientTexture( 1330 GrRefCachedBitmapTexture(context, paintingData->getGradientBitmap(), 1331 textureParams)); 1332 return GrImprovedPerlinNoiseEffect::Create(fNumOctaves, fSeed, paintingData, 1333 permutationsTexture, gradientTexture, m); 1334 } 1335 1336 if (0 == fNumOctaves) { 1337 if (kFractalNoise_Type == fType) { 1338 // Extract the incoming alpha and emit rgba = (a/4, a/4, a/4, a/2) 1339 SkAutoTUnref<const GrFragmentProcessor> inner( 1340 GrConstColorProcessor::Create(0x80404040, 1341 GrConstColorProcessor::kModulateRGBA_InputMode)); 1342 return GrFragmentProcessor::MulOutputByInputAlpha(inner); 1343 } 1344 // Emit zero. 1345 return GrConstColorProcessor::Create(0x0, GrConstColorProcessor::kIgnore_InputMode); 1346 } 1347 1348 SkAutoTUnref<GrTexture> permutationsTexture( 1349 GrRefCachedBitmapTexture(context, paintingData->getPermutationsBitmap(), 1350 GrTextureParams::ClampNoFilter())); 1351 SkAutoTUnref<GrTexture> noiseTexture( 1352 GrRefCachedBitmapTexture(context, paintingData->getNoiseBitmap(), 1353 GrTextureParams::ClampNoFilter())); 1354 1355 if ((permutationsTexture) && (noiseTexture)) { 1356 SkAutoTUnref<GrFragmentProcessor> inner( 1357 GrPerlinNoise2Effect::Create(fType, 1358 fNumOctaves, 1359 fStitchTiles, 1360 paintingData, 1361 permutationsTexture, noiseTexture, 1362 m)); 1363 return GrFragmentProcessor::MulOutputByInputAlpha(inner); 1364 } 1365 delete paintingData; 1366 return nullptr; 1367 } 1368 1369 #endif 1370 1371 #ifndef SK_IGNORE_TO_STRING 1372 void SkPerlinNoiseShader2::toString(SkString* str) const { 1373 str->append("SkPerlinNoiseShader2: ("); 1374 1375 str->append("type: "); 1376 switch (fType) { 1377 case kFractalNoise_Type: 1378 str->append("\"fractal noise\""); 1379 break; 1380 case kTurbulence_Type: 1381 str->append("\"turbulence\""); 1382 break; 1383 default: 1384 str->append("\"unknown\""); 1385 break; 1386 } 1387 str->append(" base frequency: ("); 1388 str->appendScalar(fBaseFrequencyX); 1389 str->append(", "); 1390 str->appendScalar(fBaseFrequencyY); 1391 str->append(") number of octaves: "); 1392 str->appendS32(fNumOctaves); 1393 str->append(" seed: "); 1394 str->appendScalar(fSeed); 1395 str->append(" stitch tiles: "); 1396 str->append(fStitchTiles ? "true " : "false "); 1397 1398 this->INHERITED::toString(str); 1399 1400 str->append(")"); 1401 } 1402 #endif 1403