SkPMColor SkPerlinNoiseShader::PerlinNoiseShaderContext::shade( const SkPoint& point, StitchData& stitchData) const { SkPoint newPoint; fMatrix.mapPoints(&newPoint, &point, 1); newPoint.fX = SkScalarRoundToScalar(newPoint.fX); newPoint.fY = SkScalarRoundToScalar(newPoint.fY); U8CPU rgba[4]; for (int channel = 3; channel >= 0; --channel) { rgba[channel] = SkScalarFloorToInt(255 * calculateTurbulenceValueForPoint(channel, stitchData, newPoint)); } return SkPreMultiplyARGB(rgba[3], rgba[0], rgba[1], rgba[2]); }
inline void FETurbulence::fillRegion(ByteArray* pixelArray, PaintingData& paintingData, int startY, int endY) { IntRect filterRegion = absolutePaintRect(); IntPoint point(0, filterRegion.y() + startY); int indexOfPixelChannel = startY * (filterRegion.width() << 2); int channel; for (int y = startY; y < endY; ++y) { point.setY(point.y() + 1); point.setX(filterRegion.x()); for (int x = 0; x < filterRegion.width(); ++x) { point.setX(point.x() + 1); for (channel = 0; channel < 4; ++channel, ++indexOfPixelChannel) pixelArray->set(indexOfPixelChannel, calculateTurbulenceValueForPoint(channel, paintingData, filter()->mapAbsolutePointToLocalPoint(point))); } } }