blob: 5c9a62abd8697eecf1805297ffe5f3db71868a70 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <memory>
#include <vector>
#include "flutter/display_list/display_list_attributes_testing.h"
#include "flutter/display_list/display_list_builder.h"
#include "flutter/display_list/display_list_color_source.h"
#include "flutter/display_list/display_list_image.h"
#include "flutter/display_list/display_list_runtime_effect.h"
#include "flutter/display_list/display_list_sampling_options.h"
#include "flutter/display_list/types.h"
#include "third_party/skia/include/core/SkString.h"
#include "third_party/skia/include/core/SkSurface.h"
namespace flutter {
namespace testing {
static sk_sp<DlImage> MakeTestImage(int w, int h, SkColor color) {
sk_sp<SkSurface> surface;
if (SkColorGetA(color) < 255) {
surface = SkSurface::MakeRasterN32Premul(w, h);
} else {
SkImageInfo info =
SkImageInfo::MakeN32(w, h, SkAlphaType::kOpaque_SkAlphaType);
surface = SkSurface::MakeRaster(info);
}
SkCanvas* canvas = surface->getCanvas();
canvas->drawColor(color);
return DlImage::Make(surface->makeImageSnapshot());
}
static const sk_sp<DlRuntimeEffect> kTestRuntimeEffect1 =
DlRuntimeEffect::MakeSkia(
SkRuntimeEffect::MakeForShader(
SkString("vec4 main(vec2 p) { return vec4(0); }"))
.effect);
static const sk_sp<DlRuntimeEffect> kTestRuntimeEffect2 =
DlRuntimeEffect::MakeSkia(
SkRuntimeEffect::MakeForShader(
SkString("vec4 main(vec2 p) { return vec4(1); }"))
.effect);
static const sk_sp<DlImage> kTestImage1 = MakeTestImage(10, 10, SK_ColorGREEN);
static const sk_sp<DlImage> kTestAlphaImage1 =
MakeTestImage(10, 10, SK_ColorTRANSPARENT);
// clang-format off
static const SkMatrix kTestMatrix1 =
SkMatrix::MakeAll(2, 0, 10,
0, 3, 12,
0, 0, 1);
static const SkMatrix kTestMatrix2 =
SkMatrix::MakeAll(4, 0, 15,
0, 7, 17,
0, 0, 1);
// clang-format on
static constexpr int kTestStopCount = 3;
static constexpr DlColor kTestColors[kTestStopCount] = {
DlColor::kRed(),
DlColor::kGreen(),
DlColor::kBlue(),
};
static const DlColor kTestAlphaColors[kTestStopCount] = {
DlColor::kBlue().withAlpha(0x7F),
DlColor::kRed().withAlpha(0x2F),
DlColor::kGreen().withAlpha(0xCF),
};
static constexpr float kTestStops[kTestStopCount] = {
0.0f,
0.7f,
1.0f,
};
static constexpr float kTestStops2[kTestStopCount] = {
0.0f,
0.3f,
1.0f,
};
static constexpr SkPoint kTestPoints[2] = {
SkPoint::Make(5, 15),
SkPoint::Make(7, 18),
};
static constexpr SkPoint kTestPoints2[2] = {
SkPoint::Make(100, 115),
SkPoint::Make(107, 118),
};
static const sk_sp<SkShader> kShaderA = SkShaders::Color(SK_ColorRED);
static const sk_sp<SkShader> kShaderB = SkShaders::Color(SK_ColorBLUE);
static const sk_sp<SkShader> kTestUnknownShader =
SkShaders::Blend(SkBlendMode::kOverlay, kShaderA, kShaderB);
static const sk_sp<SkShader> kTestAlphaUnknownShader =
SkShaders::Blend(SkBlendMode::kDstOut, kShaderA, kShaderB);
TEST(DisplayListColorSource, BuilderSetGet) {
DlImageColorSource source(kTestImage1, DlTileMode::kClamp, DlTileMode::kClamp,
DlImageSampling::kLinear, &kTestMatrix1);
DisplayListBuilder builder;
ASSERT_EQ(builder.getColorSource(), nullptr);
builder.setColorSource(&source);
ASSERT_NE(builder.getColorSource(), nullptr);
ASSERT_TRUE(
Equals(builder.getColorSource(), static_cast<DlColorSource*>(&source)));
builder.setColorSource(nullptr);
ASSERT_EQ(builder.getColorSource(), nullptr);
}
TEST(DisplayListColorSource, FromSkiaNullShader) {
std::shared_ptr<DlColorSource> source = DlColorSource::From(nullptr);
ASSERT_EQ(source, nullptr);
ASSERT_EQ(source.get(), nullptr);
}
TEST(DisplayListColorSource, FromSkiaColorShader) {
// We cannot read back the matrix parameter from a Skia LinearGradient
// so we conservatively use an UnknownColorSource wrapper so as to not
// lose any data. Note that the Skia Color shader end is read back from
// the Skia asAGradient() method so while this type of color source
// does not really need the matrix, we represent all of the gradient
// sources using an unknown source.
// Note that this shader should never really happen in practice as it
// represents a degenerate gradient that collapsed to a single color.
sk_sp<SkShader> shader = SkShaders::Color(SK_ColorBLUE);
std::shared_ptr<DlColorSource> source = DlColorSource::From(shader);
ASSERT_EQ(source->type(), DlColorSourceType::kUnknown);
ASSERT_EQ(source->skia_object(), shader);
ASSERT_EQ(source->asColor(), nullptr);
ASSERT_EQ(source->asImage(), nullptr);
ASSERT_EQ(source->asLinearGradient(), nullptr);
ASSERT_EQ(source->asRadialGradient(), nullptr);
ASSERT_EQ(source->asConicalGradient(), nullptr);
ASSERT_EQ(source->asSweepGradient(), nullptr);
}
TEST(DisplayListColorSource, FromSkiaImageShader) {
sk_sp<SkShader> shader = kTestImage1->skia_image()->makeShader(
ToSk(DlImageSampling::kLinear), &kTestMatrix1);
std::shared_ptr<DlColorSource> source = DlColorSource::From(shader);
DlImageColorSource dl_source(kTestImage1, DlTileMode::kClamp,
DlTileMode::kClamp, DlImageSampling::kLinear,
&kTestMatrix1);
ASSERT_EQ(source->type(), DlColorSourceType::kImage);
ASSERT_EQ(*source->asImage(), dl_source);
ASSERT_TRUE(source->asImage()->image()->Equals(kTestImage1));
ASSERT_TRUE(kTestImage1->Equals(source->asImage()->image()));
ASSERT_EQ(source->asImage()->matrix(), kTestMatrix1);
ASSERT_EQ(source->asImage()->horizontal_tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asImage()->vertical_tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asImage()->sampling(), DlImageSampling::kLinear);
ASSERT_EQ(source->asColor(), nullptr);
ASSERT_EQ(source->asLinearGradient(), nullptr);
ASSERT_EQ(source->asRadialGradient(), nullptr);
ASSERT_EQ(source->asConicalGradient(), nullptr);
ASSERT_EQ(source->asSweepGradient(), nullptr);
ASSERT_EQ(source->asRuntimeEffect(), nullptr);
}
TEST(DisplayListColorSource, FromSkiaLinearGradient) {
// We cannot read back the matrix parameter from a Skia LinearGradient
// so we conservatively use an UnknownColorSource wrapper so as to not
// lose any data.
const SkColor* sk_colors = reinterpret_cast<const SkColor*>(kTestColors);
sk_sp<SkShader> shader = SkGradientShader::MakeLinear(
kTestPoints, sk_colors, kTestStops, kTestStopCount, SkTileMode::kClamp);
std::shared_ptr<DlColorSource> source = DlColorSource::From(shader);
ASSERT_EQ(source->type(), DlColorSourceType::kUnknown);
ASSERT_EQ(source->skia_object(), shader);
ASSERT_EQ(source->asColor(), nullptr);
ASSERT_EQ(source->asImage(), nullptr);
ASSERT_EQ(source->asLinearGradient(), nullptr);
ASSERT_EQ(source->asRadialGradient(), nullptr);
ASSERT_EQ(source->asConicalGradient(), nullptr);
ASSERT_EQ(source->asSweepGradient(), nullptr);
}
TEST(DisplayListColorSource, FromSkiaRadialGradient) {
// We cannot read back the matrix parameter from a Skia RadialGradient
// so we conservatively use an UnknownColorSource wrapper so as to not
// lose any data.
const SkColor* sk_colors = reinterpret_cast<const SkColor*>(kTestColors);
sk_sp<SkShader> shader =
SkGradientShader::MakeRadial(kTestPoints[0], 10.0, sk_colors, kTestStops,
kTestStopCount, SkTileMode::kClamp);
std::shared_ptr<DlColorSource> source = DlColorSource::From(shader);
ASSERT_EQ(source->type(), DlColorSourceType::kUnknown);
ASSERT_EQ(source->skia_object(), shader);
ASSERT_EQ(source->asColor(), nullptr);
ASSERT_EQ(source->asImage(), nullptr);
ASSERT_EQ(source->asLinearGradient(), nullptr);
ASSERT_EQ(source->asRadialGradient(), nullptr);
ASSERT_EQ(source->asConicalGradient(), nullptr);
ASSERT_EQ(source->asSweepGradient(), nullptr);
ASSERT_EQ(source->asRuntimeEffect(), nullptr);
}
TEST(DisplayListColorSource, FromSkiaConicalGradient) {
// We cannot read back the matrix parameter from a Skia ConicalGradient
// so we conservatively use an UnknownColorSource wrapper so as to not
// lose any data.
const SkColor* sk_colors = reinterpret_cast<const SkColor*>(kTestColors);
sk_sp<SkShader> shader = SkGradientShader::MakeTwoPointConical(
kTestPoints[0], 10.0, kTestPoints[1], 20.0, sk_colors, kTestStops,
kTestStopCount, SkTileMode::kClamp);
std::shared_ptr<DlColorSource> source = DlColorSource::From(shader);
ASSERT_EQ(source->type(), DlColorSourceType::kUnknown);
ASSERT_EQ(source->skia_object(), shader);
ASSERT_EQ(source->asColor(), nullptr);
ASSERT_EQ(source->asImage(), nullptr);
ASSERT_EQ(source->asLinearGradient(), nullptr);
ASSERT_EQ(source->asRadialGradient(), nullptr);
ASSERT_EQ(source->asConicalGradient(), nullptr);
ASSERT_EQ(source->asSweepGradient(), nullptr);
ASSERT_EQ(source->asRuntimeEffect(), nullptr);
}
TEST(DisplayListColorSource, FromSkiaSweepGradient) {
// We cannot read back the matrix parameter, nor the sweep parameters from a
// Skia SweepGradient so we conservatively use an UnknownColorSource wrapper
// so as to not lose any data.
const SkColor* sk_colors = reinterpret_cast<const SkColor*>(kTestColors);
sk_sp<SkShader> shader =
SkGradientShader::MakeSweep(kTestPoints[0].fX, kTestPoints[0].fY,
sk_colors, kTestStops, kTestStopCount);
std::shared_ptr<DlColorSource> source = DlColorSource::From(shader);
ASSERT_EQ(source->type(), DlColorSourceType::kUnknown);
ASSERT_EQ(source->skia_object(), shader);
ASSERT_EQ(source->asColor(), nullptr);
ASSERT_EQ(source->asImage(), nullptr);
ASSERT_EQ(source->asLinearGradient(), nullptr);
ASSERT_EQ(source->asRadialGradient(), nullptr);
ASSERT_EQ(source->asConicalGradient(), nullptr);
ASSERT_EQ(source->asSweepGradient(), nullptr);
ASSERT_EQ(source->asRuntimeEffect(), nullptr);
}
TEST(DisplayListColorSource, FromSkiaUnrecognizedShader) {
std::shared_ptr<DlColorSource> source =
DlColorSource::From(kTestUnknownShader);
ASSERT_EQ(source->type(), DlColorSourceType::kUnknown);
ASSERT_EQ(source->skia_object(), kTestUnknownShader);
ASSERT_EQ(source->asColor(), nullptr);
ASSERT_EQ(source->asImage(), nullptr);
ASSERT_EQ(source->asLinearGradient(), nullptr);
ASSERT_EQ(source->asRadialGradient(), nullptr);
ASSERT_EQ(source->asConicalGradient(), nullptr);
ASSERT_EQ(source->asSweepGradient(), nullptr);
ASSERT_EQ(source->asRuntimeEffect(), nullptr);
}
TEST(DisplayListColorSource, ColorConstructor) {
DlColorColorSource source(SK_ColorRED);
}
TEST(DisplayListColorSource, ColorShared) {
DlColorColorSource source(SK_ColorRED);
ASSERT_NE(source.shared().get(), &source);
ASSERT_EQ(*source.shared(), source);
}
TEST(DisplayListColorSource, ColorAsColor) {
DlColorColorSource source(SK_ColorRED);
ASSERT_NE(source.asColor(), nullptr);
ASSERT_EQ(source.asColor(), &source);
ASSERT_EQ(source.asImage(), nullptr);
ASSERT_EQ(source.asLinearGradient(), nullptr);
ASSERT_EQ(source.asRadialGradient(), nullptr);
ASSERT_EQ(source.asConicalGradient(), nullptr);
ASSERT_EQ(source.asSweepGradient(), nullptr);
ASSERT_EQ(source.asRuntimeEffect(), nullptr);
}
TEST(DisplayListColorSource, ColorContents) {
DlColorColorSource source(SK_ColorRED);
ASSERT_EQ(source.color(), SK_ColorRED);
ASSERT_EQ(source.is_opaque(), true);
for (int i = 0; i < 255; i++) {
SkColor alpha_color = SkColorSetA(SK_ColorRED, i);
DlColorColorSource alpha_source(alpha_color);
ASSERT_EQ(alpha_source.color(), alpha_color);
ASSERT_EQ(alpha_source.is_opaque(), false);
}
}
TEST(DisplayListColorSource, ColorEquals) {
DlColorColorSource source1(SK_ColorRED);
DlColorColorSource source2(SK_ColorRED);
TestEquals(source1, source2);
}
TEST(DisplayListColorSource, ColorNotEquals) {
DlColorColorSource source1(SK_ColorRED);
DlColorColorSource source2(SK_ColorBLUE);
TestNotEquals(source1, source2, "Color differs");
}
TEST(DisplayListColorSource, ImageConstructor) {
DlImageColorSource source(kTestImage1, DlTileMode::kClamp, DlTileMode::kClamp,
DlImageSampling::kLinear, &kTestMatrix1);
}
TEST(DisplayListColorSource, ImageShared) {
DlImageColorSource source(kTestImage1, DlTileMode::kClamp, DlTileMode::kClamp,
DlImageSampling::kLinear, &kTestMatrix1);
ASSERT_NE(source.shared().get(), &source);
ASSERT_EQ(*source.shared(), source);
}
TEST(DisplayListColorSource, ImageAsImage) {
DlImageColorSource source(kTestImage1, DlTileMode::kClamp, DlTileMode::kClamp,
DlImageSampling::kLinear, &kTestMatrix1);
ASSERT_NE(source.asImage(), nullptr);
ASSERT_EQ(source.asImage(), &source);
ASSERT_EQ(source.asColor(), nullptr);
ASSERT_EQ(source.asLinearGradient(), nullptr);
ASSERT_EQ(source.asRadialGradient(), nullptr);
ASSERT_EQ(source.asConicalGradient(), nullptr);
ASSERT_EQ(source.asSweepGradient(), nullptr);
}
TEST(DisplayListColorSource, ImageContents) {
DlImageColorSource source(kTestImage1, DlTileMode::kRepeat,
DlTileMode::kMirror, DlImageSampling::kLinear,
&kTestMatrix1);
ASSERT_EQ(source.image(), kTestImage1);
ASSERT_EQ(source.horizontal_tile_mode(), DlTileMode::kRepeat);
ASSERT_EQ(source.vertical_tile_mode(), DlTileMode::kMirror);
ASSERT_EQ(source.sampling(), DlImageSampling::kLinear);
ASSERT_EQ(source.matrix(), kTestMatrix1);
ASSERT_EQ(source.is_opaque(), true);
}
TEST(DisplayListColorSource, AlphaImageContents) {
DlImageColorSource source(kTestAlphaImage1, DlTileMode::kRepeat,
DlTileMode::kMirror, DlImageSampling::kLinear,
&kTestMatrix1);
ASSERT_EQ(source.image(), kTestAlphaImage1);
ASSERT_EQ(source.horizontal_tile_mode(), DlTileMode::kRepeat);
ASSERT_EQ(source.vertical_tile_mode(), DlTileMode::kMirror);
ASSERT_EQ(source.sampling(), DlImageSampling::kLinear);
ASSERT_EQ(source.matrix(), kTestMatrix1);
ASSERT_EQ(source.is_opaque(), false);
}
TEST(DisplayListColorSource, ImageEquals) {
DlImageColorSource source1(kTestImage1, DlTileMode::kClamp,
DlTileMode::kMirror, DlImageSampling::kLinear,
&kTestMatrix1);
DlImageColorSource source2(kTestImage1, DlTileMode::kClamp,
DlTileMode::kMirror, DlImageSampling::kLinear,
&kTestMatrix1);
TestEquals(source1, source2);
}
TEST(DisplayListColorSource, ImageNotEquals) {
DlImageColorSource source1(kTestImage1, DlTileMode::kClamp,
DlTileMode::kMirror, DlImageSampling::kLinear,
&kTestMatrix1);
{
DlImageColorSource source2(kTestAlphaImage1, DlTileMode::kClamp,
DlTileMode::kMirror, DlImageSampling::kLinear,
&kTestMatrix1);
TestNotEquals(source1, source2, "Image differs");
}
{
DlImageColorSource source2(kTestImage1, DlTileMode::kRepeat,
DlTileMode::kMirror, DlImageSampling::kLinear,
&kTestMatrix1);
TestNotEquals(source1, source2, "hTileMode differs");
}
{
DlImageColorSource source2(kTestImage1, DlTileMode::kClamp,
DlTileMode::kRepeat, DlImageSampling::kLinear,
&kTestMatrix1);
TestNotEquals(source1, source2, "vTileMode differs");
}
{
DlImageColorSource source2(kTestImage1, DlTileMode::kClamp,
DlTileMode::kMirror, DlImageSampling::kCubic,
&kTestMatrix1);
TestNotEquals(source1, source2, "Sampling differs");
}
{
DlImageColorSource source2(kTestImage1, DlTileMode::kClamp,
DlTileMode::kMirror, DlImageSampling::kLinear,
&kTestMatrix2);
TestNotEquals(source1, source2, "Matrix differs");
}
}
TEST(DisplayListColorSource, LinearGradientConstructor) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeLinear(
kTestPoints[0], kTestPoints[1], kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
}
TEST(DisplayListColorSource, LinearGradientShared) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeLinear(
kTestPoints[0], kTestPoints[1], kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
ASSERT_NE(source->shared().get(), source.get());
ASSERT_EQ(*source->shared().get(), *source.get());
}
TEST(DisplayListColorSource, LinearGradientAsLinear) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeLinear(
kTestPoints[0], kTestPoints[1], kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
ASSERT_NE(source->asLinearGradient(), nullptr);
ASSERT_EQ(source->asLinearGradient(), source.get());
ASSERT_EQ(source->asColor(), nullptr);
ASSERT_EQ(source->asImage(), nullptr);
ASSERT_EQ(source->asRadialGradient(), nullptr);
ASSERT_EQ(source->asConicalGradient(), nullptr);
ASSERT_EQ(source->asSweepGradient(), nullptr);
ASSERT_EQ(source->asRuntimeEffect(), nullptr);
}
TEST(DisplayListColorSource, LinearGradientContents) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeLinear(
kTestPoints[0], kTestPoints[1], kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
ASSERT_EQ(source->asLinearGradient()->start_point(), kTestPoints[0]);
ASSERT_EQ(source->asLinearGradient()->end_point(), kTestPoints[1]);
ASSERT_EQ(source->asLinearGradient()->stop_count(), kTestStopCount);
for (int i = 0; i < kTestStopCount; i++) {
ASSERT_EQ(source->asLinearGradient()->colors()[i], kTestColors[i]);
ASSERT_EQ(source->asLinearGradient()->stops()[i], kTestStops[i]);
}
ASSERT_EQ(source->asLinearGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asLinearGradient()->matrix(), kTestMatrix1);
ASSERT_EQ(source->is_opaque(), true);
}
TEST(DisplayListColorSource, AlphaLinearGradientContents) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeLinear(
kTestPoints[0], kTestPoints[1], kTestStopCount, kTestAlphaColors,
kTestStops, DlTileMode::kClamp, &kTestMatrix1);
ASSERT_EQ(source->asLinearGradient()->start_point(), kTestPoints[0]);
ASSERT_EQ(source->asLinearGradient()->end_point(), kTestPoints[1]);
ASSERT_EQ(source->asLinearGradient()->stop_count(), kTestStopCount);
for (int i = 0; i < kTestStopCount; i++) {
ASSERT_EQ(source->asLinearGradient()->colors()[i], kTestAlphaColors[i]);
ASSERT_EQ(source->asLinearGradient()->stops()[i], kTestStops[i]);
}
ASSERT_EQ(source->asLinearGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asLinearGradient()->matrix(), kTestMatrix1);
ASSERT_EQ(source->is_opaque(), false);
}
TEST(DisplayListColorSource, LinearGradientEquals) {
std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeLinear(
kTestPoints[0], kTestPoints[1], kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
kTestPoints[0], kTestPoints[1], kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
TestEquals(*source1, *source2);
}
TEST(DisplayListColorSource, LinearGradientNotEquals) {
std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeLinear(
kTestPoints[0], kTestPoints[1], kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
kTestPoints2[0], kTestPoints[1], kTestStopCount, kTestColors,
kTestStops, DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Point 0 differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
kTestPoints[0], kTestPoints2[1], kTestStopCount, kTestColors,
kTestStops, DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Point 1 differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
kTestPoints[0], kTestPoints[1], 2, kTestColors, kTestStops, //
DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Stop count differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
kTestPoints[0], kTestPoints[1], kTestStopCount, kTestAlphaColors,
kTestStops, DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Colors differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
kTestPoints[0], kTestPoints[1], kTestStopCount, kTestColors,
kTestStops2, DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Stops differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
kTestPoints[0], kTestPoints[1], kTestStopCount, kTestColors, kTestStops,
DlTileMode::kMirror, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Tile Mode differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
kTestPoints[0], kTestPoints[1], kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix2);
TestNotEquals(*source1, *source2, "Matrix differs");
}
}
TEST(DisplayListColorSource, RadialGradientConstructor) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeRadial(
kTestPoints[0], 10.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
}
TEST(DisplayListColorSource, RadialGradientShared) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeRadial(
kTestPoints[0], 10.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
ASSERT_NE(source->shared().get(), source.get());
ASSERT_EQ(*source->shared().get(), *source.get());
}
TEST(DisplayListColorSource, RadialGradientAsRadial) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeRadial(
kTestPoints[0], 10.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
ASSERT_NE(source->asRadialGradient(), nullptr);
ASSERT_EQ(source->asRadialGradient(), source.get());
ASSERT_EQ(source->asColor(), nullptr);
ASSERT_EQ(source->asImage(), nullptr);
ASSERT_EQ(source->asLinearGradient(), nullptr);
ASSERT_EQ(source->asConicalGradient(), nullptr);
ASSERT_EQ(source->asSweepGradient(), nullptr);
ASSERT_EQ(source->asRuntimeEffect(), nullptr);
}
TEST(DisplayListColorSource, RadialGradientContents) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeRadial(
kTestPoints[0], 10.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
ASSERT_EQ(source->asRadialGradient()->center(), kTestPoints[0]);
ASSERT_EQ(source->asRadialGradient()->radius(), 10.0);
ASSERT_EQ(source->asRadialGradient()->stop_count(), kTestStopCount);
for (int i = 0; i < kTestStopCount; i++) {
ASSERT_EQ(source->asRadialGradient()->colors()[i], kTestColors[i]);
ASSERT_EQ(source->asRadialGradient()->stops()[i], kTestStops[i]);
}
ASSERT_EQ(source->asRadialGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asRadialGradient()->matrix(), kTestMatrix1);
ASSERT_EQ(source->is_opaque(), true);
}
TEST(DisplayListColorSource, AlphaRadialGradientContents) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeRadial(
kTestPoints[0], 10.0, kTestStopCount, kTestAlphaColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
ASSERT_EQ(source->asRadialGradient()->center(), kTestPoints[0]);
ASSERT_EQ(source->asRadialGradient()->radius(), 10.0);
ASSERT_EQ(source->asRadialGradient()->stop_count(), kTestStopCount);
for (int i = 0; i < kTestStopCount; i++) {
ASSERT_EQ(source->asRadialGradient()->colors()[i], kTestAlphaColors[i]);
ASSERT_EQ(source->asRadialGradient()->stops()[i], kTestStops[i]);
}
ASSERT_EQ(source->asRadialGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asRadialGradient()->matrix(), kTestMatrix1);
ASSERT_EQ(source->is_opaque(), false);
}
TEST(DisplayListColorSource, RadialGradientEquals) {
std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeRadial(
kTestPoints[0], 10.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRadial(
kTestPoints[0], 10.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
TestEquals(*source1, *source2);
}
TEST(DisplayListColorSource, RadialGradientNotEquals) {
std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeRadial(
kTestPoints[0], 10.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRadial(
kTestPoints2[0], 10.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Center differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRadial(
kTestPoints[0], 20.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Radius differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRadial(
kTestPoints[0], 10.0, 2, kTestColors, kTestStops, //
DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Stop count differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRadial(
kTestPoints[0], 10.0, kTestStopCount, kTestAlphaColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Colors differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRadial(
kTestPoints[0], 10.0, kTestStopCount, kTestColors, kTestStops2,
DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Stops differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRadial(
kTestPoints[0], 10.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kMirror, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Tile Mode differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRadial(
kTestPoints[0], 10.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix2);
TestNotEquals(*source1, *source2, "Matrix differs");
}
}
TEST(DisplayListColorSource, ConicalGradientConstructor) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeConical(
kTestPoints[0], 10.0, kTestPoints[1], 20.0, kTestStopCount, kTestColors,
kTestStops, DlTileMode::kClamp, &kTestMatrix1);
}
TEST(DisplayListColorSource, ConicalGradientShared) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeConical(
kTestPoints[0], 10.0, kTestPoints[1], 20.0, kTestStopCount, kTestColors,
kTestStops, DlTileMode::kClamp, &kTestMatrix1);
ASSERT_NE(source->shared().get(), source.get());
ASSERT_EQ(*source->shared().get(), *source.get());
}
TEST(DisplayListColorSource, ConicalGradientAsConical) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeConical(
kTestPoints[0], 10.0, kTestPoints[1], 20.0, kTestStopCount, kTestColors,
kTestStops, DlTileMode::kClamp, &kTestMatrix1);
ASSERT_NE(source->asConicalGradient(), nullptr);
ASSERT_EQ(source->asConicalGradient(), source.get());
ASSERT_EQ(source->asColor(), nullptr);
ASSERT_EQ(source->asImage(), nullptr);
ASSERT_EQ(source->asLinearGradient(), nullptr);
ASSERT_EQ(source->asRadialGradient(), nullptr);
ASSERT_EQ(source->asSweepGradient(), nullptr);
ASSERT_EQ(source->asRuntimeEffect(), nullptr);
}
TEST(DisplayListColorSource, ConicalGradientContents) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeConical(
kTestPoints[0], 10.0, kTestPoints[1], 20.0, kTestStopCount, kTestColors,
kTestStops, DlTileMode::kClamp, &kTestMatrix1);
ASSERT_EQ(source->asConicalGradient()->start_center(), kTestPoints[0]);
ASSERT_EQ(source->asConicalGradient()->start_radius(), 10.0);
ASSERT_EQ(source->asConicalGradient()->end_center(), kTestPoints[1]);
ASSERT_EQ(source->asConicalGradient()->end_radius(), 20.0);
ASSERT_EQ(source->asConicalGradient()->stop_count(), kTestStopCount);
for (int i = 0; i < kTestStopCount; i++) {
ASSERT_EQ(source->asConicalGradient()->colors()[i], kTestColors[i]);
ASSERT_EQ(source->asConicalGradient()->stops()[i], kTestStops[i]);
}
ASSERT_EQ(source->asConicalGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asConicalGradient()->matrix(), kTestMatrix1);
ASSERT_EQ(source->is_opaque(), true);
}
TEST(DisplayListColorSource, AlphaConicalGradientContents) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeConical(
kTestPoints[0], 10.0, kTestPoints[1], 20.0, kTestStopCount,
kTestAlphaColors, kTestStops, DlTileMode::kClamp, &kTestMatrix1);
ASSERT_EQ(source->asConicalGradient()->start_center(), kTestPoints[0]);
ASSERT_EQ(source->asConicalGradient()->start_radius(), 10.0);
ASSERT_EQ(source->asConicalGradient()->end_center(), kTestPoints[1]);
ASSERT_EQ(source->asConicalGradient()->end_radius(), 20.0);
ASSERT_EQ(source->asConicalGradient()->stop_count(), kTestStopCount);
for (int i = 0; i < kTestStopCount; i++) {
ASSERT_EQ(source->asConicalGradient()->colors()[i], kTestAlphaColors[i]);
ASSERT_EQ(source->asConicalGradient()->stops()[i], kTestStops[i]);
}
ASSERT_EQ(source->asConicalGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asConicalGradient()->matrix(), kTestMatrix1);
ASSERT_EQ(source->is_opaque(), false);
}
TEST(DisplayListColorSource, ConicalGradientEquals) {
std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeConical(
kTestPoints[0], 10.0, kTestPoints[1], 20.0, kTestStopCount, kTestColors,
kTestStops, DlTileMode::kClamp, &kTestMatrix1);
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
kTestPoints[0], 10.0, kTestPoints[1], 20.0, kTestStopCount, kTestColors,
kTestStops, DlTileMode::kClamp, &kTestMatrix1);
TestEquals(*source1, *source2);
}
TEST(DisplayListColorSource, ConicalGradientNotEquals) {
std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeConical(
kTestPoints[0], 10.0, kTestPoints[1], 20.0, kTestStopCount, kTestColors,
kTestStops, DlTileMode::kClamp, &kTestMatrix1);
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
kTestPoints2[0], 10.0, kTestPoints[1], 20.0, kTestStopCount,
kTestColors, kTestStops, DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Start Center differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
kTestPoints[0], 15.0, kTestPoints[1], 20.0, kTestStopCount, kTestColors,
kTestStops, DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Start Radius differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
kTestPoints[0], 10.0, kTestPoints2[1], 20.0, kTestStopCount,
kTestColors, kTestStops, DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "End Center differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
kTestPoints[0], 10.0, kTestPoints[1], 25.0, kTestStopCount, kTestColors,
kTestStops, DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "End Radius differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
kTestPoints[0], 10.0, kTestPoints[1], 20.0, 2, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Stop count differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
kTestPoints[0], 10.0, kTestPoints[1], 20.0, kTestStopCount,
kTestAlphaColors, kTestStops, DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Colors differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
kTestPoints[0], 10.0, kTestPoints[1], 20.0, kTestStopCount, kTestColors,
kTestStops2, DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Stops differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
kTestPoints[0], 10.0, kTestPoints[1], 20.0, kTestStopCount, kTestColors,
kTestStops, DlTileMode::kMirror, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Tile Mode differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
kTestPoints[0], 10.0, kTestPoints[1], 20.0, kTestStopCount, kTestColors,
kTestStops, DlTileMode::kClamp, &kTestMatrix2);
TestNotEquals(*source1, *source2, "Matrix differs");
}
}
TEST(DisplayListColorSource, SweepGradientConstructor) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeSweep(
kTestPoints[0], 10.0, 20.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
}
TEST(DisplayListColorSource, SweepGradientShared) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeSweep(
kTestPoints[0], 10.0, 20.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
ASSERT_NE(source->shared().get(), source.get());
ASSERT_EQ(*source->shared().get(), *source.get());
}
TEST(DisplayListColorSource, SweepGradientAsSweep) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeSweep(
kTestPoints[0], 10.0, 20.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
ASSERT_NE(source->asSweepGradient(), nullptr);
ASSERT_EQ(source->asSweepGradient(), source.get());
ASSERT_EQ(source->asColor(), nullptr);
ASSERT_EQ(source->asImage(), nullptr);
ASSERT_EQ(source->asLinearGradient(), nullptr);
ASSERT_EQ(source->asRadialGradient(), nullptr);
ASSERT_EQ(source->asConicalGradient(), nullptr);
ASSERT_EQ(source->asRuntimeEffect(), nullptr);
}
TEST(DisplayListColorSource, SweepGradientContents) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeSweep(
kTestPoints[0], 10.0, 20.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
ASSERT_EQ(source->asSweepGradient()->center(), kTestPoints[0]);
ASSERT_EQ(source->asSweepGradient()->start(), 10.0);
ASSERT_EQ(source->asSweepGradient()->end(), 20.0);
ASSERT_EQ(source->asSweepGradient()->stop_count(), kTestStopCount);
for (int i = 0; i < kTestStopCount; i++) {
ASSERT_EQ(source->asSweepGradient()->colors()[i], kTestColors[i]);
ASSERT_EQ(source->asSweepGradient()->stops()[i], kTestStops[i]);
}
ASSERT_EQ(source->asSweepGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asSweepGradient()->matrix(), kTestMatrix1);
ASSERT_EQ(source->is_opaque(), true);
}
TEST(DisplayListColorSource, AlphaSweepGradientContents) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeSweep(
kTestPoints[0], 10.0, 20.0, kTestStopCount, kTestAlphaColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
ASSERT_EQ(source->asSweepGradient()->center(), kTestPoints[0]);
ASSERT_EQ(source->asSweepGradient()->start(), 10.0);
ASSERT_EQ(source->asSweepGradient()->end(), 20.0);
ASSERT_EQ(source->asSweepGradient()->stop_count(), kTestStopCount);
for (int i = 0; i < kTestStopCount; i++) {
ASSERT_EQ(source->asSweepGradient()->colors()[i], kTestAlphaColors[i]);
ASSERT_EQ(source->asSweepGradient()->stops()[i], kTestStops[i]);
}
ASSERT_EQ(source->asSweepGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asSweepGradient()->matrix(), kTestMatrix1);
ASSERT_EQ(source->is_opaque(), false);
}
TEST(DisplayListColorSource, SweepGradientEquals) {
std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeSweep(
kTestPoints[0], 10.0, 20.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
kTestPoints[0], 10.0, 20.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
TestEquals(*source1, *source2);
}
TEST(DisplayListColorSource, SweepGradientNotEquals) {
std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeSweep(
kTestPoints[0], 10.0, 20.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
kTestPoints2[0], 10.0, 20.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Center differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
kTestPoints[0], 15.0, 20.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Start Angle differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
kTestPoints[0], 10.0, 25.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "End Angle differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
kTestPoints[0], 10.0, 20.0, 2, kTestColors, kTestStops, //
DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Stop count differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
kTestPoints[0], 10.0, 20.0, kTestStopCount, kTestAlphaColors,
kTestStops, DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Colors differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
kTestPoints[0], 10.0, 20.0, kTestStopCount, kTestColors, kTestStops2,
DlTileMode::kClamp, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Stops differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
kTestPoints[0], 10.0, 20.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kMirror, &kTestMatrix1);
TestNotEquals(*source1, *source2, "Tile Mode differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
kTestPoints[0], 10.0, 20.0, kTestStopCount, kTestColors, kTestStops,
DlTileMode::kClamp, &kTestMatrix2);
TestNotEquals(*source1, *source2, "Matrix differs");
}
}
TEST(DisplayListColorSource, UnknownConstructor) {
DlUnknownColorSource source(kTestUnknownShader);
}
TEST(DisplayListColorSource, UnknownShared) {
DlUnknownColorSource source(kTestUnknownShader);
ASSERT_NE(source.shared().get(), &source);
ASSERT_EQ(*source.shared(), source);
}
TEST(DisplayListColorSource, UnknownAsNone) {
DlUnknownColorSource source(kTestUnknownShader);
ASSERT_EQ(source.asColor(), nullptr);
ASSERT_EQ(source.asImage(), nullptr);
ASSERT_EQ(source.asLinearGradient(), nullptr);
ASSERT_EQ(source.asRadialGradient(), nullptr);
ASSERT_EQ(source.asConicalGradient(), nullptr);
ASSERT_EQ(source.asSweepGradient(), nullptr);
ASSERT_EQ(source.asRuntimeEffect(), nullptr);
}
TEST(DisplayListColorSource, UnknownContents) {
DlUnknownColorSource source(kTestUnknownShader);
ASSERT_EQ(source.skia_object(), kTestUnknownShader);
// Blend shaders always return false for is_opaque.
// See: https://bugs.chromium.org/p/skia/issues/detail?id=13046
ASSERT_EQ(source.is_opaque(), false);
}
TEST(DisplayListColorSource, AlphaUnknownContents) {
DlUnknownColorSource source(kTestAlphaUnknownShader);
ASSERT_EQ(source.skia_object(), kTestAlphaUnknownShader);
ASSERT_EQ(source.is_opaque(), false);
}
TEST(DisplayListColorSource, UnknownEquals) {
DlUnknownColorSource source1(kTestUnknownShader);
DlUnknownColorSource source2(kTestUnknownShader);
TestEquals(source1, source2);
}
TEST(DisplayListColorSource, UnknownNotEquals) {
DlUnknownColorSource source1(kTestUnknownShader);
DlUnknownColorSource source2(kTestAlphaUnknownShader);
TestNotEquals(source1, source2, "SkShader differs");
}
TEST(DisplayListColorSource, RuntimeEffect) {
std::shared_ptr<DlRuntimeEffectColorSource> source1 =
DlColorSource::MakeRuntimeEffect(
kTestRuntimeEffect1, {}, std::make_shared<std::vector<uint8_t>>());
std::shared_ptr<DlRuntimeEffectColorSource> source2 =
DlColorSource::MakeRuntimeEffect(
kTestRuntimeEffect2, {}, std::make_shared<std::vector<uint8_t>>());
std::shared_ptr<DlRuntimeEffectColorSource> source3 =
DlColorSource::MakeRuntimeEffect(
nullptr, {}, std::make_shared<std::vector<uint8_t>>());
ASSERT_EQ(source1->type(), DlColorSourceType::kRuntimeEffect);
ASSERT_EQ(source1->asRuntimeEffect(), source1.get());
ASSERT_NE(source2->asRuntimeEffect(), source1.get());
ASSERT_EQ(source1->asImage(), nullptr);
ASSERT_EQ(source1->asColor(), nullptr);
ASSERT_EQ(source1->asLinearGradient(), nullptr);
ASSERT_EQ(source1->asRadialGradient(), nullptr);
ASSERT_EQ(source1->asConicalGradient(), nullptr);
ASSERT_EQ(source1->asSweepGradient(), nullptr);
ASSERT_NE(source1->skia_object(), nullptr);
ASSERT_EQ(source3->skia_object(), nullptr);
TestEquals(source1, source1);
TestEquals(source3, source3);
TestNotEquals(source1, source2, "SkRuntimeEffect differs");
TestNotEquals(source2, source3, "SkRuntimeEffect differs");
}
TEST(DisplayListColorSource, RuntimeEffectWithNullSampler) {
std::shared_ptr<DlRuntimeEffectColorSource> source1 =
DlColorSource::MakeRuntimeEffect(
kTestRuntimeEffect1, {nullptr},
std::make_shared<std::vector<uint8_t>>());
ASSERT_EQ(source1->skia_object(), nullptr);
}
} // namespace testing
} // namespace flutter