153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)/*
253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org>
353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * Copyright (C) 2005 Eric Seidel <eric@webkit.org>
553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) *
853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * This library is free software; you can redistribute it and/or
953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * modify it under the terms of the GNU Library General Public
1053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * License as published by the Free Software Foundation; either
1153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * version 2 of the License, or (at your option) any later version.
1253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) *
1353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * This library is distributed in the hope that it will be useful,
1453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
1553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * Library General Public License for more details.
1753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) *
1853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * You should have received a copy of the GNU Library General Public License
1953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
2053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
2153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * Boston, MA 02110-1301, USA.
2253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) */
2353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "config.h"
25a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/FEColorMatrix.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
27a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "SkColorFilterImageFilter.h"
28a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "SkColorMatrixFilter.h"
29a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContext.h"
30a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/SkiaImageFilterBuilder.h"
31a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/skia/NativeImageSkia.h"
321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/TextStream.h"
337757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/MathExtras.h"
347757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/Uint8ClampedArray.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)namespace WebCore {
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)FEColorMatrix::FEColorMatrix(Filter* filter, ColorMatrixType type, const Vector<float>& values)
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    : FilterEffect(filter)
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    , m_type(type)
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    , m_values(values)
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)PassRefPtr<FEColorMatrix> FEColorMatrix::create(Filter* filter, ColorMatrixType type, const Vector<float>& values)
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return adoptRef(new FEColorMatrix(filter, type, values));
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)ColorMatrixType FEColorMatrix::type() const
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return m_type;
5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool FEColorMatrix::setType(ColorMatrixType type)
5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_type == type)
5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_type = type;
6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)const Vector<float>& FEColorMatrix::values() const
6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return m_values;
6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
6753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
6853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool FEColorMatrix::setValues(const Vector<float> &values)
6953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
7053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_values == values)
7153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
7253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_values = values;
7353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
7453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
7553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
7653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static void saturateMatrix(float s, SkScalar matrix[20])
7753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
7853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[0] = 0.213f + 0.787f * s;
7953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[1] = 0.715f - 0.715f * s;
8053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[2] = 0.072f - 0.072f * s;
8153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[3] = matrix[4] = 0;
8253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[5] = 0.213f - 0.213f * s;
8353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[6] = 0.715f + 0.285f * s;
8453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[7] = 0.072f - 0.072f * s;
8553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[8] = matrix[9] = 0;
8653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[10] = 0.213f - 0.213f * s;
8753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[11] = 0.715f - 0.715f * s;
8853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[12] = 0.072f + 0.928f * s;
8953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[13] = matrix[14] = 0;
9053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[15] = matrix[16] = matrix[17] = 0;
9153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[18] = 1;
9253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[19] = 0;
9353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
9453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
9553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static void hueRotateMatrix(float hue, SkScalar matrix[20])
9653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
9753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    float cosHue = cosf(hue * piFloat / 180);
9853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    float sinHue = sinf(hue * piFloat / 180);
9953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[0] = 0.213f + cosHue * 0.787f - sinHue * 0.213f;
10053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[1] = 0.715f - cosHue * 0.715f - sinHue * 0.715f;
10153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[2] = 0.072f - cosHue * 0.072f + sinHue * 0.928f;
10253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[3] = matrix[4] = 0;
10353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[5] = 0.213f - cosHue * 0.213f + sinHue * 0.143f;
10453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[6] = 0.715f + cosHue * 0.285f + sinHue * 0.140f;
10553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[7] = 0.072f - cosHue * 0.072f - sinHue * 0.283f;
10653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[8] = matrix[9] = 0;
10753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[10] = 0.213f - cosHue * 0.213f - sinHue * 0.787f;
10853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[11] = 0.715f - cosHue * 0.715f + sinHue * 0.715f;
10953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[12] = 0.072f + cosHue * 0.928f + sinHue * 0.072f;
11053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[13] = matrix[14] = 0;
11153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[15] = matrix[16] = matrix[17] = 0;
11253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[18] = 1;
11353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[19] = 0;
11453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
11553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
11653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static void luminanceToAlphaMatrix(SkScalar matrix[20])
11753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
11853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    memset(matrix, 0, 20 * sizeof(SkScalar));
11953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[15] = 0.2125f;
12053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[16] = 0.7154f;
12153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    matrix[17] = 0.0721f;
12253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
12353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
12453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static SkColorFilter* createColorFilter(ColorMatrixType type, const float* values)
12553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
12653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    SkScalar matrix[20];
12753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    switch (type) {
12853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case FECOLORMATRIX_TYPE_UNKNOWN:
12953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        break;
13053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case FECOLORMATRIX_TYPE_MATRIX:
13153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        for (int i = 0; i < 20; ++i)
13253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            matrix[i] = values[i];
13353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
13453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        matrix[4] *= SkScalar(255);
13553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        matrix[9] *= SkScalar(255);
13653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        matrix[14] *= SkScalar(255);
13753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        matrix[19] *= SkScalar(255);
13853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        break;
13953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case FECOLORMATRIX_TYPE_SATURATE:
14053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        saturateMatrix(values[0], matrix);
14153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        break;
14253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case FECOLORMATRIX_TYPE_HUEROTATE:
14353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        hueRotateMatrix(values[0], matrix);
14453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        break;
14553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case FECOLORMATRIX_TYPE_LUMINANCETOALPHA:
14653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        luminanceToAlphaMatrix(matrix);
14753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        break;
14853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
14910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return SkColorMatrixFilter::Create(matrix);
15053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
15153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
152aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochvoid FEColorMatrix::applySoftware()
15353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
15453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ImageBuffer* resultImage = createImageBufferResult();
15553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!resultImage)
156aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        return;
15753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
15853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    FilterEffect* in = inputEffect(0);
15953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
16009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    IntRect drawingRegion = drawingRegionOfInputImage(in->absolutePaintRect());
16153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
16253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    SkAutoTUnref<SkColorFilter> filter(createColorFilter(m_type, m_values.data()));
16353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
16453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    RefPtr<Image> image = in->asImageBuffer()->copyImage(DontCopyBackingStore);
16553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    RefPtr<NativeImageSkia> nativeImage = image->nativeImageForCurrentFrame();
16653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!nativeImage)
167aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        return;
16853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
16953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    SkPaint paint;
17053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    paint.setColorFilter(filter);
17153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    paint.setXfermodeMode(SkXfermode::kSrc_Mode);
17209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    resultImage->context()->drawBitmap(nativeImage->bitmap(), drawingRegion.x(), drawingRegion.y(), &paint);
17309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
17409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (affectsTransparentPixels()) {
17509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        IntRect fullRect = IntRect(IntPoint(), absolutePaintRect().size());
17609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        resultImage->context()->clipOut(drawingRegion);
17709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        resultImage->context()->fillRect(fullRect, Color(m_values[4], m_values[9], m_values[14], m_values[19]));
17809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
179aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    return;
18053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
18153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
18209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool FEColorMatrix::affectsTransparentPixels()
18309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
18409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Because the input pixels are premultiplied, the only way clear pixels can be
18509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // painted is if the additive component for the alpha is not 0.
18609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return m_type == FECOLORMATRIX_TYPE_MATRIX && m_values[19] > 0;
18709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
18809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1893c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben MurdochPassRefPtr<SkImageFilter> FEColorMatrix::createImageFilter(SkiaImageFilterBuilder* builder)
19053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
1913c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    RefPtr<SkImageFilter> input(builder->build(inputEffect(0), operatingColorSpace()));
19253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    SkAutoTUnref<SkColorFilter> filter(createColorFilter(m_type, m_values.data()));
1931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    SkImageFilter::CropRect rect = getCropRect(builder->cropOffset());
1948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return adoptRef(SkColorFilterImageFilter::Create(filter, input.get(), &rect));
19553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
19653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
19753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static TextStream& operator<<(TextStream& ts, const ColorMatrixType& type)
19853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
19953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    switch (type) {
20053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case FECOLORMATRIX_TYPE_UNKNOWN:
20153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        ts << "UNKNOWN";
20253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        break;
20353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case FECOLORMATRIX_TYPE_MATRIX:
20453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        ts << "MATRIX";
20553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        break;
20653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case FECOLORMATRIX_TYPE_SATURATE:
20753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        ts << "SATURATE";
20853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        break;
20953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case FECOLORMATRIX_TYPE_HUEROTATE:
21053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        ts << "HUEROTATE";
21153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        break;
21253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case FECOLORMATRIX_TYPE_LUMINANCETOALPHA:
21353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        ts << "LUMINANCETOALPHA";
21453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        break;
21553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
21653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return ts;
21753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
21853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
21953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)TextStream& FEColorMatrix::externalRepresentation(TextStream& ts, int indent) const
22053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
22153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    writeIndent(ts, indent);
22253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ts << "[feColorMatrix";
22353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    FilterEffect::externalRepresentation(ts);
22453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ts << " type=\"" << m_type << "\"";
22553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!m_values.isEmpty()) {
22653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        ts << " values=\"";
22753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        Vector<float>::const_iterator ptr = m_values.begin();
22853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        const Vector<float>::const_iterator end = m_values.end();
22953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        while (ptr < end) {
23053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            ts << *ptr;
23153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            ++ptr;
23202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch            if (ptr < end)
23353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                ts << " ";
23453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
23553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        ts << "\"";
23653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
23753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ts << "]\n";
23853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    inputEffect(0)->externalRepresentation(ts, indent + 1);
23953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return ts;
24053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
24153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
24253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} // namespace WebCore
243