| Index: src/effects/SkPerlinNoiseShader.cpp
|
| diff --git a/src/effects/SkPerlinNoiseShader.cpp b/src/effects/SkPerlinNoiseShader.cpp
|
| index 5adb582506e807830c2fcfff9c7c71654406ade7..ed63fafae14c14093c5f66c21f482c9011ffa482 100644
|
| --- a/src/effects/SkPerlinNoiseShader.cpp
|
| +++ b/src/effects/SkPerlinNoiseShader.cpp
|
| @@ -278,6 +278,7 @@
|
| , fStitchTiles(!fTileSize.isEmpty())
|
| {
|
| SkASSERT(numOctaves >= 0 && numOctaves < 256);
|
| + fMatrix.reset();
|
| fPaintingData = SkNEW_ARGS(PaintingData, (fTileSize, fSeed, fBaseFrequencyX, fBaseFrequencyY));
|
| }
|
|
|
| @@ -292,6 +293,7 @@
|
| fStitchTiles = buffer.readBool();
|
| fTileSize.fWidth = buffer.readInt();
|
| fTileSize.fHeight = buffer.readInt();
|
| + fMatrix.reset();
|
| fPaintingData = SkNEW_ARGS(PaintingData, (fTileSize, fSeed, fBaseFrequencyX, fBaseFrequencyY));
|
| buffer.validate(perlin_noise_type_is_valid(fType) &&
|
| (fNumOctaves >= 0) && (fNumOctaves <= 255) &&
|
| @@ -315,9 +317,9 @@
|
| buffer.writeInt(fTileSize.fHeight);
|
| }
|
|
|
| -SkScalar SkPerlinNoiseShader::PerlinNoiseShaderContext::noise2D(
|
| - int channel, const PaintingData& paintingData,
|
| - const StitchData& stitchData, const SkPoint& noiseVector) const {
|
| +SkScalar SkPerlinNoiseShader::noise2D(int channel, const PaintingData& paintingData,
|
| + const StitchData& stitchData,
|
| + const SkPoint& noiseVector) const {
|
| struct Noise {
|
| int noisePositionIntegerValue;
|
| SkScalar noisePositionFractionValue;
|
| @@ -331,9 +333,8 @@
|
| Noise noiseX(noiseVector.x());
|
| Noise noiseY(noiseVector.y());
|
| SkScalar u, v;
|
| - const SkPerlinNoiseShader& perlinNoiseShader = static_cast<const SkPerlinNoiseShader&>(fShader);
|
| // If stitching, adjust lattice points accordingly.
|
| - if (perlinNoiseShader.fStitchTiles) {
|
| + if (fStitchTiles) {
|
| noiseX.noisePositionIntegerValue =
|
| checkNoise(noiseX.noisePositionIntegerValue, stitchData.fWrapX, stitchData.fWidth);
|
| noiseY.noisePositionIntegerValue =
|
| @@ -364,11 +365,11 @@
|
| return SkScalarInterp(a, b, sy);
|
| }
|
|
|
| -SkScalar SkPerlinNoiseShader::PerlinNoiseShaderContext::calculateTurbulenceValueForPoint(
|
| - int channel, const PaintingData& paintingData,
|
| - StitchData& stitchData, const SkPoint& point) const {
|
| - const SkPerlinNoiseShader& perlinNoiseShader = static_cast<const SkPerlinNoiseShader&>(fShader);
|
| - if (perlinNoiseShader.fStitchTiles) {
|
| +SkScalar SkPerlinNoiseShader::calculateTurbulenceValueForPoint(int channel,
|
| + const PaintingData& paintingData,
|
| + StitchData& stitchData,
|
| + const SkPoint& point) const {
|
| + if (fStitchTiles) {
|
| // Set up TurbulenceInitial stitch values.
|
| stitchData = paintingData.fStitchDataInit;
|
| }
|
| @@ -376,14 +377,14 @@
|
| SkPoint noiseVector(SkPoint::Make(SkScalarMul(point.x(), paintingData.fBaseFrequency.fX),
|
| SkScalarMul(point.y(), paintingData.fBaseFrequency.fY)));
|
| SkScalar ratio = SK_Scalar1;
|
| - for (int octave = 0; octave < perlinNoiseShader.fNumOctaves; ++octave) {
|
| + for (int octave = 0; octave < fNumOctaves; ++octave) {
|
| SkScalar noise = noise2D(channel, paintingData, stitchData, noiseVector);
|
| turbulenceFunctionResult += SkScalarDiv(
|
| - (perlinNoiseShader.fType == kFractalNoise_Type) ? noise : SkScalarAbs(noise), ratio);
|
| + (fType == kFractalNoise_Type) ? noise : SkScalarAbs(noise), ratio);
|
| noiseVector.fX *= 2;
|
| noiseVector.fY *= 2;
|
| ratio *= 2;
|
| - if (perlinNoiseShader.fStitchTiles) {
|
| + if (fStitchTiles) {
|
| // Update stitch values
|
| stitchData.fWidth *= 2;
|
| stitchData.fWrapX = stitchData.fWidth + kPerlinNoise;
|
| @@ -394,7 +395,7 @@
|
|
|
| // The value of turbulenceFunctionResult comes from ((turbulenceFunctionResult) + 1) / 2
|
| // by fractalNoise and (turbulenceFunctionResult) by turbulence.
|
| - if (perlinNoiseShader.fType == kFractalNoise_Type) {
|
| + if (fType == kFractalNoise_Type) {
|
| turbulenceFunctionResult =
|
| SkScalarMul(turbulenceFunctionResult, SK_ScalarHalf) + SK_ScalarHalf;
|
| }
|
| @@ -408,9 +409,7 @@
|
| return SkScalarPin(turbulenceFunctionResult, 0, SK_Scalar1);
|
| }
|
|
|
| -SkPMColor SkPerlinNoiseShader::PerlinNoiseShaderContext::shade(
|
| - const SkPoint& point, StitchData& stitchData) const {
|
| - const SkPerlinNoiseShader& perlinNoiseShader = static_cast<const SkPerlinNoiseShader&>(fShader);
|
| +SkPMColor SkPerlinNoiseShader::shade(const SkPoint& point, StitchData& stitchData) const {
|
| SkPoint newPoint;
|
| fMatrix.mapPoints(&newPoint, &point, 1);
|
| newPoint.fX = SkScalarRoundToScalar(newPoint.fX);
|
| @@ -419,32 +418,15 @@
|
| U8CPU rgba[4];
|
| for (int channel = 3; channel >= 0; --channel) {
|
| rgba[channel] = SkScalarFloorToInt(255 *
|
| - calculateTurbulenceValueForPoint(channel, *perlinNoiseShader.fPaintingData,
|
| - stitchData, newPoint));
|
| + calculateTurbulenceValueForPoint(channel, *fPaintingData, stitchData, newPoint));
|
| }
|
| return SkPreMultiplyARGB(rgba[3], rgba[0], rgba[1], rgba[2]);
|
| }
|
|
|
| -SkShader::Context* SkPerlinNoiseShader::createContext(const SkBitmap& device, const SkPaint& paint,
|
| - const SkMatrix& matrix, void* storage) const {
|
| - if (!this->validContext(device, paint, matrix)) {
|
| - return NULL;
|
| - }
|
| -
|
| - return SkNEW_PLACEMENT_ARGS(storage, PerlinNoiseShaderContext, (*this, device, paint, matrix));
|
| -}
|
| -
|
| -size_t SkPerlinNoiseShader::contextSize() const {
|
| - return sizeof(PerlinNoiseShaderContext);
|
| -}
|
| -
|
| -SkPerlinNoiseShader::PerlinNoiseShaderContext::PerlinNoiseShaderContext(
|
| - const SkPerlinNoiseShader& shader, const SkBitmap& device,
|
| - const SkPaint& paint, const SkMatrix& matrix)
|
| - : INHERITED(shader, device, paint, matrix)
|
| -{
|
| +bool SkPerlinNoiseShader::setContext(const SkBitmap& device, const SkPaint& paint,
|
| + const SkMatrix& matrix) {
|
| SkMatrix newMatrix = matrix;
|
| - newMatrix.postConcat(shader.getLocalMatrix());
|
| + newMatrix.postConcat(getLocalMatrix());
|
| SkMatrix invMatrix;
|
| if (!newMatrix.invert(&invMatrix)) {
|
| invMatrix.reset();
|
| @@ -455,10 +437,10 @@
|
| newMatrix.postConcat(invMatrix);
|
| newMatrix.postConcat(invMatrix);
|
| fMatrix = newMatrix;
|
| -}
|
| -
|
| -void SkPerlinNoiseShader::PerlinNoiseShaderContext::shadeSpan(
|
| - int x, int y, SkPMColor result[], int count) {
|
| + return INHERITED::setContext(device, paint, matrix);
|
| +}
|
| +
|
| +void SkPerlinNoiseShader::shadeSpan(int x, int y, SkPMColor result[], int count) {
|
| SkPoint point = SkPoint::Make(SkIntToScalar(x), SkIntToScalar(y));
|
| StitchData stitchData;
|
| for (int i = 0; i < count; ++i) {
|
| @@ -467,8 +449,7 @@
|
| }
|
| }
|
|
|
| -void SkPerlinNoiseShader::PerlinNoiseShaderContext::shadeSpan16(
|
| - int x, int y, uint16_t result[], int count) {
|
| +void SkPerlinNoiseShader::shadeSpan16(int x, int y, uint16_t result[], int count) {
|
| SkPoint point = SkPoint::Make(SkIntToScalar(x), SkIntToScalar(y));
|
| StitchData stitchData;
|
| DITHER_565_SCAN(y);
|
|
|