aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/xfermodes.cpp
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2016-09-26 20:40:57 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2016-09-26 20:53:19 +0000
commit10ff5bfa789b6b602464e8511fdf676c6f5b1bd4 (patch)
tree1eb96e7533f882aa935b5d62132f4205bfedd2c9 /gm/xfermodes.cpp
parent29111a3e71f59b26c1feebf6b30db5c68a27d5a9 (diff)
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 <reed@google.com> > Reviewed-by: Florin Malita <fmalita@chromium.org> > Reviewed-by: Robert Phillips <robertphillips@google.com> > 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 <fmalita@chromium.org> Commit-Queue: Florin Malita <fmalita@chromium.org>
Diffstat (limited to 'gm/xfermodes.cpp')
-rw-r--r--gm/xfermodes.cpp44
1 files changed, 39 insertions, 5 deletions
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<SkXfermode> 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<SkXfermode> 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<SkXfermode> 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<SrcType>(sourceType),
+ draw_mode(canvas, std::move(mode), static_cast<SrcType>(sourceType),
r.fLeft, r.fTop);
canvas->restore();