Index: include/effects/SkPerlinNoiseShader.h |
diff --git a/include/effects/SkPerlinNoiseShader.h b/include/effects/SkPerlinNoiseShader.h |
index dd89c70925954deefd9fa6d7f05e4335454f9465..fd9f19fe29650573f60be4415f6dc51dbf319f2e 100644 |
--- a/include/effects/SkPerlinNoiseShader.h |
+++ b/include/effects/SkPerlinNoiseShader.h |
@@ -8,6 +8,8 @@ |
#ifndef SkPerlinNoiseShader_DEFINED |
#define SkPerlinNoiseShader_DEFINED |
+#include "SkBitmap.h" |
+#include "SkPoint.h" |
#include "SkShader.h" |
/** \class SkPerlinNoiseShader |
@@ -23,10 +25,7 @@ |
http://www.w3.org/TR/SVG/filters.html#feTurbulenceElement |
*/ |
class SK_API SkPerlinNoiseShader : public SkShader { |
- struct PaintingData; |
public: |
- struct StitchData; |
- |
/** |
* About the noise types : the difference between the 2 is just minor tweaks to the algorithm, |
* they're not 2 entirely different noises. The output looks different, but once the noise is |
@@ -69,6 +68,27 @@ public: |
virtual GrEffectRef* asNewEffect(GrContext* context, const SkPaint&) const SK_OVERRIDE; |
+ struct StitchData { |
scroggo
2014/03/04 22:26:34
StitchData is now defined in the class declaration
|
+ StitchData() |
+ : fWidth(0) |
+ , fWrapX(0) |
+ , fHeight(0) |
+ , fWrapY(0) |
+ {} |
+ |
+ bool operator==(const StitchData& other) const { |
+ return fWidth == other.fWidth && |
+ fWrapX == other.fWrapX && |
+ fHeight == other.fHeight && |
+ fWrapY == other.fWrapY; |
+ } |
+ |
+ int fWidth; // How much to subtract to wrap for stitching. |
+ int fWrapX; // Minimum value to wrap. |
+ int fHeight; |
+ int fWrapY; |
+ }; |
+ |
SK_DEVELOPER_TO_STRING() |
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPerlinNoiseShader) |
@@ -80,30 +100,44 @@ private: |
SkPerlinNoiseShader(SkPerlinNoiseShader::Type type, SkScalar baseFrequencyX, |
SkScalar baseFrequencyY, int numOctaves, SkScalar seed, |
const SkISize* tileSize = NULL); |
- virtual ~SkPerlinNoiseShader(); |
- void setTileSize(const SkISize&); |
+ SkScalar noise2D(int channel, const StitchData& stitchData, const SkPoint& noiseVector) const; |
- void initPaint(PaintingData& paintingData); |
+ SkScalar calculateTurbulenceValueForPoint(int channel, StitchData& stitchData, |
+ const SkPoint& point) const; |
- SkScalar noise2D(int channel, const PaintingData& paintingData, |
- const StitchData& stitchData, const SkPoint& noiseVector); |
+ SkPMColor shade(const SkPoint& point, StitchData& stitchData) const; |
- SkScalar calculateTurbulenceValueForPoint(int channel, const PaintingData& paintingData, |
- StitchData& stitchData, const SkPoint& point); |
+ // TODO (scroggo): Investigate making fields const. |
+ SkPerlinNoiseShader::Type fType; |
+ SkVector fBaseFrequency; |
+ int fNumOctaves; |
+ // fSeed changes on each call to random. |
+ mutable int fSeed; |
scroggo
2014/03/04 22:26:34
fSeed is now an int, like PaintingData::fSeed was.
|
+ SkISize fTileSize; |
+ bool fStitchTiles; |
- SkPMColor shade(const SkPoint& point, StitchData& stitchData); |
+ static const int kBlockSize = 256; |
scroggo
2014/03/04 22:26:34
Now defined here for members referencing it that u
|
+ static const int kBlockMask = kBlockSize - 1; |
- SkPerlinNoiseShader::Type fType; |
- SkScalar fBaseFrequencyX; |
- SkScalar fBaseFrequencyY; |
- int fNumOctaves; |
- SkScalar fSeed; |
- SkISize fTileSize; |
- bool fStitchTiles; |
+ uint8_t fLatticeSelector[kBlockSize]; |
+ uint16_t fNoise[4][kBlockSize][2]; |
+ SkPoint fGradient[4][kBlockSize]; |
+ |
+ StitchData fStitchDataInit; |
+ |
+ // These are caches. Instead of accessing directly, getPermutationsBitmap and getNoiseBitmap |
+ // should be called. |
+ mutable SkBitmap fPermutationsBitmap; |
scroggo
2014/03/04 22:26:34
I changed these from pointers on fPaintingData to
|
+ mutable SkBitmap fNoiseBitmap; |
+ |
+ |
+ // TODO (scroggo): Once setContext creates a new object, place this on that object. |
SkMatrix fMatrix; |
- PaintingData* fPaintingData; |
+ void init(); |
scroggo
2014/03/04 22:26:34
This should now be the only function that modifies
|
+ const SkBitmap& getPermutationsBitmap() const; |
+ const SkBitmap& getNoiseBitmap() const; |
typedef SkShader INHERITED; |
}; |