18d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org/*
28d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org * Copyright 2012 Google Inc.
38d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org *
48d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
58d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org * found in the LICENSE file.
68d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org */
78d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
88d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#include "gm.h"
98d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#include "SkCanvas.h"
108d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#include "SkColorMatrixFilter.h"
118d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#include "SkColorPriv.h"
128d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#include "SkShader.h"
138d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
148d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#include "SkBlurImageFilter.h"
158d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#include "SkColorFilterImageFilter.h"
168d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
178d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#define FILTER_WIDTH    SkIntToScalar(30)
188d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#define FILTER_HEIGHT   SkIntToScalar(30)
198d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#define MARGIN          SkIntToScalar(10)
208d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
218d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgstatic SkImageFilter* make_blur(float amount, SkImageFilter* input = NULL) {
22cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    return SkBlurImageFilter::Create(amount, amount, input);
238d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
248d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
258d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgstatic SkImageFilter* make_brightness(float amount, SkImageFilter* input = NULL) {
264b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    SkScalar amount255 = SkScalarMul(amount, SkIntToScalar(255));
278d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    SkScalar matrix[20] = { 1, 0, 0, 0, amount255,
288d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org                            0, 1, 0, 0, amount255,
298d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org                            0, 0, 1, 0, amount255,
308d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org                            0, 0, 0, 1, 0 };
31727a352f7412753d2a3e4d30eab6500a1a4de135commit-bot@chromium.org    SkAutoTUnref<SkColorFilter> filter(SkColorMatrixFilter::Create(matrix));
32cd9f55989e680b7f52fa21766dde0ac67ac9911fsenorblanco@chromium.org    return SkColorFilterImageFilter::Create(filter, input);
338d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
348d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
358d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgstatic SkImageFilter* make_grayscale(SkImageFilter* input = NULL) {
368d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    SkScalar matrix[20];
378d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    memset(matrix, 0, 20 * sizeof(SkScalar));
384b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    matrix[0] = matrix[5] = matrix[10] = 0.2126f;
394b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    matrix[1] = matrix[6] = matrix[11] = 0.7152f;
404b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    matrix[2] = matrix[7] = matrix[12] = 0.0722f;
414b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    matrix[18] = 1.0f;
42727a352f7412753d2a3e4d30eab6500a1a4de135commit-bot@chromium.org    SkAutoTUnref<SkColorFilter> filter(SkColorMatrixFilter::Create(matrix));
43cd9f55989e680b7f52fa21766dde0ac67ac9911fsenorblanco@chromium.org    return SkColorFilterImageFilter::Create(filter, input);
448d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
458d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
468d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgstatic SkImageFilter* make_mode_blue(SkImageFilter* input = NULL) {
478d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    SkAutoTUnref<SkColorFilter> filter(
488d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        SkColorFilter::CreateModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mode));
49cd9f55989e680b7f52fa21766dde0ac67ac9911fsenorblanco@chromium.org    return SkColorFilterImageFilter::Create(filter, input);
508d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
518d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
528d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgclass ColorFilterImageFilterGM : public skiagm::GM {
538d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgpublic:
548d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    ColorFilterImageFilterGM () {}
558d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
568d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgprotected:
578d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
588d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    virtual SkString onShortName() {
598d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        return SkString("colorfilterimagefilter");
608d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    }
618d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
628d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    void drawClippedRect(SkCanvas* canvas, const SkRect& r, const SkPaint& paint, float outset = 0.0f) {
638d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->save();
648d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        SkRect clip(r);
654b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        clip.outset(outset, outset);
668d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->clipRect(clip);
678d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->drawRect(r, paint);
688d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->restore();
698d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    }
708d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
718d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    virtual SkISize onISize() { return SkISize::Make(400, 100); }
728d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
738d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    virtual void onDraw(SkCanvas* canvas) {
74f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com
758d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        SkRect r = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
768d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        SkPaint paint;
778d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        paint.setColor(SK_ColorRED);
788d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->save();
798d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        for (float brightness = -1.0f; brightness <= 1.0f; brightness += 0.2f) {
808d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> dim(make_brightness(-brightness));
818d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> bright(make_brightness(brightness, dim));
828d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(bright);
838d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint);
848d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
858d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
868d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->restore();
878d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->translate(0, FILTER_HEIGHT + MARGIN);
888d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
898d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.9f));
908d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> grayscale(make_grayscale(brightness));
918d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(grayscale);
928d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint);
938d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
948d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
958d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
968d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> grayscale(make_grayscale());
978d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.9f, grayscale));
988d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(brightness);
998d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint);
1008d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1018d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1028d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1038d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> blue(make_mode_blue());
1048d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> brightness(make_brightness(1.0f, blue));
1058d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(brightness);
1068d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint);
1078d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1088d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1098d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1108d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> brightness(make_brightness(1.0f));
1118d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> blue(make_mode_blue(brightness));
1128d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(blue);
1138d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint);
1148d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1158d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1168d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1178d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> blur(make_blur(3.0f));
1188d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.5f, blur));
1198d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(brightness);
1208d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint, 3);
1218d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1228d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1238d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    }
1248d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
1258d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgprivate:
1268d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    typedef GM INHERITED;
1278d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org};
1288d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
1298d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org//////////////////////////////////////////////////////////////////////////////
1308d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
1318d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgstatic skiagm::GM* MyFactory(void*) { return new ColorFilterImageFilterGM; }
1328d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgstatic skiagm::GMRegistry reg(MyFactory);
133