Flutter Engine
 
Loading...
Searching...
No Matches
dl_sk_conversions_unittests.cc
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
15#include "flutter/third_party/skia/include/core/SkColorSpace.h"
16#include "flutter/third_party/skia/include/core/SkSamplingOptions.h"
17#include "flutter/third_party/skia/include/core/SkTileMode.h"
18#include "flutter/third_party/skia/include/effects/SkRuntimeEffect.h"
19
20#include "gtest/gtest.h"
21
22namespace flutter {
23namespace testing {
24
25TEST(DisplayListImageFilter, LocalImageSkiaNull) {
26 auto blur_filter = DlImageFilter::MakeBlur(0, 0, DlTileMode::kClamp);
27 DlLocalMatrixImageFilter dl_local_matrix_filter(
28 DlMatrix::MakeRotationZ(DlDegrees(45)), blur_filter);
29 // With sigmas set to zero on the blur filter, Skia will return a null filter.
30 // The local matrix filter should return nullptr instead of crashing.
31 ASSERT_EQ(ToSk(dl_local_matrix_filter), nullptr);
32}
33
34// This test exists just to confirm and demonstrate how to convert existing
35// SkMatrix construction code into the same operations using the replacement
36// DlMatrix/impeller::Matrix objects.
37//
38// To be clear, it verifies:
39// SkMatrix.pre<Op>(data) is the same as DlMatrix * DlMatrix::Make<Op>(data).
40// SkMatrix1.preConcat(SkMatrix2) is the same as DlMatrix1 * DlMatrix2.
41TEST(DisplayListSkConversions, OpOrderPreMethodsVsMatrixMultiply) {
42 // If you have code like this...
43 const SkMatrix sk_matrix =
44 SkMatrix().preTranslate(0, 800).preRotate(-90, 0, 0);
45
46 // Convert it to math like this (same order as the pre<Op>() calls)...
47 const DlMatrix dl_matrix = DlMatrix::MakeTranslation({0, 800}) *
49 SkPoint sk_result = sk_matrix.mapPoint({10, 10});
50 DlPoint dl_result = dl_matrix * DlPoint(10, 10);
51 EXPECT_FLOAT_EQ(sk_result.fX, dl_result.x);
52 EXPECT_FLOAT_EQ(sk_result.fY, dl_result.y);
53
54 // Not like this...
55 const DlMatrix dl_matrix_2 = DlMatrix::MakeRotationZ(DlDegrees(-90)) *
57 DlPoint dl_result_2 = dl_matrix_2 * DlPoint(10, 10);
58 EXPECT_FALSE(impeller::ScalarNearlyEqual(sk_result.fX, dl_result_2.x));
59 EXPECT_FALSE(impeller::ScalarNearlyEqual(sk_result.fY, dl_result_2.y));
60
61 // -------------------------------------------------------------------
62
63 // And if you have this...
64 SkMatrix sk_matrix_2;
65 sk_matrix_2.preConcat(SkMatrix::Translate(0, 800));
66 sk_matrix_2.preConcat(SkMatrix::RotateDeg(-90));
67
68 // It's really the same as the above case, btw...
69 SkPoint sk_result_2 = sk_matrix_2.mapPoint({10, 10});
70 EXPECT_FLOAT_EQ(sk_result.fX, sk_result_2.fX);
71 EXPECT_FLOAT_EQ(sk_result.fY, sk_result_2.fY);
72
73 // Convert it to math like this (same order as the pre<Op>() calls)...
74 DlMatrix dl_matrix_3;
75 dl_matrix_3 = dl_matrix_3 * DlMatrix::MakeTranslation({0, 800});
76 dl_matrix_3 = dl_matrix_3 * DlMatrix::MakeRotationZ(DlDegrees(-90));
77 DlPoint dl_result_3 = dl_matrix_3 * DlPoint(10, 10);
78 EXPECT_FLOAT_EQ(sk_result_2.fX, dl_result_3.x);
79 EXPECT_FLOAT_EQ(sk_result_2.fY, dl_result_3.y);
80
81 // Which is also the same result as the first case above...
82 EXPECT_FLOAT_EQ(dl_result_3.x, dl_result.x);
83 EXPECT_FLOAT_EQ(dl_result_3.y, dl_result.y);
84
85 // Not like this...
86 DlMatrix dl_matrix_4;
87 dl_matrix_4 = dl_matrix_4 * DlMatrix::MakeRotationZ(DlDegrees(-90));
88 dl_matrix_4 = dl_matrix_4 * DlMatrix::MakeTranslation({0, 800});
89 DlPoint dl_result_4 = dl_matrix_4 * DlPoint(10, 10);
90 EXPECT_FALSE(impeller::ScalarNearlyEqual(sk_result_2.fX, dl_result_4.x));
91 EXPECT_FALSE(impeller::ScalarNearlyEqual(sk_result_2.fY, dl_result_4.y));
92
93 // Which is also the same result as the second case above...
94 EXPECT_FLOAT_EQ(dl_result_4.x, dl_result_2.x);
95 EXPECT_FLOAT_EQ(dl_result_4.y, dl_result_2.y);
96}
97
98TEST(DisplayListSkConversions, ToSkColor) {
99 // Red
100 ASSERT_EQ(ToSkColor(DlColor::kRed()), SK_ColorRED);
101 ASSERT_EQ(ToSkColor4f(DlColor::kRed()), SkColors::kRed);
102
103 // Green
104 ASSERT_EQ(ToSkColor(DlColor::kGreen()), SK_ColorGREEN);
105 ASSERT_EQ(ToSkColor4f(DlColor::kGreen()), SkColors::kGreen);
106
107 // Blue
108 ASSERT_EQ(ToSkColor(DlColor::kBlue()), SK_ColorBLUE);
109 ASSERT_EQ(ToSkColor4f(DlColor::kBlue()), SkColors::kBlue);
110
111 // Half transparent grey
112 auto const grey_hex_half_opaque = 0x7F999999;
113 ASSERT_EQ(ToSkColor(DlColor(grey_hex_half_opaque)),
114 SkColor(grey_hex_half_opaque));
115 ASSERT_EQ(ToSkColor4f(DlColor(grey_hex_half_opaque)),
116 SkColor4f::FromColor(grey_hex_half_opaque));
117}
118
119TEST(DisplayListSkConversions, ToSkTileMode) {
120 ASSERT_EQ(ToSk(DlTileMode::kClamp), SkTileMode::kClamp);
121 ASSERT_EQ(ToSk(DlTileMode::kRepeat), SkTileMode::kRepeat);
122 ASSERT_EQ(ToSk(DlTileMode::kMirror), SkTileMode::kMirror);
123 ASSERT_EQ(ToSk(DlTileMode::kDecal), SkTileMode::kDecal);
124}
125
126TEST(DisplayListSkConversions, ToSkBlurStyle) {
127 ASSERT_EQ(ToSk(DlBlurStyle::kInner), SkBlurStyle::kInner_SkBlurStyle);
128 ASSERT_EQ(ToSk(DlBlurStyle::kOuter), SkBlurStyle::kOuter_SkBlurStyle);
129 ASSERT_EQ(ToSk(DlBlurStyle::kSolid), SkBlurStyle::kSolid_SkBlurStyle);
130 ASSERT_EQ(ToSk(DlBlurStyle::kNormal), SkBlurStyle::kNormal_SkBlurStyle);
131}
132
133TEST(DisplayListSkConversions, ToSkDrawStyle) {
134 ASSERT_EQ(ToSk(DlDrawStyle::kFill), SkPaint::Style::kFill_Style);
135 ASSERT_EQ(ToSk(DlDrawStyle::kStroke), SkPaint::Style::kStroke_Style);
137 SkPaint::Style::kStrokeAndFill_Style);
138}
139
140TEST(DisplayListSkConversions, ToSkStrokeCap) {
141 ASSERT_EQ(ToSk(DlStrokeCap::kButt), SkPaint::Cap::kButt_Cap);
142 ASSERT_EQ(ToSk(DlStrokeCap::kRound), SkPaint::Cap::kRound_Cap);
143 ASSERT_EQ(ToSk(DlStrokeCap::kSquare), SkPaint::Cap::kSquare_Cap);
144}
145
146TEST(DisplayListSkConversions, ToSkStrokeJoin) {
147 ASSERT_EQ(ToSk(DlStrokeJoin::kMiter), SkPaint::Join::kMiter_Join);
148 ASSERT_EQ(ToSk(DlStrokeJoin::kRound), SkPaint::Join::kRound_Join);
149 ASSERT_EQ(ToSk(DlStrokeJoin::kBevel), SkPaint::Join::kBevel_Join);
150}
151
152TEST(DisplayListSkConversions, ToSkVertexMode) {
154 SkVertices::VertexMode::kTriangles_VertexMode);
156 SkVertices::VertexMode::kTriangleStrip_VertexMode);
158 SkVertices::VertexMode::kTriangleFan_VertexMode);
159}
160
161TEST(DisplayListSkConversions, ToSkFilterMode) {
162 ASSERT_EQ(ToSk(DlFilterMode::kLinear), SkFilterMode::kLinear);
163 ASSERT_EQ(ToSk(DlFilterMode::kNearest), SkFilterMode::kNearest);
164 ASSERT_EQ(ToSk(DlFilterMode::kLast), SkFilterMode::kLast);
165}
166
167TEST(DisplayListSkConversions, ToSkSrcRectConstraint) {
169 SkCanvas::SrcRectConstraint::kFast_SrcRectConstraint);
171 SkCanvas::SrcRectConstraint::kStrict_SrcRectConstraint);
172}
173
174TEST(DisplayListSkConversions, ToSkSamplingOptions) {
176 SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kNone));
178 SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kLinear));
180 SkSamplingOptions(SkFilterMode::kNearest, SkMipmapMode::kNone));
181 ASSERT_EQ(ToSk(DlImageSampling::kCubic),
182 SkSamplingOptions(SkCubicResampler{1 / 3.0f, 1 / 3.0f}));
183}
184
185#define FOR_EACH_BLEND_MODE_ENUM(FUNC) \
186 FUNC(kSrc) \
187 FUNC(kClear) \
188 FUNC(kSrc) \
189 FUNC(kDst) \
190 FUNC(kSrcOver) \
191 FUNC(kDstOver) \
192 FUNC(kSrcIn) \
193 FUNC(kDstIn) \
194 FUNC(kSrcOut) \
195 FUNC(kDstOut) \
196 FUNC(kSrcATop) \
197 FUNC(kDstATop) \
198 FUNC(kXor) \
199 FUNC(kPlus) \
200 FUNC(kModulate) \
201 FUNC(kScreen) \
202 FUNC(kOverlay) \
203 FUNC(kDarken) \
204 FUNC(kLighten) \
205 FUNC(kColorDodge) \
206 FUNC(kColorBurn) \
207 FUNC(kHardLight) \
208 FUNC(kSoftLight) \
209 FUNC(kDifference) \
210 FUNC(kExclusion) \
211 FUNC(kMultiply) \
212 FUNC(kHue) \
213 FUNC(kSaturation) \
214 FUNC(kColor) \
215 FUNC(kLuminosity) \
216 FUNC(kLastMode)
217
218TEST(DisplayListSkConversions, ToSkBlendMode) {
219#define CHECK_TO_SKENUM(V) ASSERT_EQ(ToSk(DlBlendMode::V), SkBlendMode::V);
221#undef CHECK_TO_SKENUM
222}
223
224TEST(DisplayListSkConversions, BlendColorFilterModifiesTransparency) {
225 auto test_mode_color = [](DlBlendMode mode, DlColor color) {
226 std::stringstream desc_str;
227 desc_str << "blend[" << static_cast<int>(mode) << ", " << color.argb()
228 << "]";
229 std::string desc = desc_str.str();
230 DlBlendColorFilter filter(color, mode);
231 auto srgb = SkColorSpace::MakeSRGB();
232 if (filter.modifies_transparent_black()) {
233 auto dl_filter = DlColorFilter::MakeBlend(color, mode);
234 auto sk_filter = ToSk(filter);
235 ASSERT_NE(dl_filter, nullptr) << desc;
236 ASSERT_NE(sk_filter, nullptr) << desc;
237 ASSERT_TRUE(sk_filter->filterColor4f(SkColors::kTransparent, srgb.get(),
238 srgb.get()) !=
239 SkColors::kTransparent)
240 << desc;
241 } else {
242 auto dl_filter = DlColorFilter::MakeBlend(color, mode);
243 auto sk_filter = ToSk(filter);
244 EXPECT_EQ(dl_filter == nullptr, sk_filter == nullptr) << desc;
245 ASSERT_TRUE(sk_filter == nullptr ||
246 sk_filter->filterColor4f(SkColors::kTransparent, srgb.get(),
247 srgb.get()) ==
248 SkColors::kTransparent)
249 << desc;
250 }
251 };
252
253 auto test_mode = [&test_mode_color](DlBlendMode mode) {
254 test_mode_color(mode, DlColor::kTransparent());
255 test_mode_color(mode, DlColor::kWhite());
256 test_mode_color(mode, DlColor::kWhite().modulateOpacity(0.5));
257 test_mode_color(mode, DlColor::kBlack());
258 test_mode_color(mode, DlColor::kBlack().modulateOpacity(0.5));
259 };
260
261#define TEST_MODE(V) test_mode(DlBlendMode::V);
263#undef TEST_MODE
264}
265
266#undef FOR_EACH_BLEND_MODE_ENUM
267
268TEST(DisplayListSkConversions, ConvertWithZeroAndNegativeVerticesAndIndices) {
269 std::shared_ptr<DlVertices> vertices1 = DlVertices::Make(
270 DlVertexMode::kTriangles, 0, nullptr, nullptr, nullptr, 0, nullptr);
271 EXPECT_NE(vertices1, nullptr);
272 EXPECT_EQ(ToSk(vertices1), nullptr);
273
274 std::shared_ptr<DlVertices> vertices2 = DlVertices::Make(
275 DlVertexMode::kTriangles, -1, nullptr, nullptr, nullptr, -1, nullptr);
276 EXPECT_NE(vertices2, nullptr);
277 EXPECT_EQ(ToSk(vertices2), nullptr);
278}
279
280TEST(DisplayListVertices, ConvertWithZeroAndNegativeVerticesAndIndices) {
283 EXPECT_TRUE(builder1.is_valid());
284 std::shared_ptr<DlVertices> vertices1 = builder1.build();
285 EXPECT_NE(vertices1, nullptr);
286 EXPECT_EQ(ToSk(vertices1), nullptr);
287
290 EXPECT_TRUE(builder2.is_valid());
291 std::shared_ptr<DlVertices> vertices2 = builder2.build();
292 EXPECT_NE(vertices2, nullptr);
293 EXPECT_EQ(ToSk(vertices2), nullptr);
294}
295
296TEST(DisplayListColorSource, ConvertRuntimeEffect) {
297 const sk_sp<DlRuntimeEffect> kTestRuntimeEffect1 = DlRuntimeEffectSkia::Make(
298 SkRuntimeEffect::MakeForShader(
299 SkString("vec4 main(vec2 p) { return vec4(0); }"))
300 .effect);
301 const sk_sp<DlRuntimeEffect> kTestRuntimeEffect2 = DlRuntimeEffectSkia::Make(
302 SkRuntimeEffect::MakeForShader(
303 SkString("vec4 main(vec2 p) { return vec4(1); }"))
304 .effect);
305 std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeRuntimeEffect(
306 kTestRuntimeEffect1, {}, std::make_shared<std::vector<uint8_t>>());
307 std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRuntimeEffect(
308 kTestRuntimeEffect2, {}, std::make_shared<std::vector<uint8_t>>());
309 std::shared_ptr<DlColorSource> source3 = DlColorSource::MakeRuntimeEffect(
310 nullptr, {}, std::make_shared<std::vector<uint8_t>>());
311
312 ASSERT_NE(ToSk(source1), nullptr);
313 ASSERT_NE(ToSk(source2), nullptr);
314 ASSERT_EQ(ToSk(source3), nullptr);
315}
316
317TEST(DisplayListColorSource, ConvertRuntimeEffectWithNullSampler) {
318 const sk_sp<DlRuntimeEffect> kTestRuntimeEffect1 = DlRuntimeEffectSkia::Make(
319 SkRuntimeEffect::MakeForShader(
320 SkString("vec4 main(vec2 p) { return vec4(0); }"))
321 .effect);
322 std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeRuntimeEffect(
323 kTestRuntimeEffect1, {nullptr}, std::make_shared<std::vector<uint8_t>>());
324
325 ASSERT_EQ(ToSk(source1), nullptr);
326}
327
328TEST(DisplayListSkConversions, MatrixColorFilterModifiesTransparency) {
329 auto test_matrix = [](int element, SkScalar value) {
330 // clang-format off
331 float matrix[] = {
332 1, 0, 0, 0, 0,
333 0, 1, 0, 0, 0,
334 0, 0, 1, 0, 0,
335 0, 0, 0, 1, 0,
336 };
337 // clang-format on
338 std::string desc =
339 "matrix[" + std::to_string(element) + "] = " + std::to_string(value);
340 matrix[element] = value;
341 DlMatrixColorFilter filter(matrix);
342 auto dl_filter = DlColorFilter::MakeMatrix(matrix);
343 auto sk_filter = ToSk(filter);
344 auto srgb = SkColorSpace::MakeSRGB();
345 EXPECT_EQ(dl_filter == nullptr, sk_filter == nullptr);
346 EXPECT_EQ(filter.modifies_transparent_black(),
347 sk_filter && sk_filter->filterColor4f(SkColors::kTransparent,
348 srgb.get(), srgb.get()) !=
349 SkColors::kTransparent);
350 };
351
352 // Tests identity (matrix[0] already == 1 in an identity filter)
353 test_matrix(0, 1);
354 // test_matrix(19, 1);
355 for (int i = 0; i < 20; i++) {
356 test_matrix(i, -0.25);
357 test_matrix(i, 0);
358 test_matrix(i, 0.25);
359 test_matrix(i, 1);
360 test_matrix(i, 1.25);
361 test_matrix(i, SK_ScalarNaN);
362 test_matrix(i, SK_ScalarInfinity);
363 test_matrix(i, -SK_ScalarInfinity);
364 }
365}
366
367TEST(DisplayListSkConversions, ToSkDitheringEnabledForGradients) {
368 // Test that when using the utility method "ToSk", the resulting SkPaint
369 // has "isDither" set to true, if the paint is a gradient, because it's
370 // a supported feature in the Impeller backend.
371
372 DlPaint dl_paint;
373
374 // Set the paint to be a gradient.
376 DlPoint(0, 0), DlPoint(100, 100), 0,
377 std::array<DlColor, 1>{DlColor(0)}.data(), 0, DlTileMode::kClamp));
378
379 {
380 SkPaint sk_paint = ToSk(dl_paint);
381 EXPECT_TRUE(sk_paint.isDither());
382 }
383
384 {
385 SkPaint sk_paint = ToStrokedSk(dl_paint);
386 EXPECT_TRUE(sk_paint.isDither());
387 }
388
389 {
390 SkPaint sk_paint = ToNonShaderSk(dl_paint);
391 EXPECT_FALSE(sk_paint.isDither());
392 }
393}
394
395TEST(DisplayListSkConversions, ToSkRSTransform) {
396 constexpr size_t kTransformCount = 4;
397 DlRSTransform transforms[kTransformCount] = {
398 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(0)),
399 DlRSTransform::Make({12.25f, 14.75f}, 10.0f, DlDegrees(30)),
400 DlRSTransform::Make({-10.4f, 8.25f}, 11.0f, DlDegrees(400)),
401 DlRSTransform::Make({1.0f, 3.0f}, 0.5f, DlDegrees(45)),
402 };
403 SkRSXform expected_transforms[kTransformCount] = {
404 SkRSXform::MakeFromRadians(1.0f, SkDegreesToRadians(0), //
405 0.0f, 0.0f, 0.0f, 0.0f),
406 SkRSXform::MakeFromRadians(10.0f, SkDegreesToRadians(30), //
407 12.25f, 14.75f, 0.0f, 0.0f),
408 SkRSXform::MakeFromRadians(11.0f, SkDegreesToRadians(400), //
409 -10.4f, 8.25f, 0.0f, 0.0f),
410 SkRSXform::MakeFromRadians(0.5f, SkDegreesToRadians(45), //
411 1.0f, 3.0f, 0.0f, 0.0f),
412 };
413 auto sk_transforms = ToSk(transforms);
414 for (size_t i = 0; i < kTransformCount; i++) {
415 // Comparing dl values to transformed copy values
416 // should match exactly because arrays were simply aliased
417 EXPECT_EQ(sk_transforms[i].fSCos, transforms[i].scaled_cos) << i;
418 EXPECT_EQ(sk_transforms[i].fSSin, transforms[i].scaled_sin) << i;
419 EXPECT_EQ(sk_transforms[i].fTx, transforms[i].translate_x) << i;
420 EXPECT_EQ(sk_transforms[i].fTy, transforms[i].translate_y) << i;
421
422 // Comparing dl values to computed Skia values
423 // should match closely, but not exactly due to differences in trig
424 EXPECT_FLOAT_EQ(sk_transforms[i].fSCos, expected_transforms[i].fSCos) << i;
425 EXPECT_FLOAT_EQ(sk_transforms[i].fSSin, expected_transforms[i].fSSin) << i;
426 EXPECT_EQ(sk_transforms[i].fTx, expected_transforms[i].fTx) << i;
427 EXPECT_EQ(sk_transforms[i].fTy, expected_transforms[i].fTy) << i;
428
429 // Comparing the results of transforming a sprite with Skia vs Impeller
430 SkPoint sk_quad[4];
431 expected_transforms[i].toQuad(20, 30, sk_quad);
432 DlQuad dl_quad;
433 transforms[i].GetQuad(20, 30, dl_quad);
434 // Skia order is UL,UR,LR,LL, Impeller order is UL,UR,LL,LR
435 EXPECT_FLOAT_EQ(sk_quad[0].fX, dl_quad[0].x) << i;
436 EXPECT_FLOAT_EQ(sk_quad[0].fY, dl_quad[0].y) << i;
437 EXPECT_FLOAT_EQ(sk_quad[1].fX, dl_quad[1].x) << i;
438 EXPECT_FLOAT_EQ(sk_quad[1].fY, dl_quad[1].y) << i;
439 EXPECT_FLOAT_EQ(sk_quad[2].fX, dl_quad[3].x) << i;
440 EXPECT_FLOAT_EQ(sk_quad[2].fY, dl_quad[3].y) << i;
441 EXPECT_FLOAT_EQ(sk_quad[3].fX, dl_quad[2].x) << i;
442 EXPECT_FLOAT_EQ(sk_quad[3].fY, dl_quad[2].y) << i;
443 }
444}
445
446} // namespace testing
447} // namespace flutter
bool modifies_transparent_black() const override
static std::shared_ptr< const DlColorFilter > MakeBlend(DlColor color, DlBlendMode mode)
static std::shared_ptr< const DlColorFilter > MakeMatrix(const float matrix[20])
static std::shared_ptr< DlColorSource > MakeLinear(const DlPoint start_point, const DlPoint end_point, uint32_t stop_count, const DlColor *colors, const float *stops, DlTileMode tile_mode, const DlMatrix *matrix=nullptr)
static std::shared_ptr< DlColorSource > MakeRuntimeEffect(sk_sp< DlRuntimeEffect > runtime_effect, std::vector< std::shared_ptr< DlColorSource > > samplers, std::shared_ptr< std::vector< uint8_t > > uniform_data)
static std::shared_ptr< DlImageFilter > MakeBlur(DlScalar sigma_x, DlScalar sigma_y, DlTileMode tile_mode)
bool modifies_transparent_black() const override
DlPaint & setColorSource(std::nullptr_t source)
Definition dl_paint.h:131
static sk_sp< DlRuntimeEffect > Make(const sk_sp< SkRuntimeEffect > &runtime_effect)
A utility class to build up a |DlVertices| object one set of data at a time.
Definition dl_vertices.h:73
static constexpr Flags kNone
Definition dl_vertices.h:94
bool is_valid() const
Returns true iff the underlying object was successfully allocated.
std::shared_ptr< DlVertices > build()
Finalizes and the constructed DlVertices object.
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.
int32_t value
int32_t x
#define CHECK_TO_SKENUM(V)
#define FOR_EACH_BLEND_MODE_ENUM(FUNC)
#define TEST_MODE(V)
SkMatrix sk_matrix
double y
static const sk_sp< DlRuntimeEffect > kTestRuntimeEffect1
static const sk_sp< DlRuntimeEffect > kTestRuntimeEffect2
TEST(NativeAssetsManagerTest, NoAvailableAssets)
SkPaint ToSk(const DlPaint &paint)
@ kMiter
extends to miter limit
@ kBevel
connects outside edges
@ kRound
adds circle
@ kButt
no stroke extension
@ kSquare
adds square
impeller::Degrees DlDegrees
SkColor ToSkColor(DlColor color)
SkPaint ToStrokedSk(const DlPaint &paint)
SkColor4f ToSkColor4f(DlColor color)
@ kTriangles
The vertices are taken 3 at a time to form a triangle.
SkPaint ToNonShaderSk(const DlPaint &paint)
@ 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
@ kNormal
fuzzy inside and outside
@ kOuter
nothing inside, fuzzy outside
@ kInner
fuzzy inside, nothing outside
@ kSolid
solid inside, fuzzy outside
impeller::Quad DlQuad
impeller::Point DlPoint
BlendMode
Definition color.h:58
constexpr bool ScalarNearlyEqual(Scalar x, Scalar y, Scalar tolerance=kEhCloseEnough)
Definition scalar.h:36
static constexpr DlColor kWhite()
Definition dl_color.h:70
static constexpr DlColor kBlue()
Definition dl_color.h:73
static constexpr DlColor kBlack()
Definition dl_color.h:69
static constexpr DlColor kTransparent()
Definition dl_color.h:68
static constexpr DlColor kRed()
Definition dl_color.h:71
static constexpr DlColor kGreen()
Definition dl_color.h:72
A 4x4 matrix using column-major storage.
Definition matrix.h:37
static constexpr Matrix MakeTranslation(const Vector3 &t)
Definition matrix.h:95
static Matrix MakeRotationZ(Radians r)
Definition matrix.h:223
static RSTransform Make(Point origin, Scalar scale, Radians radians)
Definition rstransform.h:38
void GetQuad(Scalar width, Scalar height, Quad &quad) const