1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2012 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFont.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageFilter.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkImageFilters.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h" 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker #define WIDTH 700 25*c8dee2aaSAndroid Build Coastguard Worker #define HEIGHT 560 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm { 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker class MorphologyGM : public GM { 30*c8dee2aaSAndroid Build Coastguard Worker public: MorphologyGM()31*c8dee2aaSAndroid Build Coastguard Worker MorphologyGM() { 32*c8dee2aaSAndroid Build Coastguard Worker this->setBGColor(0xFF000000); 33*c8dee2aaSAndroid Build Coastguard Worker } 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker protected: getName() const36*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("morphology"); } 37*c8dee2aaSAndroid Build Coastguard Worker onOnceBeforeDraw()38*c8dee2aaSAndroid Build Coastguard Worker void onOnceBeforeDraw() override { 39*c8dee2aaSAndroid Build Coastguard Worker auto surf = SkSurfaces::Raster(SkImageInfo::MakeN32Premul(135, 135)); 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker SkFont font(ToolUtils::DefaultPortableTypeface(), 64.0f); 42*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 43*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(0xFFFFFFFF); 44*c8dee2aaSAndroid Build Coastguard Worker surf->getCanvas()->drawString("ABC", 10, 55, font, paint); 45*c8dee2aaSAndroid Build Coastguard Worker surf->getCanvas()->drawString("XYZ", 10, 110, font, paint); 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker fImage = surf->makeImageSnapshot(); 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker getISize()50*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(WIDTH, HEIGHT); } 51*c8dee2aaSAndroid Build Coastguard Worker drawClippedBitmap(SkCanvas * canvas,const SkPaint & paint,int x,int y)52*c8dee2aaSAndroid Build Coastguard Worker void drawClippedBitmap(SkCanvas* canvas, const SkPaint& paint, int x, int y) { 53*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 54*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); 55*c8dee2aaSAndroid Build Coastguard Worker canvas->clipIRect(fImage->bounds()); 56*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(fImage, 0, 0, SkSamplingOptions(), &paint); 57*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 58*c8dee2aaSAndroid Build Coastguard Worker } 59*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)60*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 61*c8dee2aaSAndroid Build Coastguard Worker struct { 62*c8dee2aaSAndroid Build Coastguard Worker int fWidth, fHeight; 63*c8dee2aaSAndroid Build Coastguard Worker int fRadiusX, fRadiusY; 64*c8dee2aaSAndroid Build Coastguard Worker } samples[] = { 65*c8dee2aaSAndroid Build Coastguard Worker { 140, 140, 0, 0 }, 66*c8dee2aaSAndroid Build Coastguard Worker { 140, 140, 0, 2 }, 67*c8dee2aaSAndroid Build Coastguard Worker { 140, 140, 2, 0 }, 68*c8dee2aaSAndroid Build Coastguard Worker { 140, 140, 2, 2 }, 69*c8dee2aaSAndroid Build Coastguard Worker { 24, 24, 25, 25 }, 70*c8dee2aaSAndroid Build Coastguard Worker }; 71*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 72*c8dee2aaSAndroid Build Coastguard Worker SkIRect cropRect = SkIRect::MakeXYWH(25, 20, 100, 80); 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker for (unsigned j = 0; j < 4; ++j) { 75*c8dee2aaSAndroid Build Coastguard Worker for (unsigned i = 0; i < std::size(samples); ++i) { 76*c8dee2aaSAndroid Build Coastguard Worker const SkIRect* cr = j & 0x02 ? &cropRect : nullptr; 77*c8dee2aaSAndroid Build Coastguard Worker if (j & 0x01) { 78*c8dee2aaSAndroid Build Coastguard Worker paint.setImageFilter(SkImageFilters::Erode( 79*c8dee2aaSAndroid Build Coastguard Worker samples[i].fRadiusX, samples[i].fRadiusY, nullptr, cr)); 80*c8dee2aaSAndroid Build Coastguard Worker } else { 81*c8dee2aaSAndroid Build Coastguard Worker paint.setImageFilter(SkImageFilters::Dilate( 82*c8dee2aaSAndroid Build Coastguard Worker samples[i].fRadiusX, samples[i].fRadiusY, nullptr, cr)); 83*c8dee2aaSAndroid Build Coastguard Worker } 84*c8dee2aaSAndroid Build Coastguard Worker this->drawClippedBitmap(canvas, paint, i * 140, j * 140); 85*c8dee2aaSAndroid Build Coastguard Worker } 86*c8dee2aaSAndroid Build Coastguard Worker } 87*c8dee2aaSAndroid Build Coastguard Worker } 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker private: 90*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> fImage; 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GM; 93*c8dee2aaSAndroid Build Coastguard Worker }; 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////// 96*c8dee2aaSAndroid Build Coastguard Worker 97*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new MorphologyGM;) 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker } // namespace skiagm 100