diff options
author | Matt Sarett <msarett@google.com> | 2017-03-28 15:27:06 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-03-28 19:29:00 +0000 |
commit | 56ea77ac5f782d0165b2992b9575b4e3b9b15715 (patch) | |
tree | 57a6f6f05d505e9638136023422f19c92475e902 | |
parent | 8cb66485e54feefe499cae182edd3ef70130dfb1 (diff) |
Implement SkBlurDrawLooper with SkLayerDrawLooper
This allows us to delete SkBlurDrawLooper (and leave only one draw
looper implementation).
BUG=skia:
Change-Id: I549af86b81babf19e3649bdffffe2fdb0b308d5a
Reviewed-on: https://skia-review.googlesource.com/10101
Commit-Queue: Matt Sarett <msarett@google.com>
Reviewed-by: Derek Sollenberger <djsollen@google.com>
-rw-r--r-- | gn/effects.gni | 1 | ||||
-rw-r--r-- | include/effects/SkBlurDrawLooper.h | 60 | ||||
-rw-r--r-- | src/effects/SkBlurDrawLooper.cpp | 138 | ||||
-rw-r--r-- | src/effects/SkLayerDrawLooper.cpp | 38 | ||||
-rw-r--r-- | src/ports/SkGlobalInitialization_default.cpp | 2 |
5 files changed, 42 insertions, 197 deletions
diff --git a/gn/effects.gni b/gn/effects.gni index cc2b8ed146..df8e75b144 100644 --- a/gn/effects.gni +++ b/gn/effects.gni @@ -21,7 +21,6 @@ skia_effects_sources = [ "$_src/effects/SkArcToPathEffect.cpp", "$_src/effects/SkArithmeticImageFilter.cpp", "$_src/effects/SkArithmeticMode.cpp", - "$_src/effects/SkBlurDrawLooper.cpp", "$_src/effects/SkBlurMask.cpp", "$_src/effects/SkBlurMask.h", "$_src/effects/SkBlurMaskFilter.cpp", diff --git a/include/effects/SkBlurDrawLooper.h b/include/effects/SkBlurDrawLooper.h index 415018a2ad..45289c8941 100644 --- a/include/effects/SkBlurDrawLooper.h +++ b/include/effects/SkBlurDrawLooper.h @@ -10,61 +10,13 @@ #define SkBlurDrawLooper_DEFINED #include "SkDrawLooper.h" -#include "SkColor.h" -class SkArenaAlloc; -class SkMaskFilter; -class SkColorFilter; - -/** \class SkBlurDrawLooper - This class draws a shadow of the object (possibly offset), and then draws - the original object in its original position. - should there be an option to just draw the shadow/blur layer? webkit? -*/ -class SK_API SkBlurDrawLooper : public SkDrawLooper { -public: - static sk_sp<SkDrawLooper> Make(SkColor color, SkScalar sigma, SkScalar dx, SkScalar dy) { - return sk_sp<SkDrawLooper>(new SkBlurDrawLooper(color, sigma, dx, dy)); - } - - SkDrawLooper::Context* makeContext(SkCanvas*, SkArenaAlloc*) const override; - - SK_TO_STRING_OVERRIDE() - SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBlurDrawLooper) - -protected: - SkBlurDrawLooper(SkColor color, SkScalar sigma, SkScalar dx, SkScalar dy); - - void flatten(SkWriteBuffer&) const override; - - bool asABlurShadow(BlurShadowRec*) const override; - -private: - sk_sp<SkMaskFilter> fBlur; - SkScalar fDx, fDy, fSigma; - SkColor fBlurColor; - - enum State { - kBeforeEdge, - kAfterEdge, - kDone - }; - - class BlurDrawLooperContext : public SkDrawLooper::Context { - public: - explicit BlurDrawLooperContext(const SkBlurDrawLooper* looper); - - bool next(SkCanvas* canvas, SkPaint* paint) override; - - private: - const SkBlurDrawLooper* fLooper; - State fState; - }; - - void init(SkScalar sigma, SkScalar dx, SkScalar dy, SkColor color); - void initEffects(); - - typedef SkDrawLooper INHERITED; +/** + * Draws a shadow of the object (possibly offset), and then draws the original object in + * its original position. + */ +namespace SkBlurDrawLooper { + sk_sp<SkDrawLooper> Make(SkColor color, SkScalar sigma, SkScalar dx, SkScalar dy); }; #endif diff --git a/src/effects/SkBlurDrawLooper.cpp b/src/effects/SkBlurDrawLooper.cpp deleted file mode 100644 index 34ce093a9e..0000000000 --- a/src/effects/SkBlurDrawLooper.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/* - * 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 "SkArenaAlloc.h" -#include "SkBlurDrawLooper.h" -#include "SkBlurMask.h" // just for SkBlurMask::ConvertRadiusToSigma -#include "SkBlurMaskFilter.h" -#include "SkCanvas.h" -#include "SkColorFilter.h" -#include "SkReadBuffer.h" -#include "SkWriteBuffer.h" -#include "SkMaskFilter.h" -#include "SkPaint.h" -#include "SkString.h" -#include "SkStringUtils.h" - -SkBlurDrawLooper::SkBlurDrawLooper(SkColor color, SkScalar sigma, - SkScalar dx, SkScalar dy) { - this->init(sigma, dx, dy, color); -} - -// only call from constructor -void SkBlurDrawLooper::initEffects() { - if (fSigma > 0) { - fBlur = SkBlurMaskFilter::Make(kNormal_SkBlurStyle, fSigma, - SkBlurMaskFilter::kNone_BlurFlag); - } else { - fBlur = nullptr; - } -} - -void SkBlurDrawLooper::init(SkScalar sigma, SkScalar dx, SkScalar dy, SkColor color) { - fSigma = sigma; - fDx = dx; - fDy = dy; - fBlurColor = color; - - this->initEffects(); -} - -sk_sp<SkFlattenable> SkBlurDrawLooper::CreateProc(SkReadBuffer& buffer) { - const SkColor color = buffer.readColor(); - const SkScalar sigma = buffer.readScalar(); - const SkScalar dx = buffer.readScalar(); - const SkScalar dy = buffer.readScalar(); - return Make(color, sigma, dx, dy); -} - -void SkBlurDrawLooper::flatten(SkWriteBuffer& buffer) const { - buffer.writeColor(fBlurColor); - buffer.writeScalar(fSigma); - buffer.writeScalar(fDx); - buffer.writeScalar(fDy); -} - -bool SkBlurDrawLooper::asABlurShadow(BlurShadowRec* rec) const { - if (fSigma <= 0) { - return false; - } - - if (rec) { - rec->fSigma = fSigma; - rec->fColor = fBlurColor; - rec->fOffset.set(fDx, fDy); - rec->fStyle = kNormal_SkBlurStyle; - rec->fQuality = kLow_SkBlurQuality; - } - return true; -} - -//////////////////////////////////////////////////////////////////////////////////////// - - -SkDrawLooper::Context* SkBlurDrawLooper::makeContext(SkCanvas*, SkArenaAlloc* alloc) const { - return alloc->make<BlurDrawLooperContext>(this); -} - -SkBlurDrawLooper::BlurDrawLooperContext::BlurDrawLooperContext( - const SkBlurDrawLooper* looper) - : fLooper(looper), fState(SkBlurDrawLooper::kBeforeEdge) {} - -bool SkBlurDrawLooper::BlurDrawLooperContext::next(SkCanvas* canvas, - SkPaint* paint) { - switch (fState) { - case kBeforeEdge: - // we do nothing if a maskfilter is already installed - if (paint->getMaskFilter()) { - fState = kDone; - return false; - } -#ifdef SK_BUILD_FOR_ANDROID - SkColor blurColor; - blurColor = fLooper->fBlurColor; - if (SkColorGetA(blurColor) == 255) { - blurColor = SkColorSetA(blurColor, paint->getAlpha()); - } - paint->setColor(blurColor); -#else - paint->setColor(fLooper->fBlurColor); -#endif - paint->setMaskFilter(fLooper->fBlur); - canvas->save(); - canvas->translate(fLooper->fDx, fLooper->fDy); - fState = kAfterEdge; - return true; - case kAfterEdge: - canvas->restore(); - fState = kDone; - return true; - default: - SkASSERT(kDone == fState); - return false; - } -} - -#ifndef SK_IGNORE_TO_STRING -void SkBlurDrawLooper::toString(SkString* str) const { - str->append("SkBlurDrawLooper: "); - - str->append("dx: "); - str->appendScalar(fDx); - - str->append(" dy: "); - str->appendScalar(fDy); - - str->append(" color: "); - str->appendHex(fBlurColor); - - str->append(" flags: (None)"); - - // TODO: add optional "fBlurFilter->toString(str);" when SkMaskFilter::toString is added - // alternatively we could cache the radius in SkBlurDrawLooper and just add it here -} -#endif diff --git a/src/effects/SkLayerDrawLooper.cpp b/src/effects/SkLayerDrawLooper.cpp index 5c0cf6bf7b..a20638c005 100644 --- a/src/effects/SkLayerDrawLooper.cpp +++ b/src/effects/SkLayerDrawLooper.cpp @@ -5,6 +5,8 @@ * found in the LICENSE file. */ #include "SkArenaAlloc.h" +#include "SkBlurDrawLooper.h" +#include "SkBlurMaskFilter.h" #include "SkCanvas.h" #include "SkColor.h" #include "SkReadBuffer.h" @@ -61,8 +63,15 @@ static SkColor xferColor(SkColor src, SkColor dst, SkBlendMode mode) { // text/length parameters of a draw[Pos]Text call. void SkLayerDrawLooper::LayerDrawLooperContext::ApplyInfo( SkPaint* dst, const SkPaint& src, const LayerInfo& info) { - - dst->setColor(xferColor(src.getColor(), dst->getColor(), (SkBlendMode)info.fColorMode)); + SkColor srcColor = src.getColor(); +#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK + // The framework may respect the alpha value on the original paint. + // Match this legacy behavior. + if (SkColorGetA(srcColor) == 255) { + srcColor = SkColorSetA(srcColor, dst->getAlpha()); + } +#endif + dst->setColor(xferColor(srcColor, dst->getColor(), (SkBlendMode)info.fColorMode)); BitFlags bits = info.fPaintBits; SkPaint::TextEncoding encoding = dst->getTextEncoding(); @@ -356,3 +365,28 @@ sk_sp<SkDrawLooper> SkLayerDrawLooper::Builder::detach() { return sk_sp<SkDrawLooper>(looper); } + +sk_sp<SkDrawLooper> SkBlurDrawLooper::Make(SkColor color, SkScalar sigma, SkScalar dx, SkScalar dy) +{ + sk_sp<SkMaskFilter> blur = nullptr; + if (sigma > 0.0f) { + blur = SkBlurMaskFilter::Make(kNormal_SkBlurStyle, sigma, SkBlurMaskFilter::kNone_BlurFlag); + } + + SkLayerDrawLooper::Builder builder; + + // First layer + SkLayerDrawLooper::LayerInfo defaultLayer; + builder.addLayer(defaultLayer); + + // Blur layer + SkLayerDrawLooper::LayerInfo blurInfo; + blurInfo.fColorMode = SkBlendMode::kSrc; + blurInfo.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit; + blurInfo.fOffset = SkVector::Make(dx, dy); + SkPaint* paint = builder.addLayer(blurInfo); + paint->setMaskFilter(std::move(blur)); + paint->setColor(color); + + return builder.detach(); +} diff --git a/src/ports/SkGlobalInitialization_default.cpp b/src/ports/SkGlobalInitialization_default.cpp index df4dde30a6..608f5c8518 100644 --- a/src/ports/SkGlobalInitialization_default.cpp +++ b/src/ports/SkGlobalInitialization_default.cpp @@ -11,7 +11,6 @@ #include "../../src/effects/SkArithmeticModePriv.h" #include "SkArcToPathEffect.h" #include "SkBitmapSourceDeserializer.h" -#include "SkBlurDrawLooper.h" #include "SkBlurImageFilter.h" #include "SkBlurMaskFilter.h" #include "SkColorFilterImageFilter.h" @@ -74,7 +73,6 @@ void SkFlattenable::PrivateInitializer::InitEffects() { SkRRectsGaussianEdgeMaskFilter::InitializeFlattenables(); // DrawLooper - SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurDrawLooper) SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLayerDrawLooper) // Rasterizer |