Chromium Code Reviews| Index: src/effects/SkBlurDrawLooper.cpp |
| diff --git a/src/effects/SkBlurDrawLooper.cpp b/src/effects/SkBlurDrawLooper.cpp |
| index 03e635be1214a9cb4608bcd5cdb713e53ab9a2ce..5af02db8ee73fb4b0354a910e58673f3499b26d3 100644 |
| --- a/src/effects/SkBlurDrawLooper.cpp |
| +++ b/src/effects/SkBlurDrawLooper.cpp |
| @@ -1,10 +1,10 @@ |
| - |
| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| + |
| #include "SkBlurDrawLooper.h" |
| #include "SkBlurMask.h" // just for SkBlurMask::ConvertRadiusToSigma |
| #include "SkBlurMaskFilter.h" |
| @@ -29,32 +29,27 @@ SkBlurDrawLooper::SkBlurDrawLooper(SkColor color, SkScalar sigma, |
| this->init(sigma, dx, dy, color, flags); |
| } |
| -void SkBlurDrawLooper::init(SkScalar sigma, SkScalar dx, SkScalar dy, |
| - SkColor color, uint32_t flags) { |
| - fDx = dx; |
| - fDy = dy; |
| - fBlurColor = color; |
| - fBlurFlags = flags; |
| - |
| - SkASSERT(flags <= kAll_BlurFlag); |
| - if (sigma > 0) { |
| - uint32_t blurFlags = flags & kIgnoreTransform_BlurFlag ? |
| - SkBlurMaskFilter::kIgnoreTransform_BlurFlag : |
| - SkBlurMaskFilter::kNone_BlurFlag; |
| - |
| - blurFlags |= flags & kHighQuality_BlurFlag ? |
| - SkBlurMaskFilter::kHighQuality_BlurFlag : |
| - SkBlurMaskFilter::kNone_BlurFlag; |
| - |
| - fBlur = SkBlurMaskFilter::Create(kNormal_SkBlurStyle, sigma, blurFlags); |
| +// only call from constructor |
| +void SkBlurDrawLooper::initEffects() { |
| + SkASSERT(fBlurFlags <= kAll_BlurFlag); |
| + if (fSigma > 0) { |
| + uint32_t flags = fBlurFlags & kIgnoreTransform_BlurFlag ? |
| + SkBlurMaskFilter::kIgnoreTransform_BlurFlag : |
| + SkBlurMaskFilter::kNone_BlurFlag; |
| + |
| + flags |= fBlurFlags & kHighQuality_BlurFlag ? |
| + SkBlurMaskFilter::kHighQuality_BlurFlag : |
| + SkBlurMaskFilter::kNone_BlurFlag; |
| + |
| + fBlur = SkBlurMaskFilter::Create(kNormal_SkBlurStyle, fSigma, flags); |
| } else { |
| fBlur = NULL; |
| } |
| - |
| - if (flags & kOverrideColor_BlurFlag) { |
| + |
| + if (fBlurFlags & kOverrideColor_BlurFlag) { |
| // Set alpha to 1 for the override since transparency will already |
| // be baked into the blurred mask. |
| - SkColor opaqueColor = SkColorSetA(color, 255); |
| + SkColor opaqueColor = SkColorSetA(fBlurColor, 255); |
| //The SrcIn xfer mode will multiply 'color' by the incoming alpha |
| fColorFilter = SkColorFilter::CreateModeFilter(opaqueColor, |
| SkXfermode::kSrcIn_Mode); |
| @@ -63,32 +58,60 @@ void SkBlurDrawLooper::init(SkScalar sigma, SkScalar dx, SkScalar dy, |
| } |
| } |
| -SkBlurDrawLooper::SkBlurDrawLooper(SkReadBuffer& buffer) |
| -: INHERITED(buffer) { |
| +void SkBlurDrawLooper::init(SkScalar sigma, SkScalar dx, SkScalar dy, |
| + SkColor color, uint32_t flags) { |
| + fSigma = sigma; |
| + fDx = dx; |
| + fDy = dy; |
| + fBlurColor = color; |
| + fBlurFlags = flags; |
| + |
| + this->initEffects(); |
| +} |
| + |
| +SkBlurDrawLooper::SkBlurDrawLooper(SkReadBuffer& buffer) : INHERITED(buffer) { |
| + fSigma = buffer.readScalar(); |
|
scroggo
2014/04/28 21:19:13
Did you say chrome never uses this? If not, I gues
|
| fDx = buffer.readScalar(); |
| fDy = buffer.readScalar(); |
| fBlurColor = buffer.readColor(); |
| - fBlur = buffer.readMaskFilter(); |
| - fColorFilter = buffer.readColorFilter(); |
| fBlurFlags = buffer.readUInt() & kAll_BlurFlag; |
| -} |
| -SkBlurDrawLooper::~SkBlurDrawLooper() { |
| - SkSafeUnref(fBlur); |
| - SkSafeUnref(fColorFilter); |
| + this->initEffects(); |
| } |
| void SkBlurDrawLooper::flatten(SkWriteBuffer& buffer) const { |
| this->INHERITED::flatten(buffer); |
| + buffer.writeScalar(fSigma); |
| buffer.writeScalar(fDx); |
| buffer.writeScalar(fDy); |
| buffer.writeColor(fBlurColor); |
| - buffer.writeFlattenable(fBlur); |
| - buffer.writeFlattenable(fColorFilter); |
| - buffer.writeUInt(fBlurFlags); |
| + buffer.write32(fBlurFlags); |
| +} |
| + |
| +SkBlurDrawLooper::~SkBlurDrawLooper() { |
| + SkSafeUnref(fBlur); |
| + SkSafeUnref(fColorFilter); |
| } |
| +bool SkBlurDrawLooper::asABlurShadow(BlurShadowRec* rec) const { |
| + if (fSigma <= 0 || (fBlurFlags & fBlurFlags & kIgnoreTransform_BlurFlag)) { |
| + return false; |
| + } |
| + |
| + if (rec) { |
| + rec->fSigma = fSigma; |
| + rec->fColor = fBlurColor; |
| + rec->fOffset.set(fDx, fDy); |
| + rec->fStyle = kNormal_SkBlurStyle; |
| + rec->fQuality = (fBlurFlags & kHighQuality_BlurFlag) ? |
| + kHigh_SkBlurQuality : kLow_SkBlurQuality; |
| + } |
| + return true; |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////////////// |
| + |
| SkDrawLooper::Context* SkBlurDrawLooper::createContext(SkCanvas*, void* storage) const { |
| return SkNEW_PLACEMENT_ARGS(storage, BlurDrawLooperContext, (this)); |
| } |