'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',
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&) {}
return true;
}
+SkMaskFilter::BlurType SkMaskFilter::asABlur(BlurInfo*) {
+ return kNone_BlurType;
+}
+
// 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&);
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",
--- /dev/null
+#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)