diff options
Diffstat (limited to 'src/effects/SkBlurMaskFilter.cpp')
-rw-r--r-- | src/effects/SkBlurMaskFilter.cpp | 128 |
1 files changed, 63 insertions, 65 deletions
diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp index ad00d17..fe428d9 100644 --- a/src/effects/SkBlurMaskFilter.cpp +++ b/src/effects/SkBlurMaskFilter.cpp @@ -1,19 +1,11 @@ -/* libs/graphics/effects/SkBlurMaskFilter.cpp -** -** Copyright 2006, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ + +/* + * Copyright 2006 The Android Open Source Project + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + #include "SkBlurMaskFilter.h" #include "SkBlurMask.h" @@ -22,18 +14,19 @@ class SkBlurMaskFilterImpl : public SkMaskFilter { public: - SkBlurMaskFilterImpl(SkScalar radius, SkBlurMaskFilter::BlurStyle style, uint32_t flags); + SkBlurMaskFilterImpl(SkScalar radius, SkBlurMaskFilter::BlurStyle, + uint32_t flags); // overrides from SkMaskFilter - virtual SkMask::Format getFormat(); - virtual bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix& matrix, SkIPoint* margin); - virtual void computeFastBounds(const SkRect& src, SkRect* dst); + virtual SkMask::Format getFormat() SK_OVERRIDE; + virtual bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&, + SkIPoint* margin) SK_OVERRIDE; + virtual BlurType asABlur(BlurInfo*) const SK_OVERRIDE; + virtual void computeFastBounds(const SkRect& src, SkRect* dst) SK_OVERRIDE; // overrides from SkFlattenable - // This method is not exported to java. - virtual Factory getFactory(); - // This method is not exported to java. - virtual void flatten(SkFlattenableWriteBuffer&); + virtual Factory getFactory() SK_OVERRIDE; + virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE; static SkFlattenable* CreateProc(SkFlattenableReadBuffer&); @@ -47,26 +40,27 @@ private: typedef SkMaskFilter INHERITED; }; -SkMaskFilter* SkBlurMaskFilter::Create(SkScalar radius, SkBlurMaskFilter::BlurStyle style, - uint32_t flags) -{ - if (radius <= 0 || (unsigned)style >= SkBlurMaskFilter::kBlurStyleCount - || flags > SkBlurMaskFilter::kAll_BlurFlag) +SkMaskFilter* SkBlurMaskFilter::Create(SkScalar radius, + SkBlurMaskFilter::BlurStyle style, + uint32_t flags) { + // use !(radius > 0) instead of radius <= 0 to reject NaN values + if (!(radius > 0) || (unsigned)style >= SkBlurMaskFilter::kBlurStyleCount + || flags > SkBlurMaskFilter::kAll_BlurFlag) { return NULL; + } return SkNEW_ARGS(SkBlurMaskFilterImpl, (radius, style, flags)); } -///////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// -SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar radius, SkBlurMaskFilter::BlurStyle style, +SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar radius, + SkBlurMaskFilter::BlurStyle style, uint32_t flags) - : fRadius(radius), fBlurStyle(style), fBlurFlags(flags) -{ + : fRadius(radius), fBlurStyle(style), fBlurFlags(flags) { #if 0 fGamma = NULL; - if (gammaScale) - { + if (gammaScale) { fGamma = new U8[256]; if (gammaScale > 0) SkBlurMask::BuildSqrGamma(fGamma, gammaScale); @@ -79,37 +73,30 @@ SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar radius, SkBlurMaskFilter::Bl SkASSERT(flags <= SkBlurMaskFilter::kAll_BlurFlag); } -SkMask::Format SkBlurMaskFilterImpl::getFormat() -{ +SkMask::Format SkBlurMaskFilterImpl::getFormat() { return SkMask::kA8_Format; } -bool SkBlurMaskFilterImpl::filterMask(SkMask* dst, const SkMask& src, const SkMatrix& matrix, SkIPoint* margin) -{ +bool SkBlurMaskFilterImpl::filterMask(SkMask* dst, const SkMask& src, + const SkMatrix& matrix, SkIPoint* margin) { SkScalar radius; - if (fBlurFlags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag) + if (fBlurFlags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag) { radius = fRadius; - else + } else { radius = matrix.mapRadius(fRadius); + } // To avoid unseemly allocation requests (esp. for finite platforms like // handset) we limit the radius so something manageable. (as opposed to // a request like 10,000) static const SkScalar MAX_RADIUS = SkIntToScalar(128); radius = SkMinScalar(radius, MAX_RADIUS); - SkBlurMask::Quality blurQuality = (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? - SkBlurMask::kHigh_Quality : SkBlurMask::kLow_Quality; - - if (SkBlurMask::Blur(dst, src, radius, (SkBlurMask::Style)fBlurStyle, blurQuality)) - { - if (margin) { - // we need to integralize radius for our margin, so take the ceil - // just to be safe. - margin->set(SkScalarCeil(radius), SkScalarCeil(radius)); - } - return true; - } - return false; + SkBlurMask::Quality blurQuality = + (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? + SkBlurMask::kHigh_Quality : SkBlurMask::kLow_Quality; + + return SkBlurMask::Blur(dst, src, radius, (SkBlurMask::Style)fBlurStyle, + blurQuality, margin); } void SkBlurMaskFilterImpl::computeFastBounds(const SkRect& src, SkRect* dst) { @@ -117,18 +104,16 @@ void SkBlurMaskFilterImpl::computeFastBounds(const SkRect& src, SkRect* dst) { src.fRight + fRadius, src.fBottom + fRadius); } -SkFlattenable* SkBlurMaskFilterImpl::CreateProc(SkFlattenableReadBuffer& buffer) -{ +SkFlattenable* SkBlurMaskFilterImpl::CreateProc(SkFlattenableReadBuffer& buffer) { return SkNEW_ARGS(SkBlurMaskFilterImpl, (buffer)); } -SkFlattenable::Factory SkBlurMaskFilterImpl::getFactory() -{ +SkFlattenable::Factory SkBlurMaskFilterImpl::getFactory() { return CreateProc; } -SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkFlattenableReadBuffer& buffer) : SkMaskFilter(buffer) -{ +SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkFlattenableReadBuffer& buffer) + : SkMaskFilter(buffer) { fRadius = buffer.readScalar(); fBlurStyle = (SkBlurMaskFilter::BlurStyle)buffer.readS32(); fBlurFlags = buffer.readU32() & SkBlurMaskFilter::kAll_BlurFlag; @@ -136,16 +121,29 @@ SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkFlattenableReadBuffer& buffer) : Sk SkASSERT((unsigned)fBlurStyle < SkBlurMaskFilter::kBlurStyleCount); } -void SkBlurMaskFilterImpl::flatten(SkFlattenableWriteBuffer& buffer) -{ +void SkBlurMaskFilterImpl::flatten(SkFlattenableWriteBuffer& buffer) { this->INHERITED::flatten(buffer); buffer.writeScalar(fRadius); buffer.write32(fBlurStyle); buffer.write32(fBlurFlags); } -/////////////////////////////////////////////////////////////////////////////// +static const SkMaskFilter::BlurType gBlurStyle2BlurType[] = { + SkMaskFilter::kNormal_BlurType, + SkMaskFilter::kSolid_BlurType, + SkMaskFilter::kOuter_BlurType, + SkMaskFilter::kInner_BlurType, +}; -static SkFlattenable::Registrar gReg("SkBlurMaskFilter", - SkBlurMaskFilterImpl::CreateProc); +SkMaskFilter::BlurType SkBlurMaskFilterImpl::asABlur(BlurInfo* info) const { + if (info) { + info->fRadius = fRadius; + info->fIgnoreTransform = SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag); + info->fHighQuality = SkToBool(fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag); + } + return gBlurStyle2BlurType[fBlurStyle]; +} +SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) + SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) +SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |