blob: 0a90db03e45a79563e9eb75b33e25da3812307f2 [file] [log] [blame]
/*
* Copyright 2015 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrBlurUtils_DEFINED
#define GrBlurUtils_DEFINED
#include "include/core/SkRefCnt.h"
#include "include/core/SkScalar.h"
#include "src/gpu/SkBackingFit.h"
#include <memory>
class GrClip;
class GrPaint;
class GrRecordingContext;
class GrStyledShape;
class GrSurfaceProxyView;
class SkColorSpace;
class SkMaskFilter;
class SkMatrix;
class SkPaint;
class SkRRect;
enum SkAlphaType : int;
enum class GrColorType;
enum class SkTileMode;
namespace skgpu { namespace ganesh { class SurfaceDrawContext; } }
struct SkIRect;
struct SkISize;
/**
* Blur utilities.
*/
namespace GrBlurUtils {
static constexpr int kBlurRRectMaxDivisions = 6;
/**
* This method computes all the parameters for drawing a partially occluded nine-patched
* blurred rrect mask:
* rrectToDraw - the integerized rrect to draw in the mask
* widthHeight - how large to make the mask (rrectToDraw will be centered in this coord system).
* rectXs, rectYs - the x & y coordinates of the covering geometry lattice
* texXs, texYs - the texture coordinate at each point in rectXs & rectYs
* It returns true if 'devRRect' is nine-patchable
*/
bool ComputeBlurredRRectParams(const SkRRect& srcRRect,
const SkRRect& devRRect,
SkScalar sigma,
SkScalar xformedSigma,
SkRRect* rrectToDraw,
SkISize* widthHeight,
SkScalar rectXs[kBlurRRectMaxDivisions],
SkScalar rectYs[kBlurRRectMaxDivisions],
SkScalar texXs[kBlurRRectMaxDivisions],
SkScalar texYs[kBlurRRectMaxDivisions]);
/**
* Draw a shape handling the mask filter if present.
*/
void DrawShapeWithMaskFilter(GrRecordingContext*,
skgpu::ganesh::SurfaceDrawContext*,
const GrClip*,
const SkPaint&,
const SkMatrix&,
const GrStyledShape&);
/**
* Draw a shape handling the mask filter. The mask filter is not optional.
* The GrPaint will be modified after return.
*/
void DrawShapeWithMaskFilter(GrRecordingContext*,
skgpu::ganesh::SurfaceDrawContext*,
const GrClip*,
const GrStyledShape&,
GrPaint&&,
const SkMatrix& viewMatrix,
const SkMaskFilter*);
/**
* Applies a 2D Gaussian blur to a given texture. The blurred result is returned
* as a surfaceDrawContext in case the caller wishes to draw into the result.
* The GrSurfaceOrigin of the result will watch the GrSurfaceOrigin of srcView. The output
* color type, color space, and alpha type will be the same as the src.
*
* Note: one of sigmaX and sigmaY should be non-zero!
* @param context The GPU context
* @param srcView The source to be blurred.
* @param srcColorType The colorType of srcProxy
* @param srcAlphaType The alphaType of srcProxy
* @param srcColorSpace Color space of the source.
* @param dstBounds The destination bounds, relative to the source texture.
* @param srcBounds The source bounds, relative to the source texture's offset. No pixels
* will be sampled outside of this rectangle.
* @param sigmaX The blur's standard deviation in X.
* @param sigmaY The blur's standard deviation in Y.
* @param tileMode The mode to handle samples outside bounds.
* @param fit backing fit for the returned render target context
* @return The surfaceDrawContext containing the blurred result.
*/
std::unique_ptr<skgpu::ganesh::SurfaceDrawContext> GaussianBlur(
GrRecordingContext*,
GrSurfaceProxyView srcView,
GrColorType srcColorType,
SkAlphaType srcAlphaType,
sk_sp<SkColorSpace> srcColorSpace,
SkIRect dstBounds,
SkIRect srcBounds,
float sigmaX,
float sigmaY,
SkTileMode mode,
SkBackingFit fit = SkBackingFit::kApprox);
} // namespace GrBlurUtils
#endif