aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2010-12-06 23:45:58 +0000
committerGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2010-12-06 23:45:58 +0000
commit038aff623d9fd47946cd31685f74cf473f7c84f0 (patch)
tree9b5f5caae5b9fb8de931bb7ca25767aef8078c43 /src
parent8cfdf01ff953b47fdd5c29ebd54fea8a7a9be83e (diff)
Patch by Mike Lawther (mikelawther@chromium.org).
The HTML5 canvas client of BlurDrawLooper needs the option to not apply the canvas transform to the blur offset. see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-elemen... - "The shadowOffsetX and shadowOffsetY attributes specify the distance that the shadow will be offset in the positive horizontal and positive vertical distance respectively. Their values are in coordinate space units. They are not affected by the current transformation matrix." This patch is part of fixing http://code.google.com/p/chromium/issues/detail?id=64647. Review URL: http://codereview.appspot.com/3391041/ git-svn-id: http://skia.googlecode.com/svn/trunk@631 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r--src/effects/SkBlurDrawLooper.cpp27
-rw-r--r--src/effects/SkBlurMaskFilter.cpp26
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);
}
///////////////////////////////////////////////////////////////////////////////