aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/arithmode.cpp
diff options
context:
space:
mode:
authorGravatar fmalita <fmalita@chromium.org>2016-09-29 12:25:26 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-09-29 12:25:26 -0700
commitad7cb810dcb480dd5df81b55449334751894b5b3 (patch)
tree5f99adb0003512fbffc70c3d831b358038c9e46d /gm/arithmode.cpp
parentc6cc28c35be30f9ea144f433f3f04273674e29ed (diff)
Reenable GM:arithmode
Convert to SkXfermodeImageFilter and reenable. R=reed@google.com,robertphillips@google.com GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2379873003 Review-Url: https://codereview.chromium.org/2379873003
Diffstat (limited to 'gm/arithmode.cpp')
-rw-r--r--gm/arithmode.cpp128
1 files changed, 66 insertions, 62 deletions
diff --git a/gm/arithmode.cpp b/gm/arithmode.cpp
index f98fbf7057..caa3e283bb 100644
--- a/gm/arithmode.cpp
+++ b/gm/arithmode.cpp
@@ -8,24 +8,20 @@
#include "gm.h"
#include "SkCanvas.h"
#include "SkColorPriv.h"
+#include "SkGradientShader.h"
+#include "SkImage.h"
+#include "SkImageSource.h"
#include "SkShader.h"
+#include "SkSurface.h"
+#include "SkXfermodeImageFilter.h"
-#include "SkArithmeticMode.h"
-#include "SkGradientShader.h"
#define WW 100
#define HH 32
-#ifdef SK_SUPPORT_LEGACY_ARITHMETICMODE
-static SkBitmap make_bm() {
- SkBitmap bm;
- bm.allocN32Pixels(WW, HH);
- bm.eraseColor(SK_ColorTRANSPARENT);
- return bm;
-}
+static sk_sp<SkImage> make_src() {
+ sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(WW, HH));
+ SkCanvas* canvas = surface->getCanvas();
-static SkBitmap make_src() {
- SkBitmap bm = make_bm();
- SkCanvas canvas(bm);
SkPaint paint;
SkPoint pts[] = { {0, 0}, {SkIntToScalar(WW), SkIntToScalar(HH)} };
SkColor colors[] = {
@@ -34,13 +30,14 @@ static SkBitmap make_src() {
};
paint.setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, SK_ARRAY_COUNT(colors),
SkShader::kClamp_TileMode));
- canvas.drawPaint(paint);
- return bm;
+ canvas->drawPaint(paint);
+ return surface->makeImageSnapshot();
}
-static SkBitmap make_dst() {
- SkBitmap bm = make_bm();
- SkCanvas canvas(bm);
+static sk_sp<SkImage> make_dst() {
+ sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(WW, HH));
+ SkCanvas* canvas = surface->getCanvas();
+
SkPaint paint;
SkPoint pts[] = { {0, SkIntToScalar(HH)}, {SkIntToScalar(WW), 0} };
SkColor colors[] = {
@@ -49,8 +46,8 @@ static SkBitmap make_dst() {
};
paint.setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, SK_ARRAY_COUNT(colors),
SkShader::kClamp_TileMode));
- canvas.drawPaint(paint);
- return bm;
+ canvas->drawPaint(paint);
+ return surface->makeImageSnapshot();
}
static void show_k_text(SkCanvas* canvas, SkScalar x, SkScalar y, const SkScalar k[]) {
@@ -80,8 +77,10 @@ protected:
virtual SkISize onISize() { return SkISize::Make(640, 572); }
virtual void onDraw(SkCanvas* canvas) {
- SkBitmap src = make_src();
- SkBitmap dst = make_dst();
+ sk_sp<SkImage> src = make_src();
+ sk_sp<SkImage> dst = make_dst();
+ sk_sp<SkImageFilter> srcFilter = SkImageSource::Make(src);
+ sk_sp<SkImageFilter> dstFilter = SkImageSource::Make(dst);
constexpr SkScalar one = SK_Scalar1;
constexpr SkScalar K[] = {
@@ -100,25 +99,27 @@ protected:
const SkScalar* k = K;
const SkScalar* stop = k + SK_ARRAY_COUNT(K);
- SkScalar y = 0;
- SkScalar gap = SkIntToScalar(src.width() + 20);
+ const SkRect rect = SkRect::MakeWH(WW, HH);
+ SkScalar gap = SkIntToScalar(WW + 20);
while (k < stop) {
- SkScalar x = 0;
- canvas->drawBitmap(src, x, y, nullptr);
- x += gap;
- canvas->drawBitmap(dst, x, y, nullptr);
- x += gap;
- SkRect rect = SkRect::MakeXYWH(x, y, SkIntToScalar(WW), SkIntToScalar(HH));
- canvas->saveLayer(&rect, nullptr);
- canvas->drawBitmap(dst, x, y, nullptr);
- SkPaint paint;
- paint.setXfermode(SkArithmeticMode::Make(k[0], k[1], k[2], k[3]));
- canvas->drawBitmap(src, x, y, &paint);
- canvas->restore();
- x += gap;
- show_k_text(canvas, x, y, k);
+ {
+ SkAutoCanvasRestore acr(canvas, true);
+ canvas->drawImage(src, 0, 0);
+ canvas->translate(gap, 0);
+ canvas->drawImage(dst, 0, 0);
+ canvas->translate(gap, 0);
+ SkPaint paint;
+ paint.setImageFilter(SkXfermodeImageFilter::MakeArithmetic(k[0], k[1], k[2], k[3],
+ true, dstFilter, srcFilter, nullptr));
+ canvas->saveLayer(&rect, &paint);
+ canvas->restore();
+
+ canvas->translate(gap, 0);
+ show_k_text(canvas, 0, 0, k);
+ }
+
k += 4;
- y += SkIntToScalar(src.height() + 12);
+ canvas->translate(0, HH + 12);
}
// Draw two special cases to test enforcePMColor. In these cases, we
@@ -128,29 +129,33 @@ protected:
// second draw.
for (int i = 0; i < 2; i++) {
const bool enforcePMColor = (i == 0);
- SkScalar x = gap;
- canvas->drawBitmap(dst, x, y, nullptr);
- x += gap;
- SkRect rect = SkRect::MakeXYWH(x, y, SkIntToScalar(WW), SkIntToScalar(HH));
- canvas->saveLayer(&rect, nullptr);
- SkPaint paint1;
- paint1.setXfermode(SkArithmeticMode::Make(0, -one / 2, 0, 1, enforcePMColor));
- canvas->drawBitmap(dst, x, y, &paint1);
- SkPaint paint2;
- paint2.setXfermode(SkArithmeticMode::Make(0, one / 2, -one, 1));
- canvas->drawBitmap(dst, x, y, &paint2);
- canvas->restore();
- x += gap;
-
- // Label
- SkPaint paint;
- paint.setTextSize(SkIntToScalar(24));
- paint.setAntiAlias(true);
- sk_tool_utils::set_portable_typeface(&paint);
- SkString str(enforcePMColor ? "enforcePM" : "no enforcePM");
- canvas->drawText(str.c_str(), str.size(), x, y + paint.getTextSize(), paint);
-
- y += SkIntToScalar(src.height() + 12);
+
+ {
+ SkAutoCanvasRestore acr(canvas, true);
+ canvas->translate(gap, 0);
+ canvas->drawImage(dst, 0, 0);
+ canvas->translate(gap, 0);
+
+ sk_sp<SkImageFilter> bg =
+ SkXfermodeImageFilter::MakeArithmetic(0, 0, -one / 2, 1, enforcePMColor,
+ dstFilter);
+ SkPaint p;
+ p.setImageFilter(SkXfermodeImageFilter::MakeArithmetic(0, one / 2, -one, 1, true,
+ std::move(bg), dstFilter,
+ nullptr));
+ canvas->saveLayer(&rect, &p);
+ canvas->restore();
+ canvas->translate(gap, 0);
+
+ // Label
+ SkPaint paint;
+ paint.setTextSize(SkIntToScalar(24));
+ paint.setAntiAlias(true);
+ sk_tool_utils::set_portable_typeface(&paint);
+ SkString str(enforcePMColor ? "enforcePM" : "no enforcePM");
+ canvas->drawText(str.c_str(), str.size(), 0, paint.getTextSize(), paint);
+ }
+ canvas->translate(0, HH + 12);
}
}
@@ -161,4 +166,3 @@ private:
///////////////////////////////////////////////////////////////////////////////
DEF_GM( return new ArithmodeGM; )
-#endif