/* * Copyright 2017 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkBlurMaskFilter_DEFINED #define SkBlurMaskFilter_DEFINED #include #include #include "SkMask.h" #include "SkTypes.h" // Implement a single channel Gaussian blur. The specifics for implementation are taken from: // https://drafts.fxtf.org/filters/#feGaussianBlurElement class SkMaskBlurFilter { public: // Given a filter specified by sigma, generate various quantities. class FilterInfo { public: explicit FilterInfo(double sigma); // The final weight to divide by given a box size calculated from sigma accumulated for // all three passes. For example, if the box size is 5, then the final weight for all // three passes is 5^3 or 125. uint64_t weight() const; // The distance between the first value of the dst and the first value of the src. uint32_t borderSize() const; // The size of the box filter. size_t diameter(uint8_t) const; // A factor used to simulate division using multiplication and shift. uint64_t scaledWeight() const; private: const uint32_t fFilterWindow; const uint64_t fScaledWeight; }; // Create an object suitable for filtering an SkMask using a filter with width sigmaW and // height sigmaH. SkMaskBlurFilter(double sigmaW, double sigmaH); // Given a src SkMask, generate dst SkMask returning the border width and height. SkIPoint blur(const SkMask& src, SkMask* dst) const; private: size_t bufferSize(uint8_t bufferPass) const; void blurOneScan(FilterInfo gen, const uint8_t* src, size_t srcStride, const uint8_t* srcEnd, uint8_t* dst, size_t dstStride, uint8_t* dstEnd) const; const FilterInfo fInfoW, fInfoH; std::unique_ptr fBuffer0, fBuffer1, fBuffer2; }; #endif // SkBlurMaskFilter_DEFINED