aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/effects/SkBlurDrawLooper.h16
-rw-r--r--include/effects/SkBlurMaskFilter.h12
-rw-r--r--src/effects/SkBlurDrawLooper.cpp27
-rw-r--r--src/effects/SkBlurMaskFilter.cpp26
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);
}
///////////////////////////////////////////////////////////////////////////////