Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
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:
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];
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 }
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[]
SkColor4f color
@ 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
constexpr SkRect kRect
void drawRect(const SkRect &rect, const SkPaint &paint)
void restore()
Definition SkCanvas.cpp:465
void translate(SkScalar dx, SkScalar dy)
sk_sp< SkSurface > makeSurface(const SkImageInfo &info, const SkSurfaceProps *props=nullptr)
void drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1, const SkPaint &paint)
void clear(SkColor color)
Definition SkCanvas.h:1199
void drawRoundRect(const SkRect &rect, SkScalar rx, SkScalar ry, const SkPaint &paint)
int save()
Definition SkCanvas.cpp:451
void drawPath(const SkPath &path, const SkPaint &paint)
void scale(SkScalar sx, SkScalar sy)
void drawString(const char str[], SkScalar x, SkScalar y, const SkFont &font, const SkPaint &paint)
Definition SkCanvas.h:1803
SkImageInfo imageInfo() const
void drawImage(const SkImage *image, SkScalar left, SkScalar top)
Definition SkCanvas.h:1528
void drawCircle(SkScalar cx, SkScalar cy, SkScalar radius, const SkPaint &paint)
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)
bool isEmpty() const
Definition SkPath.cpp:406
void setFillType(SkPathFillType ft)
Definition SkPath.h:235
bool isConvex() const
Definition SkPath.cpp:416
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)
void setBGColor(SkColor)
Definition gm.cpp:159
const Paint & paint
float SkScalar
Definition extension.cpp:12
static bool b
#define DEF_GM(CODE)
Definition gm.h:40
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)
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
SkColorType colorType() const
void toQuad(SkPoint quad[4]) const
Definition SkRect.cpp:50
static constexpr SkRect MakeXYWH(float x, float y, float w, float h)
Definition SkRect.h:659
constexpr float centerX() const
Definition SkRect.h:776
constexpr float centerY() const
Definition SkRect.h:785
constexpr float width() const
Definition SkRect.h:762