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