aboutsummaryrefslogtreecommitdiffstats
path: root/src/effects/SkBlurMaskFilter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/effects/SkBlurMaskFilter.cpp')
-rw-r--r--src/effects/SkBlurMaskFilter.cpp128
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