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"
20#include "gtest/gtest.h"
25TEST(DisplayListImageFilter, LocalImageSkiaNull) {
31 ASSERT_EQ(
ToSk(dl_local_matrix_filter),
nullptr);
41TEST(DisplayListSkConversions, OpOrderPreMethodsVsMatrixMultiply) {
44 SkMatrix().preTranslate(0, 800).preRotate(-90, 0, 0);
49 SkPoint sk_result =
sk_matrix.mapPoint({10, 10});
51 EXPECT_FLOAT_EQ(sk_result.fX, dl_result.
x);
52 EXPECT_FLOAT_EQ(sk_result.fY, dl_result.
y);
65 sk_matrix_2.preConcat(SkMatrix::Translate(0, 800));
66 sk_matrix_2.preConcat(SkMatrix::RotateDeg(-90));
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);
78 EXPECT_FLOAT_EQ(sk_result_2.fX, dl_result_3.
x);
79 EXPECT_FLOAT_EQ(sk_result_2.fY, dl_result_3.
y);
82 EXPECT_FLOAT_EQ(dl_result_3.
x, dl_result.
x);
83 EXPECT_FLOAT_EQ(dl_result_3.
y, dl_result.
y);
94 EXPECT_FLOAT_EQ(dl_result_4.x, dl_result_2.x);
95 EXPECT_FLOAT_EQ(dl_result_4.y, dl_result_2.y);
112 auto const grey_hex_half_opaque = 0x7F999999;
114 SkColor(grey_hex_half_opaque));
116 SkColor4f::FromColor(grey_hex_half_opaque));
119TEST(DisplayListSkConversions, ToSkTileMode) {
126TEST(DisplayListSkConversions, ToSkBlurStyle) {
133TEST(DisplayListSkConversions, ToSkDrawStyle) {
137 SkPaint::Style::kStrokeAndFill_Style);
140TEST(DisplayListSkConversions, ToSkStrokeCap) {
146TEST(DisplayListSkConversions, ToSkStrokeJoin) {
152TEST(DisplayListSkConversions, ToSkVertexMode) {
154 SkVertices::VertexMode::kTriangles_VertexMode);
156 SkVertices::VertexMode::kTriangleStrip_VertexMode);
158 SkVertices::VertexMode::kTriangleFan_VertexMode);
161TEST(DisplayListSkConversions, ToSkFilterMode) {
167TEST(DisplayListSkConversions, ToSkSrcRectConstraint) {
169 SkCanvas::SrcRectConstraint::kFast_SrcRectConstraint);
171 SkCanvas::SrcRectConstraint::kStrict_SrcRectConstraint);
174TEST(DisplayListSkConversions, ToSkSamplingOptions) {
176 SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kNone));
178 SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kLinear));
180 SkSamplingOptions(SkFilterMode::kNearest, SkMipmapMode::kNone));
182 SkSamplingOptions(SkCubicResampler{1 / 3.0f, 1 / 3.0f}));
185#define FOR_EACH_BLEND_MODE_ENUM(FUNC) \
218TEST(DisplayListSkConversions, ToSkBlendMode) {
219#define CHECK_TO_SKENUM(V) ASSERT_EQ(ToSk(DlBlendMode::V), SkBlendMode::V);
221#undef CHECK_TO_SKENUM
224TEST(DisplayListSkConversions, BlendColorFilterModifiesTransparency) {
226 std::stringstream desc_str;
227 desc_str <<
"blend[" <<
static_cast<int>(
mode) <<
", " << color.argb()
229 std::string desc = desc_str.str();
231 auto srgb = SkColorSpace::MakeSRGB();
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(),
239 SkColors::kTransparent)
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(),
248 SkColors::kTransparent)
261#define TEST_MODE(V) test_mode(DlBlendMode::V);
266#undef FOR_EACH_BLEND_MODE_ENUM
268TEST(DisplayListSkConversions, ConvertWithZeroAndNegativeVerticesAndIndices) {
271 EXPECT_NE(vertices1,
nullptr);
272 EXPECT_EQ(
ToSk(vertices1),
nullptr);
276 EXPECT_NE(vertices2,
nullptr);
277 EXPECT_EQ(
ToSk(vertices2),
nullptr);
280TEST(DisplayListVertices, ConvertWithZeroAndNegativeVerticesAndIndices) {
284 std::shared_ptr<DlVertices> vertices1 = builder1.
build();
285 EXPECT_NE(vertices1,
nullptr);
286 EXPECT_EQ(
ToSk(vertices1),
nullptr);
291 std::shared_ptr<DlVertices> vertices2 = builder2.
build();
292 EXPECT_NE(vertices2,
nullptr);
293 EXPECT_EQ(
ToSk(vertices2),
nullptr);
296TEST(DisplayListColorSource, ConvertRuntimeEffect) {
298 SkRuntimeEffect::MakeForShader(
299 SkString(
"vec4 main(vec2 p) { return vec4(0); }"))
302 SkRuntimeEffect::MakeForShader(
303 SkString(
"vec4 main(vec2 p) { return vec4(1); }"))
310 nullptr, {}, std::make_shared<std::vector<uint8_t>>());
312 ASSERT_NE(
ToSk(source1),
nullptr);
313 ASSERT_NE(
ToSk(source2),
nullptr);
314 ASSERT_EQ(
ToSk(source3),
nullptr);
317TEST(DisplayListColorSource, ConvertRuntimeEffectWithNullSampler) {
319 SkRuntimeEffect::MakeForShader(
320 SkString(
"vec4 main(vec2 p) { return vec4(0); }"))
325 ASSERT_EQ(
ToSk(source1),
nullptr);
328TEST(DisplayListSkConversions, MatrixColorFilterModifiesTransparency) {
329 auto test_matrix = [](
int element, SkScalar
value) {
339 "matrix[" + std::to_string(element) +
"] = " + std::to_string(
value);
340 matrix[element] =
value;
343 auto sk_filter =
ToSk(filter);
344 auto srgb = SkColorSpace::MakeSRGB();
345 EXPECT_EQ(dl_filter ==
nullptr, sk_filter ==
nullptr);
347 sk_filter && sk_filter->filterColor4f(SkColors::kTransparent,
348 srgb.get(), srgb.get()) !=
349 SkColors::kTransparent);
355 for (
int i = 0;
i < 20;
i++) {
356 test_matrix(
i, -0.25);
358 test_matrix(
i, 0.25);
360 test_matrix(
i, 1.25);
361 test_matrix(
i, SK_ScalarNaN);
362 test_matrix(
i, SK_ScalarInfinity);
363 test_matrix(
i, -SK_ScalarInfinity);
367TEST(DisplayListSkConversions, ToSkDitheringEnabledForGradients) {
380 SkPaint sk_paint =
ToSk(dl_paint);
381 EXPECT_TRUE(sk_paint.isDither());
386 EXPECT_TRUE(sk_paint.isDither());
391 EXPECT_FALSE(sk_paint.isDither());
395TEST(DisplayListSkConversions, ToSkRSTransform) {
396 constexpr size_t kTransformCount = 4;
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),
413 auto sk_transforms =
ToSk(transforms);
414 for (
size_t i = 0;
i < kTransformCount;
i++) {
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;
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;
431 expected_transforms[
i].toQuad(20, 30, sk_quad);
433 transforms[
i].
GetQuad(20, 30, dl_quad);
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;
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)
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.
static constexpr Flags kNone
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.
#define CHECK_TO_SKENUM(V)
#define FOR_EACH_BLEND_MODE_ENUM(FUNC)
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
@ kButt
no stroke extension
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
constexpr bool ScalarNearlyEqual(Scalar x, Scalar y, Scalar tolerance=kEhCloseEnough)
static constexpr DlColor kWhite()
static constexpr DlColor kBlue()
static constexpr DlColor kBlack()
static constexpr DlColor kTransparent()
static constexpr DlColor kRed()
static constexpr DlColor kGreen()
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeTranslation(const Vector3 &t)
static Matrix MakeRotationZ(Radians r)