| Index: Source/platform/graphics/filters/FEColorMatrix.cpp
|
| diff --git a/Source/platform/graphics/filters/FEColorMatrix.cpp b/Source/platform/graphics/filters/FEColorMatrix.cpp
|
| index 689edd37ddcbccd11181990a53e63f3a79619200..425f35c1ecb6bd4d41ead49f86582bae400a83c2 100644
|
| --- a/Source/platform/graphics/filters/FEColorMatrix.cpp
|
| +++ b/Source/platform/graphics/filters/FEColorMatrix.cpp
|
| @@ -31,6 +31,8 @@
|
|
|
| namespace blink {
|
|
|
| +static const unsigned kColorMatrixSize = 20;
|
| +
|
| FEColorMatrix::FEColorMatrix(Filter* filter, ColorMatrixType type, const Vector<float>& values)
|
| : FilterEffect(filter)
|
| , m_type(type)
|
| @@ -63,14 +65,13 @@ const Vector<float>& FEColorMatrix::values() const
|
|
|
| bool FEColorMatrix::setValues(const Vector<float> &values)
|
| {
|
| - ASSERT(values.size() == 20);
|
| if (m_values == values)
|
| return false;
|
| m_values = values;
|
| return true;
|
| }
|
|
|
| -static void saturateMatrix(float s, SkScalar matrix[20])
|
| +static void saturateMatrix(float s, SkScalar matrix[kColorMatrixSize])
|
| {
|
| matrix[0] = 0.213f + 0.787f * s;
|
| matrix[1] = 0.715f - 0.715f * s;
|
| @@ -89,7 +90,7 @@ static void saturateMatrix(float s, SkScalar matrix[20])
|
| matrix[19] = 0;
|
| }
|
|
|
| -static void hueRotateMatrix(float hue, SkScalar matrix[20])
|
| +static void hueRotateMatrix(float hue, SkScalar matrix[kColorMatrixSize])
|
| {
|
| float cosHue = cosf(hue * piFloat / 180);
|
| float sinHue = sinf(hue * piFloat / 180);
|
| @@ -110,34 +111,41 @@ static void hueRotateMatrix(float hue, SkScalar matrix[20])
|
| matrix[19] = 0;
|
| }
|
|
|
| -static void luminanceToAlphaMatrix(SkScalar matrix[20])
|
| +static void luminanceToAlphaMatrix(SkScalar matrix[kColorMatrixSize])
|
| {
|
| - memset(matrix, 0, 20 * sizeof(SkScalar));
|
| + memset(matrix, 0, kColorMatrixSize * sizeof(SkScalar));
|
| matrix[15] = 0.2125f;
|
| matrix[16] = 0.7154f;
|
| matrix[17] = 0.0721f;
|
| }
|
|
|
| -static SkColorFilter* createColorFilter(ColorMatrixType type, const float* values)
|
| +static SkColorFilter* createColorFilter(ColorMatrixType type, const Vector<float>& values)
|
| {
|
| - SkScalar matrix[20];
|
| + // Use defaults if values contains too few values. See SVGFEColorMatrixElement::build
|
| + SkScalar matrix[kColorMatrixSize];
|
| + memset(matrix, 0, kColorMatrixSize * sizeof(SkScalar));
|
| + matrix[0] = matrix[6] = matrix[12] = matrix[18] = 1;
|
| +
|
| switch (type) {
|
| case FECOLORMATRIX_TYPE_UNKNOWN:
|
| break;
|
| case FECOLORMATRIX_TYPE_MATRIX:
|
| - for (int i = 0; i < 20; ++i)
|
| - matrix[i] = values[i];
|
| -
|
| + if (values.size() >= kColorMatrixSize) {
|
| + for (unsigned i = 0; i < kColorMatrixSize; ++i)
|
| + matrix[i] = values[i];
|
| + }
|
| matrix[4] *= SkScalar(255);
|
| matrix[9] *= SkScalar(255);
|
| matrix[14] *= SkScalar(255);
|
| matrix[19] *= SkScalar(255);
|
| break;
|
| case FECOLORMATRIX_TYPE_SATURATE:
|
| - saturateMatrix(values[0], matrix);
|
| + if (values.size())
|
| + saturateMatrix(values[0], matrix);
|
| break;
|
| case FECOLORMATRIX_TYPE_HUEROTATE:
|
| - hueRotateMatrix(values[0], matrix);
|
| + if (values.size())
|
| + hueRotateMatrix(values[0], matrix);
|
| break;
|
| case FECOLORMATRIX_TYPE_LUMINANCETOALPHA:
|
| luminanceToAlphaMatrix(matrix);
|
| @@ -150,13 +158,13 @@ bool FEColorMatrix::affectsTransparentPixels()
|
| {
|
| // Because the input pixels are premultiplied, the only way clear pixels can be
|
| // painted is if the additive component for the alpha is not 0.
|
| - return m_type == FECOLORMATRIX_TYPE_MATRIX && m_values[19] > 0;
|
| + return m_type == FECOLORMATRIX_TYPE_MATRIX && m_values.size() >= kColorMatrixSize && m_values[19] > 0;
|
| }
|
|
|
| PassRefPtr<SkImageFilter> FEColorMatrix::createImageFilter(SkiaImageFilterBuilder* builder)
|
| {
|
| RefPtr<SkImageFilter> input(builder->build(inputEffect(0), operatingColorSpace()));
|
| - SkAutoTUnref<SkColorFilter> filter(createColorFilter(m_type, m_values.data()));
|
| + SkAutoTUnref<SkColorFilter> filter(createColorFilter(m_type, m_values));
|
| SkImageFilter::CropRect rect = getCropRect(builder->cropOffset());
|
| return adoptRef(SkColorFilterImageFilter::Create(filter, input.get(), &rect));
|
| }
|
|
|