Flutter Engine
The Flutter Engine
dstreadshuffle.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2013 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"
13#include "include/core/SkFont.h"
19#include "include/core/SkRect.h"
22#include "include/core/SkSize.h"
27#include "src/base/SkRandom.h"
28#include "tools/ToolUtils.h"
30
31namespace skiagm {
32
33/**
34 * Renders overlapping shapes with colorburn against a checkerboard.
35 */
36class DstReadShuffle : public GM {
37public:
38 DstReadShuffle() { this->setBGColor(kBackground); }
39
40protected:
41 enum ShapeType {
49 };
50
51 SkString getName() const override { return SkString("dstreadshuffle"); }
52
53 SkISize getISize() override { return SkISize::Make(530, 680); }
54
56 const SkRect kRect = SkRect::MakeXYWH(0, 0, 75.f, 85.f);
57 switch (type) {
59 canvas->drawCircle(kRect.centerX(), kRect.centerY(), kRect.width() / 2.f, *paint);
60 break;
62 canvas->drawRoundRect(kRect, 15.f, 15.f, *paint);
63 break;
64 case kRect_ShapeType:
65 canvas->drawRect(kRect, *paint);
66 break;
68 if (fConvexPath.isEmpty()) {
69 SkPoint points[4];
70 kRect.toQuad(points);
71 fConvexPath = SkPathBuilder().moveTo(points[0])
72 .quadTo(points[1], points[2])
73 .quadTo(points[3], points[0])
74 .detach();
75 SkASSERT(fConvexPath.isConvex());
76 }
77 canvas->drawPath(fConvexPath, *paint);
78 break;
80 if (fConcavePath.isEmpty()) {
82 SkPoint points[5] = {{50.f, 0.f}};
83 SkMatrix rot;
84 rot.setRotate(360.f / 5, 50.f, 70.f);
85 for (int i = 1; i < 5; ++i) {
86 rot.mapPoints(points + i, points + i - 1, 1);
87 }
88 b.moveTo(points[0]);
89 for (int i = 0; i < 5; ++i) {
90 b.lineTo(points[(2 * i) % 5]);
91 }
92 fConcavePath = b.setFillType(SkPathFillType::kEvenOdd)
93 .detach();
94 SkASSERT(!fConcavePath.isConvex());
95 }
96 canvas->drawPath(fConcavePath, *paint);
97 break;
98 case kText_ShapeType: {
99 const char* text = "N";
101 font.setEmbolden(true);
102 canvas->drawString(text, 0.f, 100.f, font, *paint);
103 break;
104 }
105 default:
106 break;
107 }
108 }
109
110 static SkColor GetColor(SkRandom* random) {
111 SkColor color = ToolUtils::color_to_565(random->nextU() | 0xFF000000);
112 return SkColorSetA(color, 0x80);
113 }
114
115 static void DrawHairlines(SkCanvas* canvas) {
116 if (canvas->imageInfo().alphaType() == kOpaque_SkAlphaType) {
117 canvas->clear(kBackground);
118 } else {
119 canvas->clear(SK_ColorTRANSPARENT);
120 }
121 SkPaint hairPaint;
123 hairPaint.setStrokeWidth(0);
124 hairPaint.setAntiAlias(true);
125 static constexpr int kNumHairlines = 12;
126 SkPoint pts[] = {{3.f, 7.f}, {29.f, 7.f}};
127 SkRandom colorRandom;
128 SkMatrix rot;
129 rot.setRotate(360.f / kNumHairlines, 15.5f, 12.f);
130 rot.postTranslate(3.f, 0);
131 for (int i = 0; i < 12; ++i) {
132 hairPaint.setColor(GetColor(&colorRandom));
133 canvas->drawLine(pts[0], pts[1], hairPaint);
134 rot.mapPoints(pts, 2);
135 }
136 }
137
138 void onDraw(SkCanvas* canvas) override {
139 SkScalar y = 5;
140 for (int i = 0; i < kNumShapeTypes; i++) {
141 SkRandom colorRandom;
142 ShapeType shapeType = static_cast<ShapeType>(i);
143 SkScalar x = 5;
144 for (int r = 0; r <= 15; r++) {
145 SkPaint p;
146 p.setAntiAlias(true);
147 p.setColor(GetColor(&colorRandom));
148 // In order to get some op combining on the GPU backend we do 2 src over
149 // for each xfer mode which requires a dst read
150 p.setBlendMode(r % 3 == 0 ? SkBlendMode::kColorBurn : SkBlendMode::kSrcOver);
151 canvas->save();
152 canvas->translate(x, y);
153 this->drawShape(canvas, &p, shapeType);
154 canvas->restore();
155 x += 15;
156 }
157 y += 110;
158 }
159 // Draw hairlines to a surface and then draw that to the main canvas with a zoom so that
160 // it is easier to see how they blend.
162 // Recording canvases don't have a color type.
165 } else {
166 info = SkImageInfo::Make(35, 35,
167 canvas->imageInfo().colorType(),
168 canvas->imageInfo().alphaType(),
169 canvas->imageInfo().refColorSpace());
170 }
171 auto surf = canvas->makeSurface(info);
172 if (!surf) {
173 // Fall back to raster. Raster supports only one of the 8 bit per-channel RGBA or BGRA
174 // formats. This fall back happens when running with --preAbandonGpuContext.
175 if ((info.colorType() == kRGBA_8888_SkColorType ||
176 info.colorType() == kBGRA_8888_SkColorType) &&
177 info.colorType() != kN32_SkColorType) {
178 info = SkImageInfo::Make(35, 35,
179 kN32_SkColorType,
180 canvas->imageInfo().alphaType(),
181 canvas->imageInfo().refColorSpace());
182 }
183 surf = SkSurfaces::Raster(info);
184 SkASSERT(surf);
185 }
186 canvas->scale(5.f, 5.f);
187 canvas->translate(67.f, 10.f);
188 DrawHairlines(surf->getCanvas());
189 canvas->drawImage(surf->makeImageSnapshot(), 0.f, 0.f);
190 }
191
192private:
193 static constexpr SkColor kBackground = SK_ColorLTGRAY;
194 SkPath fConcavePath;
195 SkPath fConvexPath;
196 using INHERITED = GM;
197};
198
199//////////////////////////////////////////////////////////////////////////////
200
201DEF_GM( return new DstReadShuffle; )
202
203} // namespace skiagm
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition: DM.cpp:213
static const int points[]
@ kOpaque_SkAlphaType
pixel is opaque
Definition: SkAlphaType.h:28
#define SkASSERT(cond)
Definition: SkAssert.h:116
@ kColorBurn
darken destination to reflect source
@ kSrcOver
r = s + (1-sa)*d
@ kBGRA_8888_SkColorType
pixel with 8 bits for blue, green, red, alpha; in 32-bit word
Definition: SkColorType.h:26
@ kRGBA_8888_SkColorType
pixel with 8 bits for red, green, blue, alpha; in 32-bit word
Definition: SkColorType.h:24
@ kUnknown_SkColorType
uninitialized
Definition: SkColorType.h:20
constexpr SkColor SK_ColorLTGRAY
Definition: SkColor.h:118
uint32_t SkColor
Definition: SkColor.h:37
constexpr SkColor SK_ColorTRANSPARENT
Definition: SkColor.h:99
static constexpr SkColor SkColorSetA(SkColor c, U8CPU a)
Definition: SkColor.h:82
GLenum type
void drawRect(const SkRect &rect, const SkPaint &paint)
Definition: SkCanvas.cpp:1673
void restore()
Definition: SkCanvas.cpp:461
void translate(SkScalar dx, SkScalar dy)
Definition: SkCanvas.cpp:1278
sk_sp< SkSurface > makeSurface(const SkImageInfo &info, const SkSurfaceProps *props=nullptr)
Definition: SkCanvas.cpp:1195
void drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1, const SkPaint &paint)
Definition: SkCanvas.cpp:2700
void clear(SkColor color)
Definition: SkCanvas.h:1199
void drawRoundRect(const SkRect &rect, SkScalar rx, SkScalar ry, const SkPaint &paint)
Definition: SkCanvas.cpp:2717
int save()
Definition: SkCanvas.cpp:447
void drawPath(const SkPath &path, const SkPaint &paint)
Definition: SkCanvas.cpp:1747
void scale(SkScalar sx, SkScalar sy)
Definition: SkCanvas.cpp:1289
void drawString(const char str[], SkScalar x, SkScalar y, const SkFont &font, const SkPaint &paint)
Definition: SkCanvas.h:1803
SkImageInfo imageInfo() const
Definition: SkCanvas.cpp:1206
void drawImage(const SkImage *image, SkScalar left, SkScalar top)
Definition: SkCanvas.h:1528
void drawCircle(SkScalar cx, SkScalar cy, SkScalar radius, const SkPaint &paint)
Definition: SkCanvas.cpp:2707
Definition: SkFont.h:35
SkMatrix & postTranslate(SkScalar dx, SkScalar dy)
Definition: SkMatrix.cpp:281
void mapPoints(SkPoint dst[], const SkPoint src[], int count) const
Definition: SkMatrix.cpp:770
SkMatrix & setRotate(SkScalar degrees, SkScalar px, SkScalar py)
Definition: SkMatrix.cpp:452
void setStyle(Style style)
Definition: SkPaint.cpp:105
void setColor(SkColor color)
Definition: SkPaint.cpp:119
void setAntiAlias(bool aa)
Definition: SkPaint.h:170
@ kStroke_Style
set to stroke geometry
Definition: SkPaint.h:194
void setStrokeWidth(SkScalar width)
Definition: SkPaint.cpp:159
SkPathBuilder & moveTo(SkPoint pt)
SkPathBuilder & quadTo(SkPoint pt1, SkPoint pt2)
Definition: SkPath.h:59
bool isEmpty() const
Definition: SkPath.cpp:416
bool isConvex() const
Definition: SkPath.cpp:426
uint32_t nextU()
Definition: SkRandom.h:42
SkISize getISize() override
void drawShape(SkCanvas *canvas, SkPaint *paint, ShapeType type)
static SkColor GetColor(SkRandom *random)
SkString getName() const override
void onDraw(SkCanvas *canvas) override
static void DrawHairlines(SkCanvas *canvas)
Definition: gm.h:110
GM(SkColor backgroundColor=SK_ColorWHITE)
Definition: gm.cpp:81
void setBGColor(SkColor)
Definition: gm.cpp:159
const Paint & paint
Definition: color_source.cc:38
DlColor color
float SkScalar
Definition: extension.cpp:12
static bool b
std::u16string text
double y
double x
SK_API sk_sp< SkSurface > Raster(const SkImageInfo &imageInfo, size_t rowBytes, const SkSurfaceProps *surfaceProps)
sk_sp< SkTypeface > DefaultPortableTypeface()
SkColor color_to_565(SkColor color)
Definition: ToolUtils.cpp:139
font
Font Metadata and Metrics.
DEF_GM(return F(C(clipbox), 0.0f, 0.0f, {})) DEF_GM(return F(C(clipbox)
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)
sk_sp< SkColorSpace > refColorSpace() const
static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at)
SkAlphaType alphaType() const
Definition: SkImageInfo.h:375
SkColorType colorType() const
Definition: SkImageInfo.h:373
static constexpr SkRect MakeXYWH(float x, float y, float w, float h)
Definition: SkRect.h:659