From 10ff5bfa789b6b602464e8511fdf676c6f5b1bd4 Mon Sep 17 00:00:00 2001 From: Mike Reed Date: Mon, 26 Sep 2016 20:40:57 +0000 Subject: Revert "replace Arithmetic xfermode with imagefilter" This reverts commit Ia3f3b721854c516f3b7f8c44f71f40a8a2eeb9b4. Reason for revert: need to guard the no-gpu codepath Original issue's description: > replace Arithmetic xfermode with imagefilter > > chrome pre-cl: https://codereview.chromium.org/2369023002/ > > BUG=skia: > > GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2595 > > Change-Id: Ia3f3b721854c516f3b7f8c44f71f40a8a2eeb9b4 > Reviewed-on: https://skia-review.googlesource.com/2595 > Commit-Queue: Mike Reed > Reviewed-by: Florin Malita > Reviewed-by: Robert Phillips > TBR=robertphillips@google.com,fmalita@chromium.org,fmalita@google.com,reed@google.com NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true Change-Id: I761799b594a0379c6bf356e6abc73552c3d19480 Reviewed-on: https://skia-review.googlesource.com/2661 Reviewed-by: Florin Malita Commit-Queue: Florin Malita --- gm/xfermodes.cpp | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) (limited to 'gm/xfermodes.cpp') diff --git a/gm/xfermodes.cpp b/gm/xfermodes.cpp index 8fbbdbec6a..68d267bd22 100644 --- a/gm/xfermodes.cpp +++ b/gm/xfermodes.cpp @@ -11,6 +11,31 @@ #include "SkXfermode.h" #include "SkPM4f.h" +#include "SkArithmeticMode.h" + +#define kCustomShift 16 +#define kCustomMask (~0xFFFF) + +enum CustomModes { + kArithmetic_CustomMode = 1 << kCustomShift, +}; + +static sk_sp make_custom(int customMode) { + switch (customMode) { + case kArithmetic_CustomMode: { + const SkScalar k1 = 0.25; + const SkScalar k2 = 0.75; + const SkScalar k3 = 0.75; + const SkScalar k4 = -0.25; + return SkArithmeticMode::Make(k1, k2, k3, k4); + } + default: + break; + } + SkASSERT(false); + return nullptr; +} + enum SrcType { //! A WxH image with a rectangle in the lower right. kRectangleImage_SrcType = 0x01, @@ -73,6 +98,8 @@ const struct { { SkXfermode::kSaturation_Mode, "Saturation", kBasic_SrcType }, { SkXfermode::kColor_Mode, "Color", kBasic_SrcType }, { SkXfermode::kLuminosity_Mode, "Luminosity", kBasic_SrcType }, + + { SkXfermode::Mode(0xFFFF), "Arithmetic", kBasic_SrcType + kArithmetic_CustomMode }, }; static void make_bitmaps(int w, int h, SkBitmap* src, SkBitmap* dst, @@ -118,7 +145,7 @@ class XfermodesGM : public skiagm::GM { * uses the implied shape of the drawing command and these modes * demonstrate that. */ - void draw_mode(SkCanvas* canvas, SkXfermode::Mode mode, SrcType srcType, + void draw_mode(SkCanvas* canvas, sk_sp mode, SrcType srcType, SkScalar x, SkScalar y) { SkPaint p; SkMatrix m; @@ -126,7 +153,7 @@ class XfermodesGM : public skiagm::GM { m.setTranslate(x, y); canvas->drawBitmap(fSrcB, x, y, &p); - p.setXfermodeMode(mode); + p.setXfermode(std::move(mode)); switch (srcType) { case kSmallTransparentImage_SrcType: { m.postScale(SK_ScalarHalf, SK_ScalarHalf, x, y); @@ -214,7 +241,7 @@ protected: } SkISize onISize() override { - return SkISize::Make(1990, 570); + return SkISize::Make(1990, 660); } void onDraw(SkCanvas* canvas) override { @@ -242,7 +269,14 @@ protected: if ((gModes[i].fSourceTypeMask & sourceType) == 0) { continue; } - SkRect r{ x, y, x+w, y+h }; + sk_sp mode; + if (gModes[i].fSourceTypeMask & kCustomMask) { + mode = make_custom(gModes[i].fSourceTypeMask & kCustomMask); + } else { + mode = SkXfermode::Make(gModes[i].fMode); + } + SkRect r; + r.set(x, y, x+w, y+h); SkPaint p; p.setStyle(SkPaint::kFill_Style); @@ -250,7 +284,7 @@ protected: canvas->drawRect(r, p); canvas->saveLayer(&r, nullptr); - draw_mode(canvas, gModes[i].fMode, static_cast(sourceType), + draw_mode(canvas, std::move(mode), static_cast(sourceType), r.fLeft, r.fTop); canvas->restore(); -- cgit v1.2.3