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

Side by Side Diff: src/effects/SkPerlinNoiseShader.cpp

Issue 83343003: Adding more validation (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Minor fixes Created 7 years 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 | Annotate | Revision Log
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 #include "SkDither.h" 8 #include "SkDither.h"
9 #include "SkPerlinNoiseShader.h" 9 #include "SkPerlinNoiseShader.h"
10 #include "SkColorFilter.h" 10 #include "SkColorFilter.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 return noiseValue; 44 return noiseValue;
45 } 45 }
46 46
47 inline SkScalar smoothCurve(SkScalar t) { 47 inline SkScalar smoothCurve(SkScalar t) {
48 static const SkScalar SK_Scalar3 = SkFloatToScalar(3.0f); 48 static const SkScalar SK_Scalar3 = SkFloatToScalar(3.0f);
49 49
50 // returns t * t * (3 - 2 * t) 50 // returns t * t * (3 - 2 * t)
51 return SkScalarMul(SkScalarSquare(t), SK_Scalar3 - 2 * t); 51 return SkScalarMul(SkScalarSquare(t), SK_Scalar3 - 2 * t);
52 } 52 }
53 53
54 bool perlin_noise_type_is_valid(SkPerlinNoiseShader::Type type) {
55 switch (type) {
Stephen White 2013/11/25 16:11:21 Nit: this could be: return type == SkPerlinNoiseS
sugoi 2013/11/25 16:20:33 Done.
56 case SkPerlinNoiseShader::kFractalNoise_Type:
57 case SkPerlinNoiseShader::kTurbulence_Type:
58 return true;
59 default:
60 break;
61 }
62 return false;
63 }
64
54 } // end namespace 65 } // end namespace
55 66
56 struct SkPerlinNoiseShader::StitchData { 67 struct SkPerlinNoiseShader::StitchData {
57 StitchData() 68 StitchData()
58 : fWidth(0) 69 : fWidth(0)
59 , fWrapX(0) 70 , fWrapX(0)
60 , fHeight(0) 71 , fHeight(0)
61 , fWrapY(0) 72 , fWrapY(0)
62 {} 73 {}
63 74
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 283
273 SkPerlinNoiseShader::SkPerlinNoiseShader(SkPerlinNoiseShader::Type type, 284 SkPerlinNoiseShader::SkPerlinNoiseShader(SkPerlinNoiseShader::Type type,
274 SkScalar baseFrequencyX, 285 SkScalar baseFrequencyX,
275 SkScalar baseFrequencyY, 286 SkScalar baseFrequencyY,
276 int numOctaves, 287 int numOctaves,
277 SkScalar seed, 288 SkScalar seed,
278 const SkISize* tileSize) 289 const SkISize* tileSize)
279 : fType(type) 290 : fType(type)
280 , fBaseFrequencyX(baseFrequencyX) 291 , fBaseFrequencyX(baseFrequencyX)
281 , fBaseFrequencyY(baseFrequencyY) 292 , fBaseFrequencyY(baseFrequencyY)
282 , fNumOctaves(numOctaves & 0xFF /*[0,255] octaves allowed*/) 293 , fNumOctaves(numOctaves > 255 ? 255 : numOctaves/*[0,255] octaves allowed*/)
283 , fSeed(seed) 294 , fSeed(seed)
284 , fStitchTiles((tileSize != NULL) && !tileSize->isEmpty()) 295 , fStitchTiles((tileSize != NULL) && !tileSize->isEmpty())
285 , fPaintingData(NULL) 296 , fPaintingData(NULL)
286 { 297 {
287 SkASSERT(numOctaves >= 0 && numOctaves < 256); 298 SkASSERT(numOctaves >= 0 && numOctaves < 256);
288 setTileSize(fStitchTiles ? *tileSize : SkISize::Make(0,0)); 299 setTileSize(fStitchTiles ? *tileSize : SkISize::Make(0,0));
289 fMatrix.reset(); 300 fMatrix.reset();
290 } 301 }
291 302
292 SkPerlinNoiseShader::SkPerlinNoiseShader(SkFlattenableReadBuffer& buffer) : 303 SkPerlinNoiseShader::SkPerlinNoiseShader(SkFlattenableReadBuffer& buffer) :
293 INHERITED(buffer), fPaintingData(NULL) { 304 INHERITED(buffer), fPaintingData(NULL) {
294 fType = (SkPerlinNoiseShader::Type) buffer.readInt(); 305 fType = (SkPerlinNoiseShader::Type) buffer.readInt();
295 fBaseFrequencyX = buffer.readScalar(); 306 fBaseFrequencyX = buffer.readScalar();
296 fBaseFrequencyY = buffer.readScalar(); 307 fBaseFrequencyY = buffer.readScalar();
297 fNumOctaves = buffer.readInt(); 308 fNumOctaves = buffer.readInt();
298 fSeed = buffer.readScalar(); 309 fSeed = buffer.readScalar();
299 fStitchTiles = buffer.readBool(); 310 fStitchTiles = buffer.readBool();
300 fTileSize.fWidth = buffer.readInt(); 311 fTileSize.fWidth = buffer.readInt();
301 fTileSize.fHeight = buffer.readInt(); 312 fTileSize.fHeight = buffer.readInt();
302 setTileSize(fTileSize); 313 setTileSize(fTileSize);
303 fMatrix.reset(); 314 fMatrix.reset();
315 buffer.validate(perlin_noise_type_is_valid(fType) &&
316 (fNumOctaves >= 0) && (fNumOctaves <= 255));
304 } 317 }
305 318
306 SkPerlinNoiseShader::~SkPerlinNoiseShader() { 319 SkPerlinNoiseShader::~SkPerlinNoiseShader() {
307 // Safety, should have been done in endContext() 320 // Safety, should have been done in endContext()
308 SkDELETE(fPaintingData); 321 SkDELETE(fPaintingData);
309 } 322 }
310 323
311 void SkPerlinNoiseShader::flatten(SkFlattenableWriteBuffer& buffer) const { 324 void SkPerlinNoiseShader::flatten(SkFlattenableWriteBuffer& buffer) const {
312 this->INHERITED::flatten(buffer); 325 this->INHERITED::flatten(buffer);
313 buffer.writeInt((int) fType); 326 buffer.writeInt((int) fType);
(...skipping 1064 matching lines...) Expand 10 before | Expand all | Expand 10 after
1378 str->append(" seed: "); 1391 str->append(" seed: ");
1379 str->appendScalar(fSeed); 1392 str->appendScalar(fSeed);
1380 str->append(" stitch tiles: "); 1393 str->append(" stitch tiles: ");
1381 str->append(fStitchTiles ? "true " : "false "); 1394 str->append(fStitchTiles ? "true " : "false ");
1382 1395
1383 this->INHERITED::toString(str); 1396 this->INHERITED::toString(str);
1384 1397
1385 str->append(")"); 1398 str->append(")");
1386 } 1399 }
1387 #endif 1400 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698