105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org/*
205054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org * Copyright 2012 Google Inc.
305054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org *
405054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org * found in the LICENSE file.
605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org */
705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org#include "gm.h"
933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
1005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org#include "SkMorphologyImageFilter.h"
1105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
128fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org#define WIDTH 700
138fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org#define HEIGHT 560
1405054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
1505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgnamespace skiagm {
1605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
1705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgclass MorphologyGM : public GM {
1805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgpublic:
1905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    MorphologyGM() {
2005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        this->setBGColor(0xFF000000);
2105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    }
22ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
2305054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgprotected:
24f299e7105435829c47e94f4cf6e408cad675bc77robertphillips    SkString onShortName() override {
2505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        return SkString("morphology");
2605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    }
2705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
28f299e7105435829c47e94f4cf6e408cad675bc77robertphillips    void onOnceBeforeDraw() override {
29eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        fBitmap.allocN32Pixels(135, 135);
30c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        SkCanvas canvas(fBitmap);
3105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        canvas.clear(0x0);
3205054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        SkPaint paint;
3305054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        paint.setAntiAlias(true);
341818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark        sk_tool_utils::set_portable_typeface(&paint);
3505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        const char* str1 = "ABC";
3605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        const char* str2 = "XYZ";
3705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        paint.setColor(0xFFFFFFFF);
3805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        paint.setTextSize(64);
392a475eae622adc1e8fa29206be1eaf862c23548eCary Clark        canvas.drawString(str1, 10, 55, paint);
402a475eae622adc1e8fa29206be1eaf862c23548eCary Clark        canvas.drawString(str2, 10, 110, paint);
4105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    }
4205054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
43f299e7105435829c47e94f4cf6e408cad675bc77robertphillips    SkISize onISize() override {
44f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(WIDTH, HEIGHT);
4505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    }
468fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org
478fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org    void drawClippedBitmap(SkCanvas* canvas, const SkPaint& paint, int x, int y) {
488fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org        canvas->save();
498fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org        canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
508fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org        canvas->clipRect(SkRect::MakeWH(
518fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org          SkIntToScalar(fBitmap.width()), SkIntToScalar(fBitmap.height())));
528fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org        canvas->drawBitmap(fBitmap, 0, 0, &paint);
538fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org        canvas->restore();
548fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org    }
558fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org
56f299e7105435829c47e94f4cf6e408cad675bc77robertphillips    void onDraw(SkCanvas* canvas) override {
5705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        struct {
5856dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org            int fWidth, fHeight;
5905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org            int fRadiusX, fRadiusY;
6005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        } samples[] = {
6156dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org            { 140, 140,   0,   0 },
6256dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org            { 140, 140,   0,   2 },
6356dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org            { 140, 140,   2,   0 },
6456dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org            { 140, 140,   2,   2 },
6556dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org            {  24,  24,  25,  25 },
6605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        };
6705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        SkPaint paint;
68b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org        SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(25, 20, 100, 80));
698fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org
708fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org        for (unsigned j = 0; j < 4; ++j) {
7156dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org            for (unsigned i = 0; i < SK_ARRAY_COUNT(samples); ++i) {
7296fcdcc219d2a0d3579719b84b28bede76efba64halcanary                const SkImageFilter::CropRect* cr = j & 0x02 ? &cropRect : nullptr;
738fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org                if (j & 0x01) {
74fc11b0afe0ca922a42767d4a656ed640008da1bbrobertphillips                    paint.setImageFilter(SkErodeImageFilter::Make(samples[i].fRadiusX,
75fc11b0afe0ca922a42767d4a656ed640008da1bbrobertphillips                                                                  samples[i].fRadiusY,
76fc11b0afe0ca922a42767d4a656ed640008da1bbrobertphillips                                                                  nullptr,
77fc11b0afe0ca922a42767d4a656ed640008da1bbrobertphillips                                                                  cr));
7856dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org                } else {
79fc11b0afe0ca922a42767d4a656ed640008da1bbrobertphillips                    paint.setImageFilter(SkDilateImageFilter::Make(samples[i].fRadiusX,
80fc11b0afe0ca922a42767d4a656ed640008da1bbrobertphillips                                                                   samples[i].fRadiusY,
81fc11b0afe0ca922a42767d4a656ed640008da1bbrobertphillips                                                                   nullptr,
82fc11b0afe0ca922a42767d4a656ed640008da1bbrobertphillips                                                                   cr));
8356dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org                }
84f299e7105435829c47e94f4cf6e408cad675bc77robertphillips                this->drawClippedBitmap(canvas, paint, i * 140, j * 140);
8505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org            }
8605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        }
8705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    }
88ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
8905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgprivate:
9005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    SkBitmap fBitmap;
91f299e7105435829c47e94f4cf6e408cad675bc77robertphillips
92f299e7105435829c47e94f4cf6e408cad675bc77robertphillips    typedef GM INHERITED;
9305054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org};
9405054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
9505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org//////////////////////////////////////////////////////////////////////////////
9605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
97f299e7105435829c47e94f4cf6e408cad675bc77robertphillipsDEF_GM(return new MorphologyGM;)
9805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
9905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org}
100