Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
matrixconvolution.cpp
Go to the documentation of this file.
1/*
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
8#include "gm/gm.h"
12#include "include/core/SkFont.h"
16#include "include/core/SkRect.h"
19#include "include/core/SkSize.h"
25#include "src/gpu/BlurUtils.h"
26#include "tools/ToolUtils.h"
28
29#include <vector>
30
31namespace skiagm {
32
37
38class MatrixConvolutionGM : public GM {
39public:
40 MatrixConvolutionGM(SkColor colorOne, SkColor colorTwo, KernelFixture kernelFixture, const char* nameSuffix)
41 : fNameSuffix(nameSuffix),
42 fKernelFixture(kernelFixture) {
43 this->setBGColor(0x00000000);
44 fColors[0] = colorOne;
45 fColors[1] = colorTwo;
46 }
47
48protected:
49 SkString getName() const override { return SkStringPrintf("matrixconvolution%s", fNameSuffix); }
50
51 void makeBitmap() {
52 // Draw our bitmap in N32, so legacy devices get "premul" values they understand
55 paint.setColor(0xFFFFFFFF);
56 SkPoint pts[2] = { {0, 0},
57 {0, 80.0f} };
58 SkScalar pos[2] = { 0, 80.0f };
60 pts, fColors, pos, 2, SkTileMode::kClamp));
62 surf->getCanvas()->drawString("e", -10.0f, 80.0f, font, paint);
63 fImage = surf->makeImageSnapshot();
64 }
65
66 SkISize getISize() override { return SkISize::Make(500, 300); }
67
69 SkTileMode tileMode,
70 bool convolveAlpha) {
71 // Must provide a cropping geometry in order for 'tileMode' to be well defined.
72 SkIRect tileBoundary = fImage->bounds();
73 switch (fKernelFixture) {
75 // All 1s except center value, which is -7 (sum of 1).
76 std::vector<SkScalar> kernel(9, SkIntToScalar(1));
77 kernel[4] = SkIntToScalar(-7);
79 {3,3}, kernel.data(), /* gain */ 0.3f, /* bias */ SkIntToScalar(100),
80 kernelOffset, tileMode, convolveAlpha, nullptr, tileBoundary);
81 }
83 // This ensures the texture fallback path will be taken
84 static_assert(49 > skgpu::kMaxBlurSamples);
85 // All 1s except center value, which is -47 (sum of 1).
86 std::vector<SkScalar> kernel(49, SkIntToScalar(1));
87 kernel[24] = SkIntToScalar(-47);
89 {7,7}, kernel.data(), /* gain */ 0.3f, /* bias */ SkIntToScalar(100),
90 kernelOffset, tileMode, convolveAlpha, nullptr, tileBoundary);
91 }
92 default:
93 return nullptr;
94 }
95 }
96
97 void draw(SkCanvas* canvas, int x, int y, const SkIPoint& kernelOffset,
98 SkTileMode tileMode, bool convolveAlpha,
99 const SkIRect* cropRect = nullptr) {
101 auto filter = this->makeFilter(kernelOffset, tileMode, convolveAlpha);
102 if (cropRect) {
103 filter = SkImageFilters::Crop(SkRect::Make(*cropRect), std::move(filter));
104 }
105 paint.setImageFilter(std::move(filter));
106 canvas->save();
108 canvas->drawImage(fImage, 0, 0, {}, &paint);
109 canvas->restore();
110 }
111
112 void onOnceBeforeDraw() override {
113 this->makeBitmap();
114 }
115
116 void onDraw(SkCanvas* canvas) override {
117 canvas->clear(SK_ColorBLACK);
118 SkIPoint kernelOffset = SkIPoint::Make(1, 0);
119 for (int x = 10; x < 310; x += 100) {
120 this->draw(canvas, x, 10, kernelOffset, SkTileMode::kClamp, true);
121 this->draw(canvas, x, 110, kernelOffset, SkTileMode::kDecal, true);
122 this->draw(canvas, x, 210, kernelOffset, SkTileMode::kRepeat, true);
123 kernelOffset.fY++;
124 }
125 kernelOffset.fY = 1;
126 SkIRect smallRect = SkIRect::MakeXYWH(10, 5, 60, 60);
127 this->draw(canvas, 310, 10, kernelOffset, SkTileMode::kClamp, true, &smallRect);
128 this->draw(canvas, 310, 110, kernelOffset, SkTileMode::kDecal, true, &smallRect);
129 this->draw(canvas, 310, 210, kernelOffset, SkTileMode::kRepeat, true, &smallRect);
130
131 this->draw(canvas, 410, 10, kernelOffset, SkTileMode::kClamp, false);
132 this->draw(canvas, 410, 110, kernelOffset, SkTileMode::kDecal, false);
133 this->draw(canvas, 410, 210, kernelOffset, SkTileMode::kRepeat, false);
134 }
135
136private:
137 sk_sp<SkImage> fImage;
138 SkColor fColors[2];
139 const char* fNameSuffix;
140 KernelFixture fKernelFixture;
141
142 using INHERITED = GM;
143};
144
145//////////////////////////////////////////////////////////////////////////////
146
147DEF_GM(return new MatrixConvolutionGM(0xFFFFFFFF, 0x40404040, KernelFixture::kBasic_KernelFixture, "");)
148DEF_GM(return new MatrixConvolutionGM(0xFFFF0000, 0xFF00FF00, KernelFixture::kBasic_KernelFixture, "_color");)
149DEF_GM(return new MatrixConvolutionGM(0xFFFFFFFF, 0x40404040, KernelFixture::kLarge_KernelFixture, "_big");)
150DEF_GM(return new MatrixConvolutionGM(0xFFFF0000, 0xFF00FF00, KernelFixture::kLarge_KernelFixture, "_big_color");)
151
152} // namespace skiagm
SkPoint pos
uint32_t SkColor
Definition SkColor.h:37
constexpr SkColor SK_ColorBLACK
Definition SkColor.h:103
#define SkIntToScalar(x)
Definition SkScalar.h:57
SK_API SkString static SkString SkStringPrintf()
Definition SkString.h:287
SkTileMode
Definition SkTileMode.h:13
void restore()
Definition SkCanvas.cpp:465
void translate(SkScalar dx, SkScalar dy)
void clear(SkColor color)
Definition SkCanvas.h:1199
int save()
Definition SkCanvas.cpp:451
void drawImage(const SkImage *image, SkScalar left, SkScalar top)
Definition SkCanvas.h:1528
static sk_sp< SkShader > MakeLinear(const SkPoint pts[2], const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
static sk_sp< SkImageFilter > MatrixConvolution(const SkISize &kernelSize, const SkScalar kernel[], SkScalar gain, SkScalar bias, const SkIPoint &kernelOffset, SkTileMode tileMode, bool convolveAlpha, sk_sp< SkImageFilter > input, const CropRect &cropRect={})
static sk_sp< SkImageFilter > Crop(const SkRect &rect, SkTileMode tileMode, sk_sp< SkImageFilter > input)
SkIRect bounds() const
Definition SkImage.h:303
void setBGColor(SkColor)
Definition gm.cpp:159
void draw(SkCanvas *canvas, int x, int y, const SkIPoint &kernelOffset, SkTileMode tileMode, bool convolveAlpha, const SkIRect *cropRect=nullptr)
void onDraw(SkCanvas *canvas) override
SkString getName() const override
MatrixConvolutionGM(SkColor colorOne, SkColor colorTwo, KernelFixture kernelFixture, const char *nameSuffix)
sk_sp< SkImageFilter > makeFilter(const SkIPoint &kernelOffset, SkTileMode tileMode, bool convolveAlpha)
const Paint & paint
float SkScalar
Definition extension.cpp:12
#define DEF_GM(CODE)
Definition gm.h:40
double y
double x
SK_API sk_sp< SkSurface > Raster(const SkImageInfo &imageInfo, size_t rowBytes, const SkSurfaceProps *surfaceProps)
sk_sp< SkTypeface > DefaultPortableTypeface()
static constexpr int kMaxBlurSamples
Definition BlurUtils.h:52
int32_t fY
y-axis value
static constexpr SkIPoint Make(int32_t x, int32_t y)
static constexpr SkIRect MakeXYWH(int32_t x, int32_t y, int32_t w, int32_t h)
Definition SkRect.h:104
static constexpr SkISize Make(int32_t w, int32_t h)
Definition SkSize.h:20
static SkImageInfo MakeN32Premul(int width, int height)
static SkRect Make(const SkISize &size)
Definition SkRect.h:669