blob: 61752b7ca6d65ea7a50307c700cfc32c90090f11 [file] [log] [blame]
senorblanco@chromium.org05054f12012-03-02 21:05:45 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkBitmap.h"
10#include "include/core/SkCanvas.h"
11#include "include/core/SkFont.h"
12#include "include/core/SkImageFilter.h"
13#include "include/core/SkPaint.h"
14#include "include/core/SkRect.h"
15#include "include/core/SkScalar.h"
16#include "include/core/SkSize.h"
17#include "include/core/SkString.h"
18#include "include/core/SkTypeface.h"
19#include "include/core/SkTypes.h"
Michael Ludwig898bbfa2019-08-02 15:21:23 -040020#include "include/effects/SkImageFilters.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050021#include "tools/ToolUtils.h"
Kevin Lubicke836c3a2023-10-20 06:55:35 -040022#include "tools/fonts/FontToolUtils.h"
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000023
senorblanco@chromium.org8fcad982013-09-17 13:41:43 +000024#define WIDTH 700
25#define HEIGHT 560
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000026
27namespace skiagm {
28
29class MorphologyGM : public GM {
30public:
31 MorphologyGM() {
32 this->setBGColor(0xFF000000);
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000033 }
rmistry@google.comae933ce2012-08-23 18:19:56 +000034
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000035protected:
Leandro Lovisolo24fa2112023-08-15 19:05:17 +000036 SkString getName() const override { return SkString("morphology"); }
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000037
robertphillipsf299e712016-03-25 04:49:22 -070038 void onOnceBeforeDraw() override {
Kevin Lubick5c93acf2023-05-09 12:11:43 -040039 auto surf = SkSurfaces::Raster(SkImageInfo::MakeN32Premul(135, 135));
Hal Canarydf2d27e2019-01-08 09:38:02 -050040
Kevin Lubicke836c3a2023-10-20 06:55:35 -040041 SkFont font(ToolUtils::DefaultPortableTypeface(), 64.0f);
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000042 SkPaint paint;
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000043 paint.setColor(0xFFFFFFFF);
Mike Reed568f0ae2021-01-24 08:57:23 -050044 surf->getCanvas()->drawString("ABC", 10, 55, font, paint);
45 surf->getCanvas()->drawString("XYZ", 10, 110, font, paint);
46
47 fImage = surf->makeImageSnapshot();
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000048 }
49
Leandro Lovisolo8f023882023-08-15 21:13:52 +000050 SkISize getISize() override { return SkISize::Make(WIDTH, HEIGHT); }
senorblanco@chromium.org8fcad982013-09-17 13:41:43 +000051
52 void drawClippedBitmap(SkCanvas* canvas, const SkPaint& paint, int x, int y) {
53 canvas->save();
54 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
Mike Reed568f0ae2021-01-24 08:57:23 -050055 canvas->clipIRect(fImage->bounds());
56 canvas->drawImage(fImage, 0, 0, SkSamplingOptions(), &paint);
senorblanco@chromium.org8fcad982013-09-17 13:41:43 +000057 canvas->restore();
58 }
59
robertphillipsf299e712016-03-25 04:49:22 -070060 void onDraw(SkCanvas* canvas) override {
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000061 struct {
senorblanco@chromium.org56dd6302012-04-10 17:25:44 +000062 int fWidth, fHeight;
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000063 int fRadiusX, fRadiusY;
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000064 } samples[] = {
senorblanco@chromium.org56dd6302012-04-10 17:25:44 +000065 { 140, 140, 0, 0 },
66 { 140, 140, 0, 2 },
67 { 140, 140, 2, 0 },
68 { 140, 140, 2, 2 },
69 { 24, 24, 25, 25 },
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000070 };
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000071 SkPaint paint;
Michael Ludwig898bbfa2019-08-02 15:21:23 -040072 SkIRect cropRect = SkIRect::MakeXYWH(25, 20, 100, 80);
senorblanco@chromium.org8fcad982013-09-17 13:41:43 +000073
74 for (unsigned j = 0; j < 4; ++j) {
Herb Derbyc37b3862022-06-21 09:49:17 -040075 for (unsigned i = 0; i < std::size(samples); ++i) {
Michael Ludwig898bbfa2019-08-02 15:21:23 -040076 const SkIRect* cr = j & 0x02 ? &cropRect : nullptr;
senorblanco@chromium.org8fcad982013-09-17 13:41:43 +000077 if (j & 0x01) {
Michael Ludwig898bbfa2019-08-02 15:21:23 -040078 paint.setImageFilter(SkImageFilters::Erode(
79 samples[i].fRadiusX, samples[i].fRadiusY, nullptr, cr));
senorblanco@chromium.org56dd6302012-04-10 17:25:44 +000080 } else {
Michael Ludwigbf8439d2019-08-05 10:24:49 -040081 paint.setImageFilter(SkImageFilters::Dilate(
Michael Ludwig898bbfa2019-08-02 15:21:23 -040082 samples[i].fRadiusX, samples[i].fRadiusY, nullptr, cr));
senorblanco@chromium.org56dd6302012-04-10 17:25:44 +000083 }
robertphillipsf299e712016-03-25 04:49:22 -070084 this->drawClippedBitmap(canvas, paint, i * 140, j * 140);
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000085 }
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000086 }
87 }
rmistry@google.comae933ce2012-08-23 18:19:56 +000088
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000089private:
Mike Reed568f0ae2021-01-24 08:57:23 -050090 sk_sp<SkImage> fImage;
robertphillipsf299e712016-03-25 04:49:22 -070091
John Stiles7571f9e2020-09-02 22:42:33 -040092 using INHERITED = GM;
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000093};
94
95//////////////////////////////////////////////////////////////////////////////
96
robertphillipsf299e712016-03-25 04:49:22 -070097DEF_GM(return new MorphologyGM;)
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000098
John Stilesa6841be2020-08-06 14:11:56 -040099} // namespace skiagm