Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(626)

Unified Diff: src/effects/SkPerlinNoiseShader.cpp

Issue 169973002: Begin making SkPerlinNoiseShader const. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Don't lazily initialize bitmaps. Use setPixels Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/effects/SkPerlinNoiseShader.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/effects/SkPerlinNoiseShader.cpp
diff --git a/src/effects/SkPerlinNoiseShader.cpp b/src/effects/SkPerlinNoiseShader.cpp
index 47de924b997e41b34bf902ee1174f7313e514cfe..e28227db09e7007036a65e0ce6553835995ce384 100644
--- a/src/effects/SkPerlinNoiseShader.cpp
+++ b/src/effects/SkPerlinNoiseShader.cpp
@@ -81,17 +81,23 @@ struct SkPerlinNoiseShader::StitchData {
};
struct SkPerlinNoiseShader::PaintingData {
- PaintingData(const SkISize& tileSize)
- : fSeed(0)
- , fTileSize(tileSize)
- , fPermutationsBitmap(NULL)
- , fNoiseBitmap(NULL)
- {}
-
- ~PaintingData()
+ PaintingData(const SkISize& tileSize, SkScalar seed,
+ SkScalar baseFrequencyX, SkScalar baseFrequencyY)
+ : fTileSize(tileSize)
+ , fBaseFrequency(SkPoint::Make(baseFrequencyX, baseFrequencyY))
{
- SkDELETE(fPermutationsBitmap);
- SkDELETE(fNoiseBitmap);
+ this->init(seed);
+ if (!fTileSize.isEmpty()) {
+ this->stitch();
+ }
+
+#if SK_SUPPORT_GPU && !defined(SK_USE_SIMPLEX_NOISE)
+ fPermutationsBitmap.setConfig(SkImageInfo::MakeA8(kBlockSize, 1));
+ fPermutationsBitmap.setPixels(fLatticeSelector);
+
+ fNoiseBitmap.setConfig(SkImageInfo::MakeN32Premul(kBlockSize, 4));
+ fNoiseBitmap.setPixels(fNoise[0][0]);
+#endif
}
int fSeed;
@@ -104,10 +110,10 @@ struct SkPerlinNoiseShader::PaintingData {
private:
- SkBitmap* fPermutationsBitmap;
- SkBitmap* fNoiseBitmap;
-
-public:
+#if SK_SUPPORT_GPU && !defined(SK_USE_SIMPLEX_NOISE)
+ SkBitmap fPermutationsBitmap;
+ SkBitmap fNoiseBitmap;
+#endif
inline int random() {
static const int gRandAmplitude = 16807; // 7**5; primitive root of m
@@ -121,6 +127,7 @@ public:
return result;
}
+ // Only called once. Could be part of the constructor.
void init(SkScalar seed)
{
static const SkScalar gInvBlockSizef = SkScalarInvert(SkIntToScalar(kBlockSize));
@@ -190,14 +197,9 @@ public:
fGradient[channel][i].fY + SK_Scalar1, gHalfMax16bits));
}
}
-
- // Invalidate bitmaps
- SkDELETE(fPermutationsBitmap);
- fPermutationsBitmap = NULL;
- SkDELETE(fNoiseBitmap);
- fNoiseBitmap = NULL;
}
+ // Only called once. Could be part of the constructor.
void stitch() {
SkScalar tileWidth = SkIntToScalar(fTileSize.width());
SkScalar tileHeight = SkIntToScalar(fTileSize.height());
@@ -238,27 +240,13 @@ public:
fStitchDataInit.fWrapY = kPerlinNoise + fStitchDataInit.fHeight;
}
- SkBitmap* getPermutationsBitmap()
- {
- if (!fPermutationsBitmap) {
- fPermutationsBitmap = SkNEW(SkBitmap);
- fPermutationsBitmap->allocPixels(SkImageInfo::MakeA8(kBlockSize, 1));
- uint8_t* bitmapPixels = fPermutationsBitmap->getAddr8(0, 0);
- memcpy(bitmapPixels, fLatticeSelector, sizeof(uint8_t) * kBlockSize);
- }
- return fPermutationsBitmap;
- }
+public:
- SkBitmap* getNoiseBitmap()
- {
- if (!fNoiseBitmap) {
- fNoiseBitmap = SkNEW(SkBitmap);
- fNoiseBitmap->allocPixels(SkImageInfo::MakeN32Premul(kBlockSize, 4));
- uint32_t* bitmapPixels = fNoiseBitmap->getAddr32(0, 0);
- memcpy(bitmapPixels, fNoise[0][0], sizeof(uint16_t) * kBlockSize * 4 * 2);
- }
- return fNoiseBitmap;
- }
+#if SK_SUPPORT_GPU && !defined(SK_USE_SIMPLEX_NOISE)
+ const SkBitmap& getPermutationsBitmap() const { return fPermutationsBitmap; }
+
+ const SkBitmap& getNoiseBitmap() const { return fNoiseBitmap; }
+#endif
};
SkShader* SkPerlinNoiseShader::CreateFractalNoise(SkScalar baseFrequencyX, SkScalar baseFrequencyY,
@@ -286,16 +274,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 +293,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,39 +317,9 @@ 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)
-{
+ const StitchData& stitchData,
+ const SkPoint& noiseVector) const {
struct Noise {
int noisePositionIntegerValue;
SkScalar noisePositionFractionValue;
@@ -405,9 +365,10 @@ SkScalar SkPerlinNoiseShader::noise2D(int channel, const PaintingData& paintingD
return SkScalarInterp(a, b, sy);
}
-SkScalar SkPerlinNoiseShader::calculateTurbulenceValueForPoint(
- int channel, const PaintingData& paintingData, StitchData& stitchData, const SkPoint& point)
-{
+SkScalar SkPerlinNoiseShader::calculateTurbulenceValueForPoint(int channel,
+ const PaintingData& paintingData,
+ StitchData& stitchData,
+ const SkPoint& point) const {
if (fStitchTiles) {
// Set up TurbulenceInitial stitch values.
stitchData = paintingData.fStitchDataInit;
@@ -448,7 +409,7 @@ SkScalar SkPerlinNoiseShader::calculateTurbulenceValueForPoint(
return SkScalarPin(turbulenceFunctionResult, 0, SK_Scalar1);
}
-SkPMColor SkPerlinNoiseShader::shade(const SkPoint& point, StitchData& stitchData) {
+SkPMColor SkPerlinNoiseShader::shade(const SkPoint& point, StitchData& stitchData) const {
SkMatrix matrix = fMatrix;
matrix.postConcat(getLocalMatrix());
SkMatrix invMatrix;
@@ -1326,9 +1287,9 @@ GrEffectRef* SkPerlinNoiseShader::asNewEffect(GrContext* context, const SkPaint&
this->getLocalMatrix(), paint.getAlpha());
#else
GrTexture* permutationsTexture = GrLockAndRefCachedBitmapTexture(
- context, *fPaintingData->getPermutationsBitmap(), NULL);
+ context, fPaintingData->getPermutationsBitmap(), NULL);
GrTexture* noiseTexture = GrLockAndRefCachedBitmapTexture(
- context, *fPaintingData->getNoiseBitmap(), NULL);
+ context, fPaintingData->getNoiseBitmap(), NULL);
GrEffectRef* effect = (NULL != permutationsTexture) && (NULL != noiseTexture) ?
GrPerlinNoiseEffect::Create(fType, fPaintingData->fBaseFrequency,
« no previous file with comments | « include/effects/SkPerlinNoiseShader.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698