/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ /************************************************************************************************** *** This file was autogenerated from GrRectBlurEffect.fp; do not modify. **************************************************************************************************/ #ifndef GrRectBlurEffect_DEFINED #define GrRectBlurEffect_DEFINED #include "include/core/SkTypes.h" #include "include/core/SkScalar.h" #include "src/core/SkBlurMask.h" #include "src/gpu/GrProxyProvider.h" #include "src/gpu/GrShaderCaps.h" #include "src/gpu/GrCoordTransform.h" #include "src/gpu/GrFragmentProcessor.h" class GrRectBlurEffect : public GrFragmentProcessor { public: static std::unique_ptr Make(GrProxyProvider* proxyProvider, const GrShaderCaps& caps, const SkRect& rect, float sigma) { float doubleProfileSize = (12 * sigma); if (!caps.floatIs32Bits()) { // We promote the math that gets us into the Gaussian space to full float when the rect // coords are large. If we don't have full float then fail. We could probably clip the // rect to an outset device bounds instead. if (SkScalarAbs(rect.fLeft) > 16000.f || SkScalarAbs(rect.fTop) > 16000.f || SkScalarAbs(rect.fRight) > 16000.f || SkScalarAbs(rect.fBottom) > 16000.f) { return nullptr; } } // Sigma is always a half. SkASSERT(sigma > 0); if (sigma > 16000.f) { return nullptr; } if (doubleProfileSize >= (float)rect.width() || doubleProfileSize >= (float)rect.height()) { // if the blur sigma is too large so the gaussian overlaps the whole // rect in either direction, fall back to CPU path for now. return nullptr; } return std::unique_ptr(new GrRectBlurEffect(rect, sigma)); } GrRectBlurEffect(const GrRectBlurEffect& src); std::unique_ptr clone() const override; const char* name() const override { return "RectBlurEffect"; } SkRect rect; float sigma; private: GrRectBlurEffect(SkRect rect, float sigma) : INHERITED(kGrRectBlurEffect_ClassID, (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag) , rect(rect) , sigma(sigma) {} GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor&) const override; GR_DECLARE_FRAGMENT_PROCESSOR_TEST typedef GrFragmentProcessor INHERITED; }; #endif