18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org>
3dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
4dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2005 Eric Seidel <eric@webkit.org>
5dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2010 Zoltan Herczeg <zherczeg@webkit.org>
6dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
7dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is free software; you can redistribute it and/or
8dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * modify it under the terms of the GNU Library General Public
9dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * License as published by the Free Software Foundation; either
10dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * version 2 of the License, or (at your option) any later version.
11dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
12dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is distributed in the hope that it will be useful,
13dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of
14dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Library General Public License for more details.
16dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
17dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * You should have received a copy of the GNU Library General Public License
18dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * along with this library; see the file COPYING.LIB.  If not, write to
19dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Boston, MA 02110-1301, USA.
21dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch */
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#ifndef FEConvolveMatrix_h
24bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#define FEConvolveMatrix_h
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if ENABLE(FILTERS)
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FilterEffect.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatPoint.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatSize.h"
305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Filter.h"
31ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include <wtf/AlwaysInline.h>
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h>
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockenum EdgeModeType {
37ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    EDGEMODE_UNKNOWN   = 0,
38ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    EDGEMODE_DUPLICATE = 1,
39ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    EDGEMODE_WRAP      = 2,
40ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    EDGEMODE_NONE      = 3
41ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block};
42ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
43ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass CanvasPixelArray;
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass FEConvolveMatrix : public FilterEffect {
46ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockpublic:
474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    static PassRefPtr<FEConvolveMatrix> create(Filter*, const IntSize&,
48ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            float, float, const IntPoint&, EdgeModeType, const FloatPoint&,
49ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bool, const Vector<float>&);
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    IntSize kernelSize() const;
5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void setKernelSize(const IntSize&);
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    const Vector<float>& kernel() const;
55ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    void setKernel(const Vector<float>&);
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    float divisor() const;
5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool setDivisor(float);
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    float bias() const;
6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool setBias(float);
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    IntPoint targetOffset() const;
6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool setTargetOffset(const IntPoint&);
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    EdgeModeType edgeMode() const;
6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool setEdgeMode(EdgeModeType);
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    FloatPoint kernelUnitLength() const;
7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool setKernelUnitLength(const FloatPoint&);
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
72ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    bool preserveAlpha() const;
7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool setPreserveAlpha(bool);
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    virtual void apply();
76bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual void dump();
77bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
7854cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    virtual void determineAbsolutePaintRect() { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
79a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
80bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual TextStream& externalRepresentation(TextStream&, int indention) const;
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
82ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockprivate:
834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    FEConvolveMatrix(Filter*, const IntSize&, float, float,
84ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            const IntPoint&, EdgeModeType, const FloatPoint&, bool, const Vector<float>&);
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
86ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    struct PaintingData {
87cad810f21b803229eb11403f9209855525a25d57Steve Block        ByteArray* srcPixelArray;
88cad810f21b803229eb11403f9209855525a25d57Steve Block        ByteArray* dstPixelArray;
89ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        int width;
90ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        int height;
91ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        float bias;
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
94ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    template<bool preserveAlphaValues>
95ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    ALWAYS_INLINE void fastSetInteriorPixels(PaintingData&, int clipRight, int clipBottom);
96ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
97ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    ALWAYS_INLINE int getPixelValue(PaintingData&, int x, int y);
98ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
99ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    template<bool preserveAlphaValues>
100ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    void fastSetOuterPixels(PaintingData&, int x1, int y1, int x2, int y2);
101ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
102ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Wrapper functions
103ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    ALWAYS_INLINE void setInteriorPixels(PaintingData& paintingData, int clipRight, int clipBottom);
104ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    ALWAYS_INLINE void setOuterPixels(PaintingData& paintingData, int x1, int y1, int x2, int y2);
105ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
106ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    IntSize m_kernelSize;
107ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    float m_divisor;
108ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    float m_bias;
109ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    IntPoint m_targetOffset;
110ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    EdgeModeType m_edgeMode;
111ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    FloatPoint m_kernelUnitLength;
112ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    bool m_preserveAlpha;
113ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    Vector<float> m_kernelMatrix;
114ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block};
115ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
118bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#endif // ENABLE(FILTERS)
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
120bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#endif // FEConvolveMatrix_h
121