diff options
Diffstat (limited to 'src/effects')
-rw-r--r-- | src/effects/SkBlurDrawLooper.cpp | 27 | ||||
-rw-r--r-- | src/effects/SkBlurMaskFilter.cpp | 26 |
2 files changed, 42 insertions, 11 deletions
diff --git a/src/effects/SkBlurDrawLooper.cpp b/src/effects/SkBlurDrawLooper.cpp index 6ad01360e1..2af60971c3 100644 --- a/src/effects/SkBlurDrawLooper.cpp +++ b/src/effects/SkBlurDrawLooper.cpp @@ -5,12 +5,20 @@ #include "SkMaskFilter.h" SkBlurDrawLooper::SkBlurDrawLooper(SkScalar radius, SkScalar dx, SkScalar dy, - SkColor color) - : fDx(dx), fDy(dy), fBlurColor(color) + SkColor color, uint32_t flags) + : fDx(dx), fDy(dy), fBlurColor(color), fBlurFlags(flags) { + SkASSERT(flags <= kAll_BlurFlag); if (radius > 0) + { + uint32_t blurFlags = flags & kIgnoreTransform_BlurFlag ? + SkBlurMaskFilter::kIgnoreTransform_BlurFlag : + SkBlurMaskFilter::kNone_BlurFlag; + fBlur = SkBlurMaskFilter::Create(radius, - SkBlurMaskFilter::kNormal_BlurStyle); + SkBlurMaskFilter::kNormal_BlurStyle, + blurFlags); + } else fBlur = NULL; } @@ -21,6 +29,7 @@ SkBlurDrawLooper::SkBlurDrawLooper(SkFlattenableReadBuffer& buffer) fDy = buffer.readScalar(); fBlurColor = buffer.readU32(); fBlur = static_cast<SkMaskFilter*>(buffer.readFlattenable()); + fBlurFlags = buffer.readU32() & kAll_BlurFlag; } SkBlurDrawLooper::~SkBlurDrawLooper() @@ -34,6 +43,7 @@ void SkBlurDrawLooper::flatten(SkFlattenableWriteBuffer& buffer) buffer.writeScalar(fDy); buffer.write32(fBlurColor); buffer.writeFlattenable(fBlur); + buffer.write32(fBlurFlags); } void SkBlurDrawLooper::init(SkCanvas* canvas, SkPaint* paint) @@ -58,7 +68,16 @@ bool SkBlurDrawLooper::next() fPaint->setColor(fBlurColor); fPaint->setMaskFilter(fBlur); fCanvas->save(SkCanvas::kMatrix_SaveFlag); - fCanvas->translate(fDx, fDy); + if (fBlurFlags & kIgnoreTransform_BlurFlag) + { + SkMatrix transform(fCanvas->getTotalMatrix()); + transform.postTranslate(fDx, fDy); + fCanvas->setMatrix(transform); + } + else + { + fCanvas->translate(fDx, fDy); + } fState = kAfterEdge; return true; case kAfterEdge: diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp index b74cd99bcf..8941cd1015 100644 --- a/src/effects/SkBlurMaskFilter.cpp +++ b/src/effects/SkBlurMaskFilter.cpp @@ -22,7 +22,7 @@ class SkBlurMaskFilterImpl : public SkMaskFilter { public: - SkBlurMaskFilterImpl(SkScalar radius, SkBlurMaskFilter::BlurStyle style); + SkBlurMaskFilterImpl(SkScalar radius, SkBlurMaskFilter::BlurStyle style, uint32_t flags); // overrides from SkMaskFilter virtual SkMask::Format getFormat(); @@ -39,24 +39,28 @@ public: private: SkScalar fRadius; SkBlurMaskFilter::BlurStyle fBlurStyle; + uint32_t fBlurFlags; SkBlurMaskFilterImpl(SkFlattenableReadBuffer&); typedef SkMaskFilter INHERITED; }; -SkMaskFilter* SkBlurMaskFilter::Create(SkScalar radius, SkBlurMaskFilter::BlurStyle style) +SkMaskFilter* SkBlurMaskFilter::Create(SkScalar radius, SkBlurMaskFilter::BlurStyle style, + uint32_t flags) { - if (radius <= 0 || (unsigned)style >= SkBlurMaskFilter::kBlurStyleCount) + if (radius <= 0 || (unsigned)style >= SkBlurMaskFilter::kBlurStyleCount + || flags > SkBlurMaskFilter::kAll_BlurFlag) return NULL; - return SkNEW_ARGS(SkBlurMaskFilterImpl, (radius, style)); + return SkNEW_ARGS(SkBlurMaskFilterImpl, (radius, style, flags)); } ///////////////////////////////////////////////////////////////////////////////////////////////////////// -SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar radius, SkBlurMaskFilter::BlurStyle style) - : fRadius(radius), fBlurStyle(style) +SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar radius, SkBlurMaskFilter::BlurStyle style, + uint32_t flags) + : fRadius(radius), fBlurStyle(style), fBlurFlags(flags) { #if 0 fGamma = NULL; @@ -71,6 +75,7 @@ SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar radius, SkBlurMaskFilter::Bl #endif SkASSERT(radius >= 0); SkASSERT((unsigned)style < SkBlurMaskFilter::kBlurStyleCount); + SkASSERT(flags <= SkBlurMaskFilter::kAll_BlurFlag); } SkMask::Format SkBlurMaskFilterImpl::getFormat() @@ -80,7 +85,12 @@ SkMask::Format SkBlurMaskFilterImpl::getFormat() bool SkBlurMaskFilterImpl::filterMask(SkMask* dst, const SkMask& src, const SkMatrix& matrix, SkIPoint* margin) { - SkScalar radius = matrix.mapRadius(fRadius); + SkScalar radius; + if (fBlurFlags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag) + radius = fRadius; + 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) @@ -113,6 +123,7 @@ SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkFlattenableReadBuffer& buffer) : Sk { fRadius = buffer.readScalar(); fBlurStyle = (SkBlurMaskFilter::BlurStyle)buffer.readS32(); + fBlurFlags = buffer.readU32() & SkBlurMaskFilter::kAll_BlurFlag; SkASSERT(fRadius >= 0); SkASSERT((unsigned)fBlurStyle < SkBlurMaskFilter::kBlurStyleCount); } @@ -122,6 +133,7 @@ void SkBlurMaskFilterImpl::flatten(SkFlattenableWriteBuffer& buffer) this->INHERITED::flatten(buffer); buffer.writeScalar(fRadius); buffer.write32(fBlurStyle); + buffer.write32(fBlurFlags); } /////////////////////////////////////////////////////////////////////////////// |