blob: b56535b5376d4c85e0408aeb254527e33016162c [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 "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/types.h"
#include "third_party/skia/include/core/SkSurface.h"
namespace flutter {
namespace testing {
static sk_sp<SkImage> 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 surface->makeImageSnapshot();
}
static const sk_sp<SkImage> TestImage1 = MakeTestImage(10, 10, SK_ColorGREEN);
static const sk_sp<SkImage> TestAlphaImage1 =
MakeTestImage(10, 10, SK_ColorTRANSPARENT);
// clang-format off
static const SkMatrix TestMatrix1 =
SkMatrix::MakeAll(2, 0, 10,
0, 3, 12,
0, 0, 1);
static const SkMatrix TestMatrix2 =
SkMatrix::MakeAll(4, 0, 15,
0, 7, 17,
0, 0, 1);
// clang-format on
static constexpr int kTestStopCount = 3;
static constexpr DlColor TestColors[kTestStopCount] = {
DlColor::kRed(),
DlColor::kGreen(),
DlColor::kBlue(),
};
static const DlColor TestAlphaColors[kTestStopCount] = {
DlColor::kBlue().withAlpha(0x7F),
DlColor::kRed().withAlpha(0x2F),
DlColor::kGreen().withAlpha(0xCF),
};
static constexpr float TestStops[kTestStopCount] = {
0.0f,
0.7f,
1.0f,
};
static constexpr float TestStops2[kTestStopCount] = {
0.0f,
0.3f,
1.0f,
};
static constexpr SkPoint TestPoints[2] = {
SkPoint::Make(5, 15),
SkPoint::Make(7, 18),
};
static constexpr SkPoint TestPoints2[2] = {
SkPoint::Make(100, 115),
SkPoint::Make(107, 118),
};
static const sk_sp<SkShader> shaderA = SkShaders::Color(SK_ColorRED);
static const sk_sp<SkShader> shaderB = SkShaders::Color(SK_ColorBLUE);
static const sk_sp<SkShader> TestUnknownShader =
SkShaders::Blend(SkBlendMode::kOverlay, shaderA, shaderB);
static const sk_sp<SkShader> TestAlphaUnknownShader =
SkShaders::Blend(SkBlendMode::kDstOut, shaderA, shaderB);
TEST(DisplayListColorSource, BuilderSetGet) {
DlImageColorSource source(TestImage1, DlTileMode::kClamp, DlTileMode::kClamp,
DisplayList::LinearSampling, &TestMatrix1);
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 =
TestImage1->makeShader(DisplayList::LinearSampling, &TestMatrix1);
std::shared_ptr<DlColorSource> source = DlColorSource::From(shader);
DlImageColorSource dl_source(TestImage1, DlTileMode::kClamp,
DlTileMode::kClamp, DisplayList::LinearSampling,
&TestMatrix1);
ASSERT_EQ(source->type(), DlColorSourceType::kImage);
ASSERT_EQ(*source->asImage(), dl_source);
ASSERT_EQ(source->asImage()->image(), TestImage1);
ASSERT_EQ(source->asImage()->matrix(), TestMatrix1);
ASSERT_EQ(source->asImage()->horizontal_tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asImage()->vertical_tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asImage()->sampling(), DisplayList::LinearSampling);
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, 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*>(TestColors);
sk_sp<SkShader> shader = SkGradientShader::MakeLinear(
TestPoints, sk_colors, TestStops, 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*>(TestColors);
sk_sp<SkShader> shader =
SkGradientShader::MakeRadial(TestPoints[0], 10.0, sk_colors, TestStops,
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, 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*>(TestColors);
sk_sp<SkShader> shader = SkGradientShader::MakeTwoPointConical(
TestPoints[0], 10.0, TestPoints[1], 20.0, sk_colors, TestStops,
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, 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*>(TestColors);
sk_sp<SkShader> shader = SkGradientShader::MakeSweep(
TestPoints[0].fX, TestPoints[0].fY, sk_colors, TestStops, 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);
}
TEST(DisplayListColorSource, FromSkiaUnrecognizedShader) {
std::shared_ptr<DlColorSource> source =
DlColorSource::From(TestUnknownShader);
ASSERT_EQ(source->type(), DlColorSourceType::kUnknown);
ASSERT_EQ(source->skia_object(), TestUnknownShader);
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, 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);
}
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(TestImage1, DlTileMode::kClamp, DlTileMode::kClamp,
DisplayList::LinearSampling, &TestMatrix1);
}
TEST(DisplayListColorSource, ImageShared) {
DlImageColorSource source(TestImage1, DlTileMode::kClamp, DlTileMode::kClamp,
DisplayList::LinearSampling, &TestMatrix1);
ASSERT_NE(source.shared().get(), &source);
ASSERT_EQ(*source.shared(), source);
}
TEST(DisplayListColorSource, ImageAsImage) {
DlImageColorSource source(TestImage1, DlTileMode::kClamp, DlTileMode::kClamp,
DisplayList::LinearSampling, &TestMatrix1);
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(TestImage1, DlTileMode::kRepeat,
DlTileMode::kMirror, DisplayList::LinearSampling,
&TestMatrix1);
ASSERT_EQ(source.image(), TestImage1);
ASSERT_EQ(source.horizontal_tile_mode(), DlTileMode::kRepeat);
ASSERT_EQ(source.vertical_tile_mode(), DlTileMode::kMirror);
ASSERT_EQ(source.sampling(), DisplayList::LinearSampling);
ASSERT_EQ(source.matrix(), TestMatrix1);
ASSERT_EQ(source.is_opaque(), true);
}
TEST(DisplayListColorSource, AlphaImageContents) {
DlImageColorSource source(TestAlphaImage1, DlTileMode::kRepeat,
DlTileMode::kMirror, DisplayList::LinearSampling,
&TestMatrix1);
ASSERT_EQ(source.image(), TestAlphaImage1);
ASSERT_EQ(source.horizontal_tile_mode(), DlTileMode::kRepeat);
ASSERT_EQ(source.vertical_tile_mode(), DlTileMode::kMirror);
ASSERT_EQ(source.sampling(), DisplayList::LinearSampling);
ASSERT_EQ(source.matrix(), TestMatrix1);
ASSERT_EQ(source.is_opaque(), false);
}
TEST(DisplayListColorSource, ImageEquals) {
DlImageColorSource source1(TestImage1, DlTileMode::kClamp,
DlTileMode::kMirror, DisplayList::LinearSampling,
&TestMatrix1);
DlImageColorSource source2(TestImage1, DlTileMode::kClamp,
DlTileMode::kMirror, DisplayList::LinearSampling,
&TestMatrix1);
TestEquals(source1, source2);
}
TEST(DisplayListColorSource, ImageNotEquals) {
DlImageColorSource source1(TestImage1, DlTileMode::kClamp,
DlTileMode::kMirror, DisplayList::LinearSampling,
&TestMatrix1);
{
DlImageColorSource source2(TestAlphaImage1, DlTileMode::kClamp,
DlTileMode::kMirror, DisplayList::LinearSampling,
&TestMatrix1);
TestNotEquals(source1, source2, "Image differs");
}
{
DlImageColorSource source2(TestImage1, DlTileMode::kRepeat,
DlTileMode::kMirror, DisplayList::LinearSampling,
&TestMatrix1);
TestNotEquals(source1, source2, "hTileMode differs");
}
{
DlImageColorSource source2(TestImage1, DlTileMode::kClamp,
DlTileMode::kRepeat, DisplayList::LinearSampling,
&TestMatrix1);
TestNotEquals(source1, source2, "vTileMode differs");
}
{
DlImageColorSource source2(TestImage1, DlTileMode::kClamp,
DlTileMode::kMirror, DisplayList::CubicSampling,
&TestMatrix1);
TestNotEquals(source1, source2, "Sampling differs");
}
{
DlImageColorSource source2(TestImage1, DlTileMode::kClamp,
DlTileMode::kMirror, DisplayList::LinearSampling,
&TestMatrix2);
TestNotEquals(source1, source2, "Matrix differs");
}
}
TEST(DisplayListColorSource, LinearGradientConstructor) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeLinear(
TestPoints[0], TestPoints[1], kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
}
TEST(DisplayListColorSource, LinearGradientShared) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeLinear(
TestPoints[0], TestPoints[1], kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
ASSERT_NE(source->shared().get(), source.get());
ASSERT_EQ(*source->shared().get(), *source.get());
}
TEST(DisplayListColorSource, LinearGradientAsLinear) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeLinear(
TestPoints[0], TestPoints[1], kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
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);
}
TEST(DisplayListColorSource, LinearGradientContents) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeLinear(
TestPoints[0], TestPoints[1], kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
ASSERT_EQ(source->asLinearGradient()->start_point(), TestPoints[0]);
ASSERT_EQ(source->asLinearGradient()->end_point(), TestPoints[1]);
ASSERT_EQ(source->asLinearGradient()->stop_count(), kTestStopCount);
for (int i = 0; i < kTestStopCount; i++) {
ASSERT_EQ(source->asLinearGradient()->colors()[i], TestColors[i]);
ASSERT_EQ(source->asLinearGradient()->stops()[i], TestStops[i]);
}
ASSERT_EQ(source->asLinearGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asLinearGradient()->matrix(), TestMatrix1);
ASSERT_EQ(source->is_opaque(), true);
}
TEST(DisplayListColorSource, AlphaLinearGradientContents) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeLinear(
TestPoints[0], TestPoints[1], kTestStopCount, TestAlphaColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
ASSERT_EQ(source->asLinearGradient()->start_point(), TestPoints[0]);
ASSERT_EQ(source->asLinearGradient()->end_point(), TestPoints[1]);
ASSERT_EQ(source->asLinearGradient()->stop_count(), kTestStopCount);
for (int i = 0; i < kTestStopCount; i++) {
ASSERT_EQ(source->asLinearGradient()->colors()[i], TestAlphaColors[i]);
ASSERT_EQ(source->asLinearGradient()->stops()[i], TestStops[i]);
}
ASSERT_EQ(source->asLinearGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asLinearGradient()->matrix(), TestMatrix1);
ASSERT_EQ(source->is_opaque(), false);
}
TEST(DisplayListColorSource, LinearGradientEquals) {
std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeLinear(
TestPoints[0], TestPoints[1], kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
TestPoints[0], TestPoints[1], kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
TestEquals(*source1, *source2);
}
TEST(DisplayListColorSource, LinearGradientNotEquals) {
std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeLinear(
TestPoints[0], TestPoints[1], kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
TestPoints2[0], TestPoints[1], kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Point 0 differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
TestPoints[0], TestPoints2[1], kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Point 1 differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
TestPoints[0], TestPoints[1], 2, TestColors, TestStops, //
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Stop count differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
TestPoints[0], TestPoints[1], kTestStopCount, TestAlphaColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Colors differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
TestPoints[0], TestPoints[1], kTestStopCount, TestColors, TestStops2,
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Stops differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
TestPoints[0], TestPoints[1], kTestStopCount, TestColors, TestStops,
DlTileMode::kMirror, &TestMatrix1);
TestNotEquals(*source1, *source2, "Tile Mode differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeLinear(
TestPoints[0], TestPoints[1], kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix2);
TestNotEquals(*source1, *source2, "Matrix differs");
}
}
TEST(DisplayListColorSource, RadialGradientConstructor) {
std::shared_ptr<DlColorSource> source =
DlColorSource::MakeRadial(TestPoints[0], 10.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
}
TEST(DisplayListColorSource, RadialGradientShared) {
std::shared_ptr<DlColorSource> source =
DlColorSource::MakeRadial(TestPoints[0], 10.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
ASSERT_NE(source->shared().get(), source.get());
ASSERT_EQ(*source->shared().get(), *source.get());
}
TEST(DisplayListColorSource, RadialGradientAsRadial) {
std::shared_ptr<DlColorSource> source =
DlColorSource::MakeRadial(TestPoints[0], 10.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
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);
}
TEST(DisplayListColorSource, RadialGradientContents) {
std::shared_ptr<DlColorSource> source =
DlColorSource::MakeRadial(TestPoints[0], 10.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
ASSERT_EQ(source->asRadialGradient()->center(), TestPoints[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], TestColors[i]);
ASSERT_EQ(source->asRadialGradient()->stops()[i], TestStops[i]);
}
ASSERT_EQ(source->asRadialGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asRadialGradient()->matrix(), TestMatrix1);
ASSERT_EQ(source->is_opaque(), true);
}
TEST(DisplayListColorSource, AlphaRadialGradientContents) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeRadial(
TestPoints[0], 10.0, kTestStopCount, TestAlphaColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
ASSERT_EQ(source->asRadialGradient()->center(), TestPoints[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], TestAlphaColors[i]);
ASSERT_EQ(source->asRadialGradient()->stops()[i], TestStops[i]);
}
ASSERT_EQ(source->asRadialGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asRadialGradient()->matrix(), TestMatrix1);
ASSERT_EQ(source->is_opaque(), false);
}
TEST(DisplayListColorSource, RadialGradientEquals) {
std::shared_ptr<DlColorSource> source1 =
DlColorSource::MakeRadial(TestPoints[0], 10.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
std::shared_ptr<DlColorSource> source2 =
DlColorSource::MakeRadial(TestPoints[0], 10.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
TestEquals(*source1, *source2);
}
TEST(DisplayListColorSource, RadialGradientNotEquals) {
std::shared_ptr<DlColorSource> source1 =
DlColorSource::MakeRadial(TestPoints[0], 10.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRadial(
TestPoints2[0], 10.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Center differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRadial(
TestPoints[0], 20.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Radius differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRadial(
TestPoints[0], 10.0, 2, TestColors, TestStops, //
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Stop count differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRadial(
TestPoints[0], 10.0, kTestStopCount, TestAlphaColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Colors differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRadial(
TestPoints[0], 10.0, kTestStopCount, TestColors, TestStops2,
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Stops differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRadial(
TestPoints[0], 10.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kMirror, &TestMatrix1);
TestNotEquals(*source1, *source2, "Tile Mode differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeRadial(
TestPoints[0], 10.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix2);
TestNotEquals(*source1, *source2, "Matrix differs");
}
}
TEST(DisplayListColorSource, ConicalGradientConstructor) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeConical(
TestPoints[0], 10.0, TestPoints[1], 20.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
}
TEST(DisplayListColorSource, ConicalGradientShared) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeConical(
TestPoints[0], 10.0, TestPoints[1], 20.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
ASSERT_NE(source->shared().get(), source.get());
ASSERT_EQ(*source->shared().get(), *source.get());
}
TEST(DisplayListColorSource, ConicalGradientAsConical) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeConical(
TestPoints[0], 10.0, TestPoints[1], 20.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
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);
}
TEST(DisplayListColorSource, ConicalGradientContents) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeConical(
TestPoints[0], 10.0, TestPoints[1], 20.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
ASSERT_EQ(source->asConicalGradient()->start_center(), TestPoints[0]);
ASSERT_EQ(source->asConicalGradient()->start_radius(), 10.0);
ASSERT_EQ(source->asConicalGradient()->end_center(), TestPoints[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], TestColors[i]);
ASSERT_EQ(source->asConicalGradient()->stops()[i], TestStops[i]);
}
ASSERT_EQ(source->asConicalGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asConicalGradient()->matrix(), TestMatrix1);
ASSERT_EQ(source->is_opaque(), true);
}
TEST(DisplayListColorSource, AlphaConicalGradientContents) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeConical(
TestPoints[0], 10.0, TestPoints[1], 20.0, kTestStopCount, TestAlphaColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
ASSERT_EQ(source->asConicalGradient()->start_center(), TestPoints[0]);
ASSERT_EQ(source->asConicalGradient()->start_radius(), 10.0);
ASSERT_EQ(source->asConicalGradient()->end_center(), TestPoints[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], TestAlphaColors[i]);
ASSERT_EQ(source->asConicalGradient()->stops()[i], TestStops[i]);
}
ASSERT_EQ(source->asConicalGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asConicalGradient()->matrix(), TestMatrix1);
ASSERT_EQ(source->is_opaque(), false);
}
TEST(DisplayListColorSource, ConicalGradientEquals) {
std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeConical(
TestPoints[0], 10.0, TestPoints[1], 20.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
TestPoints[0], 10.0, TestPoints[1], 20.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
TestEquals(*source1, *source2);
}
TEST(DisplayListColorSource, ConicalGradientNotEquals) {
std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeConical(
TestPoints[0], 10.0, TestPoints[1], 20.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
TestPoints2[0], 10.0, TestPoints[1], 20.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Start Center differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
TestPoints[0], 15.0, TestPoints[1], 20.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Start Radius differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
TestPoints[0], 10.0, TestPoints2[1], 20.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "End Center differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
TestPoints[0], 10.0, TestPoints[1], 25.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "End Radius differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
TestPoints[0], 10.0, TestPoints[1], 20.0, 2, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Stop count differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
TestPoints[0], 10.0, TestPoints[1], 20.0, kTestStopCount,
TestAlphaColors, TestStops, DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Colors differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
TestPoints[0], 10.0, TestPoints[1], 20.0, kTestStopCount, TestColors,
TestStops2, DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Stops differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
TestPoints[0], 10.0, TestPoints[1], 20.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kMirror, &TestMatrix1);
TestNotEquals(*source1, *source2, "Tile Mode differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeConical(
TestPoints[0], 10.0, TestPoints[1], 20.0, kTestStopCount, TestColors,
TestStops, DlTileMode::kClamp, &TestMatrix2);
TestNotEquals(*source1, *source2, "Matrix differs");
}
}
TEST(DisplayListColorSource, SweepGradientConstructor) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeSweep(
TestPoints[0], 10.0, 20.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
}
TEST(DisplayListColorSource, SweepGradientShared) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeSweep(
TestPoints[0], 10.0, 20.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
ASSERT_NE(source->shared().get(), source.get());
ASSERT_EQ(*source->shared().get(), *source.get());
}
TEST(DisplayListColorSource, SweepGradientAsSweep) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeSweep(
TestPoints[0], 10.0, 20.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
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);
}
TEST(DisplayListColorSource, SweepGradientContents) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeSweep(
TestPoints[0], 10.0, 20.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
ASSERT_EQ(source->asSweepGradient()->center(), TestPoints[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], TestColors[i]);
ASSERT_EQ(source->asSweepGradient()->stops()[i], TestStops[i]);
}
ASSERT_EQ(source->asSweepGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asSweepGradient()->matrix(), TestMatrix1);
ASSERT_EQ(source->is_opaque(), true);
}
TEST(DisplayListColorSource, AlphaSweepGradientContents) {
std::shared_ptr<DlColorSource> source = DlColorSource::MakeSweep(
TestPoints[0], 10.0, 20.0, kTestStopCount, TestAlphaColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
ASSERT_EQ(source->asSweepGradient()->center(), TestPoints[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], TestAlphaColors[i]);
ASSERT_EQ(source->asSweepGradient()->stops()[i], TestStops[i]);
}
ASSERT_EQ(source->asSweepGradient()->tile_mode(), DlTileMode::kClamp);
ASSERT_EQ(source->asSweepGradient()->matrix(), TestMatrix1);
ASSERT_EQ(source->is_opaque(), false);
}
TEST(DisplayListColorSource, SweepGradientEquals) {
std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeSweep(
TestPoints[0], 10.0, 20.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
TestPoints[0], 10.0, 20.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
TestEquals(*source1, *source2);
}
TEST(DisplayListColorSource, SweepGradientNotEquals) {
std::shared_ptr<DlColorSource> source1 = DlColorSource::MakeSweep(
TestPoints[0], 10.0, 20.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
TestPoints2[0], 10.0, 20.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Center differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
TestPoints[0], 15.0, 20.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Start Angle differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
TestPoints[0], 10.0, 25.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "End Angle differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
TestPoints[0], 10.0, 20.0, 2, TestColors, TestStops, //
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Stop count differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
TestPoints[0], 10.0, 20.0, kTestStopCount, TestAlphaColors, TestStops,
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Colors differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
TestPoints[0], 10.0, 20.0, kTestStopCount, TestColors, TestStops2,
DlTileMode::kClamp, &TestMatrix1);
TestNotEquals(*source1, *source2, "Stops differ");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
TestPoints[0], 10.0, 20.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kMirror, &TestMatrix1);
TestNotEquals(*source1, *source2, "Tile Mode differs");
}
{
std::shared_ptr<DlColorSource> source2 = DlColorSource::MakeSweep(
TestPoints[0], 10.0, 20.0, kTestStopCount, TestColors, TestStops,
DlTileMode::kClamp, &TestMatrix2);
TestNotEquals(*source1, *source2, "Matrix differs");
}
}
TEST(DisplayListColorSource, UnknownConstructor) {
DlUnknownColorSource source(TestUnknownShader);
}
TEST(DisplayListColorSource, UnknownShared) {
DlUnknownColorSource source(TestUnknownShader);
ASSERT_NE(source.shared().get(), &source);
ASSERT_EQ(*source.shared(), source);
}
TEST(DisplayListColorSource, UnknownAsNone) {
DlUnknownColorSource source(TestUnknownShader);
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, UnknownContents) {
DlUnknownColorSource source(TestUnknownShader);
ASSERT_EQ(source.skia_object(), TestUnknownShader);
// 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(TestAlphaUnknownShader);
ASSERT_EQ(source.skia_object(), TestAlphaUnknownShader);
ASSERT_EQ(source.is_opaque(), false);
}
TEST(DisplayListColorSource, UnknownEquals) {
DlUnknownColorSource source1(TestUnknownShader);
DlUnknownColorSource source2(TestUnknownShader);
TestEquals(source1, source2);
}
TEST(DisplayListColorSource, UnknownNotEquals) {
DlUnknownColorSource source1(TestUnknownShader);
DlUnknownColorSource source2(TestAlphaUnknownShader);
TestNotEquals(source1, source2, "SkShader differs");
}
} // namespace testing
} // namespace flutter