15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2005 Eric Seidel <eric@webkit.org> 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Zoltan Herczeg <zherczeg@webkit.org> 653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved. 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef FEConvolveMatrix_h 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define FEConvolveMatrix_h 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatPoint.h" 281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatSize.h" 29a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/Filter.h" 30a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/FilterEffect.h" 317757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/Vector.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum EdgeModeType { 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EDGEMODE_UNKNOWN = 0, 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EDGEMODE_DUPLICATE = 1, 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EDGEMODE_WRAP = 2, 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EDGEMODE_NONE = 3 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 42a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class PLATFORM_EXPORT FEConvolveMatrix : public FilterEffect { 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static PassRefPtr<FEConvolveMatrix> create(Filter*, const IntSize&, 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float, float, const IntPoint&, EdgeModeType, const FloatPoint&, 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool, const Vector<float>&); 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntSize kernelSize() const; 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setKernelSize(const IntSize&); 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Vector<float>& kernel() const; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setKernel(const Vector<float>&); 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float divisor() const; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool setDivisor(float); 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float bias() const; 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool setBias(float); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint targetOffset() const; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool setTargetOffset(const IntPoint&); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EdgeModeType edgeMode() const; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool setEdgeMode(EdgeModeType); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FloatPoint kernelUnitLength() const; 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool setKernelUnitLength(const FloatPoint&); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool preserveAlpha() const; 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool setPreserveAlpha(bool); 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 723c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch virtual PassRefPtr<SkImageFilter> createImageFilter(SkiaImageFilterBuilder*) OVERRIDE; 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual FloatRect mapPaintRect(const FloatRect&, bool forward = true) OVERRIDE FINAL; 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual TextStream& externalRepresentation(TextStream&, int indention) const OVERRIDE; 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) struct PaintingData { 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Uint8ClampedArray* srcPixelArray; 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Uint8ClampedArray* dstPixelArray; 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int width; 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int height; 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float bias; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FEConvolveMatrix(Filter*, const IntSize&, float, float, 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const IntPoint&, EdgeModeType, const FloatPoint&, bool, const Vector<float>&); 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual void applySoftware() OVERRIDE; 9253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) template<bool preserveAlphaValues> 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ALWAYS_INLINE void fastSetInteriorPixels(PaintingData&, int clipRight, int clipBottom, int yStart, int yEnd); 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ALWAYS_INLINE int getPixelValue(PaintingData&, int x, int y); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) template<bool preserveAlphaValues> 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void fastSetOuterPixels(PaintingData&, int x1, int y1, int x2, int y2); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Wrapper functions 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ALWAYS_INLINE void setInteriorPixels(PaintingData&, int clipRight, int clipBottom, int yStart, int yEnd); 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ALWAYS_INLINE void setOuterPixels(PaintingData&, int x1, int y1, int x2, int y2); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Parallelization parts 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static const int s_minimalRectDimension = (100 * 100); // Empirical data limit for parallel jobs 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) template<typename Type> 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class ParallelJobs; 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) struct InteriorPixelParameters { 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FEConvolveMatrix* filter; 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PaintingData* paintingData; 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int clipBottom; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int clipRight; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int yStart; 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int yEnd; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static void setInteriorPixelsWorker(InteriorPixelParameters*); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntSize m_kernelSize; 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float m_divisor; 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float m_bias; 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint m_targetOffset; 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EdgeModeType m_edgeMode; 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FloatPoint m_kernelUnitLength; 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_preserveAlpha; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<float> m_kernelMatrix; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 132c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // FEConvolveMatrix_h 135