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"
905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org#include "SkMorphologyImageFilter.h"
1005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
118fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org#define WIDTH 700
128fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org#define HEIGHT 560
1305054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
1405054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgnamespace skiagm {
1505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
1605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgclass MorphologyGM : public GM {
1705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgpublic:
1805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    MorphologyGM() {
1905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        this->setBGColor(0xFF000000);
2005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        fOnce = false;
2105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    }
22ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
2305054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgprotected:
2405054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    virtual SkString onShortName() {
2505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        return SkString("morphology");
2605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    }
2705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
2805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    void make_bitmap() {
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);
34992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        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);
3905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        canvas.drawText(str1, strlen(str1), 10, 55, paint);
4005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        canvas.drawText(str2, strlen(str2), 10, 110, paint);
4105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    }
4205054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
4305054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    virtual SkISize onISize() {
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
5605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    virtual void onDraw(SkCanvas* canvas) {
5705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        if (!fOnce) {
5805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org            make_bitmap();
5905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org            fOnce = true;
6005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        }
6105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        struct {
6256dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org            int fWidth, fHeight;
6305054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org            int fRadiusX, fRadiusY;
6405054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        } samples[] = {
6556dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org            { 140, 140,   0,   0 },
6656dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org            { 140, 140,   0,   2 },
6756dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org            { 140, 140,   2,   0 },
6856dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org            { 140, 140,   2,   2 },
6956dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org            {  24,  24,  25,  25 },
7005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        };
7105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        SkPaint paint;
72b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org        SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(25, 20, 100, 80));
738fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org
748fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org        for (unsigned j = 0; j < 4; ++j) {
7556dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org            for (unsigned i = 0; i < SK_ARRAY_COUNT(samples); ++i) {
76b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org                const SkImageFilter::CropRect* cr = j & 0x02 ? &cropRect : NULL;
778fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org                if (j & 0x01) {
78cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                    paint.setImageFilter(SkErodeImageFilter::Create(
7956dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org                        samples[i].fRadiusX,
808fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org                        samples[i].fRadiusY,
818fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org                        NULL,
828fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org                        cr))->unref();
8356dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org                } else {
84cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                    paint.setImageFilter(SkDilateImageFilter::Create(
8556dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org                        samples[i].fRadiusX,
868fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org                        samples[i].fRadiusY,
878fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org                        NULL,
888fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org                        cr))->unref();
8956dd630c41d662bcf2a3f08100f2c6accda05ba9senorblanco@chromium.org                }
908fcad9879173d627ee8638c52709d924034e34cesenorblanco@chromium.org                drawClippedBitmap(canvas, paint, i * 140, j * 140);
9105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org            }
9205054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org        }
9305054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    }
94ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
9505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgprivate:
9605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    typedef GM INHERITED;
9705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    SkBitmap fBitmap;
9805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    bool fOnce;
9905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org};
10005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
10105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org//////////////////////////////////////////////////////////////////////////////
10205054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
10305054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgstatic GM* MyFactory(void*) { return new MorphologyGM; }
10405054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgstatic GMRegistry reg(MyFactory);
10505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
10605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org}
107