From 2b75f4279a237ceea929ff8ac019f7fbd3ad08b5 Mon Sep 17 00:00:00 2001 From: "reed@google.com" Date: Thu, 7 Jul 2011 13:43:38 +0000 Subject: [PATCH] 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 --- gyp/tests.gyp | 3 ++- include/core/SkMaskFilter.h | 22 ++++++++++++++++++++++ src/core/SkMaskFilter.cpp | 4 ++++ src/effects/SkBlurMaskFilter.cpp | 19 +++++++++++++++++-- tests/BlurTest.cpp | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 tests/BlurTest.cpp 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 @@ 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 a278261..878403e 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 41e04b8..c53e04a 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 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) -- 2.7.4