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

Side by Side Diff: include/effects/SkPerlinNoiseShader.h

Issue 169973002: Begin making SkPerlinNoiseShader const. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Make methods const and simplify const comments. Created 6 years, 9 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 unified diff | Download patch
« no previous file with comments | « no previous file | src/effects/SkPerlinNoiseShader.cpp » ('j') | src/effects/SkPerlinNoiseShader.cpp » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkPerlinNoiseShader_DEFINED 8 #ifndef SkPerlinNoiseShader_DEFINED
9 #define SkPerlinNoiseShader_DEFINED 9 #define SkPerlinNoiseShader_DEFINED
10 10
11 #include "SkBitmap.h"
12 #include "SkPoint.h"
11 #include "SkShader.h" 13 #include "SkShader.h"
12 14
13 /** \class SkPerlinNoiseShader 15 /** \class SkPerlinNoiseShader
14 16
15 SkPerlinNoiseShader creates an image using the Perlin turbulence function. 17 SkPerlinNoiseShader creates an image using the Perlin turbulence function.
16 18
17 It can produce tileable noise if asked to stitch tiles and provided a tile s ize. 19 It can produce tileable noise if asked to stitch tiles and provided a tile s ize.
18 In order to fill a large area with repeating noise, set the stitchTiles flag to 20 In order to fill a large area with repeating noise, set the stitchTiles flag to
19 true, and render exactly a single tile of noise. Without this flag, the resu lt 21 true, and render exactly a single tile of noise. Without this flag, the resu lt
20 will contain visible seams between tiles. 22 will contain visible seams between tiles.
21 23
22 The algorithm used is described here : 24 The algorithm used is described here :
23 http://www.w3.org/TR/SVG/filters.html#feTurbulenceElement 25 http://www.w3.org/TR/SVG/filters.html#feTurbulenceElement
24 */ 26 */
25 class SK_API SkPerlinNoiseShader : public SkShader { 27 class SK_API SkPerlinNoiseShader : public SkShader {
26 struct PaintingData;
27 public: 28 public:
28 struct StitchData;
29
30 /** 29 /**
31 * About the noise types : the difference between the 2 is just minor tweak s to the algorithm, 30 * About the noise types : the difference between the 2 is just minor tweak s to the algorithm,
32 * they're not 2 entirely different noises. The output looks different, but once the noise is 31 * they're not 2 entirely different noises. The output looks different, but once the noise is
33 * generated in the [1, -1] range, the output is brought back in the [0, 1] range by doing : 32 * generated in the [1, -1] range, the output is brought back in the [0, 1] range by doing :
34 * kFractalNoise_Type : noise * 0.5 + 0.5 33 * kFractalNoise_Type : noise * 0.5 + 0.5
35 * kTurbulence_Type : abs(noise) 34 * kTurbulence_Type : abs(noise)
36 * Very little differences between the 2 types, although you can tell the d ifference visually. 35 * Very little differences between the 2 types, although you can tell the d ifference visually.
37 */ 36 */
38 enum Type { 37 enum Type {
39 kFractalNoise_Type, 38 kFractalNoise_Type,
(...skipping 22 matching lines...) Expand all
62 int numOctaves, SkScalar seed, 61 int numOctaves, SkScalar seed,
63 const SkISize* tileSize = NULL); 62 const SkISize* tileSize = NULL);
64 63
65 virtual bool setContext(const SkBitmap& device, const SkPaint& paint, 64 virtual bool setContext(const SkBitmap& device, const SkPaint& paint,
66 const SkMatrix& matrix); 65 const SkMatrix& matrix);
67 virtual void shadeSpan(int x, int y, SkPMColor[], int count) SK_OVERRIDE; 66 virtual void shadeSpan(int x, int y, SkPMColor[], int count) SK_OVERRIDE;
68 virtual void shadeSpan16(int x, int y, uint16_t[], int count) SK_OVERRIDE; 67 virtual void shadeSpan16(int x, int y, uint16_t[], int count) SK_OVERRIDE;
69 68
70 virtual GrEffectRef* asNewEffect(GrContext* context, const SkPaint&) const S K_OVERRIDE; 69 virtual GrEffectRef* asNewEffect(GrContext* context, const SkPaint&) const S K_OVERRIDE;
71 70
71 struct StitchData {
scroggo 2014/03/04 22:26:34 StitchData is now defined in the class declaration
72 StitchData()
73 : fWidth(0)
74 , fWrapX(0)
75 , fHeight(0)
76 , fWrapY(0)
77 {}
78
79 bool operator==(const StitchData& other) const {
80 return fWidth == other.fWidth &&
81 fWrapX == other.fWrapX &&
82 fHeight == other.fHeight &&
83 fWrapY == other.fWrapY;
84 }
85
86 int fWidth; // How much to subtract to wrap for stitching.
87 int fWrapX; // Minimum value to wrap.
88 int fHeight;
89 int fWrapY;
90 };
91
72 SK_DEVELOPER_TO_STRING() 92 SK_DEVELOPER_TO_STRING()
73 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPerlinNoiseShader) 93 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPerlinNoiseShader)
74 94
75 protected: 95 protected:
76 SkPerlinNoiseShader(SkReadBuffer&); 96 SkPerlinNoiseShader(SkReadBuffer&);
77 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; 97 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
78 98
79 private: 99 private:
80 SkPerlinNoiseShader(SkPerlinNoiseShader::Type type, SkScalar baseFrequencyX, 100 SkPerlinNoiseShader(SkPerlinNoiseShader::Type type, SkScalar baseFrequencyX,
81 SkScalar baseFrequencyY, int numOctaves, SkScalar seed, 101 SkScalar baseFrequencyY, int numOctaves, SkScalar seed,
82 const SkISize* tileSize = NULL); 102 const SkISize* tileSize = NULL);
83 virtual ~SkPerlinNoiseShader();
84 103
85 void setTileSize(const SkISize&); 104 SkScalar noise2D(int channel, const StitchData& stitchData, const SkPoint& n oiseVector) const;
86 105
87 void initPaint(PaintingData& paintingData); 106 SkScalar calculateTurbulenceValueForPoint(int channel, StitchData& stitchDat a,
107 const SkPoint& point) const;
88 108
89 SkScalar noise2D(int channel, const PaintingData& paintingData, 109 SkPMColor shade(const SkPoint& point, StitchData& stitchData) const;
90 const StitchData& stitchData, const SkPoint& noiseVector);
91 110
92 SkScalar calculateTurbulenceValueForPoint(int channel, const PaintingData& p aintingData, 111 // TODO (scroggo): Investigate making fields const.
93 StitchData& stitchData, const SkPo int& point); 112 SkPerlinNoiseShader::Type fType;
113 SkVector fBaseFrequency;
114 int fNumOctaves;
115 // fSeed changes on each call to random.
116 mutable int fSeed;
scroggo 2014/03/04 22:26:34 fSeed is now an int, like PaintingData::fSeed was.
117 SkISize fTileSize;
118 bool fStitchTiles;
94 119
95 SkPMColor shade(const SkPoint& point, StitchData& stitchData); 120 static const int kBlockSize = 256;
scroggo 2014/03/04 22:26:34 Now defined here for members referencing it that u
121 static const int kBlockMask = kBlockSize - 1;
96 122
97 SkPerlinNoiseShader::Type fType; 123 uint8_t fLatticeSelector[kBlockSize];
98 SkScalar fBaseFrequencyX; 124 uint16_t fNoise[4][kBlockSize][2];
99 SkScalar fBaseFrequencyY; 125 SkPoint fGradient[4][kBlockSize];
100 int fNumOctaves; 126
101 SkScalar fSeed; 127 StitchData fStitchDataInit;
102 SkISize fTileSize; 128
103 bool fStitchTiles; 129 // These are caches. Instead of accessing directly, getPermutationsBitmap an d getNoiseBitmap
130 // should be called.
131 mutable SkBitmap fPermutationsBitmap;
scroggo 2014/03/04 22:26:34 I changed these from pointers on fPaintingData to
132 mutable SkBitmap fNoiseBitmap;
133
134
135 // TODO (scroggo): Once setContext creates a new object, place this on that object.
104 SkMatrix fMatrix; 136 SkMatrix fMatrix;
105 137
106 PaintingData* fPaintingData; 138 void init();
scroggo 2014/03/04 22:26:34 This should now be the only function that modifies
139 const SkBitmap& getPermutationsBitmap() const;
140 const SkBitmap& getNoiseBitmap() const;
107 141
108 typedef SkShader INHERITED; 142 typedef SkShader INHERITED;
109 }; 143 };
110 144
111 #endif 145 #endif
OLDNEW
« no previous file with comments | « no previous file | src/effects/SkPerlinNoiseShader.cpp » ('j') | src/effects/SkPerlinNoiseShader.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698