1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkMaskFilter_DEFINED
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkMaskFilter_DEFINED
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
13daaafa6e81860e3dc52660ba019c336f0a43f1e7reed@google.com#include "SkBlurTypes.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkFlattenable.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMask.h"
162ac4ef5e6e0c9c95c9200408ba25a95ca758eac2junov@chromium.org#include "SkPaint.h"
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
18570d2f81a65fc868d6300a7edf34c0d5d048c5d6joshualittclass GrClip;
19fbcd415aa01801df5f554963d7463649b49ead73senorblanco@chromium.orgclass GrContext;
20cf34bc06347dd2734a7fdaef5cf8853e92979d5ecommit-bot@chromium.orgclass GrPaint;
2125d9c154087d2132a51d1ca74a104726f60ef380joshualittclass GrRenderTarget;
22491493119c11206c5823b76eb6420a705be243a1robertphillips@google.comclass SkBitmap;
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkBlitter;
24b0df8be137d8fb49436e46d1fd1a5aec8b7ab562reedclass SkCachedData;
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkMatrix;
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkPath;
27045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comclass SkRasterClip;
28a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.comclass SkRRect;
29cf34bc06347dd2734a7fdaef5cf8853e92979d5ecommit-bot@chromium.orgclass SkStrokeRec;
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkMaskFilter
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMaskFilter is the base class for object that perform transformations on
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    an alpha-channel mask before drawing it. A subclass of SkMaskFilter may be
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    installed into a SkPaint. Once there, each time a primitive is drawn, it
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    is first scan converted into a SkMask::kA8_Format mask, and handed to the
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    filter, calling its filterMask() method. If this returns true, then the
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    new mask is used to render into the device.
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Blur and emboss are implemented as subclasses of SkMaskFilter.
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
424200dfe9c1a2c0e99a7155a63fbffb01e9d1fd28bungeman@google.comclass SK_API SkMaskFilter : public SkFlattenable {
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
440456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com    SK_DECLARE_INST_COUNT(SkMaskFilter)
450456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Returns the format of the resulting mask that this subclass will return
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        when its filterMask() method is called.
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
4930711b764be6bbb58caa30a0ac5d1474c894efe7reed@google.com    virtual SkMask::Format getFormat() const = 0;
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Create a new mask by filter the src mask.
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        If src.fImage == null, then do not allocate or create the dst image
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        but do fill out the other fields in dstMask.
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        If you do allocate a dst image, use SkMask::AllocImage()
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        If this returns false, dst mask is ignored.
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        @param  dst the result of the filter. If src.fImage == null, dst should not allocate its image
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        @param src the original image to be filtered.
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        @param matrix the CTM
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        @param margin   if not null, return the buffer dx/dy need when calculating the effect. Used when
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        drawing a clipped object to know how much larger to allocate the src before
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        applying the filter. If returning false, ignore this parameter.
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        @return true if the dst mask was correctly created.
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
644135f2893289dd37b662a32dd1f3d9e79a0eabf3mike@reedtribe.org    virtual bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&,
6530711b764be6bbb58caa30a0ac5d1474c894efe7reed@google.com                            SkIPoint* margin) const;
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
67491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com#if SK_SUPPORT_GPU
68491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com    /**
69b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt     *  Returns true if the filter can be expressed a single-pass GrProcessor without requiring an
7041bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org     *  explicit input mask. Per-pixel, the effect receives the incoming mask's coverage as
7141bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org     *  the input color and outputs the filtered covereage value. This means that each pixel's
7241bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org     *  filtered coverage must only depend on the unfiltered mask value for that pixel and not on
7341bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org     *  surrounding values.
74491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com     *
75b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt     * If effect is non-NULL, a new GrProcessor instance is stored in it. The caller assumes
76b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt     * ownership of the effect and must unref it.
77491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com     */
78b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual bool asFragmentProcessor(GrFragmentProcessor**, GrTexture*, const SkMatrix& ctm) const;
792b75f4279a237ceea929ff8ac019f7fbd3ad08b5reed@google.com
80491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com    /**
81b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt     *  If asFragmentProcessor() fails the filter may be implemented on the GPU by a subclass
82b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt     *  overriding filterMaskGPU (declared below). That code path requires constructing a src mask
83b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt     *  as input. Since that is a potentially expensive operation, the subclass must also override
84b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt     *  this function to indicate whether filterTextureMaskGPU would succeeed if the mask were to be
8541bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org     *  created.
86491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com     *
8741bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org     *  'maskRect' returns the device space portion of the mask that the filter needs. The mask
8841bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org     *  passed into 'filterMaskGPU' should have the same extent as 'maskRect' but be translated
8941bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org     *  to the upper-left corner of the mask (i.e., (maskRect.fLeft, maskRect.fTop) appears at
9041bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org     *  (0, 0) in the mask).
91491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com     */
921842adf01320f9197b449de7375d08ccac43f389skia.committer@gmail.com    virtual bool canFilterMaskGPU(const SkRect& devBounds,
93491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com                                  const SkIRect& clipBounds,
94491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com                                  const SkMatrix& ctm,
95491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com                                  SkRect* maskRect) const;
96491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com
97491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com    /**
98cf34bc06347dd2734a7fdaef5cf8853e92979d5ecommit-bot@chromium.org     *  Try to directly render the mask filter into the target.  Returns
99cf34bc06347dd2734a7fdaef5cf8853e92979d5ecommit-bot@chromium.org     *  true if drawing was successful.
100cf34bc06347dd2734a7fdaef5cf8853e92979d5ecommit-bot@chromium.org     */
101cf34bc06347dd2734a7fdaef5cf8853e92979d5ecommit-bot@chromium.org    virtual bool directFilterMaskGPU(GrContext* context,
10225d9c154087d2132a51d1ca74a104726f60ef380joshualitt                                     GrRenderTarget* rt,
103cf34bc06347dd2734a7fdaef5cf8853e92979d5ecommit-bot@chromium.org                                     GrPaint* grp,
104570d2f81a65fc868d6300a7edf34c0d5d048c5d6joshualitt                                     const GrClip&,
1055531d51ce7426bdae7563547326fcf0bf926a083joshualitt                                     const SkMatrix& viewMatrix,
106cf34bc06347dd2734a7fdaef5cf8853e92979d5ecommit-bot@chromium.org                                     const SkStrokeRec& strokeRec,
107cf34bc06347dd2734a7fdaef5cf8853e92979d5ecommit-bot@chromium.org                                     const SkPath& path) const;
108821397018fdabea6b434ecb96f84fb5449c4025fcommit-bot@chromium.org    /**
109821397018fdabea6b434ecb96f84fb5449c4025fcommit-bot@chromium.org     *  Try to directly render a rounded rect mask filter into the target.  Returns
110821397018fdabea6b434ecb96f84fb5449c4025fcommit-bot@chromium.org     *  true if drawing was successful.
111821397018fdabea6b434ecb96f84fb5449c4025fcommit-bot@chromium.org     */
112821397018fdabea6b434ecb96f84fb5449c4025fcommit-bot@chromium.org    virtual bool directFilterRRectMaskGPU(GrContext* context,
11325d9c154087d2132a51d1ca74a104726f60ef380joshualitt                                          GrRenderTarget* rt,
114821397018fdabea6b434ecb96f84fb5449c4025fcommit-bot@chromium.org                                          GrPaint* grp,
115570d2f81a65fc868d6300a7edf34c0d5d048c5d6joshualitt                                          const GrClip&,
1165531d51ce7426bdae7563547326fcf0bf926a083joshualitt                                          const SkMatrix& viewMatrix,
117821397018fdabea6b434ecb96f84fb5449c4025fcommit-bot@chromium.org                                          const SkStrokeRec& strokeRec,
118821397018fdabea6b434ecb96f84fb5449c4025fcommit-bot@chromium.org                                          const SkRRect& rrect) const;
119cf34bc06347dd2734a7fdaef5cf8853e92979d5ecommit-bot@chromium.org
120cf34bc06347dd2734a7fdaef5cf8853e92979d5ecommit-bot@chromium.org    /**
12141bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org     * This function is used to implement filters that require an explicit src mask. It should only
12241bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org     * be called if canFilterMaskGPU returned true and the maskRect param should be the output from
12341bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org     * that call. canOverwriteSrc indicates whether the implementation may treat src as a scratch
12441bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org     * texture and overwrite its contents. When true it is also legal to return src as the result.
12541bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org     * Implementations are free to get the GrContext from the src texture in order to create
12641bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org     * additional textures and perform multiple passes.
1272b75f4279a237ceea929ff8ac019f7fbd3ad08b5reed@google.com     */
1281842adf01320f9197b449de7375d08ccac43f389skia.committer@gmail.com    virtual bool filterMaskGPU(GrTexture* src,
12941bf930039314cc71039b12957195f1c65c30ce1commit-bot@chromium.org                               const SkMatrix& ctm,
1301842adf01320f9197b449de7375d08ccac43f389skia.committer@gmail.com                               const SkRect& maskRect,
131491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com                               GrTexture** result,
132491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com                               bool canOverwriteSrc) const;
133491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com#endif
1342b75f4279a237ceea929ff8ac019f7fbd3ad08b5reed@google.com
1359efd9a048aebaa6681afb76b18e1a7dd642078d3reed@google.com    /**
1369efd9a048aebaa6681afb76b18e1a7dd642078d3reed@google.com     * The fast bounds function is used to enable the paint to be culled early
1379efd9a048aebaa6681afb76b18e1a7dd642078d3reed@google.com     * in the drawing pipeline. This function accepts the current bounds of the
1389efd9a048aebaa6681afb76b18e1a7dd642078d3reed@google.com     * paint as its src param and the filter adjust those bounds using its
1399efd9a048aebaa6681afb76b18e1a7dd642078d3reed@google.com     * current mask and returns the result using the dest param. Callers are
1409efd9a048aebaa6681afb76b18e1a7dd642078d3reed@google.com     * allowed to provide the same struct for both src and dest so each
1419efd9a048aebaa6681afb76b18e1a7dd642078d3reed@google.com     * implementation must accomodate that behavior.
1429efd9a048aebaa6681afb76b18e1a7dd642078d3reed@google.com     *
1439efd9a048aebaa6681afb76b18e1a7dd642078d3reed@google.com     *  The default impl calls filterMask with the src mask having no image,
1449efd9a048aebaa6681afb76b18e1a7dd642078d3reed@google.com     *  but subclasses may override this if they can compute the rect faster.
1459efd9a048aebaa6681afb76b18e1a7dd642078d3reed@google.com     */
14630711b764be6bbb58caa30a0ac5d1474c894efe7reed@google.com    virtual void computeFastBounds(const SkRect& src, SkRect* dest) const;
1479efd9a048aebaa6681afb76b18e1a7dd642078d3reed@google.com
148daaafa6e81860e3dc52660ba019c336f0a43f1e7reed@google.com    struct BlurRec {
149daaafa6e81860e3dc52660ba019c336f0a43f1e7reed@google.com        SkScalar        fSigma;
150daaafa6e81860e3dc52660ba019c336f0a43f1e7reed@google.com        SkBlurStyle     fStyle;
151daaafa6e81860e3dc52660ba019c336f0a43f1e7reed@google.com        SkBlurQuality   fQuality;
152daaafa6e81860e3dc52660ba019c336f0a43f1e7reed@google.com    };
153daaafa6e81860e3dc52660ba019c336f0a43f1e7reed@google.com    /**
154daaafa6e81860e3dc52660ba019c336f0a43f1e7reed@google.com     *  If this filter can be represented by a BlurRec, return true and (if not null) fill in the
155daaafa6e81860e3dc52660ba019c336f0a43f1e7reed@google.com     *  provided BlurRec parameter. If this effect cannot be represented as a BlurRec, return false
156daaafa6e81860e3dc52660ba019c336f0a43f1e7reed@google.com     *  and ignore the BlurRec parameter.
157daaafa6e81860e3dc52660ba019c336f0a43f1e7reed@google.com     */
158daaafa6e81860e3dc52660ba019c336f0a43f1e7reed@google.com    virtual bool asABlur(BlurRec*) const;
159daaafa6e81860e3dc52660ba019c336f0a43f1e7reed@google.com
1600f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org    SK_TO_STRING_PUREVIRT()
161c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org    SK_DEFINE_FLATTENABLE_TYPE(SkMaskFilter)
1620bd80fa01bba2b3f0f49937fcb17928c74bde5a6robertphillips@google.com
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
1647c9d0f3104408a64d52b84643f116179022d73bdcommit-bot@chromium.org    SkMaskFilter() {}
165045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
166d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com    enum FilterReturn {
167d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com        kFalse_FilterReturn,
168d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com        kTrue_FilterReturn,
169d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com        kUnimplemented_FilterReturn
170d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com    };
171d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com
172b0df8be137d8fb49436e46d1fd1a5aec8b7ab562reed    class NinePatch : ::SkNoncopyable {
173b0df8be137d8fb49436e46d1fd1a5aec8b7ab562reed    public:
174b0df8be137d8fb49436e46d1fd1a5aec8b7ab562reed        NinePatch() : fCache(NULL) {
175b0df8be137d8fb49436e46d1fd1a5aec8b7ab562reed            fMask.fImage = NULL;
176b0df8be137d8fb49436e46d1fd1a5aec8b7ab562reed        }
177b0df8be137d8fb49436e46d1fd1a5aec8b7ab562reed        ~NinePatch();
178b0df8be137d8fb49436e46d1fd1a5aec8b7ab562reed
179dab9b4fe035c1e8a79e110139953c19bd48d66f9reed@google.com        SkMask      fMask;      // fBounds must have [0,0] in its top-left
180dab9b4fe035c1e8a79e110139953c19bd48d66f9reed@google.com        SkIRect     fOuterRect; // width/height must be >= fMask.fBounds'
181dab9b4fe035c1e8a79e110139953c19bd48d66f9reed@google.com        SkIPoint    fCenter;    // identifies center row/col for stretching
182b0df8be137d8fb49436e46d1fd1a5aec8b7ab562reed        SkCachedData* fCache;
183dab9b4fe035c1e8a79e110139953c19bd48d66f9reed@google.com    };
184dab9b4fe035c1e8a79e110139953c19bd48d66f9reed@google.com
185d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com    /**
186d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com     *  Override if your subclass can filter a rect, and return the answer as
187d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com     *  a ninepatch mask to be stretched over the returned outerRect. On success
188d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com     *  return kTrue_FilterReturn. On failure (e.g. out of memory) return
189d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com     *  kFalse_FilterReturn. If the normal filterMask() entry-point should be
190d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com     *  called (the default) return kUnimplemented_FilterReturn.
191d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com     *
192d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com     *  By convention, the caller will take the center rol/col from the returned
193d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com     *  mask as the slice it can replicate horizontally and vertically as we
194d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com     *  stretch the mask to fit inside outerRect. It is an error for outerRect
195d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com     *  to be smaller than the mask's bounds. This would imply that the width
196d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com     *  and height of the mask should be odd. This is not required, just that
197d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com     *  the caller will call mask.fBounds.centerX() and centerY() to find the
198d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com     *  strips that will be replicated.
199d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com     */
200dab9b4fe035c1e8a79e110139953c19bd48d66f9reed@google.com    virtual FilterReturn filterRectsToNine(const SkRect[], int count,
201dab9b4fe035c1e8a79e110139953c19bd48d66f9reed@google.com                                           const SkMatrix&,
202dab9b4fe035c1e8a79e110139953c19bd48d66f9reed@google.com                                           const SkIRect& clipBounds,
20330711b764be6bbb58caa30a0ac5d1474c894efe7reed@google.com                                           NinePatch*) const;
204a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.com    /**
205a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.com     *  Similar to filterRectsToNine, except it performs the work on a round rect.
206a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.com     */
207a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.com    virtual FilterReturn filterRRectToNine(const SkRRect&, const SkMatrix&,
208a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.com                                           const SkIRect& clipBounds,
209a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.com                                           NinePatch*) const;
210d729b3e504ae547ee0978e8f7156bd8dd8124172reed@google.com
211045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comprivate:
212045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    friend class SkDraw;
213045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
214045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    /** Helper method that, given a path in device space, will rasterize it into a kA8_Format mask
215045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com     and then call filterMask(). If this returns true, the specified blitter will be called
216045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com     to render that mask. Returns false if filterMask() returned false.
217045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com     This method is not exported to java.
218045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com     */
219868074b50b0fc3e460d2aa97c1096827fe0a1935reed    bool filterPath(const SkPath& devPath, const SkMatrix& ctm, const SkRasterClip&, SkBlitter*,
220868074b50b0fc3e460d2aa97c1096827fe0a1935reed                    SkPaint::Style) const;
22154924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com
222a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.com    /** Helper method that, given a roundRect in device space, will rasterize it into a kA8_Format
223a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.com     mask and then call filterMask(). If this returns true, the specified blitter will be called
224a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.com     to render that mask. Returns false if filterMask() returned false.
225a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.com     */
226868074b50b0fc3e460d2aa97c1096827fe0a1935reed    bool filterRRect(const SkRRect& devRRect, const SkMatrix& ctm, const SkRasterClip&,
227868074b50b0fc3e460d2aa97c1096827fe0a1935reed                     SkBlitter*, SkPaint::Style style) const;
228a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.com
22954924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com    typedef SkFlattenable INHERITED;
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
233