14f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger/*
24f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger * Copyright 2012 Google Inc.
34f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger *
44f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
54f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger * found in the LICENSE file.
64f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger */
74f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
84f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "gm.h"
94f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "SkMorphologyImageFilter.h"
104f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
114f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#define WIDTH 640
124f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#define HEIGHT 480
134f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
144f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergernamespace skiagm {
154f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
164f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerclass MorphologyGM : public GM {
174f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerpublic:
184f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    MorphologyGM() {
194f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        this->setBGColor(0xFF000000);
204f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        fOnce = false;
214f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    }
224f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
234f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerprotected:
244f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    virtual SkString onShortName() {
254f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        return SkString("morphology");
264f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    }
274f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
284f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    void make_bitmap() {
294f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        fBitmap.setConfig(SkBitmap::kARGB_8888_Config, 135, 135);
304f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        fBitmap.allocPixels();
314f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        SkDevice device(fBitmap);
324f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        SkCanvas canvas(&device);
334f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        canvas.clear(0x0);
344f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        SkPaint paint;
354f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        paint.setAntiAlias(true);
364f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        const char* str1 = "ABC";
374f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        const char* str2 = "XYZ";
384f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        paint.setColor(0xFFFFFFFF);
394f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        paint.setTextSize(64);
404f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        canvas.drawText(str1, strlen(str1), 10, 55, paint);
414f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        canvas.drawText(str2, strlen(str2), 10, 110, paint);
424f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    }
434f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
444f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    virtual SkISize onISize() {
454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        return make_isize(WIDTH, HEIGHT);
464f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    }
474f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    virtual void onDraw(SkCanvas* canvas) {
484f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (!fOnce) {
494f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            make_bitmap();
504f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            fOnce = true;
514f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        }
524f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        struct {
534f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            int fRadiusX, fRadiusY;
544f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            bool erode;
554f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            SkScalar fX, fY;
564f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        } samples[] = {
574f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            { 0, 0, false, 0,   0 },
584f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            { 0, 2, false, 140, 0 },
594f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            { 2, 0, false, 280, 0 },
604f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            { 2, 2, false, 420, 0 },
614f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            { 0, 0, true,  0,   140 },
624f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            { 0, 2, true,  140, 140 },
634f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            { 2, 0, true,  280, 140 },
644f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            { 2, 2, true,  420, 140 },
654f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        };
664f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        const char* str = "The quick brown fox jumped over the lazy dog.";
674f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        SkPaint paint;
684f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        for (unsigned i = 0; i < SK_ARRAY_COUNT(samples); ++i) {
694f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            if (samples[i].erode) {
704f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                paint.setImageFilter(new SkErodeImageFilter(
714f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                    samples[i].fRadiusX,
724f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                    samples[i].fRadiusY))->unref();
734f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            } else {
744f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                paint.setImageFilter(new SkDilateImageFilter(
754f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                    samples[i].fRadiusX,
764f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                    samples[i].fRadiusY))->unref();
774f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            }
784f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            SkRect bounds = SkRect::MakeXYWH(samples[i].fX,
794f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                             samples[i].fY,
804f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                             140, 140);
814f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            canvas->saveLayer(&bounds, &paint);
824f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            canvas->drawBitmap(fBitmap, samples[i].fX, samples[i].fY);
834f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            canvas->restore();
844f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        }
854f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    }
864f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
874f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerprivate:
884f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    typedef GM INHERITED;
894f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    SkBitmap fBitmap;
904f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    bool fOnce;
914f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger};
924f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
934f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger//////////////////////////////////////////////////////////////////////////////
944f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
954f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerstatic GM* MyFactory(void*) { return new MorphologyGM; }
964f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerstatic GMRegistry reg(MyFactory);
974f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
984f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger}
99