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