5#include "flutter/testing/display_list_testing.h"
9#include "flutter/display_list/display_list.h"
22 <<
"not identical to ..." << std::endl
31 <<
"DisplayLists are both the same:" << std::endl
65 os << std::setprecision(std::numeric_limits<long double>::digits10 + 1);
66 os <<
"DisplayList {" << std::endl;
68 os <<
"}" << std::endl;
74 <<
"isaa: " <<
paint.isAntiAlias() <<
", "
75 <<
paint.getColor() <<
", "
76 <<
paint.getBlendMode() <<
", "
77 <<
paint.getDrawStyle();
79 os <<
", width: " <<
paint.getStrokeWidth()
80 <<
", miter: " <<
paint.getStrokeMiter()
81 <<
", " <<
paint.getStrokeCap()
82 <<
", " <<
paint.getStrokeJoin();
84 if (
paint.getColorSource()) {
85 os <<
", " <<
paint.getColorSource();
87 if (
paint.getColorFilter()) {
88 os <<
", " <<
paint.getColorFilter();
90 if (
paint.getImageFilter()) {
91 os <<
", " <<
paint.getImageFilter();
93 if (
paint.getMaskFilter()) {
94 os <<
", " <<
paint.getMaskFilter();
96 if (
paint.isInvertColors()) {
97 os <<
", invertColors: " <<
paint.isInvertColors();
106 case DlBlendMode::kDst:
return os <<
"BlendMode::kDst";
107 case DlBlendMode::kSrcOver:
return os <<
"BlendMode::kSrcOver";
108 case DlBlendMode::kDstOver:
return os <<
"BlendMode::kDstOver";
109 case DlBlendMode::kSrcIn:
return os <<
"BlendMode::kSrcIn";
110 case DlBlendMode::kDstIn:
return os <<
"BlendMode::kDstIn";
111 case DlBlendMode::kSrcOut:
return os <<
"BlendMode::kSrcOut";
112 case DlBlendMode::kDstOut:
return os <<
"BlendMode::kDstOut";
113 case DlBlendMode::kSrcATop:
return os <<
"BlendMode::kSrcATop";
114 case DlBlendMode::kDstATop:
return os <<
"BlendMode::kDstATop";
115 case DlBlendMode::kXor:
return os <<
"BlendMode::kXor";
116 case DlBlendMode::kPlus:
return os <<
"BlendMode::kPlus";
117 case DlBlendMode::kModulate:
return os <<
"BlendMode::kModulate";
120 case DlBlendMode::kOverlay:
return os <<
"BlendMode::kOverlay";
123 case DlBlendMode::kColorDodge:
return os <<
"BlendMode::kColorDodge";
124 case DlBlendMode::kColorBurn:
return os <<
"BlendMode::kColorBurn";
125 case DlBlendMode::kHardLight:
return os <<
"BlendMode::kHardLight";
126 case DlBlendMode::kSoftLight:
return os <<
"BlendMode::kSoftLight";
128 case DlBlendMode::kExclusion:
return os <<
"BlendMode::kExclusion";
131 case DlBlendMode::kHue:
return os <<
"BlendMode::kHue";
132 case DlBlendMode::kSaturation:
return os <<
"BlendMode::kSaturation";
134 case DlBlendMode::kLuminosity:
return os <<
"BlendMode::kLuminosity";
136 default:
return os <<
"BlendMode::????";
141 return os <<
"SaveLayerOptions("
142 <<
"renders_with_attributes: " <<
options.renders_with_attributes()
144 <<
"can_distribute_opacity: " <<
options.can_distribute_opacity()
146 <<
"contains_backdrop: " <<
options.contains_backdrop_filter()
151 return os <<
"SkPoint(" << point.
fX <<
", " << point.
fY <<
")";
155 return os <<
"SkIRect("
156 <<
"left: " <<
rect.fLeft <<
", "
157 <<
"top: " <<
rect.fTop <<
", "
158 <<
"right: " <<
rect.fRight <<
", "
159 <<
"bottom: " <<
rect.fBottom
164 return os <<
"SkRect("
165 <<
"left: " <<
rect.fLeft <<
", "
166 <<
"top: " <<
rect.fTop <<
", "
167 <<
"right: " <<
rect.fRight <<
", "
168 <<
"bottom: " <<
rect.fBottom
173 return rect ? (os <<
"&" << *
rect) : os <<
"no rect";
177 return os <<
"SkRRect("
191 return os <<
"SkPath("
192 <<
"bounds: " <<
path.getBounds()
198 return os <<
"SkMatrix("
207 return os <<
"no matrix";
211 return os <<
"SkRSXform("
212 <<
"scos: " << xform.
fSCos <<
", "
213 <<
"ssin: " << xform.
fSSin <<
", "
214 <<
"tx: " << xform.
fTx <<
", "
215 <<
"ty: " << xform.
fTy <<
")";
226 switch (constraint) {
228 return os <<
"SrcRectConstraint::kFast";
230 return os <<
"SrcRectConstraint::kStrict";
236 case DlStrokeCap::kButt:
return os <<
"Cap::kButt";
254 case DlDrawStyle::kStrokeAndFill:
return os <<
"Style::kStrokeAnFill";
280 default:
return os <<
"FilterMode::????";
285 return os <<
"DlColor(" << std::hex <<
color.
argb() << std::dec <<
")";
291 return os <<
"NearestSampling";
294 return os <<
"LinearSampling";
297 return os <<
"MipmapSampling";
300 return os <<
"CubicSampling";
306 if (blob ==
nullptr) {
307 return os <<
"no text";
309 return os <<
"&SkTextBlob(ID: " << blob->
uniqueID() <<
", " << blob->
bounds() <<
")";
314 if (
frame ==
nullptr) {
315 return os <<
"no text";
318 return os <<
"&TextFrame("
319 <<
bounds.GetLeft() <<
", " <<
bounds.GetTop() <<
" => "
320 <<
bounds.GetRight() <<
", " <<
bounds.GetBottom() <<
")";
329 default:
return os <<
"VertexMode::????";
340 default:
return os <<
"TileMode::????";
345 if (
image ==
nullptr) {
346 return os <<
"null image";
349 if (
image->skia_image()) {
350 os <<
"skia(" <<
image->skia_image().get() <<
"), ";
352 if (
image->impeller_texture()) {
353 os <<
"impeller(" <<
image->impeller_texture().get() <<
"), ";
363std::ostream& DisplayListStreamDispatcher::startl() {
364 for (
int i = 0;
i < cur_indent_;
i++) {
371std::ostream& DisplayListStreamDispatcher::out_array(std::string
name,
374 if (array ==
nullptr ||
count < 0) {
375 return os_ <<
"no " <<
name;
377 os_ <<
name <<
"[" <<
count <<
"] = [" << std::endl;
381 startl() << array[
i] <<
"," << std::endl;
390 startl() <<
"setAntiAlias(" << aa <<
");" << std::endl;
393 startl() <<
"setStyle(" << style <<
");" << std::endl;
396 startl() <<
"setColor(" <<
color <<
");" << std::endl;
399 startl() <<
"setStrokeWidth(" <<
width <<
");" << std::endl;
402 startl() <<
"setStrokeMiter(" << limit <<
");" << std::endl;
405 startl() <<
"setStrokeCap(" << cap <<
");" << std::endl;
408 startl() <<
"setStrokeJoin(" <<
join <<
");" << std::endl;
412 startl() <<
"setColorSource(no ColorSource);" << std::endl;
415 startl() <<
"setColorSource(";
420 os_ <<
"DlColorColorSource(" << color_src->
color() <<
")";
426 os_ <<
"DlImageColorSource(image: " << image_src->
image()
437 os_ <<
"DlLinearGradientSource("
439 <<
", end: " << linear_src->
end_point() <<
", ";
440 out_array(
"colors", linear_src->
stop_count(), linear_src->
colors()) <<
", ";
441 out_array(
"stops", linear_src->
stop_count(), linear_src->
stops()) <<
", "
448 os_ <<
"DlRadialGradientSource("
449 <<
"center: " << radial_src->
center()
450 <<
", radius: " << radial_src->
radius() <<
", ";
451 out_array(
"colors", radial_src->
stop_count(), radial_src->
colors()) <<
", ";
452 out_array(
"stops", radial_src->
stop_count(), radial_src->
stops()) <<
", "
459 os_ <<
"DlConicalGradientColorSource("
462 <<
", end center: " << conical_src->
end_center()
463 <<
", end radius: " << conical_src->
end_radius() <<
", ";
464 out_array(
"colors", conical_src->
stop_count(), conical_src->
colors()) <<
", ";
465 out_array(
"stops", conical_src->
stop_count(), conical_src->
stops()) <<
", "
472 os_ <<
"DlSweepGradientColorSource("
473 <<
"center: " << sweep_src->
center()
474 <<
", start: " << sweep_src->
start() <<
", "
475 <<
", end: " << sweep_src->
end() <<
", ";
477 out_array(
"stops", sweep_src->
stop_count(), sweep_src->
stops()) <<
", "
482 os_ <<
"?DlUnknownColorSource?()";
485 os_ <<
");" << std::endl;
487void DisplayListStreamDispatcher::out(
const DlColorFilter& filter) {
488 switch (filter.
type()) {
492 os_ <<
"DlBlendColorFilter(" <<
blend->color() <<
", "
493 <<
static_cast<int>(
blend->mode()) <<
")";
501 os_ <<
"DlMatrixColorFilter(matrix[20] = [" << std::endl;
503 for (
int i = 0;
i < 20;
i += 5) {
516 os_ <<
"DlSrgbToLinearGammaColorFilter()";
520 os_ <<
"DlLinearToSrgbGammaColorFilter()";
524 os_ <<
"?DlUnknownColorFilter?()";
528void DisplayListStreamDispatcher::out(
const DlColorFilter* filter) {
529 if (filter ==
nullptr) {
530 os_ <<
"no ColorFilter";
537 startl() <<
"setColorFilter(";
539 os_ <<
");" << std::endl;
542 startl() <<
"setInvertColors(" <<
invert <<
");" << std::endl;
545 startl() <<
"setBlendMode(" <<
mode <<
");" << std::endl;
548 if (filter ==
nullptr) {
549 startl() <<
"setMaskFilter(no MaskFilter);" << std::endl;
552 startl() <<
"setMaskFilter(";
553 switch (filter->
type()) {
557 os_ <<
"DlMaskFilter(" << blur->
style() <<
", " << blur->
sigma() <<
")";
561 os_ <<
"?DlUnknownMaskFilter?()";
564 os_ <<
");" << std::endl;
566void DisplayListStreamDispatcher::out(
const DlImageFilter& filter) {
567 switch (filter.
type()) {
571 os_ <<
"DlBlurImageFilter(" << blur->
sigma_x() <<
", "
579 os_ <<
"DlDilateImageFilter(" << dilate->
radius_x() <<
", " << dilate->
radius_y() <<
")";
583 const DlErodeImageFilter* erode = filter.
asErode();
585 os_ <<
"DlDilateImageFilter(" << erode->radius_x() <<
", " << erode->radius_y() <<
")";
591 os_ <<
"DlMatrixImageFilter(" <<
matrix->matrix() <<
", " <<
matrix->sampling() <<
")";
595 const DlComposeImageFilter* compose = filter.
asCompose();
597 os_ <<
"DlComposeImageFilter(" << std::endl;
599 startl() <<
"outer: ";
601 out(compose->outer().get());
602 os_ <<
"," << std::endl;
604 startl() <<
"inner: ";
606 out(compose->inner().get());
616 os_ <<
"DlColorFilterImageFilter(";
622 const DlLocalMatrixImageFilter* local_matrix = filter.
asLocalMatrix();
624 os_ <<
"DlLocalMatrixImageFilter(" << local_matrix->matrix();
625 os_ <<
"," << std::endl;
627 startl() <<
"filter: ";
628 out(local_matrix->image_filter().get());
636void DisplayListStreamDispatcher::out(
const DlImageFilter* filter) {
637 if (filter ==
nullptr) {
638 os_ <<
"no ImageFilter";
647 startl() <<
"setImageFilter(";
651 os_ <<
");" << std::endl;
654 startl() <<
"save();" << std::endl;
655 startl() <<
"{" << std::endl;
663 os_ <<
"," << std::endl;
665 startl() <<
"backdrop: ";
669 os_ <<
", no backdrop";
671 os_ <<
");" << std::endl;
672 startl() <<
"{" << std::endl;
677 startl() <<
"}" << std::endl;
678 startl() <<
"restore();" << std::endl;
682 startl() <<
"translate(" << tx <<
", " << ty <<
");" << std::endl;
685 startl() <<
"scale(" << sx <<
", " << sy <<
");" << std::endl;
688 startl() <<
"rotate(" << degrees <<
");" << std::endl;
691 startl() <<
"skew(" << sx <<
", " << sy <<
");" << std::endl;
696 startl() <<
"transform2DAffine(" << std::endl;
700 <<
"[" << mxx <<
", " << mxy <<
", " << mxt <<
"], "
703 <<
"[" << myx <<
", " << myy <<
", " << myt <<
"], "
707 startl() <<
");" << std::endl;
714 startl() <<
"transformFullPerspective(" << std::endl;
718 <<
"[" << mxx <<
", " << mxy <<
", " << mxz <<
", " << mxt <<
"], "
721 <<
"[" << myx <<
", " << myy <<
", " << myz <<
", " << myt <<
"], "
724 <<
"[" << mzx <<
", " << mzy <<
", " << mzz <<
", " << mzt <<
"], "
727 <<
"[" << mwx <<
", " << mwy <<
", " << mwz <<
", " << mwt <<
"]"
731 startl() <<
");" << std::endl;
734 startl() <<
"transformReset();" << std::endl;
739 startl() <<
"clipRect("
743 <<
");" << std::endl;
748 startl() <<
"clipRRect("
752 <<
");" << std::endl;
756 startl() <<
"clipPath("
760 <<
");" << std::endl;
764 startl() <<
"drawColor("
767 <<
");" << std::endl;
770 startl() <<
"drawPaint();" << std::endl;
774 startl() <<
"drawLine(" << p0 <<
", " << p1 <<
");" << std::endl;
780 startl() <<
"drawDashedLine("
785 <<
");" << std::endl;
788 startl() <<
"drawRect(" <<
rect <<
");" << std::endl;
791 startl() <<
"drawOval(" <<
bounds <<
");" << std::endl;
795 startl() <<
"drawCircle(" << center <<
", " << radius <<
");" << std::endl;
798 startl() <<
"drawRRect(" <<
rrect <<
");" << std::endl;
802 startl() <<
"drawDRRect(outer: " << outer <<
", " << std::endl;
803 startl() <<
" inner: " << inner <<
");" << std::endl;
806 startl() <<
"drawPath(" <<
path <<
");" << std::endl;
812 startl() <<
"drawArc("
813 << oval_bounds <<
", "
814 << start_degrees <<
", "
815 << sweep_degrees <<
", "
816 <<
"use_center: " << use_center
817 <<
");" << std::endl;
822 startl() <<
"drawPoints(" <<
mode <<
", ";
824 <<
");" << std::endl;
828 startl() <<
"drawVertices("
830 << vertices->
mode() <<
", ";
835 <<
"), " <<
mode <<
");" << std::endl;
840 bool render_with_attributes) {
841 startl() <<
"drawImage(" <<
image.
get() <<
"," << std::endl;
842 startl() <<
" " << point <<
", "
844 <<
"with attributes: " << render_with_attributes
845 <<
");" << std::endl;
851 bool render_with_attributes,
853 startl() <<
"drawImageRect(" <<
image.
get() <<
"," << std::endl;
854 startl() <<
" src: " <<
src <<
"," << std::endl;
855 startl() <<
" dst: " <<
dst <<
"," << std::endl;
857 <<
"with attributes: " << render_with_attributes <<
", "
859 <<
");" << std::endl;
865 bool render_with_attributes) {
866 startl() <<
"drawImageNine(" <<
image.
get() <<
"," << std::endl;
867 startl() <<
" center: " << center <<
"," << std::endl;
868 startl() <<
" dst: " <<
dst <<
"," << std::endl;
869 startl() <<
" " << filter <<
", "
870 <<
"with attributes: " << render_with_attributes
871 <<
");" << std::endl;
881 bool render_with_attributes) {
882 startl() <<
"drawAtlas(" <<
atlas.
get() <<
", ";
883 out_array(
"xforms",
count, xform) <<
", ";
884 out_array(
"tex_coords",
count, tex) <<
", ";
886 <<
mode <<
", " <<
sampling <<
", cull: " << cull_rect <<
", "
887 <<
"with attributes: " << render_with_attributes
888 <<
");" << std::endl;
892 startl() <<
"drawDisplayList("
893 <<
"ID: " << display_list->unique_id() <<
", "
894 <<
"bounds: " << display_list->bounds() <<
", "
895 <<
"opacity: " << opacity
896 <<
");" << std::endl;
901 startl() <<
"drawTextBlob("
902 << blob.
get() <<
", "
903 <<
x <<
", " <<
y <<
");" << std::endl;
907 const std::shared_ptr<impeller::TextFrame>& text_frame,
910 startl() <<
"drawTextFrame("
911 << text_frame.get() <<
", "
912 <<
x <<
", " <<
y <<
");" << std::endl;
918 bool transparent_occluder,
920 startl() <<
"drawShadow("
924 << transparent_occluder <<
", "
926 <<
");" << std::endl;
static const int points[]
static sk_sp< SkImage > color_filter(const SkImage *image, SkColorFilter *colorFilter)
sk_sp< SkImage > asImage() const
virtual bool isTextureBacked() const =0
const SkRect & rect() const
SkVector radii(Corner corner) const
@ kUpperLeft_Corner
index of top-left corner radii
@ kLowerRight_Corner
index of bottom-right corner radii
@ kUpperRight_Corner
index of top-right corner radii
@ kLowerLeft_Corner
index of bottom-left corner radii
uint32_t uniqueID() const
const SkRect & bounds() const
void Dispatch(DlOpReceiver &ctx) const
virtual T type() const =0
DlTileMode tile_mode() const
DlBlurStyle style() const
Developer-facing API for rendering anything within the engine.
@ 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
virtual const DlBlendColorFilter * asBlend() const
virtual const DlMatrixColorFilter * asMatrix() const
SkScalar end_radius() const
SkPoint end_center() const
SkPoint start_center() const
SkScalar start_radius() const
SkScalar radius_y() const
SkScalar radius_x() const
DlTileMode tile_mode() const
const DlColor * colors() const
const float * stops() const
DlImageSampling sampling() const
DlTileMode vertical_tile_mode() const
DlTileMode horizontal_tile_mode() const
sk_sp< const DlImage > image() const
virtual const DlLocalMatrixImageFilter * asLocalMatrix() const
virtual const DlColorFilterImageFilter * asColorFilter() const
virtual const DlMatrixImageFilter * asMatrix() const
virtual const DlComposeImageFilter * asCompose() const
virtual const DlBlurImageFilter * asBlur() const
virtual const DlDilateImageFilter * asDilate() const
virtual const DlErodeImageFilter * asErode() const
Represents an image whose allocation is (usually) resident on device memory.
const SkPoint & start_point() const
const SkPoint & end_point() const
virtual const DlBlurMaskFilter * asBlur() const
const SkMatrix * matrix_ptr() const
Holds all of the data (both required and optional) for a DisplayList drawVertices call.
const DlColor * colors() const
DlVertexMode mode() const
const SkPoint * vertices() const
Returns a pointer to the vertex information. Should be non-null.
const uint16_t * indices() const
const SkPoint * texture_coordinates() const
void setInvertColors(bool invert) override
void drawOval(const SkRect &bounds) override
void drawRect(const SkRect &rect) override
void setImageFilter(const DlImageFilter *filter) override
void setStrokeCap(DlStrokeCap cap) override
void drawVertices(const DlVertices *vertices, DlBlendMode mode) override
void drawDRRect(const SkRRect &outer, const SkRRect &inner) override
void setStrokeMiter(SkScalar limit) override
void clipRect(const SkRect &rect, ClipOp clip_op, bool is_aa) override
void drawShadow(const SkPath &path, const DlColor color, const SkScalar elevation, bool transparent_occluder, SkScalar dpr) override
void setAntiAlias(bool aa) override
void drawTextFrame(const std::shared_ptr< impeller::TextFrame > &text_frame, SkScalar x, SkScalar y) override
void drawImageNine(const sk_sp< DlImage > image, const SkIRect ¢er, const SkRect &dst, DlFilterMode filter, bool render_with_attributes) override
void setStrokeWidth(SkScalar width) override
void setMaskFilter(const DlMaskFilter *filter) override
void drawImageRect(const sk_sp< DlImage > image, const SkRect &src, const SkRect &dst, DlImageSampling sampling, bool render_with_attributes, SrcRectConstraint constraint) override
void drawDashedLine(const DlPoint &p0, const DlPoint &p1, DlScalar on_length, DlScalar off_length) override
void drawPath(const SkPath &path) override
void translate(SkScalar tx, SkScalar ty) override
void rotate(SkScalar degrees) override
void saveLayer(const SkRect &bounds, const SaveLayerOptions options, const DlImageFilter *backdrop) override
void setStrokeJoin(DlStrokeJoin join) override
void transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myt) override
void setColorFilter(const DlColorFilter *filter) override
void drawArc(const SkRect &oval_bounds, SkScalar start_degrees, SkScalar sweep_degrees, bool use_center) override
void drawCircle(const SkPoint ¢er, SkScalar radius) override
void drawImage(const sk_sp< DlImage > image, const SkPoint point, DlImageSampling sampling, bool render_with_attributes) override
void drawAtlas(const sk_sp< DlImage > atlas, const SkRSXform xform[], const SkRect tex[], const DlColor colors[], int count, DlBlendMode mode, DlImageSampling sampling, const SkRect *cull_rect, bool render_with_attributes) override
void drawDisplayList(const sk_sp< DisplayList > display_list, SkScalar opacity) override
void clipRRect(const SkRRect &rrect, ClipOp clip_op, bool is_aa) override
void setBlendMode(DlBlendMode mode) override
void drawLine(const SkPoint &p0, const SkPoint &p1) override
void setDrawStyle(DlDrawStyle style) override
void transformReset() override
void drawPaint() override
void drawPoints(PointMode mode, uint32_t count, const SkPoint points[]) override
void drawColor(DlColor color, DlBlendMode mode) override
void setColor(DlColor color) override
void skew(SkScalar sx, SkScalar sy) override
void drawRRect(const SkRRect &rrect) override
void setColorSource(const DlColorSource *source) override
void scale(SkScalar sx, SkScalar sy) override
void transformFullPerspective(SkScalar mxx, SkScalar mxy, SkScalar mxz, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myz, SkScalar myt, SkScalar mzx, SkScalar mzy, SkScalar mzz, SkScalar mzt, SkScalar mwx, SkScalar mwy, SkScalar mwz, SkScalar mwt) override
void drawTextBlob(const sk_sp< SkTextBlob > blob, SkScalar x, SkScalar y) override
void clipPath(const SkPath &path, ClipOp clip_op, bool is_aa) override
Represents a collection of shaped text runs.
#define FML_LOG(severity)
#define FML_DCHECK(condition)
static SkColor blend(SkColor dst, SkColor src, void(*mode)(float, float, float, float *, float *, float *))
sk_sp< const SkImage > atlas
unsigned useCenter Optional< SkMatrix > matrix
Optional< SkRect > bounds
sk_sp< const SkImage > image
sk_sp< const SkImageFilter > backdrop
sk_sp< SkBlender > blender SkRect rect
PODArray< SkColor > colors
SkSamplingOptions sampling
bool DisplayListsNE_Verbose(const DisplayList *a, const DisplayList *b)
bool DisplayListsEQ_Verbose(const DisplayList *a, const DisplayList *b)
impeller::Scalar DlScalar
@ kMiter
extends to miter limit
@ kBevel
connects outside edges
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
DEF_SWITCHES_START aot vmservice shared library name
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.
@ kStroke
strokes boundary of shapes
@ kFill
fills interior of shapes
@ kNormal
fuzzy inside and outside
@ kOuter
nothing inside, fuzzy outside
@ kInner
fuzzy inside, nothing outside
@ kSolid
solid inside, fuzzy outside
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 mode
@ kLighten
rc = s + d - min(s*da, d*sa), ra = kSrcOver
@ kMultiply
r = s*(1-da) + d*(1-sa) + s*d
@ kDifference
rc = s + d - 2*(min(s*da, d*sa)), ra = kSrcOver
@ kColor
hue and saturation of source with luminosity of destination
@ kDarken
rc = s + d - max(s*da, d*sa), ra = kSrcOver
flutter::DlCanvas DlCanvas
flutter::testing::DisplayListStreamDispatcher DisplayListStreamDispatcher
std::ostream & operator<<(std::ostream &out, const impeller::Color &c)
flutter::DisplayList DisplayList
flutter::SaveLayerOptions SaveLayerOptions
static SkString join(const CommandLineFlags::StringArray &)
constexpr uint32_t argb() const