123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- /*
- * Copyright 2012 The Android Open Source Project
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- #ifndef SkMatrixConvolutionImageFilter_DEFINED
- #define SkMatrixConvolutionImageFilter_DEFINED
- #include "SkFlattenable.h"
- #include "SkImageFilter.h"
- #include "SkScalar.h"
- #include "SkSize.h"
- #include "SkPoint.h"
- class SkBitmap;
- /*! \class SkMatrixConvolutionImageFilter
- Matrix convolution image filter. This filter applies an NxM image
- processing kernel to a given input image. This can be used to produce
- effects such as sharpening, blurring, edge detection, etc.
- */
- class SK_API SkMatrixConvolutionImageFilter : public SkImageFilter {
- public:
- /*! \enum TileMode */
- enum TileMode {
- kClamp_TileMode = 0, /*!< Clamp to the image's edge pixels. */
- kRepeat_TileMode, /*!< Wrap around to the image's opposite edge. */
- kClampToBlack_TileMode, /*!< Fill with transparent black. */
- kLast_TileMode = kClampToBlack_TileMode,
- // TODO: remove kMax - it is non-standard but used by Chromium!
- kMax_TileMode = kClampToBlack_TileMode
- };
- ~SkMatrixConvolutionImageFilter() override;
- /** Construct a matrix convolution image filter.
- @param kernelSize The kernel size in pixels, in each dimension (N by M).
- @param kernel The image processing kernel. Must contain N * M
- elements, in row order.
- @param gain A scale factor applied to each pixel after
- convolution. This can be used to normalize the
- kernel, if it does not sum to 1.
- @param bias A bias factor added to each pixel after convolution.
- @param kernelOffset An offset applied to each pixel coordinate before
- convolution. This can be used to center the kernel
- over the image (e.g., a 3x3 kernel should have an
- offset of {1, 1}).
- @param tileMode How accesses outside the image are treated. (@see
- TileMode).
- @param convolveAlpha If true, all channels are convolved. If false,
- only the RGB channels are convolved, and
- alpha is copied from the source image.
- @param input The input image filter. If NULL, the src bitmap
- passed to filterImage() is used instead.
- @param cropRect The rectangle to which the output processing will be limited.
- */
- static sk_sp<SkImageFilter> Make(const SkISize& kernelSize,
- const SkScalar* kernel,
- SkScalar gain,
- SkScalar bias,
- const SkIPoint& kernelOffset,
- TileMode tileMode,
- bool convolveAlpha,
- sk_sp<SkImageFilter> input,
- const CropRect* cropRect = nullptr);
- protected:
- SkMatrixConvolutionImageFilter(const SkISize& kernelSize,
- const SkScalar* kernel,
- SkScalar gain,
- SkScalar bias,
- const SkIPoint& kernelOffset,
- TileMode tileMode,
- bool convolveAlpha,
- sk_sp<SkImageFilter> input,
- const CropRect* cropRect);
- void flatten(SkWriteBuffer&) const override;
- sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&,
- SkIPoint* offset) const override;
- sk_sp<SkImageFilter> onMakeColorSpace(SkColorSpaceXformer*) const override;
- SkIRect onFilterNodeBounds(const SkIRect&, const SkMatrix& ctm,
- MapDirection, const SkIRect* inputRect) const override;
- bool affectsTransparentBlack() const override;
- private:
- SK_FLATTENABLE_HOOKS(SkMatrixConvolutionImageFilter)
- SkISize fKernelSize;
- SkScalar* fKernel;
- SkScalar fGain;
- SkScalar fBias;
- SkIPoint fKernelOffset;
- TileMode fTileMode;
- bool fConvolveAlpha;
- template <class PixelFetcher, bool convolveAlpha>
- void filterPixels(const SkBitmap& src,
- SkBitmap* result,
- SkIVector& offset,
- const SkIRect& rect,
- const SkIRect& bounds) const;
- template <class PixelFetcher>
- void filterPixels(const SkBitmap& src,
- SkBitmap* result,
- SkIVector& offset,
- const SkIRect& rect,
- const SkIRect& bounds) const;
- void filterInteriorPixels(const SkBitmap& src,
- SkBitmap* result,
- SkIVector& offset,
- const SkIRect& rect,
- const SkIRect& bounds) const;
- void filterBorderPixels(const SkBitmap& src,
- SkBitmap* result,
- SkIVector& offset,
- const SkIRect& rect,
- const SkIRect& bounds) const;
- typedef SkImageFilter INHERITED;
- };
- #endif
|