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