Flutter Engine
The Flutter Engine
dl_op_receiver.h
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef FLUTTER_DISPLAY_LIST_DL_OP_RECEIVER_H_
6#define FLUTTER_DISPLAY_LIST_DL_OP_RECEIVER_H_
7
8#include "flutter/display_list/display_list.h"
9#include "flutter/display_list/dl_blend_mode.h"
10#include "flutter/display_list/dl_canvas.h"
11#include "flutter/display_list/dl_paint.h"
12#include "flutter/display_list/dl_sampling_options.h"
13#include "flutter/display_list/dl_vertices.h"
14#include "flutter/display_list/effects/dl_color_filter.h"
15#include "flutter/display_list/effects/dl_color_source.h"
16#include "flutter/display_list/effects/dl_image_filter.h"
17#include "flutter/display_list/effects/dl_mask_filter.h"
18#include "flutter/display_list/image/dl_image.h"
19
20#include "flutter/impeller/geometry/path.h"
21
22namespace flutter {
23
24class DisplayList;
25
26//------------------------------------------------------------------------------
27/// @brief Internal API for rendering recorded display lists to backends.
28///
29/// The |DisplayList| object will play back recorded operations in this format.
30/// Most developers should not need to deal with this interface unless they are
31/// writing a utility that needs to examine the contents of a display list.
32///
33/// Similar to |DlCanvas|, this interface carries clip and transform state
34/// which are saved and restored by the |save|, |saveLayer|, and |restore|
35/// calls.
36///
37/// Unlike DlCanvas, this interface has attribute state which is global across
38/// an entire DisplayList (not affected by save/restore).
39///
40/// DISPLAYLIST DEPTH TRACKING
41///
42/// Each rendering call in the DisplayList stream is assumed to have a "depth"
43/// value relative to the beginning of its DisplayList. The depth value is
44/// implicitly allocated during recording and only reported in 2 places so
45/// it is important for a dispatcher to perform the same internal allocations
46/// if it is to make sense of the information reported by the save/saveLayer
47/// calls. This depth value is maintained as follows:
48///
49/// - The absolute depth value is never reported, only the total depth
50/// size of the entire DisplayList or one of its save/restore pairs
51/// is reported. Since the DisplayList might be dispatched recursively
52/// due to embedded drawDisplayList calls, these depth size values
53/// will often be relative to things like:
54/// - the start of a given save/saveLayer group
55/// - the start of a DisplayList dispatch or recursion
56/// as such, only totals for groups of DisplayList dispatched calls
57/// will be reported. These totals will be reported in:
58/// - the `DisplayList::total_depth()` method reporting the total
59/// depth accumulated for every operation in the DisplayList
60/// - the save/saveLayer dispatch calls will report the total
61/// depth accumulated for every call until their corresponding
62/// restore call.
63/// - The depth value is incremented for every drawing operation, including:
64/// - all draw* calls (including drawDisplayList)
65/// - drawDisplayList will also accumulate the total_depth() of the
66/// DisplayList object it is drawing (in other words it will skip enough
67/// depth values for each drawing call in the child).
68/// This bump is in addition to the depth value it records for being
69/// a rendering operation. Some implementations may need to surround
70/// the actual drawDisplayList with a protective saveLayer, but others
71/// may not - so the implicit depth value assigned to the drawDisplayList
72/// call itself may go unused, but must be accounted for.
73/// - a saveLayer call will also increment the depth value just like a
74/// rendering call. This is in addition to the depth of its content.
75/// It is doing so to reserve a depth for the drawing operation that
76/// copies its layer back to the parent.
77/// - Each save() or saveLayer() call will report the total depth of all
78/// rendering calls within its content (recorded before the corresponding
79/// restore) and report this total during dispatch. This information might
80/// be needed to assign depths to the clip operations that occur within
81/// its content. As there is no enclosing saveLayer/restore pair around
82/// the root of a DisplayList, the total depth of the DisplayList can
83/// be used to determine the appropriate clip depths for any clip ops
84/// appearing before the first save/saveLayer or after the last restore.
85///
86/// @see DlSkCanvasDispatcher
87/// @see impeller::DlDispatcher
88/// @see DlOpSpy
90 protected:
94
95 public:
96 // MaxDrawPointsCount * sizeof(SkPoint) must be less than 1 << 32
97 static constexpr int kMaxDrawPointsCount = ((1 << 29) - 1);
98
99 // ---------------------------------------------------------------------
100 // The CacheablePath forms of the drawPath, clipPath, and drawShadow
101 // methods are only called if the DlOpReceiver indicates that it prefers
102 // impeller paths by returning true from |PrefersImpellerPaths|.
103 // Note that we pass in both the SkPath and (a place to cache the)
104 // impeller::Path forms of the path since the SkPath version can contain
105 // information about the type of path that lets the receiver optimize
106 // the operation (and potentially avoid the need to cache it).
107 // It is up to the receiver to convert the path to Impeller form and
108 // cache it to avoid needing to do a lot of Impeller-specific processing
109 // inside the DisplayList code.
110
111 virtual bool PrefersImpellerPaths() const { return false; }
112
114 explicit CacheablePath(const SkPath& path) : sk_path(path) {}
115
118
119 bool operator==(const CacheablePath& other) const {
120 return sk_path == other.sk_path;
121 }
122 };
123
124 virtual void clipPath(const CacheablePath& cache,
125 ClipOp clip_op,
126 bool is_aa) {
128 }
129 virtual void drawPath(const CacheablePath& cache) { FML_UNREACHABLE(); }
130 virtual void drawShadow(const CacheablePath& cache,
131 const DlColor color,
132 const SkScalar elevation,
133 bool transparent_occluder,
134 SkScalar dpr) {
136 }
137 // ---------------------------------------------------------------------
138
139 // The following methods are nearly 1:1 with the methods on DlPaint and
140 // carry the same meanings. Each method sets a persistent value for the
141 // attribute for the rest of the display list or until it is reset by
142 // another method that changes the same attribute. The current set of
143 // attributes is not affected by |save| and |restore|.
144 virtual void setAntiAlias(bool aa) = 0;
145 virtual void setDrawStyle(DlDrawStyle style) = 0;
146 virtual void setColor(DlColor color) = 0;
147 virtual void setStrokeWidth(float width) = 0;
148 virtual void setStrokeMiter(float limit) = 0;
149 virtual void setStrokeCap(DlStrokeCap cap) = 0;
150 virtual void setStrokeJoin(DlStrokeJoin join) = 0;
151 virtual void setColorSource(const DlColorSource* source) = 0;
152 virtual void setColorFilter(const DlColorFilter* filter) = 0;
153 // setInvertColors is a quick way to set a ColorFilter that inverts the
154 // rgb values of all rendered colors.
155 // It is not reset by |setColorFilter|, but instead composed with that
156 // filter so that the color inversion happens after the ColorFilter.
157 virtual void setInvertColors(bool invert) = 0;
158 virtual void setBlendMode(DlBlendMode mode) = 0;
159 virtual void setMaskFilter(const DlMaskFilter* filter) = 0;
160 virtual void setImageFilter(const DlImageFilter* filter) = 0;
161
162 // All of the following methods are nearly 1:1 with their counterparts
163 // in |SkCanvas| and have the same behavior and output.
164 virtual void save() = 0;
165 // Optional variant of save() that passes the total depth count of
166 // all rendering operations that occur until the next restore() call.
167 virtual void save(uint32_t total_content_depth) { save(); }
168 // The |options| parameter can specify whether the existing rendering
169 // attributes will be applied to the save layer surface while rendering
170 // it back to the current surface. If the flag is false then this method
171 // is equivalent to |SkCanvas::saveLayer| with a null paint object.
172 //
173 // The |options| parameter can also specify whether the bounds came from
174 // the caller who recorded the operation, or whether they were calculated
175 // by the DisplayListBuilder.
176 //
177 // The |options| parameter may contain other options that indicate some
178 // specific optimizations may be made by the underlying implementation
179 // to avoid creating a temporary layer, these optimization options will
180 // be determined as the |DisplayList| is constructed and should not be
181 // specified in calling a |DisplayListBuilder| as they will be ignored.
182 // The |backdrop| filter, if not null, is used to initialize the new
183 // layer before further rendering happens.
184 virtual void saveLayer(const SkRect& bounds,
186 const DlImageFilter* backdrop = nullptr) = 0;
187 // Optional variant of saveLayer() that passes the total depth count of
188 // all rendering operations that occur until the next restore() call.
189 virtual void saveLayer(const SkRect& bounds,
191 uint32_t total_content_depth,
192 DlBlendMode max_content_blend_mode,
193 const DlImageFilter* backdrop = nullptr) {
195 }
196 virtual void restore() = 0;
197
198 // ---------------------------------------------------------------------
199 // Legacy helper method for older callers that use the null-ness of
200 // the bounds to indicate if they should be recorded or computed.
201 // This method will not be called on a |DlOpReceiver| that is passed
202 // to the |DisplayList::Dispatch()| method, so client receivers should
203 // ignore it for their implementation purposes.
204 //
205 // DlOpReceiver methods are generally meant to ONLY be output from a
206 // previously recorded DisplayList so this method is really only used
207 // from testing methods that bypass the public builder APIs for legacy
208 // convenience or for internal white-box testing of the DisplayList
209 // internals. Such methods should eventually be converted to using the
210 // public DisplayListBuilder/DlCanvas public interfaces where possible,
211 // as tracked in:
212 // https://github.com/flutter/flutter/issues/144070
213 virtual void saveLayer(const SkRect* bounds,
215 const DlImageFilter* backdrop = nullptr) final {
216 if (bounds) {
217 saveLayer(*bounds, options.with_bounds_from_caller(), backdrop);
218 } else {
219 saveLayer(SkRect(), options.without_bounds_from_caller(), backdrop);
220 }
221 }
222 // ---------------------------------------------------------------------
223
224 virtual void translate(SkScalar tx, SkScalar ty) = 0;
225 virtual void scale(SkScalar sx, SkScalar sy) = 0;
226 virtual void rotate(SkScalar degrees) = 0;
227 virtual void skew(SkScalar sx, SkScalar sy) = 0;
228
229 // The transform methods all assume the following math for transforming
230 // an arbitrary 3D homogenous point (x, y, z, w).
231 // All coordinates in the rendering methods (and SkPoint and SkRect objects)
232 // represent a simplified coordinate (x, y, 0, 1).
233 // x' = x * mxx + y * mxy + z * mxz + w * mxt
234 // y' = x * myx + y * myy + z * myz + w * myt
235 // z' = x * mzx + y * mzy + z * mzz + w * mzt
236 // w' = x * mwx + y * mwy + z * mwz + w * mwt
237 // Note that for non-homogenous 2D coordinates, the last column in those
238 // equations is multiplied by 1 and is simply adding a translation and
239 // so is referred to with the final letter "t" here instead of "w".
240 //
241 // In 2D coordinates, z=0 and so the 3rd column always evaluates to 0.
242 //
243 // In non-perspective transforms, the 4th row has identity values
244 // and so w` = w. (i.e. w'=1 for 2d points transformed by a matrix
245 // with identity values in the last row).
246 //
247 // In affine 2D transforms, the 3rd and 4th row and 3rd column are all
248 // identity values and so z` = z (which is 0 for 2D coordinates) and
249 // the x` and y` equations don't see a contribution from a z coordinate
250 // and the w' ends up being the same as the w from the source coordinate
251 // (which is 1 for a 2D coordinate).
252 //
253 // Here is the math for transforming a 2D source coordinate and
254 // looking for the destination 2D coordinate (for a surface that
255 // does not have a Z buffer or track the Z coordinates in any way)
256 // Source coordinate = (x, y, 0, 1)
257 // x' = x * mxx + y * mxy + 0 * mxz + 1 * mxt
258 // y' = x * myx + y * myy + 0 * myz + 1 * myt
259 // z' = x * mzx + y * mzy + 0 * mzz + 1 * mzt
260 // w' = x * mwx + y * mwy + 0 * mwz + 1 * mwt
261 // Destination coordinate does not need z', so this reduces to:
262 // x' = x * mxx + y * mxy + mxt
263 // y' = x * myx + y * myy + myt
264 // w' = x * mwx + y * mwy + mwt
265 // Destination coordinate is (x' / w', y' / w', 0, 1)
266 // Note that these are the matrix values in SkMatrix which means that
267 // an SkMatrix contains enough data to transform a 2D source coordinate
268 // and place it on a 2D surface, but is otherwise not enough to continue
269 // concatenating with further matrices as its missing elements will not
270 // be able to model the interplay between the rows and columns that
271 // happens during a full 4x4 by 4x4 matrix multiplication.
272 //
273 // If the transform doesn't have any perspective parts (the last
274 // row is identity - 0, 0, 0, 1), then this further simplifies to:
275 // x' = x * mxx + y * mxy + mxt
276 // y' = x * myx + y * myy + myt
277 // w' = x * 0 + y * 0 + 1 = 1
278 //
279 // In short, while the full 4x4 set of matrix entries needs to be
280 // maintained for accumulating transform mutations accurately, the
281 // actual end work of transforming a single 2D coordinate (or, in
282 // the case of bounds transformations, 4 of them) can be accomplished
283 // with the 9 values from transform3x3 or SkMatrix.
284 //
285 // The only need for the w value here is for homogenous coordinates
286 // which only come up if the perspective elements (the 4th row) of
287 // a transform are non-identity. Otherwise the w always ends up
288 // being 1 in all calculations. If the matrix has perspecitve elements
289 // then the final transformed coordinates will have a w that is not 1
290 // and the actual coordinates are determined by dividing out that w
291 // factor resulting in a real-world point expressed as (x, y, z, 1).
292 //
293 // Because of the predominance of 2D affine transforms the
294 // 2x3 subset of the 4x4 transform matrix is special cased with
295 // its own dispatch method that omits the last 2 rows and the 3rd
296 // column. Even though a 3x3 subset is enough for transforming
297 // leaf coordinates as shown above, no method is provided for
298 // representing a 3x3 transform in the DisplayList since if there
299 // is perspective involved then a full 4x4 matrix should be provided
300 // for accurate concatenations. Providing a 3x3 method or record
301 // in the stream would encourage developers to prematurely subset
302 // a full perspective matrix.
303
304 // clang-format off
305
306 // |transform2DAffine| is equivalent to concatenating the internal
307 // 4x4 transform with the following row major transform matrix:
308 // [ mxx mxy 0 mxt ]
309 // [ myx myy 0 myt ]
310 // [ 0 0 1 0 ]
311 // [ 0 0 0 1 ]
312 virtual void transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt,
313 SkScalar myx, SkScalar myy, SkScalar myt) = 0;
314 // |transformFullPerspective| is equivalent to concatenating the internal
315 // 4x4 transform with the following row major transform matrix:
316 // [ mxx mxy mxz mxt ]
317 // [ myx myy myz myt ]
318 // [ mzx mzy mzz mzt ]
319 // [ mwx mwy mwz mwt ]
321 SkScalar mxx, SkScalar mxy, SkScalar mxz, SkScalar mxt,
322 SkScalar myx, SkScalar myy, SkScalar myz, SkScalar myt,
323 SkScalar mzx, SkScalar mzy, SkScalar mzz, SkScalar mzt,
324 SkScalar mwx, SkScalar mwy, SkScalar mwz, SkScalar mwt) = 0;
325 // clang-format on
326
327 // Clears the transformation stack.
328 virtual void transformReset() = 0;
329
330 virtual void clipRect(const SkRect& rect, ClipOp clip_op, bool is_aa) = 0;
331 virtual void clipRRect(const SkRRect& rrect, ClipOp clip_op, bool is_aa) = 0;
332 virtual void clipPath(const SkPath& path, ClipOp clip_op, bool is_aa) = 0;
333
334 // The following rendering methods all take their rendering attributes
335 // from the last value set by the attribute methods above (regardless
336 // of any |save| or |restore| operations which do not affect attributes).
337 // In cases where a paint object may have been optional in the SkCanvas
338 // method, the methods here will generally offer a boolean parameter
339 // which specifies whether to honor the attributes of the display list
340 // stream, or assume default attributes.
342 virtual void drawPaint() = 0;
343 virtual void drawLine(const SkPoint& p0, const SkPoint& p1) = 0;
344 virtual void drawDashedLine(const DlPoint& p0,
345 const DlPoint& p1,
346 DlScalar on_length,
347 DlScalar off_length) = 0;
348 virtual void drawRect(const SkRect& rect) = 0;
349 virtual void drawOval(const SkRect& bounds) = 0;
350 virtual void drawCircle(const SkPoint& center, SkScalar radius) = 0;
351 virtual void drawRRect(const SkRRect& rrect) = 0;
352 virtual void drawDRRect(const SkRRect& outer, const SkRRect& inner) = 0;
353 virtual void drawPath(const SkPath& path) = 0;
354 virtual void drawArc(const SkRect& oval_bounds,
355 SkScalar start_degrees,
356 SkScalar sweep_degrees,
357 bool use_center) = 0;
359 uint32_t count,
360 const SkPoint points[]) = 0;
361 virtual void drawVertices(const DlVertices* vertices, DlBlendMode mode) = 0;
362 virtual void drawImage(const sk_sp<DlImage> image,
363 const SkPoint point,
365 bool render_with_attributes) = 0;
366 virtual void drawImageRect(
367 const sk_sp<DlImage> image,
368 const SkRect& src,
369 const SkRect& dst,
371 bool render_with_attributes,
374 const SkIRect& center,
375 const SkRect& dst,
376 DlFilterMode filter,
377 bool render_with_attributes) = 0;
378 virtual void drawAtlas(const sk_sp<DlImage> atlas,
379 const SkRSXform xform[],
380 const SkRect tex[],
381 const DlColor colors[],
382 int count,
385 const SkRect* cull_rect,
386 bool render_with_attributes) = 0;
387 virtual void drawDisplayList(const sk_sp<DisplayList> display_list,
388 SkScalar opacity = SK_Scalar1) = 0;
389 virtual void drawTextBlob(const sk_sp<SkTextBlob> blob,
390 SkScalar x,
391 SkScalar y) = 0;
392 virtual void drawTextFrame(
393 const std::shared_ptr<impeller::TextFrame>& text_frame,
394 SkScalar x,
395 SkScalar y) = 0;
396 virtual void drawShadow(const SkPath& path,
397 const DlColor color,
398 const SkScalar elevation,
399 bool transparent_occluder,
400 SkScalar dpr) = 0;
401};
402
403} // namespace flutter
404
405#endif // FLUTTER_DISPLAY_LIST_DL_OP_RECEIVER_H_
const char * options
int count
Definition: FontMgrTest.cpp:50
static const int points[]
#define SK_Scalar1
Definition: SkScalar.h:18
Definition: SkPath.h:59
Internal API for rendering recorded display lists to backends.
virtual void drawImageRect(const sk_sp< DlImage > image, const SkRect &src, const SkRect &dst, DlImageSampling sampling, bool render_with_attributes, SrcRectConstraint constraint=SrcRectConstraint::kFast)=0
virtual void save()=0
virtual void drawArc(const SkRect &oval_bounds, SkScalar start_degrees, SkScalar sweep_degrees, bool use_center)=0
virtual void save(uint32_t total_content_depth)
virtual void saveLayer(const SkRect &bounds, const SaveLayerOptions options, const DlImageFilter *backdrop=nullptr)=0
virtual void drawRect(const SkRect &rect)=0
virtual void setStrokeMiter(float limit)=0
virtual void clipRect(const SkRect &rect, ClipOp clip_op, bool is_aa)=0
virtual void transformReset()=0
virtual void drawShadow(const SkPath &path, const DlColor color, const SkScalar elevation, bool transparent_occluder, SkScalar dpr)=0
virtual void drawImage(const sk_sp< DlImage > image, const SkPoint point, DlImageSampling sampling, bool render_with_attributes)=0
virtual void drawCircle(const SkPoint &center, SkScalar radius)=0
virtual void drawVertices(const DlVertices *vertices, DlBlendMode mode)=0
virtual void clipPath(const SkPath &path, ClipOp clip_op, bool is_aa)=0
virtual void restore()=0
virtual void drawPath(const CacheablePath &cache)
virtual void drawPoints(PointMode mode, uint32_t count, const SkPoint points[])=0
virtual void skew(SkScalar sx, SkScalar sy)=0
virtual void drawOval(const SkRect &bounds)=0
virtual void drawRRect(const SkRRect &rrect)=0
virtual void drawDisplayList(const sk_sp< DisplayList > display_list, SkScalar opacity=SK_Scalar1)=0
virtual void setStrokeWidth(float width)=0
virtual void setMaskFilter(const DlMaskFilter *filter)=0
virtual void drawDRRect(const SkRRect &outer, const SkRRect &inner)=0
virtual void setColorFilter(const DlColorFilter *filter)=0
virtual void saveLayer(const SkRect *bounds, const SaveLayerOptions options, const DlImageFilter *backdrop=nullptr) final
virtual void drawImageNine(const sk_sp< DlImage > image, const SkIRect &center, const SkRect &dst, DlFilterMode filter, bool render_with_attributes)=0
virtual void setAntiAlias(bool aa)=0
static constexpr int kMaxDrawPointsCount
virtual void clipRRect(const SkRRect &rrect, ClipOp clip_op, bool is_aa)=0
virtual void drawPath(const SkPath &path)=0
virtual void drawTextFrame(const std::shared_ptr< impeller::TextFrame > &text_frame, SkScalar x, SkScalar y)=0
virtual void drawColor(DlColor color, DlBlendMode mode)=0
virtual 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)=0
virtual void transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myt)=0
virtual void drawDashedLine(const DlPoint &p0, const DlPoint &p1, DlScalar on_length, DlScalar off_length)=0
virtual void translate(SkScalar tx, SkScalar ty)=0
virtual void clipPath(const CacheablePath &cache, ClipOp clip_op, bool is_aa)
virtual void scale(SkScalar sx, SkScalar sy)=0
virtual void setStrokeJoin(DlStrokeJoin join)=0
virtual void drawShadow(const CacheablePath &cache, const DlColor color, const SkScalar elevation, bool transparent_occluder, SkScalar dpr)
virtual void drawLine(const SkPoint &p0, const SkPoint &p1)=0
virtual void setImageFilter(const DlImageFilter *filter)=0
virtual void setColorSource(const DlColorSource *source)=0
virtual void rotate(SkScalar degrees)=0
virtual void drawPaint()=0
virtual bool PrefersImpellerPaths() const
virtual void setDrawStyle(DlDrawStyle style)=0
virtual void drawTextBlob(const sk_sp< SkTextBlob > blob, SkScalar x, SkScalar y)=0
virtual void saveLayer(const SkRect &bounds, const SaveLayerOptions &options, uint32_t total_content_depth, DlBlendMode max_content_blend_mode, const DlImageFilter *backdrop=nullptr)
virtual void setBlendMode(DlBlendMode mode)=0
virtual 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)=0
virtual void setColor(DlColor color)=0
virtual void setInvertColors(bool invert)=0
virtual void setStrokeCap(DlStrokeCap cap)=0
Holds all of the data (both required and optional) for a DisplayList drawVertices call.
Definition: dl_vertices.h:71
Paths are lightweight objects that describe a collection of linear, quadratic, or cubic segments....
Definition: path.h:52
DlColor color
SkBitmap source
Definition: examples.cpp:28
float SkScalar
Definition: extension.cpp:12
gboolean invert
#define FML_UNREACHABLE()
Definition: logging.h:109
double y
double x
sk_sp< const SkImage > atlas
Definition: SkRecords.h:331
Optional< SkRect > bounds
Definition: SkRecords.h:189
sk_sp< const SkImage > image
Definition: SkRecords.h:269
sk_sp< const SkImageFilter > backdrop
Definition: SkRecords.h:191
SkRRect rrect
Definition: SkRecords.h:232
sk_sp< SkBlender > blender SkRect rect
Definition: SkRecords.h:350
PODArray< SkColor > colors
Definition: SkRecords.h:276
SkSamplingOptions sampling
Definition: SkRecords.h:337
impeller::Scalar DlScalar
DlStrokeJoin
Definition: dl_paint.h:37
DlStrokeCap
Definition: dl_paint.h:28
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 to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data vm service The hostname IP address on which the Dart VM Service should be served If not defaults to or::depending on whether ipv6 is specified vm service A custom Dart VM Service port The default is to pick a randomly available open port disable vm Disable the Dart VM Service The Dart VM Service is never available in release mode disable vm service Disable mDNS Dart VM Service publication Bind to the IPv6 localhost address for the Dart VM Service Ignored if vm service host is set endless trace Enable an endless trace buffer The default is a ring buffer This is useful when very old events need to viewed For during application launch Memory usage will continue to grow indefinitely however Start app with an specific route defined on the framework flutter assets Path to the Flutter assets directory enable service port Allow the VM service to fallback to automatic port selection if binding to a specified port fails trace Trace early application lifecycle Automatically switches to an endless trace buffer trace skia Filters out all Skia trace event categories except those that are specified in this comma separated list dump skp on shader Automatically dump the skp that triggers new shader compilations This is useful for writing custom ShaderWarmUp to reduce jank By this is not enabled to reduce the overhead purge persistent cache
Definition: switches.h:191
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
Definition: switches.h:57
DlDrawStyle
Definition: dl_paint.h:19
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
Definition: switches.h:228
dst
Definition: cp.py:12
flutter::DisplayList DisplayList
int32_t width
static SkString join(const CommandLineFlags::StringArray &)
Definition: skpbench.cpp:741
Definition: SkRect.h:32
bool operator==(const CacheablePath &other) const