aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-03-28 15:27:06 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-03-28 19:29:00 +0000
commit56ea77ac5f782d0165b2992b9575b4e3b9b15715 (patch)
tree57a6f6f05d505e9638136023422f19c92475e902
parent8cb66485e54feefe499cae182edd3ef70130dfb1 (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.gni1
-rw-r--r--include/effects/SkBlurDrawLooper.h60
-rw-r--r--src/effects/SkBlurDrawLooper.cpp138
-rw-r--r--src/effects/SkLayerDrawLooper.cpp38
-rw-r--r--src/ports/SkGlobalInitialization_default.cpp2
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