diff options
-rw-r--r-- | include/effects/SkBlurDrawLooper.h | 16 | ||||
-rw-r--r-- | include/effects/SkBlurMaskFilter.h | 12 | ||||
-rw-r--r-- | src/effects/SkBlurDrawLooper.cpp | 27 | ||||
-rw-r--r-- | src/effects/SkBlurMaskFilter.cpp | 26 |
4 files changed, 68 insertions, 13 deletions
diff --git a/include/effects/SkBlurDrawLooper.h b/include/effects/SkBlurDrawLooper.h index 028b2ebc8b..6f96ff633d 100644 --- a/include/effects/SkBlurDrawLooper.h +++ b/include/effects/SkBlurDrawLooper.h @@ -29,7 +29,19 @@ class SkMaskFilter; */ class SkBlurDrawLooper : public SkDrawLooper { public: - SkBlurDrawLooper(SkScalar radius, SkScalar dx, SkScalar dy, SkColor color); + enum BlurFlags { + kNone_BlurFlag = 0x00, + /** + The blur layer's dx/dy/radius aren't affected by the canvas + transform. + */ + kIgnoreTransform_BlurFlag = 0x01, + /** mask for all blur flags */ + kAll_BlurFlag = 0x01 + }; + + SkBlurDrawLooper(SkScalar radius, SkScalar dx, SkScalar dy, SkColor color, + uint32_t flags = kNone_BlurFlag); virtual ~SkBlurDrawLooper(); // overrides from SkDrawLooper @@ -41,6 +53,7 @@ public: return SkNEW_ARGS(SkBlurDrawLooper, (buffer)); } + protected: SkBlurDrawLooper(SkFlattenableReadBuffer&); // overrides from SkFlattenable @@ -55,6 +68,7 @@ private: SkColor fBlurColor; SkColor fSavedColor; // remember the original int fSaveCount; + uint32_t fBlurFlags; enum State { kBeforeEdge, diff --git a/include/effects/SkBlurMaskFilter.h b/include/effects/SkBlurMaskFilter.h index b90ea5e49e..0a68f54041 100644 --- a/include/effects/SkBlurMaskFilter.h +++ b/include/effects/SkBlurMaskFilter.h @@ -32,12 +32,22 @@ public: kBlurStyleCount }; + enum BlurFlags { + kNone_BlurFlag = 0x00, + /** The blur layer's radius is not affected by transforms */ + kIgnoreTransform_BlurFlag = 0x01, + /** mask for all blur flags */ + kAll_BlurFlag = 0x01 + }; + /** Create a blur maskfilter. @param radius The radius to extend the blur from the original mask. Must be > 0. @param style The BlurStyle to use + @param flags Flags to use - defaults to none @return The new blur maskfilter */ - static SkMaskFilter* Create(SkScalar radius, BlurStyle style); + static SkMaskFilter* Create(SkScalar radius, BlurStyle style, + uint32_t flags = kNone_BlurFlag); /** Create an emboss maskfilter @param direction array of 3 scalars [x, y, z] specifying the direction of the light source 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); } /////////////////////////////////////////////////////////////////////////////// |