add asABlur() to maskfilters, so devices like gpu and pdf can query them.
authorreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 7 Jul 2011 13:43:38 +0000 (13:43 +0000)
committerreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 7 Jul 2011 13:43:38 +0000 (13:43 +0000)
git-svn-id: http://skia.googlecode.com/svn/trunk@1816 2bbb7eff-a529-9590-31e7-b0007b416f81

gyp/tests.gyp
include/core/SkMaskFilter.h
src/core/SkMaskFilter.cpp
src/effects/SkBlurMaskFilter.cpp
tests/BlurTest.cpp [new file with mode: 0644]

index 95dc9c5..9bde66f 100644 (file)
@@ -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',
index 641ad83..84a8fd0 100644 (file)
@@ -72,6 +72,28 @@ public:
 
     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&) {}
index a278261..878403e 100644 (file)
@@ -57,4 +57,8 @@ bool SkMaskFilter::filterPath(const SkPath& devPath, const SkMatrix& matrix,
     return true;
 }
 
+SkMaskFilter::BlurType SkMaskFilter::asABlur(BlurInfo*) {
+    return kNone_BlurType;
+}
+
 
index 41e04b8..c53e04a 100644 (file)
@@ -27,11 +27,10 @@ public:
     // 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 @@ void SkBlurMaskFilterImpl::flatten(SkFlattenableWriteBuffer& buffer)
     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 (file)
index 0000000..c960ff2
--- /dev/null
@@ -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)