aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/arithmode.cpp
diff options
context:
space:
mode:
authorGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-05-29 18:50:46 +0000
committerGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-05-29 18:50:46 +0000
commit6b6c1dc34c299be87a3ff3ab41d3d4fd0f96a846 (patch)
treec4d4cd08db9aa97086079c87bed012bb75d36e79 /gm/arithmode.cpp
parent3467ee06d31798b2673364ef4f7abd83619b21dd (diff)
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
Diffstat (limited to 'gm/arithmode.cpp')
-rw-r--r--gm/arithmode.cpp22
1 files changed, 8 insertions, 14 deletions
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;