aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gyp/tests.gyp3
-rw-r--r--include/core/SkMaskFilter.h22
-rw-r--r--src/core/SkMaskFilter.cpp4
-rw-r--r--src/effects/SkBlurMaskFilter.cpp19
-rw-r--r--tests/BlurTest.cpp35
5 files changed, 80 insertions, 3 deletions
diff --git a/gyp/tests.gyp b/gyp/tests.gyp
index 95dc9c585b..9bde66ff76 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 641ad83886..84a8fd0c3a 100644
--- a/include/core/SkMaskFilter.h
+++ b/include/core/SkMaskFilter.h
@@ -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&) {}
diff --git a/src/core/SkMaskFilter.cpp b/src/core/SkMaskFilter.cpp
index a2782615a8..878403eea2 100644
--- a/src/core/SkMaskFilter.cpp
+++ b/src/core/SkMaskFilter.cpp
@@ -57,4 +57,8 @@ bool SkMaskFilter::filterPath(const SkPath& devPath, const SkMatrix& matrix,
return true;
}
+SkMaskFilter::BlurType SkMaskFilter::asABlur(BlurInfo*) {
+ return kNone_BlurType;
+}
+
diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp
index 41e04b8a53..c53e04a1f5 100644
--- a/src/effects/SkBlurMaskFilter.cpp
+++ b/src/effects/SkBlurMaskFilter.cpp
@@ -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
index 0000000000..c960ff2eea
--- /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)