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