Chromium Code Reviews| Index: src/effects/SkPerlinNoiseShader.cpp |
| diff --git a/src/effects/SkPerlinNoiseShader.cpp b/src/effects/SkPerlinNoiseShader.cpp |
| index 48a25f9a5b921c59259b9356358464a01e03d98f..1c72583329a227f8ac9f006f9a3ac5a4a5c98778 100644 |
| --- a/src/effects/SkPerlinNoiseShader.cpp |
| +++ b/src/effects/SkPerlinNoiseShader.cpp |
| @@ -81,12 +81,18 @@ struct SkPerlinNoiseShader::StitchData { |
| }; |
| struct SkPerlinNoiseShader::PaintingData { |
| - PaintingData(const SkISize& tileSize) |
| - : fSeed(0) |
| - , fTileSize(tileSize) |
| + PaintingData(const SkISize& tileSize, SkScalar seed, |
|
Stephen White
2014/02/18 14:58:56
Not new to this patch, but I think the PaintingDat
scroggo
2014/02/18 16:42:57
I believe so.
scroggo
2014/03/04 22:26:34
Done. This is a much more pervasive change, and re
|
| + SkScalar baseFrequencyX, SkScalar baseFrequencyY) |
| + : fTileSize(tileSize) |
| + , fBaseFrequency(SkPoint::Make(baseFrequencyX, baseFrequencyY)) |
| , fPermutationsBitmap(NULL) |
| , fNoiseBitmap(NULL) |
| - {} |
| + { |
| + this->init(seed); |
| + if (!fTileSize.isEmpty()) { |
| + this->stitch(); |
| + } |
| + } |
| ~PaintingData() |
| { |
| @@ -107,8 +113,6 @@ private: |
| SkBitmap* fPermutationsBitmap; |
| SkBitmap* fNoiseBitmap; |
| -public: |
| - |
| inline int random() { |
| static const int gRandAmplitude = 16807; // 7**5; primitive root of m |
| static const int gRandQ = 127773; // m / a |
| @@ -121,6 +125,7 @@ public: |
| return result; |
| } |
| + // Only called once. Could be part of the constructor. |
| void init(SkScalar seed) |
| { |
| static const SkScalar gInvBlockSizef = SkScalarInvert(SkIntToScalar(kBlockSize)); |
| @@ -198,6 +203,7 @@ public: |
| fNoiseBitmap = NULL; |
| } |
| + // Only called once. Could be part of the constructor. |
| void stitch() { |
| SkScalar tileWidth = SkIntToScalar(fTileSize.width()); |
| SkScalar tileHeight = SkIntToScalar(fTileSize.height()); |
| @@ -238,6 +244,8 @@ public: |
| fStitchDataInit.fWrapY = kPerlinNoise + fStitchDataInit.fHeight; |
| } |
| +public: |
| + |
| SkBitmap* getPermutationsBitmap() |
| { |
| if (!fPermutationsBitmap) { |
| @@ -286,16 +294,17 @@ SkPerlinNoiseShader::SkPerlinNoiseShader(SkPerlinNoiseShader::Type type, |
| , fBaseFrequencyY(baseFrequencyY) |
| , fNumOctaves(numOctaves > 255 ? 255 : numOctaves/*[0,255] octaves allowed*/) |
| , fSeed(seed) |
| - , fStitchTiles((tileSize != NULL) && !tileSize->isEmpty()) |
| - , fPaintingData(NULL) |
| + , fTileSize(NULL == tileSize ? SkISize::Make(0, 0) : *tileSize) |
| + , fStitchTiles(!fTileSize.isEmpty()) |
| { |
| SkASSERT(numOctaves >= 0 && numOctaves < 256); |
| - setTileSize(fStitchTiles ? *tileSize : SkISize::Make(0,0)); |
| fMatrix.reset(); |
| + fPaintingData = SkNEW_ARGS(PaintingData, (fTileSize, fSeed, fBaseFrequencyX, fBaseFrequencyY)); |
| } |
| -SkPerlinNoiseShader::SkPerlinNoiseShader(SkReadBuffer& buffer) : |
| - INHERITED(buffer), fPaintingData(NULL) { |
| +SkPerlinNoiseShader::SkPerlinNoiseShader(SkReadBuffer& buffer) |
| + : INHERITED(buffer) |
| +{ |
| fType = (SkPerlinNoiseShader::Type) buffer.readInt(); |
| fBaseFrequencyX = buffer.readScalar(); |
| fBaseFrequencyY = buffer.readScalar(); |
| @@ -304,10 +313,11 @@ SkPerlinNoiseShader::SkPerlinNoiseShader(SkReadBuffer& buffer) : |
| fStitchTiles = buffer.readBool(); |
| fTileSize.fWidth = buffer.readInt(); |
| fTileSize.fHeight = buffer.readInt(); |
| - setTileSize(fTileSize); |
| fMatrix.reset(); |
| + fPaintingData = SkNEW_ARGS(PaintingData, (fTileSize, fSeed, fBaseFrequencyX, fBaseFrequencyY)); |
| buffer.validate(perlin_noise_type_is_valid(fType) && |
| - (fNumOctaves >= 0) && (fNumOctaves <= 255)); |
| + (fNumOctaves >= 0) && (fNumOctaves <= 255) && |
| + (fStitchTiles != fTileSize.isEmpty())); |
| } |
| SkPerlinNoiseShader::~SkPerlinNoiseShader() { |
| @@ -327,36 +337,6 @@ void SkPerlinNoiseShader::flatten(SkWriteBuffer& buffer) const { |
| buffer.writeInt(fTileSize.fHeight); |
| } |
| -void SkPerlinNoiseShader::initPaint(PaintingData& paintingData) |
| -{ |
| - paintingData.init(fSeed); |
| - |
| - // Set frequencies to original values |
| - paintingData.fBaseFrequency.set(fBaseFrequencyX, fBaseFrequencyY); |
| - // Adjust frequecies based on size if stitching is enabled |
| - if (fStitchTiles) { |
| - paintingData.stitch(); |
| - } |
| -} |
| - |
| -void SkPerlinNoiseShader::setTileSize(const SkISize& tileSize) { |
| - fTileSize = tileSize; |
| - |
| - if (NULL == fPaintingData) { |
| - fPaintingData = SkNEW_ARGS(PaintingData, (fTileSize)); |
| - initPaint(*fPaintingData); |
| - } else { |
| - // Set Size |
| - fPaintingData->fTileSize = fTileSize; |
| - // Set frequencies to original values |
| - fPaintingData->fBaseFrequency.set(fBaseFrequencyX, fBaseFrequencyY); |
| - // Adjust frequecies based on size if stitching is enabled |
| - if (fStitchTiles) { |
| - fPaintingData->stitch(); |
| - } |
| - } |
| -} |
| - |
| SkScalar SkPerlinNoiseShader::noise2D(int channel, const PaintingData& paintingData, |
| const StitchData& stitchData, const SkPoint& noiseVector) |
| { |