From 6b6c1dc34c299be87a3ff3ab41d3d4fd0f96a846 Mon Sep 17 00:00:00 2001 From: "senorblanco@chromium.org" Date: Wed, 29 May 2013 18:50:46 +0000 Subject: Provide a GPU implementation of SkArithmeticMode, using a custom GrEffect exposed via asNewEffectOrCoeff(). Doing it this way required modifying the arithmode GM to use saveLayer()/restore() rather than creating an offscreen SkBitmap, since otherwise the compositing is always done in raster mode. Fixing that in turn exposed that SkArithmeticMode did not work in Picture mode, since it wasn't flattenable. Made it so. Note: this will require rebaselining the arithmode GM (again). R=bsalomon@google.com, reed@google.com Review URL: https://codereview.chromium.org/16064002 git-svn-id: http://skia.googlecode.com/svn/trunk@9324 2bbb7eff-a529-9590-31e7-b0007b416f81 --- gm/arithmode.cpp | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) (limited to 'gm/arithmode.cpp') diff --git a/gm/arithmode.cpp b/gm/arithmode.cpp index 2a97eca957..63be6c3871 100644 --- a/gm/arithmode.cpp +++ b/gm/arithmode.cpp @@ -54,18 +54,6 @@ static SkBitmap make_dst() { return bm; } -static SkBitmap make_arith(const SkBitmap& src, const SkBitmap& dst, - const SkScalar k[]) { - SkBitmap bm = make_bm(); - SkCanvas canvas(bm); - SkPaint paint; - canvas.drawBitmap(dst, 0, 0, NULL); - SkXfermode* xfer = SkArithmeticMode::Create(k[0], k[1], k[2], k[3]); - paint.setXfermode(xfer)->unref(); - canvas.drawBitmap(src, 0, 0, &paint); - return bm; -} - static void show_k_text(SkCanvas* canvas, SkScalar x, SkScalar y, const SkScalar k[]) { SkPaint paint; paint.setTextSize(SkIntToScalar(24)); @@ -116,12 +104,18 @@ protected: SkScalar gap = SkIntToScalar(src.width() + 20); while (k < stop) { SkScalar x = 0; - SkBitmap res = make_arith(src, dst, k); canvas->drawBitmap(src, x, y, NULL); x += gap; canvas->drawBitmap(dst, x, y, NULL); x += gap; - canvas->drawBitmap(res, x, y, NULL); + SkRect rect = SkRect::MakeXYWH(x, y, SkIntToScalar(WW), SkIntToScalar(HH)); + canvas->saveLayer(&rect, NULL); + canvas->drawBitmap(dst, x, y, NULL); + SkXfermode* xfer = SkArithmeticMode::Create(k[0], k[1], k[2], k[3]); + SkPaint paint; + paint.setXfermode(xfer)->unref(); + canvas->drawBitmap(src, x, y, &paint); + canvas->restore(); x += gap; show_k_text(canvas, x, y, k); k += 4; -- cgit v1.2.3