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

Unified Diff: experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.h

Issue 1432863003: added experimental improved Perlin noise shader (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 1 month 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 | « no previous file | experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.h
diff --git a/include/effects/SkPerlinNoiseShader.h b/experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.h
similarity index 72%
copy from include/effects/SkPerlinNoiseShader.h
copy to experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.h
index 0cb1b47a9f4b57b12e979ebb81ec41f445e36101..3c02c5de244c546ad39b4f3b15a1882882332c76 100644
--- a/include/effects/SkPerlinNoiseShader.h
+++ b/experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.h
@@ -5,14 +5,14 @@
* found in the LICENSE file.
*/
-#ifndef SkPerlinNoiseShader_DEFINED
-#define SkPerlinNoiseShader_DEFINED
+#ifndef SkPerlinNoiseShader2_DEFINED
+#define SkPerlinNoiseShader2_DEFINED
#include "SkShader.h"
-/** \class SkPerlinNoiseShader
+/** \class SkPerlinNoiseShader2
- SkPerlinNoiseShader creates an image using the Perlin turbulence function.
+ SkPerlinNoiseShader2 creates an image using the Perlin turbulence function.
It can produce tileable noise if asked to stitch tiles and provided a tile size.
In order to fill a large area with repeating noise, set the stitchTiles flag to
@@ -22,24 +22,30 @@
The algorithm used is described here :
http://www.w3.org/TR/SVG/filters.html#feTurbulenceElement
*/
-class SK_API SkPerlinNoiseShader : public SkShader {
+class SK_API SkPerlinNoiseShader2 : public SkShader {
public:
struct StitchData;
struct PaintingData;
/**
- * 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
- * generated in the [1, -1] range, the output is brought back in the [0, 1] range by doing :
+ * About the noise types : the difference between the first 2 is just minor tweaks to the
+ * algorithm, they're not 2 entirely different noises. The output looks different, but once the
+ * noise is generated in the [1, -1] range, the output is brought back in the [0, 1] range by
+ * doing :
* kFractalNoise_Type : noise * 0.5 + 0.5
* kTurbulence_Type : abs(noise)
* Very little differences between the 2 types, although you can tell the difference visually.
+ * "Improved" is based on the Improved Perlin Noise algorithm described at
+ * http://mrl.nyu.edu/~perlin/noise/. It is quite distinct from the other two, and the noise is
+ * a 2D slice of a 3D noise texture. Minor changes to the Z coordinate will result in minor
+ * changes to the noise, making it suitable for animated noise.
*/
enum Type {
kFractalNoise_Type,
kTurbulence_Type,
+ kImprovedNoise_Type,
kFirstType = kFractalNoise_Type,
- kLastType = kTurbulence_Type
+ kLastType = kImprovedNoise_Type
};
/**
* This will construct Perlin noise of the given type (Fractal Noise or Turbulence).
@@ -62,6 +68,12 @@ public:
int numOctaves, SkScalar seed,
const SkISize* tileSize = NULL);
/**
+ * Creates an Improved Perlin Noise shader. The z value is roughly equivalent to the seed of the
+ * other two types, but minor variations to z will only slightly change the noise.
+ */
+ static SkShader* CreateImprovedNoise(SkScalar baseFrequencyX, SkScalar baseFrequencyY,
+ int numOctaves, SkScalar z);
+ /**
* Create alias for CreateTurbulunce until all Skia users changed
* its code to use the new naming
*/
@@ -76,7 +88,7 @@ public:
class PerlinNoiseShaderContext : public SkShader::Context {
public:
- PerlinNoiseShaderContext(const SkPerlinNoiseShader& shader, const ContextRec&);
+ PerlinNoiseShaderContext(const SkPerlinNoiseShader2& shader, const ContextRec&);
virtual ~PerlinNoiseShaderContext();
void shadeSpan(int x, int y, SkPMColor[], int count) override;
@@ -87,6 +99,7 @@ public:
SkScalar calculateTurbulenceValueForPoint(
int channel,
StitchData& stitchData, const SkPoint& point) const;
+ SkScalar calculateImprovedNoiseValueForPoint(int channel, const SkPoint& point) const;
SkScalar noise2D(int channel,
const StitchData& stitchData, const SkPoint& noiseVector) const;
@@ -102,19 +115,19 @@ public:
#endif
SK_TO_STRING_OVERRIDE()
- SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPerlinNoiseShader)
+ SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPerlinNoiseShader2)
protected:
void flatten(SkWriteBuffer&) const override;
Context* onCreateContext(const ContextRec&, void* storage) const override;
private:
- SkPerlinNoiseShader(SkPerlinNoiseShader::Type type, SkScalar baseFrequencyX,
+ SkPerlinNoiseShader2(SkPerlinNoiseShader2::Type type, SkScalar baseFrequencyX,
SkScalar baseFrequencyY, int numOctaves, SkScalar seed,
const SkISize* tileSize);
- virtual ~SkPerlinNoiseShader();
+ virtual ~SkPerlinNoiseShader2();
- const SkPerlinNoiseShader::Type fType;
+ const SkPerlinNoiseShader2::Type fType;
const SkScalar fBaseFrequencyX;
const SkScalar fBaseFrequencyY;
const int fNumOctaves;
« no previous file with comments | « no previous file | experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698