Index: gm/xfermodes.cpp |
diff --git a/gm/xfermodes.cpp b/gm/xfermodes.cpp |
index fdaeec7e65ba27b3654d92c0a879de19205f0327..2366854941c88b4f51d9d5f94cdce3c91bf8009e 100644 |
--- a/gm/xfermodes.cpp |
+++ b/gm/xfermodes.cpp |
@@ -11,6 +11,39 @@ |
#include "SkXfermode.h" |
#include "SkPM4f.h" |
+#include "SkArithmeticMode.h" |
+#include "SkPixelXorXfermode.h" |
+#include "SkAvoidXfermode.h" |
+ |
+#define kCustomShift 16 |
+#define kCustomMask (~0xFFFF) |
+ |
+enum CustomModes { |
+ kArithmetic_CustomMode = 1 << kCustomShift, |
+ kPixelXor_CustomMode = 2 << kCustomShift, |
+ kAvoid_CustomMode = 3 << kCustomShift, |
+}; |
+ |
+static 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::Create(k1, k2, k3, k4); |
+ } |
+ case kPixelXor_CustomMode: |
+ return SkPixelXorXfermode::Create(0xFF88CC44); |
+ case kAvoid_CustomMode: |
+ return SkAvoidXfermode::Create(0xFFFF0000, 0x44, SkAvoidXfermode::kAvoidColor_Mode); |
+ default: |
+ break; |
+ } |
+ SkASSERT(false); |
+ return nullptr; |
+} |
+ |
enum SrcType { |
//! A WxH image with a rectangle in the lower right. |
kRectangleImage_SrcType = 0x01, |
@@ -73,6 +106,10 @@ 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 }, |
+ { SkXfermode::Mode(0xFFFF), "PixelXor", kBasic_SrcType + kPixelXor_CustomMode }, |
+ { SkXfermode::Mode(0xFFFF), "Avoid", kBasic_SrcType + kAvoid_CustomMode }, |
}; |
static void make_bitmaps(int w, int h, SkBitmap* src, SkBitmap* dst, |
@@ -214,7 +251,7 @@ protected: |
} |
SkISize onISize() override { |
- return SkISize::Make(1990, 640); |
+ return SkISize::Make(1990, 660); |
} |
void onDraw(SkCanvas* canvas) override { |
@@ -242,10 +279,15 @@ protected: |
SkScalar x = x0, y = y0; |
for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) { |
if ((gModes[i].fSourceTypeMask & sourceType) == 0) { |
+ SkDebugf("skip %d %s for type %x\n", i, gModes[i].fLabel, sourceType); |
continue; |
} |
- SkXfermode* mode = SkXfermode::Create(gModes[i].fMode); |
- SkAutoUnref aur(mode); |
+ SkAutoTUnref<SkXfermode> mode; |
+ if (gModes[i].fSourceTypeMask & kCustomMask) { |
+ mode.reset(make_custom(gModes[i].fSourceTypeMask & kCustomMask)); |
+ } else { |
+ mode.reset(SkXfermode::Create(gModes[i].fMode)); |
+ } |
SkRect r; |
r.set(x, y, x+w, y+h); |