Perform perlin noise matrix computations once per frame, not per pixel.

Before (Retina MBP):
running bench [640 480]                              perlinnoise   8888:  cmsecs =   1853.18

After:
running bench [640 480]                              perlinnoise   8888:  cmsecs =   1667.06

Review URL: https://codereview.chromium.org/225583006

git-svn-id: http://skia.googlecode.com/svn/trunk@14060 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
senorblanco@chromium.org 2014-04-04 14:46:10 +00:00
parent 2af1a2dbc4
commit a8d95f899b

View File

@ -410,20 +410,8 @@ SkScalar SkPerlinNoiseShader::calculateTurbulenceValueForPoint(int channel,
}
SkPMColor SkPerlinNoiseShader::shade(const SkPoint& point, StitchData& stitchData) const {
SkMatrix matrix = fMatrix;
matrix.postConcat(getLocalMatrix());
SkMatrix invMatrix;
if (!matrix.invert(&invMatrix)) {
invMatrix.reset();
} else {
invMatrix.postConcat(invMatrix); // Square the matrix
}
// This (1,1) translation is due to WebKit's 1 based coordinates for the noise
// (as opposed to 0 based, usually). The same adjustment is in the setData() function.
matrix.postTranslate(SK_Scalar1, SK_Scalar1);
SkPoint newPoint;
matrix.mapPoints(&newPoint, &point, 1);
invMatrix.mapPoints(&newPoint, &newPoint, 1);
fMatrix.mapPoints(&newPoint, &point, 1);
newPoint.fX = SkScalarRoundToScalar(newPoint.fX);
newPoint.fY = SkScalarRoundToScalar(newPoint.fY);
@ -437,7 +425,18 @@ SkPMColor SkPerlinNoiseShader::shade(const SkPoint& point, StitchData& stitchDat
bool SkPerlinNoiseShader::setContext(const SkBitmap& device, const SkPaint& paint,
const SkMatrix& matrix) {
fMatrix = matrix;
SkMatrix newMatrix = matrix;
newMatrix.postConcat(getLocalMatrix());
SkMatrix invMatrix;
if (!newMatrix.invert(&invMatrix)) {
invMatrix.reset();
}
// This (1,1) translation is due to WebKit's 1 based coordinates for the noise
// (as opposed to 0 based, usually). The same adjustment is in the setData() function.
newMatrix.postTranslate(SK_Scalar1, SK_Scalar1);
newMatrix.postConcat(invMatrix);
newMatrix.postConcat(invMatrix);
fMatrix = newMatrix;
return INHERITED::setContext(device, paint, matrix);
}