diff options
author | 2011-04-07 14:18:59 +0000 | |
---|---|---|
committer | 2011-04-07 14:18:59 +0000 | |
commit | 4e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7b (patch) | |
tree | e2f3bfd538b7ded23f94ca2c8af3ea90de52182b /src/effects/SkBlurDrawLooper.cpp | |
parent | 591b6dadb09b0c143b903d4bae6a888527d36612 (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.cpp | 113 |
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; } } |