imagefilters.cpp revision 2a24338c777462e04a2b26295f9c034155ee8f3e
17e4186accea094276c9f3c65c64e63ffc59aa644reed/*
27e4186accea094276c9f3c65c64e63ffc59aa644reed * Copyright 2015 Google Inc.
37e4186accea094276c9f3c65c64e63ffc59aa644reed *
47e4186accea094276c9f3c65c64e63ffc59aa644reed * Use of this source code is governed by a BSD-style license that can be
57e4186accea094276c9f3c65c64e63ffc59aa644reed * found in the LICENSE file.
67e4186accea094276c9f3c65c64e63ffc59aa644reed */
77e4186accea094276c9f3c65c64e63ffc59aa644reed
87e4186accea094276c9f3c65c64e63ffc59aa644reed#include "gm.h"
97e4186accea094276c9f3c65c64e63ffc59aa644reed#include "SkImageFilter.h"
107e4186accea094276c9f3c65c64e63ffc59aa644reed#include "SkColorMatrixFilter.h"
117e4186accea094276c9f3c65c64e63ffc59aa644reed
127e4186accea094276c9f3c65c64e63ffc59aa644reed/**
137e4186accea094276c9f3c65c64e63ffc59aa644reed *  Test drawing a primitive w/ an imagefilter (in this case, just matrix w/ identity) to see
147e4186accea094276c9f3c65c64e63ffc59aa644reed *  that we apply the xfermode *after* the image has been created and filtered, and not during
157e4186accea094276c9f3c65c64e63ffc59aa644reed *  the creation step (i.e. before it is filtered).
167e4186accea094276c9f3c65c64e63ffc59aa644reed *
177e4186accea094276c9f3c65c64e63ffc59aa644reed *  see skbug.com/3741
187e4186accea094276c9f3c65c64e63ffc59aa644reed */
192a24338c777462e04a2b26295f9c034155ee8f3ehalcanarystatic void do_draw(SkCanvas* canvas, SkXfermode::Mode mode, SkImageFilter* imf) {
2049124378913f3467eb67e653b3b48f80899a3f37reed        SkAutoCanvasRestore acr(canvas, true);
2149124378913f3467eb67e653b3b48f80899a3f37reed        canvas->clipRect(SkRect::MakeWH(220, 220));
2249124378913f3467eb67e653b3b48f80899a3f37reed
2349124378913f3467eb67e653b3b48f80899a3f37reed        // want to force a layer, so modes like DstIn can combine meaningfully, but the final
2449124378913f3467eb67e653b3b48f80899a3f37reed        // image can still be shown against our default (opaque) background. non-opaque GMs
2549124378913f3467eb67e653b3b48f80899a3f37reed        // are a lot more trouble to compare/triage.
2696fcdcc219d2a0d3579719b84b28bede76efba64halcanary        canvas->saveLayer(nullptr, nullptr);
2749124378913f3467eb67e653b3b48f80899a3f37reed        canvas->drawColor(SK_ColorGREEN);
2849124378913f3467eb67e653b3b48f80899a3f37reed
297e4186accea094276c9f3c65c64e63ffc59aa644reed        SkPaint paint;
307e4186accea094276c9f3c65c64e63ffc59aa644reed        paint.setAntiAlias(true);
317e4186accea094276c9f3c65c64e63ffc59aa644reed
327e4186accea094276c9f3c65c64e63ffc59aa644reed        SkRect r0 = SkRect::MakeXYWH(10, 60, 200, 100);
337e4186accea094276c9f3c65c64e63ffc59aa644reed        SkRect r1 = SkRect::MakeXYWH(60, 10, 100, 200);
347e4186accea094276c9f3c65c64e63ffc59aa644reed
357e4186accea094276c9f3c65c64e63ffc59aa644reed        paint.setColor(SK_ColorRED);
367e4186accea094276c9f3c65c64e63ffc59aa644reed        canvas->drawOval(r0, paint);
377e4186accea094276c9f3c65c64e63ffc59aa644reed
3849124378913f3467eb67e653b3b48f80899a3f37reed        paint.setColor(0x660000FF);
397e4186accea094276c9f3c65c64e63ffc59aa644reed        paint.setImageFilter(imf);
407e4186accea094276c9f3c65c64e63ffc59aa644reed        paint.setXfermodeMode(mode);
417e4186accea094276c9f3c65c64e63ffc59aa644reed        canvas->drawOval(r1, paint);
422a24338c777462e04a2b26295f9c034155ee8f3ehalcanary}
437e4186accea094276c9f3c65c64e63ffc59aa644reed
442a24338c777462e04a2b26295f9c034155ee8f3ehalcanaryDEF_SIMPLE_GM(imagefilters_xfermodes, canvas, 480, 480) {
4549124378913f3467eb67e653b3b48f80899a3f37reed        canvas->translate(10, 10);
4649124378913f3467eb67e653b3b48f80899a3f37reed
477e4186accea094276c9f3c65c64e63ffc59aa644reed        // just need an imagefilter to trigger the code-path (which creates a tmp layer)
487e4186accea094276c9f3c65c64e63ffc59aa644reed        SkAutoTUnref<SkImageFilter> imf(SkImageFilter::CreateMatrixFilter(SkMatrix::I(),
497e4186accea094276c9f3c65c64e63ffc59aa644reed                                                                          kNone_SkFilterQuality));
507e4186accea094276c9f3c65c64e63ffc59aa644reed
517e4186accea094276c9f3c65c64e63ffc59aa644reed        const SkXfermode::Mode modes[] = {
527e4186accea094276c9f3c65c64e63ffc59aa644reed            SkXfermode::kSrcATop_Mode, SkXfermode::kDstIn_Mode
537e4186accea094276c9f3c65c64e63ffc59aa644reed        };
547e4186accea094276c9f3c65c64e63ffc59aa644reed
557e4186accea094276c9f3c65c64e63ffc59aa644reed        for (size_t i = 0; i < SK_ARRAY_COUNT(modes); ++i) {
567e4186accea094276c9f3c65c64e63ffc59aa644reed            canvas->save();
572a24338c777462e04a2b26295f9c034155ee8f3ehalcanary            do_draw(canvas, modes[i], nullptr);
5849124378913f3467eb67e653b3b48f80899a3f37reed            canvas->translate(240, 0);
592a24338c777462e04a2b26295f9c034155ee8f3ehalcanary            do_draw(canvas, modes[i], imf);
607e4186accea094276c9f3c65c64e63ffc59aa644reed            canvas->restore();
617e4186accea094276c9f3c65c64e63ffc59aa644reed
6249124378913f3467eb67e653b3b48f80899a3f37reed            canvas->translate(0, 240);
637e4186accea094276c9f3c65c64e63ffc59aa644reed        }
642a24338c777462e04a2b26295f9c034155ee8f3ehalcanary}
65