add asABlur() to maskfilters, so devices like gpu and pdf can query them.



git-svn-id: http://skia.googlecode.com/svn/trunk@1816 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gyp/tests.gyp b/gyp/tests.gyp
index 95dc9c5..9bde66f 100644
--- a/gyp/tests.gyp
+++ b/gyp/tests.gyp
@@ -14,8 +14,9 @@
       'sources': [
         '../tests/BitmapCopyTest.cpp',
         '../tests/BitmapGetColorTest.cpp',
-	'../tests/BitSetTest.cpp',
+        '../tests/BitSetTest.cpp',
         '../tests/BlitRowTest.cpp',
+        '../tests/BlurTest.cpp',
         '../tests/ClampRangeTest.cpp',
         '../tests/ClipCubicTest.cpp',
         '../tests/ClipStackTest.cpp',
diff --git a/include/core/SkMaskFilter.h b/include/core/SkMaskFilter.h
index 641ad83..84a8fd0 100644
--- a/include/core/SkMaskFilter.h
+++ b/include/core/SkMaskFilter.h
@@ -72,6 +72,28 @@
 
     virtual void flatten(SkFlattenableWriteBuffer& ) {}
 
+    enum BlurType {
+        kNone_BlurType,    //!< this maskfilter is not a blur
+        kNormal_BlurType,  //!< fuzzy inside and outside
+        kSolid_BlurType,   //!< solid inside, fuzzy outside
+        kOuter_BlurType,   //!< nothing inside, fuzzy outside
+        kInner_BlurType,   //!< fuzzy inside, nothing outside
+    };
+
+    struct BlurInfo {
+        SkScalar fRadius;
+        bool     fIgnoreTransform;
+        bool     fHighQuality;
+    };
+
+    /**
+     *  Optional method for maskfilters that can be described as a blur. If so,
+     *  they return the corresponding BlurType and set the fields in BlurInfo
+     *  (if not null). If they cannot be described as a blur, they return
+     *  kNone_BlurType and ignore the info parameter.
+     */
+    virtual BlurType asABlur(BlurInfo*);
+
 protected:
     // empty for now, but lets get our subclass to remember to init us for the future
     SkMaskFilter(SkFlattenableReadBuffer&) {}
diff --git a/src/core/SkMaskFilter.cpp b/src/core/SkMaskFilter.cpp
index a278261..878403e 100644
--- a/src/core/SkMaskFilter.cpp
+++ b/src/core/SkMaskFilter.cpp
@@ -57,4 +57,8 @@
     return true;
 }
 
+SkMaskFilter::BlurType SkMaskFilter::asABlur(BlurInfo*) {
+    return kNone_BlurType;
+}
+
 
diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp
index 41e04b8..c53e04a 100644
--- a/src/effects/SkBlurMaskFilter.cpp
+++ b/src/effects/SkBlurMaskFilter.cpp
@@ -27,11 +27,10 @@
     // overrides from SkMaskFilter
     virtual SkMask::Format getFormat();
     virtual bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix& matrix, SkIPoint* margin);
+    virtual BlurType asABlur(BlurInfo*);
 
     // overrides from SkFlattenable
-    // This method is not exported to java.
     virtual Factory getFactory();
-    // This method is not exported to java.
     virtual void flatten(SkFlattenableWriteBuffer&);
 
     static SkFlattenable* CreateProc(SkFlattenableReadBuffer&);
@@ -138,6 +137,22 @@
     buffer.write32(fBlurFlags);
 }
 
+static const SkMaskFilter::BlurType gBlurStyle2BlurType[] = {
+    SkMaskFilter::kNormal_BlurType,
+    SkMaskFilter::kSolid_BlurType,
+    SkMaskFilter::kOuter_BlurType,
+    SkMaskFilter::kInner_BlurType,
+};
+
+SkMaskFilter::BlurType SkBlurMaskFilterImpl::asABlur(BlurInfo* info) {
+    if (info) {
+        info->fRadius = fRadius;
+        info->fIgnoreTransform = SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag);
+        info->fHighQuality = SkToBool(fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag);
+    }
+    return gBlurStyle2BlurType[fBlurStyle];
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 
 static SkFlattenable::Registrar gReg("SkBlurMaskFilter",
diff --git a/tests/BlurTest.cpp b/tests/BlurTest.cpp
new file mode 100644
index 0000000..c960ff2
--- /dev/null
+++ b/tests/BlurTest.cpp
@@ -0,0 +1,35 @@
+#include "Test.h"
+#include "SkBlurMaskFilter.h"
+#include "SkRandom.h"
+
+///////////////////////////////////////////////////////////////////////////////
+
+#define ILLEGAL_MODE    ((SkXfermode::Mode)-1)
+
+static void test_blur(skiatest::Reporter* reporter) {
+    SkScalar radius = SkIntToScalar(2);
+
+    for (int i = 0; i < SkBlurMaskFilter::kBlurStyleCount; ++i) {
+        SkMaskFilter* filter;
+        SkMaskFilter::BlurInfo info;
+
+        uint32_t flags = i & 3;
+
+        filter = SkBlurMaskFilter::Create(radius, (SkBlurMaskFilter::BlurStyle)i,
+                                          flags);
+
+        sk_bzero(&info, sizeof(info));
+        SkMaskFilter::BlurType type = filter->asABlur(&info);
+        REPORTER_ASSERT(reporter, type == (SkMaskFilter::BlurType)(i + 1));
+        REPORTER_ASSERT(reporter, info.fRadius == radius);
+        REPORTER_ASSERT(reporter, info.fIgnoreTransform ==
+                        SkToBool(flags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag));
+        REPORTER_ASSERT(reporter, info.fHighQuality ==
+                        SkToBool(flags & SkBlurMaskFilter::kHighQuality_BlurFlag));
+
+        filter->unref();
+    }
+}
+
+#include "TestClassDef.h"
+DEFINE_TESTCLASS("BlurMaskFilter", BlurTestClass, test_blur)