| Index: gm/arithmode.cpp
|
| diff --git a/gm/arithmode.cpp b/gm/arithmode.cpp
|
| index f98fbf70577f0feb29a1455795ecfaa3c04041ca..caa3e283bb4956ec94deb077f65d5e12717afec8 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
|
|
|