Flutter Engine
The Flutter Engine
bitmaprect.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2011 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"
16#include "include/core/SkRect.h"
19#include "include/core/SkSize.h"
25#include "tools/GpuToolUtils.h"
26#include "tools/ToolUtils.h"
27
28#include <cstddef>
29#include <iterator>
30
31static sk_sp<SkImage> make_image(SkCanvas* destCanvas) {
33 auto tmpCanvas = surf->getCanvas();
34
35 tmpCanvas->drawColor(SK_ColorRED);
37 paint.setAntiAlias(true);
38 const SkPoint pts[] = { { 0, 0 }, { 64, 64 } };
40 paint.setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkTileMode::kClamp));
41 tmpCanvas->drawCircle(32, 32, 32, paint);
42
43 return ToolUtils::MakeTextureImage(destCanvas, surf->makeImageSnapshot());
44}
45
47 bool fUseIRect;
48public:
49 DrawBitmapRect2(bool useIRect) : fUseIRect(useIRect) {
50 }
51
52protected:
53 SkString getName() const override {
54 SkString str;
55 str.printf("bitmaprect_%s", fUseIRect ? "i" : "s");
56 return str;
57 }
58
59 SkISize getISize() override { return SkISize::Make(640, 480); }
60
61 void onDraw(SkCanvas* canvas) override {
62 canvas->drawColor(0xFFCCCCCC);
63
64 const SkIRect src[] = {
65 { 0, 0, 32, 32 },
66 { 0, 0, 80, 80 },
67 { 32, 32, 96, 96 },
68 { -32, -32, 32, 32, }
69 };
70
74
75 auto image = make_image(canvas);
76
77 SkRect dstR = { 0, 200, 128, 380 };
78
79 canvas->translate(16, 40);
80 for (size_t i = 0; i < std::size(src); i++) {
81 SkRect srcR;
82 srcR.set(src[i]);
83
84 canvas->drawImage(image, 0, 0, sampling, &paint);
85 if (!fUseIRect) {
86 canvas->drawImageRect(image.get(), srcR, dstR, sampling, &paint,
88 } else {
89 canvas->drawImageRect(image.get(), SkRect::Make(src[i]), dstR, sampling, &paint,
91 }
92
93 canvas->drawRect(dstR, paint);
94 canvas->drawRect(srcR, paint);
95
96 canvas->translate(160, 0);
97 }
98 }
99
100private:
101 using INHERITED = skiagm::GM;
102};
103
104//////////////////////////////////////////////////////////////////////////////
105
107 const int xSize = 3;
108 const int ySize = 3;
109
110 const SkColor textureData[xSize][ySize] = {
114 };
115
116 bitmap->allocN32Pixels(xSize, ySize, true);
117 SkCanvas canvas(*bitmap);
119
120 for (int y = 0; y < ySize; y++) {
121 for (int x = 0; x < xSize; x++) {
122 paint.setColor(textureData[x][y]);
123 canvas.drawIRect(SkIRect::MakeXYWH(x, y, 1, 1), paint);
124 }
125 }
126}
127
128// This GM attempts to make visible any issues drawBitmapRect may have
129// with partial source rects. In this case the eight pixels on the border
130// should be half the width/height of the central pixel, i.e.:
131// __|____|__
132// | |
133// __|____|__
134// | |
136public:
139 }
140
141protected:
142 SkString getName() const override {
143 SkString str;
144 str.printf("3x3bitmaprect");
145 return str;
146 }
147
148 SkISize getISize() override { return SkISize::Make(640, 480); }
149
150 void onDraw(SkCanvas* canvas) override {
151
154
155 SkRect srcR = { 0.5f, 0.5f, 2.5f, 2.5f };
156 SkRect dstR = { 100, 100, 300, 200 };
157
158 canvas->drawImageRect(ToolUtils::MakeTextureImage(canvas, bitmap.asImage()),
159 srcR, dstR, SkSamplingOptions(),
161 }
162
163private:
164 using INHERITED = skiagm::GM;
165};
166
167//////////////////////////////////////////////////////////////////////////////
169
170 constexpr int gXSize = 4096;
171 constexpr int gYSize = 4096;
172 constexpr int gBorderWidth = 10;
173
175 bitmap.allocN32Pixels(gXSize, gYSize);
176 for (int y = 0; y < gYSize; ++y) {
177 for (int x = 0; x < gXSize; ++x) {
178 if (x <= gBorderWidth || x >= gXSize-gBorderWidth ||
179 y <= gBorderWidth || y >= gYSize-gBorderWidth) {
180 *bitmap.getAddr32(x, y) = SkPreMultiplyColor(0x88FFFFFF);
181 } else {
182 *bitmap.getAddr32(x, y) = SkPreMultiplyColor(0x88FF0000);
183 }
184 }
185 }
186 bitmap.setImmutable();
187 return ToolUtils::MakeTextureImage(canvas, bitmap.asImage());
188}
189
190// This GM attempts to reveal any issues we may have when the GPU has to
191// break up a large texture in order to draw it. The XOR transfer mode will
192// create stripes in the image if there is imprecision in the destination
193// tile placement.
195 bool fUseIRect;
196 sk_sp<SkImage> fBigImage;
197
198public:
199 DrawBitmapRect4(bool useIRect) : fUseIRect(useIRect) {
200 this->setBGColor(0x88444444);
201 }
202
203protected:
204 SkString getName() const override {
205 SkString str;
206 str.printf("bigbitmaprect_%s", fUseIRect ? "i" : "s");
207 return str;
208 }
209
210 SkISize getISize() override { return SkISize::Make(640, 480); }
211
212 void onDraw(SkCanvas* canvas) override {
213 if (!fBigImage) {
214 fBigImage = make_big_bitmap(canvas);
215 }
216
218 paint.setAlpha(128);
219 paint.setBlendMode(SkBlendMode::kXor);
221
222 SkRect srcR1 = { 0.0f, 0.0f, 4096.0f, 2040.0f };
223 SkRect dstR1 = { 10.1f, 10.1f, 629.9f, 400.9f };
224
225 SkRect srcR2 = { 4085.0f, 10.0f, 4087.0f, 12.0f };
226 SkRect dstR2 = { 10, 410, 30, 430 };
227
228 if (!fUseIRect) {
229 canvas->drawImageRect(fBigImage, srcR1, dstR1, sampling, &paint,
231 canvas->drawImageRect(fBigImage, srcR2, dstR2, sampling, &paint,
233 } else {
234 canvas->drawImageRect(fBigImage, SkRect::Make(srcR1.roundOut()), dstR1, sampling,
236 canvas->drawImageRect(fBigImage, SkRect::Make(srcR2.roundOut()), dstR2, sampling,
238 }
239 }
240
241private:
242 using INHERITED = skiagm::GM;
243};
244
246 SkBitmap fBM;
247
248public:
250
251protected:
252 SkString getName() const override {
253 SkString str;
254 str.printf("bitmaprect_rounding");
255 return str;
256 }
257
258 SkISize getISize() override { return SkISize::Make(640, 480); }
259
260 void onOnceBeforeDraw() override {
261 fBM.allocN32Pixels(10, 10);
263 }
264
265 // This choice of coordinates and matrix land the bottom edge of the clip (and bitmap dst)
266 // at exactly 1/2 pixel boundary. However, drawBitmapRect may lose precision along the way.
267 // If it does, we may see a red-line at the bottom, instead of the bitmap exactly matching
268 // the clip (in which case we should see all blue).
269 // The correct image should be all blue.
270 void onDraw(SkCanvas* canvas) override {
272 paint.setColor(SK_ColorRED);
273
274 const SkRect r = SkRect::MakeXYWH(1, 1, 110, 114);
275 canvas->scale(0.9f, 0.9f);
276
277 // the drawRect shows the same problem as clipRect(r) followed by drawcolor(red)
278 canvas->drawRect(r, paint);
279 canvas->drawImageRect(fBM.asImage(), r, SkSamplingOptions());
280 }
281
282private:
283 using INHERITED = skiagm::GM;
284};
285DEF_GM( return new BitmapRectRounding; )
286
287//////////////////////////////////////////////////////////////////////////////
288
289DEF_GM( return new DrawBitmapRect2(false); )
290DEF_GM( return new DrawBitmapRect2(true); )
291DEF_GM( return new DrawBitmapRect3(); )
292
293#ifndef SK_BUILD_FOR_ANDROID
294DEF_GM( return new DrawBitmapRect4(false); )
295DEF_GM( return new DrawBitmapRect4(true); )
296#endif
@ kXor
r = s*(1-da) + d*(1-sa)
constexpr SkColor SK_ColorYELLOW
Definition: SkColor.h:139
constexpr SkColor SK_ColorMAGENTA
Definition: SkColor.h:147
SK_API SkPMColor SkPreMultiplyColor(SkColor c)
Definition: SkColor.cpp:21
uint32_t SkColor
Definition: SkColor.h:37
constexpr SkColor SK_ColorCYAN
Definition: SkColor.h:143
constexpr SkColor SK_ColorGRAY
Definition: SkColor.h:113
constexpr SkColor SK_ColorBLUE
Definition: SkColor.h:135
constexpr SkColor SK_ColorRED
Definition: SkColor.h:126
constexpr SkColor SK_ColorBLACK
Definition: SkColor.h:103
constexpr SkColor SK_ColorGREEN
Definition: SkColor.h:131
constexpr SkColor SK_ColorWHITE
Definition: SkColor.h:122
static void make_3x3_bitmap(SkBitmap *bitmap)
Definition: bitmaprect.cpp:106
static sk_sp< SkImage > make_big_bitmap(SkCanvas *canvas)
Definition: bitmaprect.cpp:168
static sk_sp< SkImage > make_image(SkCanvas *destCanvas)
Definition: bitmaprect.cpp:31
SkISize getISize() override
Definition: bitmaprect.cpp:258
SkString getName() const override
Definition: bitmaprect.cpp:252
void onDraw(SkCanvas *canvas) override
Definition: bitmaprect.cpp:270
void onOnceBeforeDraw() override
Definition: bitmaprect.cpp:260
SkISize getISize() override
Definition: bitmaprect.cpp:59
void onDraw(SkCanvas *canvas) override
Definition: bitmaprect.cpp:61
SkString getName() const override
Definition: bitmaprect.cpp:53
DrawBitmapRect2(bool useIRect)
Definition: bitmaprect.cpp:49
SkString getName() const override
Definition: bitmaprect.cpp:142
SkISize getISize() override
Definition: bitmaprect.cpp:148
void onDraw(SkCanvas *canvas) override
Definition: bitmaprect.cpp:150
SkString getName() const override
Definition: bitmaprect.cpp:204
SkISize getISize() override
Definition: bitmaprect.cpp:210
DrawBitmapRect4(bool useIRect)
Definition: bitmaprect.cpp:199
void onDraw(SkCanvas *canvas) override
Definition: bitmaprect.cpp:212
sk_sp< SkImage > asImage() const
Definition: SkBitmap.cpp:645
void allocN32Pixels(int width, int height, bool isOpaque=false)
Definition: SkBitmap.cpp:232
void eraseColor(SkColor4f) const
Definition: SkBitmap.cpp:442
void drawRect(const SkRect &rect, const SkPaint &paint)
Definition: SkCanvas.cpp:1673
void translate(SkScalar dx, SkScalar dy)
Definition: SkCanvas.cpp:1278
void drawColor(SkColor color, SkBlendMode mode=SkBlendMode::kSrcOver)
Definition: SkCanvas.h:1182
@ kStrict_SrcRectConstraint
sample only inside bounds; slower
Definition: SkCanvas.h:1542
void drawIRect(const SkIRect &rect, const SkPaint &paint)
Definition: SkCanvas.h:1358
void drawImageRect(const SkImage *, const SkRect &src, const SkRect &dst, const SkSamplingOptions &, const SkPaint *, SrcRectConstraint)
Definition: SkCanvas.cpp:2333
void scale(SkScalar sx, SkScalar sy)
Definition: SkCanvas.cpp:1289
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)
@ kStroke_Style
set to stroke geometry
Definition: SkPaint.h:194
void printf(const char format[],...) SK_PRINTF_LIKE(2
Definition: SkString.cpp:534
T * get() const
Definition: SkRefCnt.h:303
Definition: gm.h:110
void setBGColor(SkColor)
Definition: gm.cpp:159
const Paint & paint
Definition: color_source.cc:38
#define DEF_GM(CODE)
Definition: gm.h:40
double y
double x
sk_sp< const SkImage > image
Definition: SkRecords.h:269
PODArray< SkColor > colors
Definition: SkRecords.h:276
SkSamplingOptions sampling
Definition: SkRecords.h:337
SK_API sk_sp< SkSurface > Raster(const SkImageInfo &imageInfo, size_t rowBytes, const SkSurfaceProps *surfaceProps)
sk_sp< SkImage > MakeTextureImage(SkCanvas *canvas, sk_sp< SkImage > orig)
Definition: bitmap.py:1
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
Definition: switches.h:259
SkSamplingOptions(SkFilterMode::kLinear))
Definition: SkRect.h:32
static constexpr SkIRect MakeXYWH(int32_t x, int32_t y, int32_t w, int32_t h)
Definition: SkRect.h:104
Definition: SkSize.h:16
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
static constexpr SkRect MakeXYWH(float x, float y, float w, float h)
Definition: SkRect.h:659
void roundOut(SkIRect *dst) const
Definition: SkRect.h:1241
void set(const SkIRect &src)
Definition: SkRect.h:849