15faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org/*
25faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * Copyright 2012 Google Inc.
35faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org *
45faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
55faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * found in the LICENSE file.
65faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org */
75faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
85faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#include "gm.h"
93bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org#include "SkColor.h"
105faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#include "SkMatrixConvolutionImageFilter.h"
113bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org#include "SkGradientShader.h"
125faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
135faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgnamespace skiagm {
145faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
155faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgclass MatrixConvolutionGM : public GM {
165faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgpublic:
175faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    MatrixConvolutionGM() : fInitialized(false) {
185faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        this->setBGColor(0x00000000);
195faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    }
205faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
215faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgprotected:
22a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
23a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
24a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
25a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
265faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    virtual SkString onShortName() {
275faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        return SkString("matrixconvolution");
285faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    }
295faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
305faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    void make_bitmap() {
31eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        fBitmap.allocN32Pixels(80, 80);
32c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        SkCanvas canvas(fBitmap);
335faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        canvas.clear(0x00000000);
345faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        SkPaint paint;
355faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        paint.setAntiAlias(true);
365faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        paint.setColor(0xFFFFFFFF);
375faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        paint.setTextSize(SkIntToScalar(180));
383bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org        SkPoint pts[2] = { SkPoint::Make(0, 0),
393bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org                           SkPoint::Make(0, SkIntToScalar(80)) };
403bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org        SkColor colors[2] = { 0xFFFFFFFF, 0x40404040 };
413bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org        SkScalar pos[2] = { 0, SkIntToScalar(80) };
423bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org        paint.setShader(SkGradientShader::CreateLinear(
433bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org            pts, colors, pos, 2, SkShader::kClamp_TileMode))->unref();
445faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        const char* str = "e";
455faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        canvas.drawText(str, strlen(str), SkIntToScalar(-10), SkIntToScalar(80), paint);
465faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    }
475faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
485faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    virtual SkISize onISize() {
49f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(500, 300);
505faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    }
515faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
5284cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org    void draw(SkCanvas* canvas, int x, int y, const SkIPoint& kernelOffset,
537938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org              SkMatrixConvolutionImageFilter::TileMode tileMode, bool convolveAlpha,
547938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org              const SkImageFilter::CropRect* cropRect = NULL) {
555faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        SkScalar kernel[9] = {
565faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org            SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1),
575faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org            SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1),
585faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org            SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1),
595faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        };
605faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        SkISize kernelSize = SkISize::Make(3, 3);
614b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        SkScalar gain = 0.3f, bias = SkIntToScalar(100);
625faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        SkPaint paint;
637938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org        SkAutoTUnref<SkImageFilter> filter(
64cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkMatrixConvolutionImageFilter::Create(kernelSize,
65cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                                   kernel,
66cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                                   gain,
67cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                                   bias,
6884cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org                                                   kernelOffset,
69cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                                   tileMode,
70cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                                   convolveAlpha,
71cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                                   NULL,
72cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                                   cropRect));
735faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        paint.setImageFilter(filter);
74ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org        canvas->save();
757938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org        canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
767938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org        canvas->clipRect(SkRect::MakeWH(SkIntToScalar(fBitmap.width()),
777938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org                                        SkIntToScalar(fBitmap.height())));
787938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org        canvas->drawBitmap(fBitmap, 0, 0, &paint);
79ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org        canvas->restore();
805faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    }
815faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
827938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org    typedef SkMatrixConvolutionImageFilter MCIF;
837938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org
845faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    virtual void onDraw(SkCanvas* canvas) {
855faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        if (!fInitialized) {
865faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org            make_bitmap();
875faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org            fInitialized = true;
885faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        }
895faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        canvas->clear(0x00000000);
9084cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org        SkIPoint kernelOffset = SkIPoint::Make(1, 0);
913bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org        for (int x = 10; x < 310; x += 100) {
9284cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org            this->draw(canvas, x, 10, kernelOffset, MCIF::kClamp_TileMode, true);
9384cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org            this->draw(canvas, x, 110, kernelOffset, MCIF::kClampToBlack_TileMode, true);
9484cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org            this->draw(canvas, x, 210, kernelOffset, MCIF::kRepeat_TileMode, true);
9584cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org            kernelOffset.fY++;
965faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        }
9784cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org        kernelOffset.fY = 1;
982a4223c783e35f1c6095c4736a9246884e51a48dsenorblanco@chromium.org        SkImageFilter::CropRect rect(SkRect::MakeXYWH(10, 5, 60, 60));
9984cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org        this->draw(canvas, 310, 10, kernelOffset, MCIF::kClamp_TileMode, true, &rect);
10084cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org        this->draw(canvas, 310, 110, kernelOffset, MCIF::kClampToBlack_TileMode, true, &rect);
10184cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org        this->draw(canvas, 310, 210, kernelOffset, MCIF::kRepeat_TileMode, true, &rect);
1027938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org
10384cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org        this->draw(canvas, 410, 10, kernelOffset, MCIF::kClamp_TileMode, false);
10484cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org        this->draw(canvas, 410, 110, kernelOffset, MCIF::kClampToBlack_TileMode, false);
10584cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org        this->draw(canvas, 410, 210, kernelOffset, MCIF::kRepeat_TileMode, false);
1065faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    }
1075faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1085faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgprivate:
1095faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    typedef GM INHERITED;
1105faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    SkBitmap fBitmap;
1115faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    bool fInitialized;
1125faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org};
1135faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1145faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org//////////////////////////////////////////////////////////////////////////////
1155faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1165faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgstatic GM* MyFactory(void*) { return new MatrixConvolutionGM; }
1175faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgstatic GMRegistry reg(MyFactory);
1185faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1195faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org}
120