aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/effects/SkLayerDrawLooper.cpp
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 /src/effects/SkLayerDrawLooper.cpp
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>
Diffstat (limited to 'src/effects/SkLayerDrawLooper.cpp')
-rw-r--r--src/effects/SkLayerDrawLooper.cpp38
1 files changed, 36 insertions, 2 deletions
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();
+}