15faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org/*
25faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * Copyright 2012 The Android Open Source Project
35faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org *
45faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
55faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * found in the LICENSE file.
65faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org */
75faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
85faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#ifndef SkMatrixConvolutionImageFilter_DEFINED
95faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#define SkMatrixConvolutionImageFilter_DEFINED
105faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
11377c14a1e648f4427bd11474fad8ac264d98aff2senorblanco@chromium.org#include "SkImageFilter.h"
125faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#include "SkScalar.h"
135faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#include "SkSize.h"
145faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#include "SkPoint.h"
155faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
165faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org/*! \class SkMatrixConvolutionImageFilter
175faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    Matrix convolution image filter.  This filter applies an NxM image
185faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    processing kernel to a given input image.  This can be used to produce
195faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    effects such as sharpening, blurring, edge detection, etc.
205faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org */
215faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
22377c14a1e648f4427bd11474fad8ac264d98aff2senorblanco@chromium.orgclass SK_API SkMatrixConvolutionImageFilter : public SkImageFilter {
235faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgpublic:
245faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    /*! \enum TileMode */
255faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    enum TileMode {
26ac9779234ef7a8cf3d791ab7690ef8c388662836joshualitt      kClamp_TileMode = 0,         /*!< Clamp to the image's edge pixels. */
275faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org      kRepeat_TileMode,        /*!< Wrap around to the image's opposite edge. */
285faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org      kClampToBlack_TileMode,  /*!< Fill with transparent black. */
29ac9779234ef7a8cf3d791ab7690ef8c388662836joshualitt      kMax_TileMode = kClampToBlack_TileMode
305faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    };
315faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
32cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    virtual ~SkMatrixConvolutionImageFilter();
33cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org
345faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    /** Construct a matrix convolution image filter.
35cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        @param kernelSize     The kernel size in pixels, in each dimension (N by M).
36cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        @param kernel         The image processing kernel.  Must contain N * M
37cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                              elements, in row order.
38cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        @param gain           A scale factor applied to each pixel after
39cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                              convolution.  This can be used to normalize the
40cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                              kernel, if it does not sum to 1.
41cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        @param bias           A bias factor added to each pixel after convolution.
42cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        @param kernelOffset   An offset applied to each pixel coordinate before
43cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                              convolution.  This can be used to center the kernel
44cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                              over the image (e.g., a 3x3 kernel should have an
45cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                              offset of {1, 1}).
46cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        @param tileMode       How accesses outside the image are treated.  (@see
47cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                              TileMode).
488640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.org        @param convolveAlpha  If true, all channels are convolved.  If false,
49cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                              only the RGB channels are convolved, and
50cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                              alpha is copied from the source image.
51cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        @param input          The input image filter.  If NULL, the src bitmap
52cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                              passed to filterImage() is used instead.
53cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        @param cropRect       The rectangle to which the output processing will be limited.
545faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    */
55cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    static SkMatrixConvolutionImageFilter* Create(const SkISize& kernelSize,
56cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                                  const SkScalar* kernel,
57cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                                  SkScalar gain,
58cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                                  SkScalar bias,
59cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                                  const SkIPoint& kernelOffset,
60cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                                  TileMode tileMode,
61cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                                  bool convolveAlpha,
62cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                                  SkImageFilter* input = NULL,
635e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                                                  const CropRect* cropRect = NULL,
64aafcb54f27d30c63602a0a0232f0b9fc8b310d19Stephen White                                                  uint32_t uniqueID = 0);
655faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
665faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMatrixConvolutionImageFilter)
675faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
685faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgprotected:
69bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    SkMatrixConvolutionImageFilter(const SkISize& kernelSize,
70bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org                                   const SkScalar* kernel,
71bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org                                   SkScalar gain,
72bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org                                   SkScalar bias,
73bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org                                   const SkIPoint& kernelOffset,
74bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org                                   TileMode tileMode,
75bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org                                   bool convolveAlpha,
76bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org                                   SkImageFilter* input,
775e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                                   const CropRect* cropRect,
785e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                                   uint32_t uniqueID);
799fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
80bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    explicit SkMatrixConvolutionImageFilter(SkReadBuffer& buffer);
819fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif
828b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
835faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
844cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
85ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                               SkBitmap* result, SkIPoint* loc) const SK_OVERRIDE;
860a5c233e3b911232c0d6f9a88ded99ecf88b8a97senorblanco@chromium.org    virtual bool onFilterBounds(const SkIRect&, const SkMatrix&, SkIRect*) const SK_OVERRIDE;
870a5c233e3b911232c0d6f9a88ded99ecf88b8a97senorblanco@chromium.org
885faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
893bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org#if SK_SUPPORT_GPU
90b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual bool asFragmentProcessor(GrFragmentProcessor**, GrTexture*, const SkMatrix&,
91b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                     const SkIRect& bounds) const SK_OVERRIDE;
923bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org#endif
933bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org
945faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgprivate:
955faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    SkISize   fKernelSize;
965faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    SkScalar* fKernel;
975faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    SkScalar  fGain;
985faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    SkScalar  fBias;
99cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    SkIPoint  fKernelOffset;
1005faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    TileMode  fTileMode;
1018640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.org    bool      fConvolveAlpha;
102377c14a1e648f4427bd11474fad8ac264d98aff2senorblanco@chromium.org    typedef SkImageFilter INHERITED;
1035faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1048640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.org    template <class PixelFetcher, bool convolveAlpha>
1057938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org    void filterPixels(const SkBitmap& src,
1067938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org                      SkBitmap* result,
1077938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org                      const SkIRect& rect,
108ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                      const SkIRect& bounds) const;
1095faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    template <class PixelFetcher>
1107938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org    void filterPixels(const SkBitmap& src,
1117938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org                      SkBitmap* result,
1127938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org                      const SkIRect& rect,
113ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                      const SkIRect& bounds) const;
1147938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org    void filterInteriorPixels(const SkBitmap& src,
1157938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org                              SkBitmap* result,
1167938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org                              const SkIRect& rect,
117ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                              const SkIRect& bounds) const;
1187938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org    void filterBorderPixels(const SkBitmap& src,
1197938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org                            SkBitmap* result,
1207938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org                            const SkIRect& rect,
121ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                            const SkIRect& bounds) const;
1225faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org};
1235faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1245faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#endif
125