aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/effects/SkBlurDrawLooper.cpp
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-04-07 14:18:59 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-04-07 14:18:59 +0000
commit4e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7b (patch)
treee2f3bfd538b7ded23f94ca2c8af3ea90de52182b /src/effects/SkBlurDrawLooper.cpp
parent591b6dadb09b0c143b903d4bae6a888527d36612 (diff)
Simplify drawloopers and drawfilters. This allows the canvas to keep its
promise that const SkPaint& stay const (so we don't have bugs if a const paint is referenced from two threads in pictures) git-svn-id: http://skia.googlecode.com/svn/trunk@1074 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/effects/SkBlurDrawLooper.cpp')
-rw-r--r--src/effects/SkBlurDrawLooper.cpp113
1 files changed, 40 insertions, 73 deletions
diff --git a/src/effects/SkBlurDrawLooper.cpp b/src/effects/SkBlurDrawLooper.cpp
index 5089f5926e..9290ead766 100644
--- a/src/effects/SkBlurDrawLooper.cpp
+++ b/src/effects/SkBlurDrawLooper.cpp
@@ -7,11 +7,10 @@
SkBlurDrawLooper::SkBlurDrawLooper(SkScalar radius, SkScalar dx, SkScalar dy,
SkColor color, uint32_t flags)
- : fDx(dx), fDy(dy), fBlurColor(color), fBlurFlags(flags)
-{
+ : fDx(dx), fDy(dy), fBlurColor(color), fBlurFlags(flags) {
+
SkASSERT(flags <= kAll_BlurFlag);
- if (radius > 0)
- {
+ if (radius > 0) {
uint32_t blurFlags = flags & kIgnoreTransform_BlurFlag ?
SkBlurMaskFilter::kIgnoreTransform_BlurFlag :
SkBlurMaskFilter::kNone_BlurFlag;
@@ -23,28 +22,23 @@ SkBlurDrawLooper::SkBlurDrawLooper(SkScalar radius, SkScalar dx, SkScalar dy,
fBlur = SkBlurMaskFilter::Create(radius,
SkBlurMaskFilter::kNormal_BlurStyle,
blurFlags);
- }
- else
- {
+ } else {
fBlur = NULL;
}
- if (flags & kOverrideColor_BlurFlag)
- {
+ if (flags & kOverrideColor_BlurFlag) {
// Set alpha to 1 for the override since transparency will already
// be baked into the blurred mask.
SkColor opaqueColor = SkColorSetA(color, 255);
//The SrcIn xfer mode will multiply 'color' by the incoming alpha
- fColorFilter = SkColorFilter::CreateModeFilter(opaqueColor, SkXfermode::kSrcIn_Mode);
- }
- else
- {
+ fColorFilter = SkColorFilter::CreateModeFilter(opaqueColor,
+ SkXfermode::kSrcIn_Mode);
+ } else {
fColorFilter = NULL;
}
}
-SkBlurDrawLooper::SkBlurDrawLooper(SkFlattenableReadBuffer& buffer)
-{
+SkBlurDrawLooper::SkBlurDrawLooper(SkFlattenableReadBuffer& buffer) {
fDx = buffer.readScalar();
fDy = buffer.readScalar();
fBlurColor = buffer.readU32();
@@ -53,14 +47,12 @@ SkBlurDrawLooper::SkBlurDrawLooper(SkFlattenableReadBuffer& buffer)
fBlurFlags = buffer.readU32() & kAll_BlurFlag;
}
-SkBlurDrawLooper::~SkBlurDrawLooper()
-{
+SkBlurDrawLooper::~SkBlurDrawLooper() {
SkSafeUnref(fBlur);
SkSafeUnref(fColorFilter);
}
-void SkBlurDrawLooper::flatten(SkFlattenableWriteBuffer& buffer)
-{
+void SkBlurDrawLooper::flatten(SkFlattenableWriteBuffer& buffer) {
buffer.writeScalar(fDx);
buffer.writeScalar(fDy);
buffer.write32(fBlurColor);
@@ -69,63 +61,38 @@ void SkBlurDrawLooper::flatten(SkFlattenableWriteBuffer& buffer)
buffer.write32(fBlurFlags);
}
-void SkBlurDrawLooper::init(SkCanvas* canvas, SkPaint* paint)
-{
- // we do nothing if a maskfilter is already installed
- if (paint->getMaskFilter() != NULL)
- fState = kDone;
- else
- {
- fState = kBeforeEdge;
- fPaint = paint;
- fCanvas = canvas;
- fSaveCount = canvas->getSaveCount();
- }
+void SkBlurDrawLooper::init(SkCanvas* canvas) {
+ fState = kBeforeEdge;
}
-bool SkBlurDrawLooper::next()
-{
+bool SkBlurDrawLooper::next(SkCanvas* canvas, SkPaint* paint) {
switch (fState) {
- case kBeforeEdge:
- fSavedColor = fPaint->getColor();
- fPaint->setColor(fBlurColor);
- fPaint->setMaskFilter(fBlur);
- fPaint->setColorFilter(fColorFilter);
- fCanvas->save(SkCanvas::kMatrix_SaveFlag);
- 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:
- fPaint->setColor(fSavedColor);
- fPaint->setMaskFilter(NULL);
- fPaint->setColorFilter(NULL);
- fCanvas->restore(); // to remove the translate we did earlier
- fState = kDone;
- return true;
- default:
- SkASSERT(kDone == fState);
- return false;
- }
-}
-
-void SkBlurDrawLooper::restore()
-{
- if (kAfterEdge == fState)
- {
- fPaint->setColor(fSavedColor);
- fPaint->setMaskFilter(NULL);
- fPaint->setColorFilter(NULL);
- fCanvas->restore(); // to remove the translate we did earlier
- fState = kDone;
+ case kBeforeEdge:
+ // we do nothing if a maskfilter is already installed
+ if (paint->getMaskFilter()) {
+ fState = kDone;
+ return false;
+ }
+ paint->setColor(fBlurColor);
+ paint->setMaskFilter(fBlur);
+ paint->setColorFilter(fColorFilter);
+ canvas->save(SkCanvas::kMatrix_SaveFlag);
+ if (fBlurFlags & kIgnoreTransform_BlurFlag) {
+ SkMatrix transform(canvas->getTotalMatrix());
+ transform.postTranslate(fDx, fDy);
+ canvas->setMatrix(transform);
+ } else {
+ canvas->translate(fDx, fDy);
+ }
+ fState = kAfterEdge;
+ return true;
+ case kAfterEdge:
+ canvas->restore();
+ fState = kDone;
+ return true;
+ default:
+ SkASSERT(kDone == fState);
+ return false;
}
}