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) |
{ |