Index: include/core/SkMaskFilter.h |
diff --git a/include/core/SkMaskFilter.h b/include/core/SkMaskFilter.h |
index f4448ddddb453e9502f075f928303a0c9fb428f0..ce0debd4426f923768cd7dd4e8f835ed91659ca0 100644 |
--- a/include/core/SkMaskFilter.h |
+++ b/include/core/SkMaskFilter.h |
@@ -63,25 +63,30 @@ public: |
#if SK_SUPPORT_GPU |
/** |
- * Returns true if the filter can be expressed a single-pass |
- * GrEffect, used to process this filter on the GPU, or false if |
- * not. |
+ * Returns true if the filter can be expressed a single-pass GrEffect without requiring an |
+ * explicit input mask. Per-pixel, the effect receives the incoming mask's coverage as |
+ * the input color and outputs the filtered covereage value. This means that each pixel's |
+ * filtered coverage must only depend on the unfiltered mask value for that pixel and not on |
+ * surrounding values. |
* |
- * If effect is non-NULL, a new GrEffect instance is stored |
- * in it. The caller assumes ownership of the stage, and it is up to the |
- * caller to unref it. |
+ * If effect is non-NULL, a new GrEffect instance is stored in it. The caller assumes ownership |
+ * of the effect and must unref it. |
*/ |
- virtual bool asNewEffect(GrEffectRef** effect, GrTexture*) const; |
+ virtual bool asNewEffect(GrEffectRef** effect, |
+ GrTexture*, |
+ const SkMatrix& ctm) const; |
/** |
- * Returns true if the filter can be processed on the GPU. This is most |
- * often used for multi-pass effects, where intermediate results must be |
- * rendered to textures. For single-pass effects, use asNewEffect(). |
+ * If asNewEffect() fails the filter may be implemented on the GPU by a subclass overriding |
+ * filterMaskGPU (declared below). That code path requires constructing a src mask as input. |
+ * Since that is a potentially expensive operation, the subclass must also override this |
+ * function to indicate whether filterTextureMaskGPU would succeeed if the mask were to be |
+ * created. |
* |
- * 'maskRect' returns the device space portion of the mask the the filter |
- * needs. The mask passed into 'filterMaskGPU' should have the same extent |
- * as 'maskRect' but be translated to the upper-left corner of the mask |
- * (i.e., (maskRect.fLeft, maskRect.fTop) appears at (0, 0) in the mask). |
+ * 'maskRect' returns the device space portion of the mask that the filter needs. The mask |
+ * passed into 'filterMaskGPU' should have the same extent as 'maskRect' but be translated |
+ * to the upper-left corner of the mask (i.e., (maskRect.fLeft, maskRect.fTop) appears at |
+ * (0, 0) in the mask). |
*/ |
virtual bool canFilterMaskGPU(const SkRect& devBounds, |
const SkIRect& clipBounds, |
@@ -89,24 +94,15 @@ public: |
SkRect* maskRect) const; |
/** |
- * Perform this mask filter on the GPU. This is most often used for |
- * multi-pass effects, where intermediate results must be rendered to |
- * textures. For single-pass effects, use asNewEffect(). 'src' is the |
- * source image for processing, as a texture-backed bitmap. 'result' is |
- * the destination bitmap, which should contain a texture-backed pixelref |
- * on success. 'maskRect' should be the rect returned from canFilterMaskGPU. |
- */ |
- bool filterMaskGPU(GrContext* context, |
- const SkBitmap& src, |
- const SkRect& maskRect, |
- SkBitmap* result) const; |
- |
- /** |
- * This flavor of 'filterMaskGPU' provides a more direct means of accessing |
- * the filtering capabilities. Setting 'canOverwriteSrc' can allow some |
- * filters to skip the allocation of an additional texture. |
+ * This function is used to implement filters that require an explicit src mask. It should only |
+ * be called if canFilterMaskGPU returned true and the maskRect param should be the output from |
+ * that call. canOverwriteSrc indicates whether the implementation may treat src as a scratch |
+ * texture and overwrite its contents. When true it is also legal to return src as the result. |
+ * Implementations are free to get the GrContext from the src texture in order to create |
+ * additional textures and perform multiple passes. |
*/ |
virtual bool filterMaskGPU(GrTexture* src, |
+ const SkMatrix& ctm, |
const SkRect& maskRect, |
GrTexture** result, |
bool canOverwriteSrc) const; |