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 "SkPerlinNoiseShader.h" | 9 #include "SkPerlinNoiseShader.h" |
10 #include "SkColorFilter.h" | 10 #include "SkColorFilter.h" |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 #if SK_SUPPORT_GPU | 243 #if SK_SUPPORT_GPU |
244 const SkBitmap& getPermutationsBitmap() const { return fPermutationsBitmap;
} | 244 const SkBitmap& getPermutationsBitmap() const { return fPermutationsBitmap;
} |
245 | 245 |
246 const SkBitmap& getNoiseBitmap() const { return fNoiseBitmap; } | 246 const SkBitmap& getNoiseBitmap() const { return fNoiseBitmap; } |
247 #endif | 247 #endif |
248 }; | 248 }; |
249 | 249 |
250 SkShader* SkPerlinNoiseShader::CreateFractalNoise(SkScalar baseFrequencyX, SkSca
lar baseFrequencyY, | 250 SkShader* SkPerlinNoiseShader::CreateFractalNoise(SkScalar baseFrequencyX, SkSca
lar baseFrequencyY, |
251 int numOctaves, SkScalar seed, | 251 int numOctaves, SkScalar seed, |
252 const SkISize* tileSize) { | 252 const SkISize* tileSize) { |
253 return SkNEW_ARGS(SkPerlinNoiseShader, (kFractalNoise_Type, baseFrequencyX,
baseFrequencyY, | 253 return new SkPerlinNoiseShader(kFractalNoise_Type, baseFrequencyX, baseFrequ
encyY, numOctaves, |
254 numOctaves, seed, tileSize)); | 254 seed, tileSize); |
255 } | 255 } |
256 | 256 |
257 SkShader* SkPerlinNoiseShader::CreateTurbulence(SkScalar baseFrequencyX, SkScala
r baseFrequencyY, | 257 SkShader* SkPerlinNoiseShader::CreateTurbulence(SkScalar baseFrequencyX, SkScala
r baseFrequencyY, |
258 int numOctaves, SkScalar seed, | 258 int numOctaves, SkScalar seed, |
259 const SkISize* tileSize) { | 259 const SkISize* tileSize) { |
260 return SkNEW_ARGS(SkPerlinNoiseShader, (kTurbulence_Type, baseFrequencyX, ba
seFrequencyY, | 260 return new SkPerlinNoiseShader(kTurbulence_Type, baseFrequencyX, baseFrequen
cyY, numOctaves, |
261 numOctaves, seed, tileSize)); | 261 seed, tileSize); |
262 } | 262 } |
263 | 263 |
264 SkPerlinNoiseShader::SkPerlinNoiseShader(SkPerlinNoiseShader::Type type, | 264 SkPerlinNoiseShader::SkPerlinNoiseShader(SkPerlinNoiseShader::Type type, |
265 SkScalar baseFrequencyX, | 265 SkScalar baseFrequencyX, |
266 SkScalar baseFrequencyY, | 266 SkScalar baseFrequencyY, |
267 int numOctaves, | 267 int numOctaves, |
268 SkScalar seed, | 268 SkScalar seed, |
269 const SkISize* tileSize) | 269 const SkISize* tileSize) |
270 : fType(type) | 270 : fType(type) |
271 , fBaseFrequencyX(baseFrequencyX) | 271 , fBaseFrequencyX(baseFrequencyX) |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 U8CPU rgba[4]; | 422 U8CPU rgba[4]; |
423 for (int channel = 3; channel >= 0; --channel) { | 423 for (int channel = 3; channel >= 0; --channel) { |
424 rgba[channel] = SkScalarFloorToInt(255 * | 424 rgba[channel] = SkScalarFloorToInt(255 * |
425 calculateTurbulenceValueForPoint(channel, stitchData, newPoint)); | 425 calculateTurbulenceValueForPoint(channel, stitchData, newPoint)); |
426 } | 426 } |
427 return SkPreMultiplyARGB(rgba[3], rgba[0], rgba[1], rgba[2]); | 427 return SkPreMultiplyARGB(rgba[3], rgba[0], rgba[1], rgba[2]); |
428 } | 428 } |
429 | 429 |
430 SkShader::Context* SkPerlinNoiseShader::onCreateContext(const ContextRec& rec, | 430 SkShader::Context* SkPerlinNoiseShader::onCreateContext(const ContextRec& rec, |
431 void* storage) const { | 431 void* storage) const { |
432 return SkNEW_PLACEMENT_ARGS(storage, PerlinNoiseShaderContext, (*this, rec))
; | 432 return new (storage) PerlinNoiseShaderContext(*this, rec); |
433 } | 433 } |
434 | 434 |
435 size_t SkPerlinNoiseShader::contextSize() const { | 435 size_t SkPerlinNoiseShader::contextSize() const { |
436 return sizeof(PerlinNoiseShaderContext); | 436 return sizeof(PerlinNoiseShaderContext); |
437 } | 437 } |
438 | 438 |
439 SkPerlinNoiseShader::PerlinNoiseShaderContext::PerlinNoiseShaderContext( | 439 SkPerlinNoiseShader::PerlinNoiseShaderContext::PerlinNoiseShaderContext( |
440 const SkPerlinNoiseShader& shader, const ContextRec& rec) | 440 const SkPerlinNoiseShader& shader, const ContextRec& rec) |
441 : INHERITED(shader, rec) | 441 : INHERITED(shader, rec) |
442 { | 442 { |
443 SkMatrix newMatrix = *rec.fMatrix; | 443 SkMatrix newMatrix = *rec.fMatrix; |
444 newMatrix.preConcat(shader.getLocalMatrix()); | 444 newMatrix.preConcat(shader.getLocalMatrix()); |
445 if (rec.fLocalMatrix) { | 445 if (rec.fLocalMatrix) { |
446 newMatrix.preConcat(*rec.fLocalMatrix); | 446 newMatrix.preConcat(*rec.fLocalMatrix); |
447 } | 447 } |
448 // This (1,1) translation is due to WebKit's 1 based coordinates for the noi
se | 448 // This (1,1) translation is due to WebKit's 1 based coordinates for the noi
se |
449 // (as opposed to 0 based, usually). The same adjustment is in the setData()
function. | 449 // (as opposed to 0 based, usually). The same adjustment is in the setData()
function. |
450 fMatrix.setTranslate(-newMatrix.getTranslateX() + SK_Scalar1, -newMatrix.get
TranslateY() + SK_Scalar1); | 450 fMatrix.setTranslate(-newMatrix.getTranslateX() + SK_Scalar1, -newMatrix.get
TranslateY() + SK_Scalar1); |
451 fPaintingData = SkNEW_ARGS(PaintingData, (shader.fTileSize, shader.fSeed, sh
ader.fBaseFrequencyX, shader.fBaseFrequencyY, newMatrix)); | 451 fPaintingData = new PaintingData(shader.fTileSize, shader.fSeed, shader.fBas
eFrequencyX, |
| 452 shader.fBaseFrequencyY, newMatrix); |
452 } | 453 } |
453 | 454 |
454 SkPerlinNoiseShader::PerlinNoiseShaderContext::~PerlinNoiseShaderContext() { | 455 SkPerlinNoiseShader::PerlinNoiseShaderContext::~PerlinNoiseShaderContext() { del
ete fPaintingData; } |
455 SkDELETE(fPaintingData); | |
456 } | |
457 | 456 |
458 void SkPerlinNoiseShader::PerlinNoiseShaderContext::shadeSpan( | 457 void SkPerlinNoiseShader::PerlinNoiseShaderContext::shadeSpan( |
459 int x, int y, SkPMColor result[], int count) { | 458 int x, int y, SkPMColor result[], int count) { |
460 SkPoint point = SkPoint::Make(SkIntToScalar(x), SkIntToScalar(y)); | 459 SkPoint point = SkPoint::Make(SkIntToScalar(x), SkIntToScalar(y)); |
461 StitchData stitchData; | 460 StitchData stitchData; |
462 for (int i = 0; i < count; ++i) { | 461 for (int i = 0; i < count; ++i) { |
463 result[i] = shade(point, stitchData); | 462 result[i] = shade(point, stitchData); |
464 point.fX += SK_Scalar1; | 463 point.fX += SK_Scalar1; |
465 } | 464 } |
466 } | 465 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
510 ///////////////////////////////////////////////////////////////////// | 509 ///////////////////////////////////////////////////////////////////// |
511 | 510 |
512 class GrPerlinNoiseEffect : public GrFragmentProcessor { | 511 class GrPerlinNoiseEffect : public GrFragmentProcessor { |
513 public: | 512 public: |
514 static GrFragmentProcessor* Create(GrProcessorDataManager* procDataManager, | 513 static GrFragmentProcessor* Create(GrProcessorDataManager* procDataManager, |
515 SkPerlinNoiseShader::Type type, | 514 SkPerlinNoiseShader::Type type, |
516 int numOctaves, bool stitchTiles, | 515 int numOctaves, bool stitchTiles, |
517 SkPerlinNoiseShader::PaintingData* painti
ngData, | 516 SkPerlinNoiseShader::PaintingData* painti
ngData, |
518 GrTexture* permutationsTexture, GrTexture
* noiseTexture, | 517 GrTexture* permutationsTexture, GrTexture
* noiseTexture, |
519 const SkMatrix& matrix, uint8_t alpha) { | 518 const SkMatrix& matrix, uint8_t alpha) { |
520 return SkNEW_ARGS(GrPerlinNoiseEffect, (procDataManager, type, numOctave
s, stitchTiles, | 519 return new GrPerlinNoiseEffect(procDataManager, type, numOctaves, stitch
Tiles, paintingData, |
521 paintingData, permutationsTextur
e, noiseTexture, | 520 permutationsTexture, noiseTexture, matrix
, alpha); |
522 matrix, alpha)); | |
523 } | 521 } |
524 | 522 |
525 virtual ~GrPerlinNoiseEffect() { | 523 virtual ~GrPerlinNoiseEffect() { delete fPaintingData; } |
526 SkDELETE(fPaintingData); | |
527 } | |
528 | 524 |
529 const char* name() const override { return "PerlinNoise"; } | 525 const char* name() const override { return "PerlinNoise"; } |
530 | 526 |
531 const SkPerlinNoiseShader::StitchData& stitchData() const { return fPainting
Data->fStitchDataInit; } | 527 const SkPerlinNoiseShader::StitchData& stitchData() const { return fPainting
Data->fStitchDataInit; } |
532 | 528 |
533 SkPerlinNoiseShader::Type type() const { return fType; } | 529 SkPerlinNoiseShader::Type type() const { return fType; } |
534 bool stitchTiles() const { return fStitchTiles; } | 530 bool stitchTiles() const { return fStitchTiles; } |
535 const SkVector& baseFrequency() const { return fPaintingData->fBaseFrequency
; } | 531 const SkVector& baseFrequency() const { return fPaintingData->fBaseFrequency
; } |
536 int numOctaves() const { return fNumOctaves; } | 532 int numOctaves() const { return fNumOctaves; } |
537 const SkMatrix& matrix() const { return fCoordTransform.getMatrix(); } | 533 const SkMatrix& matrix() const { return fCoordTransform.getMatrix(); } |
538 uint8_t alpha() const { return fAlpha; } | 534 uint8_t alpha() const { return fAlpha; } |
539 | 535 |
540 private: | 536 private: |
541 GrGLFragmentProcessor* onCreateGLInstance() const override { | 537 GrGLFragmentProcessor* onCreateGLInstance() const override { |
542 return SkNEW_ARGS(GrGLPerlinNoise, (*this)); | 538 return new GrGLPerlinNoise(*this); |
543 } | 539 } |
544 | 540 |
545 virtual void onGetGLProcessorKey(const GrGLSLCaps& caps, | 541 virtual void onGetGLProcessorKey(const GrGLSLCaps& caps, |
546 GrProcessorKeyBuilder* b) const override { | 542 GrProcessorKeyBuilder* b) const override { |
547 GrGLPerlinNoise::GenKey(*this, caps, b); | 543 GrGLPerlinNoise::GenKey(*this, caps, b); |
548 } | 544 } |
549 | 545 |
550 bool onIsEqual(const GrFragmentProcessor& sBase) const override { | 546 bool onIsEqual(const GrFragmentProcessor& sBase) const override { |
551 const GrPerlinNoiseEffect& s = sBase.cast<GrPerlinNoiseEffect>(); | 547 const GrPerlinNoiseEffect& s = sBase.cast<GrPerlinNoiseEffect>(); |
552 return fType == s.fType && | 548 return fType == s.fType && |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 | 613 |
618 SkPaint paint; | 614 SkPaint paint; |
619 GrColor paintColor; | 615 GrColor paintColor; |
620 GrFragmentProcessor* effect; | 616 GrFragmentProcessor* effect; |
621 GrPaint grPaint; | 617 GrPaint grPaint; |
622 SkAssertResult(shader->asFragmentProcessor(d->fContext, paint, | 618 SkAssertResult(shader->asFragmentProcessor(d->fContext, paint, |
623 GrTest::TestMatrix(d->fRandom), N
ULL, | 619 GrTest::TestMatrix(d->fRandom), N
ULL, |
624 &paintColor, grPaint.getProcessor
DataManager(), | 620 &paintColor, grPaint.getProcessor
DataManager(), |
625 &effect)); | 621 &effect)); |
626 | 622 |
627 SkDELETE(shader); | 623 delete shader; |
628 | 624 |
629 return effect; | 625 return effect; |
630 } | 626 } |
631 | 627 |
632 GrGLPerlinNoise::GrGLPerlinNoise(const GrProcessor& processor) | 628 GrGLPerlinNoise::GrGLPerlinNoise(const GrProcessor& processor) |
633 : fType(processor.cast<GrPerlinNoiseEffect>().type()) | 629 : fType(processor.cast<GrPerlinNoiseEffect>().type()) |
634 , fStitchTiles(processor.cast<GrPerlinNoiseEffect>().stitchTiles()) | 630 , fStitchTiles(processor.cast<GrPerlinNoiseEffect>().stitchTiles()) |
635 , fNumOctaves(processor.cast<GrPerlinNoiseEffect>().numOctaves()) { | 631 , fNumOctaves(processor.cast<GrPerlinNoiseEffect>().numOctaves()) { |
636 } | 632 } |
637 | 633 |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
961 } else { | 957 } else { |
962 *paintColor = 0; | 958 *paintColor = 0; |
963 } | 959 } |
964 return true; | 960 return true; |
965 } | 961 } |
966 | 962 |
967 // Either we don't stitch tiles, either we have a valid tile size | 963 // Either we don't stitch tiles, either we have a valid tile size |
968 SkASSERT(!fStitchTiles || !fTileSize.isEmpty()); | 964 SkASSERT(!fStitchTiles || !fTileSize.isEmpty()); |
969 | 965 |
970 SkPerlinNoiseShader::PaintingData* paintingData = | 966 SkPerlinNoiseShader::PaintingData* paintingData = |
971 SkNEW_ARGS(PaintingData, (fTileSize, fSeed, fBaseFrequencyX, fBaseFr
equencyY, matrix)); | 967 new PaintingData(fTileSize, fSeed, fBaseFrequencyX, fBaseFrequencyY,
matrix); |
972 SkAutoTUnref<GrTexture> permutationsTexture( | 968 SkAutoTUnref<GrTexture> permutationsTexture( |
973 GrRefCachedBitmapTexture(context, paintingData->getPermutationsBitmap(),
NULL)); | 969 GrRefCachedBitmapTexture(context, paintingData->getPermutationsBitmap(),
NULL)); |
974 SkAutoTUnref<GrTexture> noiseTexture( | 970 SkAutoTUnref<GrTexture> noiseTexture( |
975 GrRefCachedBitmapTexture(context, paintingData->getNoiseBitmap(), NULL))
; | 971 GrRefCachedBitmapTexture(context, paintingData->getNoiseBitmap(), NULL))
; |
976 | 972 |
977 SkMatrix m = viewM; | 973 SkMatrix m = viewM; |
978 m.setTranslateX(-localMatrix.getTranslateX() + SK_Scalar1); | 974 m.setTranslateX(-localMatrix.getTranslateX() + SK_Scalar1); |
979 m.setTranslateY(-localMatrix.getTranslateY() + SK_Scalar1); | 975 m.setTranslateY(-localMatrix.getTranslateY() + SK_Scalar1); |
980 if ((permutationsTexture) && (noiseTexture)) { | 976 if ((permutationsTexture) && (noiseTexture)) { |
981 *fp = GrPerlinNoiseEffect::Create(procDataManager, | 977 *fp = GrPerlinNoiseEffect::Create(procDataManager, |
982 fType, | 978 fType, |
983 fNumOctaves, | 979 fNumOctaves, |
984 fStitchTiles, | 980 fStitchTiles, |
985 paintingData, | 981 paintingData, |
986 permutationsTexture, noiseTexture, | 982 permutationsTexture, noiseTexture, |
987 m, paint.getAlpha()); | 983 m, paint.getAlpha()); |
988 } else { | 984 } else { |
989 SkDELETE(paintingData); | 985 delete paintingData; |
990 *fp = NULL; | 986 *fp = NULL; |
991 } | 987 } |
992 return true; | 988 return true; |
993 } | 989 } |
994 | 990 |
995 #else | 991 #else |
996 | 992 |
997 bool SkPerlinNoiseShader::asFragmentProcessor(GrContext*, const SkPaint&, const
SkMatrix&, | 993 bool SkPerlinNoiseShader::asFragmentProcessor(GrContext*, const SkPaint&, const
SkMatrix&, |
998 const SkMatrix*, GrColor*, GrProce
ssorDataManager*, | 994 const SkMatrix*, GrColor*, GrProce
ssorDataManager*, |
999 GrFragmentProcessor**) const { | 995 GrFragmentProcessor**) const { |
(...skipping 28 matching lines...) Expand all Loading... |
1028 str->append(" seed: "); | 1024 str->append(" seed: "); |
1029 str->appendScalar(fSeed); | 1025 str->appendScalar(fSeed); |
1030 str->append(" stitch tiles: "); | 1026 str->append(" stitch tiles: "); |
1031 str->append(fStitchTiles ? "true " : "false "); | 1027 str->append(fStitchTiles ? "true " : "false "); |
1032 | 1028 |
1033 this->INHERITED::toString(str); | 1029 this->INHERITED::toString(str); |
1034 | 1030 |
1035 str->append(")"); | 1031 str->append(")"); |
1036 } | 1032 } |
1037 #endif | 1033 #endif |
OLD | NEW |