13#include "third_party/skia/include/core/SkBitmap.h"
14#include "third_party/skia/include/core/SkImage.h"
15#include "third_party/skia/include/core/SkSurface.h"
16#include "third_party/skia/include/core/SkTextBlob.h"
37 void Close()
override { verb_count_++; }
42 uint32_t verb_count_ = 0u;
69 benchmark::State& state,
72 state.counters[
"HairlineStroke"] = attributes &
kHairlineStroke ? 1 : 0;
75 state.counters[
"HairlineStroke"] = attributes &
kHairlineStroke ? 1 : 0;
76 state.counters[
"StrokedStyle"] = attributes &
kStrokedStyle ? 1 : 0;
77 state.counters[
"FilledStyle"] = attributes &
kFilledStyle ? 1 : 0;
80 state.counters[
"AntiAliasing"] = attributes &
kAntiAliasing ? 1 : 0;
103 unsigned attributes) {
110 size_t length = state.range(0);
113 auto surface = surface_provider->GetPrimarySurface();
114 auto canvas =
surface->GetCanvas();
122 auto display_list = builder.
Build();
125 for ([[maybe_unused]]
auto _ : state) {
126 canvas->DrawDisplayList(display_list);
130 auto filename = surface_provider->backend_name() +
"-DrawLine-" +
131 std::to_string(state.range(0)) +
".png";
132 surface_provider->Snapshot(filename);
141 unsigned attributes) {
148 size_t length = state.range(0);
149 size_t canvas_size =
length * 2;
150 surface_provider->InitializeSurface(canvas_size, canvas_size);
151 auto surface = surface_provider->GetPrimarySurface();
152 auto canvas =
surface->GetCanvas();
156 const DlPoint offset(0.5f, 0.5f);
165 if (origin.
x +
size.width > canvas_size) {
166 origin.
x -= canvas_size;
169 origin.
y -= canvas_size;
173 auto display_list = builder.
Build();
176 for ([[maybe_unused]]
auto _ : state) {
177 canvas->DrawDisplayList(display_list);
181 auto filename = surface_provider->backend_name() +
"-DrawRect-" +
182 std::to_string(state.range(0)) +
".png";
183 surface_provider->Snapshot(filename);
192 unsigned attributes) {
199 size_t length = state.range(0);
200 size_t canvas_size =
length * 2;
201 surface_provider->InitializeSurface(canvas_size, canvas_size);
202 auto surface = surface_provider->GetPrimarySurface();
203 auto canvas =
surface->GetCanvas();
205 const DlPoint offset(0.5f, 0.5f);
214 if (origin.
x +
size.width > canvas_size) {
215 origin.
x -= canvas_size;
217 if (origin.
y +
size.height > canvas_size) {
218 origin.
y -= canvas_size;
221 auto display_list = builder.
Build();
224 for ([[maybe_unused]]
auto _ : state) {
225 canvas->DrawDisplayList(display_list);
229 auto filename = surface_provider->backend_name() +
"-DrawOval-" +
230 std::to_string(state.range(0)) +
".png";
231 surface_provider->Snapshot(filename);
240 unsigned attributes) {
247 size_t length = state.range(0);
248 size_t canvas_size =
length * 2;
249 surface_provider->InitializeSurface(canvas_size, canvas_size);
250 auto surface = surface_provider->GetPrimarySurface();
251 auto canvas =
surface->GetCanvas();
254 const DlPoint offset(0.5f, 0.5f);
262 if (center.x + radius > canvas_size) {
265 if (center.y + radius > canvas_size) {
269 auto display_list = builder.
Build();
272 for ([[maybe_unused]]
auto _ : state) {
273 canvas->DrawDisplayList(display_list);
277 auto filename = surface_provider->backend_name() +
"-DrawCircle-" +
278 std::to_string(state.range(0)) +
".png";
279 surface_provider->Snapshot(filename);
296 size_t length = state.range(0);
297 size_t canvas_size =
length * 2;
298 surface_provider->InitializeSurface(canvas_size, canvas_size);
299 auto surface = surface_provider->GetPrimarySurface();
300 auto canvas =
surface->GetCanvas();
335 rrect = rrect.
Shift(offset, offset);
337 rrect = rrect.
Shift(-canvas_size, 0);
340 rrect = rrect.
Shift(0, -canvas_size);
343 auto display_list = builder.
Build();
346 for ([[maybe_unused]]
auto _ : state) {
347 canvas->DrawDisplayList(display_list);
351 auto filename = surface_provider->backend_name() +
"-DrawRRect-" +
352 std::to_string(state.range(0)) +
".png";
353 surface_provider->Snapshot(filename);
373 size_t length = state.range(0);
374 size_t canvas_size =
length * 2;
375 surface_provider->InitializeSurface(canvas_size, canvas_size);
376 auto surface = surface_provider->GetPrimarySurface();
377 auto canvas =
surface->GetCanvas();
415 rrect = rrect.
Shift(offset, offset);
416 rrect_2 = rrect_2.
Shift(offset, offset);
418 rrect = rrect.
Shift(-canvas_size, 0);
419 rrect_2 = rrect_2.
Shift(-canvas_size, 0);
422 rrect = rrect.
Shift(0, -canvas_size);
423 rrect_2 = rrect_2.
Shift(0, -canvas_size);
426 auto display_list = builder.
Build();
429 for ([[maybe_unused]]
auto _ : state) {
430 canvas->DrawDisplayList(display_list);
434 auto filename = surface_provider->backend_name() +
"-DrawDRRect-" +
435 std::to_string(state.range(0)) +
".png";
436 surface_provider->Snapshot(filename);
441 unsigned attributes) {
449 size_t length = state.range(0);
450 size_t canvas_size =
length * 2;
451 surface_provider->InitializeSurface(canvas_size, canvas_size);
452 auto surface = surface_provider->GetPrimarySurface();
453 auto canvas =
surface->GetCanvas();
459 std::vector<DlScalar> segment_sweeps = {5.5f, -10.0f, 42.0f, 71.7f, 90.0f,
460 37.5f, 17.9f, 32.0f, 379.4f};
468 for (
DlScalar sweep : segment_sweeps) {
469 builder.
DrawArc(bounds, starting_angle, sweep,
false, paint);
470 starting_angle += sweep + 5.0f;
473 if (origin.
x +
size.width > canvas_size) {
474 origin.
x -= canvas_size;
476 if (origin.
y +
size.height > canvas_size) {
477 origin.
y -= canvas_size;
481 auto display_list = builder.
Build();
484 for ([[maybe_unused]]
auto _ : state) {
485 canvas->DrawDisplayList(display_list);
489 auto filename = surface_provider->backend_name() +
"-DrawArc-" +
490 std::to_string(state.range(0)) +
".png";
491 surface_provider->Snapshot(filename);
497 std::vector<DlPoint>
points;
500 float full_circle = 2.0f * M_PI;
501 for (
size_t i = 0;
i < n;
i++) {
502 angle = (full_circle /
static_cast<float>(n)) *
static_cast<float>(
i);
503 x = center.x + r * std::cosf(angle);
504 y = center.y + r * std::sinf(angle);
522 for (
size_t i = 1;
i < sides;
i++) {
526 path_builder.
Close();
543 std::vector<DlPoint> control_points =
547 for (
size_t i = 1;
i < sides;
i++) {
551 path_builder.
Close();
568 std::vector<DlPoint> control_points =
572 for (
size_t i = 1;
i < sides;
i++) {
576 path_builder.
Close();
594 std::vector<DlPoint> inner_control_points =
596 std::vector<DlPoint> outer_control_points =
600 for (
size_t i = 1;
i < sides;
i++) {
602 outer_control_points[3 *
i - 1],
points[
i]);
604 path_builder.
CubicCurveTo(inner_control_points[3 * sides - 2],
605 outer_control_points[3 * sides - 1],
points[0]);
606 path_builder.
Close();
623 std::vector<DlPoint> center_points =
626 for (
DlPoint p : center_points) {
680 auto surface = surface_provider->GetPrimarySurface();
681 auto canvas =
surface->GetCanvas();
687 float radius =
length * 0.25f;
688 state.SetComplexityN(state.range(0));
694 path.Dispatch(counter);
696 state.counters[
"DrawCallCount"] = 1;
699 auto display_list = builder.
Build();
702 canvas->DrawDisplayList(display_list);
706 for ([[maybe_unused]]
auto _ : state) {
707 canvas->DrawDisplayList(display_list);
711 auto filename = surface_provider->backend_name() +
"-DrawPath-" + label +
712 "-" + std::to_string(state.range(0)) +
".png";
713 surface_provider->Snapshot(filename);
732 size_t& final_vertex_count) {
733 size_t outer_vertex_count = vertex_count / 2;
734 std::vector<DlPoint> outer_points =
737 std::vector<DlPoint> vertices;
738 std::vector<DlColor> colors;
745 vertices.push_back(center);
746 colors.push_back(
DlColor(SK_ColorCYAN));
747 for (
size_t i = 0;
i <= outer_points.size();
i++) {
748 vertices.push_back(outer_points[
i % outer_points.size()]);
750 colors.push_back(
DlColor(SK_ColorRED));
751 }
else if (
i % 3 == 1) {
752 colors.push_back(
DlColor(SK_ColorGREEN));
754 colors.push_back(
DlColor(SK_ColorBLUE));
762 for (
size_t i = 0;
i < outer_vertex_count;
i++) {
763 vertices.push_back(outer_points[
i % outer_points.size()]);
764 colors.push_back(
DlColor(SK_ColorRED));
765 vertices.push_back(outer_points[(
i + 1) % outer_points.size()]);
766 colors.push_back(
DlColor(SK_ColorGREEN));
767 vertices.push_back(center);
768 colors.push_back(
DlColor(SK_ColorBLUE));
775 for (
size_t i = 0;
i <= outer_vertex_count;
i++) {
776 vertices.push_back(outer_points[
i % outer_points.size()]);
777 colors.push_back(
i % 2 ?
DlColor(SK_ColorRED) :
DlColor(SK_ColorGREEN));
779 vertices.push_back(center);
780 colors.push_back(
DlColor(SK_ColorBLUE));
788 final_vertex_count = vertices.size();
796 return "TriangleStrip";
798 return "TriangleFan";
825 auto surface = surface_provider->GetPrimarySurface();
826 auto canvas =
surface->GetCanvas();
830 float radius =
length / 4.0f;
832 size_t vertex_count, total_vertex_count = 0;
833 size_t disc_count = state.range(0);
835 std::vector<DlPoint> center_points =
838 state.counters[
"DrawCallCount"] = center_points.size();
839 for (
DlPoint p : center_points) {
840 std::shared_ptr<DlVertices> vertices =
842 total_vertex_count += vertex_count;
843 builder.
DrawVertices(vertices, DlBlendMode::kSrc, paint);
846 state.counters[
"VertexCount"] = total_vertex_count;
847 state.SetComplexityN(total_vertex_count);
849 auto display_list = builder.
Build();
852 for ([[maybe_unused]]
auto _ : state) {
853 canvas->DrawDisplayList(display_list);
857 auto filename = surface_provider->backend_name() +
"-DrawVertices-" +
860 surface_provider->Snapshot(filename);
870 std::vector<DlPoint>
points;
873 std::vector<DlScalar> delta_x = {10.0f, 6.3f, 15.0f, 3.5f, 22.6f, 4.7f};
874 std::vector<DlScalar> delta_y = {9.3f, -5.4f, 8.5f, -12.0f, 19.2f, -19.6f};
877 for (
size_t i = 0;
i < count;
i++) {
878 points.push_back(current);
880 DlPoint(delta_x[
i % delta_x.size()], delta_y[
i % delta_y.size()]);
881 if (current.
x > canvas_size.
width) {
884 if (current.
y > canvas_size.
height) {
935 auto surface = surface_provider->GetPrimarySurface();
936 auto canvas =
surface->GetCanvas();
938 size_t point_count = state.range(0);
939 state.SetComplexityN(point_count);
940 state.counters[
"PointCount"] = point_count;
941 state.counters[
"DrawCallCount"] = 1;
943 std::vector<DlPoint>
points =
947 auto display_list = builder.
Build();
949 for ([[maybe_unused]]
auto _ : state) {
950 canvas->DrawDisplayList(display_list);
954 auto filename = surface_provider->backend_name() +
"-DrawPoints-" +
957 surface_provider->Snapshot(filename);
965 bitmap.peekPixels(&pixmap);
966 return SkImages::RasterFromPixmap(pixmap,
nullptr,
nullptr);
975 bool upload_bitmap) {
983 size_t bitmap_size = state.range(0);
984 size_t canvas_size = 2 * bitmap_size;
985 surface_provider->InitializeSurface(canvas_size, canvas_size);
986 auto surface = surface_provider->GetPrimarySurface();
987 auto canvas =
surface->GetCanvas();
989 sk_sp<SkImage>
image;
990 std::shared_ptr<DlSurfaceInstance> offscreen_instance;
991 sk_sp<SkSurface> offscreen;
995 SkImageInfo info = SkImageInfo::Make(bitmap_size, bitmap_size,
996 SkColorType::kRGBA_8888_SkColorType,
997 SkAlphaType::kPremul_SkAlphaType);
998 bitmap.allocPixels(info, 0);
999 bitmap.eraseColor(SK_ColorBLUE);
1001 offscreen_instance =
1002 surface_provider->MakeOffscreenSurface(bitmap_size, bitmap_size);
1003 offscreen = offscreen_instance->sk_surface();
1004 offscreen->getCanvas()->clear(SK_ColorRED);
1007 const DlPoint offset(0.5f, 0.5f);
1013 : offscreen->makeImageSnapshot();
1017 if (dst.
x + bitmap_size > canvas_size) {
1020 if (dst.
y + bitmap_size > canvas_size) {
1025 auto display_list = builder.
Build();
1027 for ([[maybe_unused]]
auto _ : state) {
1028 canvas->DrawDisplayList(display_list);
1029 surface->FlushSubmitCpuSync();
1032 auto filename = surface_provider->backend_name() +
"-DrawImage-" +
1033 (upload_bitmap ?
"Upload-" :
"Texture-") +
1034 std::to_string(bitmap_size) +
".png";
1035 surface_provider->Snapshot(filename);
1039 switch (constraint) {
1055 unsigned attributes,
1058 bool upload_bitmap) {
1066 size_t bitmap_size = state.range(0);
1067 size_t canvas_size = 2 * bitmap_size;
1068 surface_provider->InitializeSurface(canvas_size, canvas_size);
1069 auto surface = surface_provider->GetPrimarySurface();
1070 auto canvas =
surface->GetCanvas();
1072 sk_sp<SkImage>
image;
1073 std::shared_ptr<DlSurfaceInstance> offscreen_instance;
1074 sk_sp<SkSurface> offscreen;
1077 if (upload_bitmap) {
1078 SkImageInfo info = SkImageInfo::Make(bitmap_size, bitmap_size,
1079 SkColorType::kRGBA_8888_SkColorType,
1080 SkAlphaType::kPremul_SkAlphaType);
1081 bitmap.allocPixels(info, 0);
1082 bitmap.eraseColor(SK_ColorBLUE);
1084 offscreen_instance =
1085 surface_provider->MakeOffscreenSurface(bitmap_size, bitmap_size);
1086 offscreen = offscreen_instance->sk_surface();
1087 offscreen->getCanvas()->clear(SK_ColorRED);
1090 const DlPoint offset(0.5f, 0.5f);
1092 bitmap_size / 2.0f, bitmap_size / 2.0f);
1094 DlSize size(bitmap_size * 0.75f, bitmap_size * 0.75f);
1099 : offscreen->makeImageSnapshot();
1104 if (origin.
x +
size.width > canvas_size) {
1107 if (origin.
y +
size.height > canvas_size) {
1112 auto display_list = builder.
Build();
1114 for ([[maybe_unused]]
auto _ : state) {
1115 canvas->DrawDisplayList(display_list);
1116 surface->FlushSubmitCpuSync();
1119 auto filename = surface_provider->backend_name() +
"-DrawImageRect-" +
1120 (upload_bitmap ?
"Upload-" :
"Texture-") +
1122 std::to_string(bitmap_size) +
".png";
1123 surface_provider->Snapshot(filename);
1144 unsigned attributes,
1146 bool upload_bitmap) {
1154 size_t bitmap_size = state.range(0);
1155 size_t canvas_size = 2 * bitmap_size;
1156 surface_provider->InitializeSurface(canvas_size, canvas_size);
1157 auto surface = surface_provider->GetPrimarySurface();
1158 auto canvas =
surface->GetCanvas();
1161 bitmap_size / 2, bitmap_size / 2);
1163 sk_sp<SkImage>
image;
1164 std::shared_ptr<DlSurfaceInstance> offscreen_instance;
1165 sk_sp<SkSurface> offscreen;
1168 if (upload_bitmap) {
1169 SkImageInfo info = SkImageInfo::Make(bitmap_size, bitmap_size,
1170 SkColorType::kRGBA_8888_SkColorType,
1171 SkAlphaType::kPremul_SkAlphaType);
1172 bitmap.allocPixels(info, 0);
1173 bitmap.eraseColor(SK_ColorBLUE);
1175 offscreen_instance =
1176 surface_provider->MakeOffscreenSurface(bitmap_size, bitmap_size);
1177 offscreen = offscreen_instance->sk_surface();
1178 offscreen->getCanvas()->clear(SK_ColorRED);
1181 const DlPoint offset(0.5f, 0.5f);
1183 DlSize size(bitmap_size * 0.75f, bitmap_size * 0.75f);
1188 : offscreen->makeImageSnapshot();
1192 if (origin.
x +
size.width > canvas_size) {
1195 if (origin.
y +
size.height > canvas_size) {
1200 auto display_list = builder.
Build();
1202 for ([[maybe_unused]]
auto _ : state) {
1203 canvas->DrawDisplayList(display_list);
1204 surface->FlushSubmitCpuSync();
1207 auto filename = surface_provider->backend_name() +
"-DrawImageNine-" +
1208 (upload_bitmap ?
"Upload-" :
"Texture-") +
1210 std::to_string(bitmap_size) +
".png";
1211 surface_provider->Snapshot(filename);
1223 unsigned attributes) {
1230 size_t draw_calls = state.range(0);
1232 surface_provider->InitializeSurface(canvas_size, canvas_size);
1233 auto surface = surface_provider->GetPrimarySurface();
1234 auto canvas =
surface->GetCanvas();
1236 state.SetComplexityN(draw_calls);
1237 state.counters[
"DrawCallCount_Varies"] = draw_calls;
1238 state.counters[
"GlyphCount"] = draw_calls;
1241 for (
size_t i = 0;
i < draw_calls;
i++) {
1247 auto display_list = builder.
Build();
1249 for ([[maybe_unused]]
auto _ : state) {
1250 canvas->DrawDisplayList(display_list);
1251 surface->FlushSubmitCpuSync();
1254 auto filename = surface_provider->backend_name() +
"-DrawTextBlob-" +
1255 std::to_string(draw_calls) +
".png";
1256 surface_provider->Snapshot(filename);
1269 unsigned attributes,
1270 bool transparent_occluder,
1280 auto surface = surface_provider->GetPrimarySurface();
1281 auto canvas =
surface->GetCanvas();
1286 float radius =
length * 0.25f;
1305 float elevation = state.range(0);
1306 state.counters[
"DrawCallCount"] = 1;
1313 transparent_occluder, 1.0f);
1314 auto display_list = builder.
Build();
1317 canvas->DrawDisplayList(display_list);
1318 surface->FlushSubmitCpuSync();
1321 for ([[maybe_unused]]
auto _ : state) {
1322 canvas->DrawDisplayList(display_list);
1323 surface->FlushSubmitCpuSync();
1326 auto filename = surface_provider->backend_name() +
"-DrawShadow-" +
1328 (transparent_occluder ?
"Transparent-" :
"Opaque-") +
1329 std::to_string(elevation) +
"-" +
".png";
1330 surface_provider->Snapshot(filename);
1341 unsigned attributes,
1342 size_t save_depth) {
1351 auto surface = surface_provider->GetPrimarySurface();
1352 auto canvas =
surface->GetCanvas();
1354 size_t save_layer_calls = state.range(0);
1361 state.counters[
"DrawCallCount_Varies"] = save_layer_calls * save_depth;
1362 for (
size_t i = 0;
i < save_layer_calls;
i++) {
1363 for (
size_t j = 0; j < save_depth; j++) {
1364 builder.
SaveLayer(std::nullopt,
nullptr);
1368 for (
size_t j = 0; j < save_depth; j++) {
1372 auto display_list = builder.
Build();
1375 for ([[maybe_unused]]
auto _ : state) {
1376 canvas->DrawDisplayList(display_list);
1377 surface->FlushSubmitCpuSync();
1380 auto filename = surface_provider->backend_name() +
"-SaveLayer-" +
1381 std::to_string(save_depth) +
"-" +
1382 std::to_string(save_layer_calls) +
".png";
1383 surface_provider->Snapshot(filename);
1386#ifdef ENABLE_SOFTWARE_BENCHMARKS
1390#ifdef ENABLE_OPENGL_BENCHMARKS
1394#ifdef ENABLE_METAL_BENCHMARKS
constexpr bool applies_anti_alias() const
constexpr bool always_stroked() const
constexpr bool applies_style() const
void DrawOval(const DlRect &bounds, const DlPaint &paint) override
void DrawImageRect(const sk_sp< DlImage > &image, const DlRect &src, const DlRect &dst, DlImageSampling sampling, const DlPaint *paint=nullptr, DlSrcRectConstraint constraint=DlSrcRectConstraint::kFast) override
void DrawVertices(const std::shared_ptr< DlVertices > &vertices, DlBlendMode mode, const DlPaint &paint) override
void DrawImageNine(const sk_sp< DlImage > &image, const DlIRect ¢er, const DlRect &dst, DlFilterMode filter, const DlPaint *paint=nullptr) override
void DrawRoundRect(const DlRoundRect &rrect, const DlPaint &paint) override
void DrawArc(const DlRect &bounds, DlScalar start, DlScalar sweep, bool useCenter, const DlPaint &paint) override
void DrawShadow(const DlPath &path, const DlColor color, const DlScalar elevation, bool transparent_occluder, DlScalar dpr) override
Draws the shadow of the given |path| rendered in the provided |color| (which is only consulted for it...
void DrawImage(const sk_sp< DlImage > &image, const DlPoint &point, DlImageSampling sampling, const DlPaint *paint=nullptr) override
void DrawCircle(const DlPoint ¢er, DlScalar radius, const DlPaint &paint) override
void SaveLayer(const std::optional< DlRect > &bounds, const DlPaint *paint=nullptr, const DlImageFilter *backdrop=nullptr, std::optional< int64_t > backdrop_id=std::nullopt) override
void DrawLine(const DlPoint &p0, const DlPoint &p1, const DlPaint &paint) override
void DrawText(const std::shared_ptr< DlText > &text, DlScalar x, DlScalar y, const DlPaint &paint) override
sk_sp< DisplayList > Build()
void DrawPath(const DlPath &path, const DlPaint &paint) override
void DrawPoints(DlPointMode mode, uint32_t count, const DlPoint pts[], const DlPaint &paint) override
void DrawDiffRoundRect(const DlRoundRect &outer, const DlRoundRect &inner, const DlPaint &paint) override
void DrawRect(const DlRect &rect, const DlPaint &paint) override
static constexpr DisplayListAttributeFlags kDrawVerticesFlags
static constexpr DisplayListAttributeFlags kDrawArcNoCenterFlags
static constexpr DisplayListAttributeFlags kDrawImageRectWithPaintFlags
static constexpr DisplayListAttributeFlags kSaveLayerFlags
static constexpr DisplayListAttributeFlags kDrawOvalFlags
static constexpr DisplayListAttributeFlags kDrawPointsAsLinesFlags
static constexpr DisplayListAttributeFlags kDrawPointsAsPolygonFlags
static constexpr DisplayListAttributeFlags kDrawCircleFlags
static constexpr DisplayListAttributeFlags kDrawPathFlags
static constexpr DisplayListAttributeFlags kDrawLineFlags
static constexpr DisplayListAttributeFlags kDrawPointsAsPointsFlags
static constexpr DisplayListAttributeFlags kDrawImageWithPaintFlags
static constexpr DisplayListAttributeFlags kDrawImageNineWithPaintFlags
static constexpr DisplayListAttributeFlags kDrawTextFlags
static constexpr DisplayListAttributeFlags kDrawShadowFlags
static constexpr DisplayListAttributeFlags kDrawRRectFlags
static constexpr DisplayListAttributeFlags kDrawDRRectFlags
static constexpr DisplayListAttributeFlags kDrawRectFlags
static sk_sp< DlImage > Make(const SkImage *image)
DlPaint & setAntiAlias(bool isAntiAlias)
DlPaint & setStrokeWidth(float width)
DlPaint & setDrawStyle(DlDrawStyle style)
DlPathBuilder & LineTo(DlPoint p2)
Draw a line from the current point to the indicated point p2.
DlPathBuilder & MoveTo(DlPoint p2)
Start a new contour that will originate at the indicated point p2.
const DlPath TakePath()
Returns the path constructed by this path builder and resets its internal state to the default state ...
DlPathBuilder & ConicCurveTo(DlPoint cp, DlPoint p2, DlScalar weight)
Draw a conic curve (a rational quadratic bezier curve) from the current point to the indicated point ...
DlPathBuilder & QuadraticCurveTo(DlPoint cp, DlPoint p2)
Draw a quadratic bezier curve from the current point to the indicated point p2, using the indicated p...
DlPathBuilder & Close()
The path is closed back to the location of the most recent MoveTo call. Contours that are filled are ...
DlPathBuilder & CubicCurveTo(DlPoint cp1, DlPoint cp2, DlPoint p2)
Draw a cubic bezier curve from the current point to the indicated point p2, using the indicated point...
static std::shared_ptr< DlTextSkia > Make(const sk_sp< SkTextBlob > &blob)
static std::shared_ptr< DlVertices > Make(DlVertexMode mode, int vertex_count, const DlPoint vertices[], const DlPoint texture_coordinates[], const DlColor colors[], int index_count=0, const uint16_t indices[]=nullptr, const DlRect *bounds=nullptr)
Constructs a DlVector with compact inline storage for all of its required and optional lists of data.
bool ConicTo(const DlPoint &cp, const DlPoint &p2, DlScalar weight) override
uint32_t GetVerbCount() const
void CubicTo(const DlPoint &cp1, const DlPoint &cp2, const DlPoint &p2) override
void MoveTo(const DlPoint &p2, bool will_be_closed) override
void LineTo(const DlPoint &p2) override
void QuadTo(const DlPoint &cp, const DlPoint &p2) override
static std::unique_ptr< DlSurfaceProvider > Create(BackendType backend_type)
Collection of functions to receive path segments from the underlying path representation via the DlPa...
#define RUN_DISPLAYLIST_BENCHMARKS(BACKEND)
FlutterVulkanImage * image
#define FML_UNREACHABLE()
std::string VertexModeToString(DlVertexMode mode)
void BM_DrawVertices(benchmark::State &state, BackendType backend_type, unsigned attributes, DlVertexMode mode)
std::shared_ptr< DlVertices > GetTestVertices(DlPoint center, float radius, size_t vertex_count, DlVertexMode mode, size_t &final_vertex_count)
void BM_DrawPath(benchmark::State &state, BackendType backend_type, unsigned attributes, PathVerb type)
constexpr size_t kRectsToDraw
SkFont CreateTestFontOfSize(DlScalar scalar)
void BM_DrawPoints(benchmark::State &state, BackendType backend_type, unsigned attributes, DlPointMode mode)
void BM_DrawOval(benchmark::State &state, BackendType backend_type, unsigned attributes)
void GetLinesPath(DlPathBuilder &path_builder, size_t sides, DlPoint center, float radius)
void BM_DrawShadow(benchmark::State &state, BackendType backend_type, unsigned attributes, bool transparent_occluder, PathVerb type)
void AnnotateAttributes(unsigned attributes, benchmark::State &state, const DisplayListAttributeFlags flags)
constexpr size_t kFixedCanvasSize
constexpr size_t kImagesToDraw
std::string ConstraintToString(DlSrcRectConstraint constraint)
std::string PointModeToString(DlPointMode mode)
void BM_DrawImage(benchmark::State &state, BackendType backend_type, unsigned attributes, DlImageSampling options, bool upload_bitmap)
void BM_DrawLine(benchmark::State &state, BackendType backend_type, unsigned attributes)
void BM_DrawCircle(benchmark::State &state, BackendType backend_type, unsigned attributes)
void BM_DrawRRect(benchmark::State &state, BackendType backend_type, unsigned attributes, RRectType type)
void GetConicsPath(DlPathBuilder &path_builder, size_t sides, DlPoint center, float radius)
void GetQuadsPath(DlPathBuilder &path_builder, size_t sides, DlPoint center, float radius)
void BM_DrawRect(benchmark::State &state, BackendType backend_type, unsigned attributes)
constexpr size_t kDRRectsToDraw
std::string FilterModeToString(const DlFilterMode mode)
sk_sp< SkImage > ImageFromBitmapWithNewID(const SkBitmap &bitmap)
std::vector< DlPoint > GetPolygonPoints(size_t n, DlPoint center, DlScalar r)
std::string VerbToString(PathVerb type)
void BM_DrawDRRect(benchmark::State &state, BackendType backend_type, unsigned attributes, RRectType type)
void BM_DrawTextBlob(benchmark::State &state, BackendType backend_type, unsigned attributes)
std::vector< DlPoint > GetTestPoints(size_t count, DlISize canvas_size)
void BM_DrawArc(benchmark::State &state, BackendType backend_type, unsigned attributes)
constexpr size_t kRRectsToDraw
void MultiplyPath(DlPathBuilder &path_builder, PathVerb type, DlPoint center, size_t sides, size_t number, float radius)
constexpr size_t kArcSweepSetsToDraw
void BM_DrawImageNine(benchmark::State &state, BackendType backend_type, unsigned attributes, const DlFilterMode filter, bool upload_bitmap)
void BM_SaveLayer(benchmark::State &state, BackendType backend_type, unsigned attributes, size_t save_depth)
constexpr size_t kCirclesToDraw
void GetCubicsPath(DlPathBuilder &path_builder, size_t sides, DlPoint center, float radius)
constexpr size_t kLinesToDraw
constexpr size_t kOvalsToDraw
void BM_DrawImageRect(benchmark::State &state, BackendType backend_type, unsigned attributes, DlImageSampling options, DlSrcRectConstraint constraint, bool upload_bitmap)
DlPaint GetPaintForRun(unsigned attributes)
impeller::Scalar DlScalar
impeller::ISize32 DlISize
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all 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
@ kLines
draw each separate pair of points as a line segment
@ kPolygon
draw each pair of overlapping points as a line segment
@ kPoints
draw each point separately
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
DlVertexMode
Defines the way in which the vertices of a DlVertices object are separated into triangles into which ...
@ kTriangles
The vertices are taken 3 at a time to form a triangle.
@ kStrokeAndFill
both strokes and fills shapes
@ kStroke
strokes boundary of shapes
@ kFill
fills interior of shapes
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all 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 mode
static RoundRect MakeRectRadii(const Rect &rect, const RoundingRadii &radii)
constexpr const Rect & GetBounds() const
RoundRect Shift(Scalar dx, Scalar dy) const
Returns a new round rectangle translated by the given offset.
constexpr auto GetBottom() const
static constexpr TRect MakeOriginSize(const TPoint< Type > &origin, const TSize< Type > &size)
constexpr auto GetRight() const
static constexpr TRect MakeXYWH(Type x, Type y, Type width, Type height)
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
std::vector< Point > points