7 #include "flutter/display_list/dl_builder.h"
8 #include "flutter/display_list/effects/dl_mask_filter.h"
10 #include "flutter/testing/testing.h"
11 #include "gtest/gtest.h"
13 #include "txt/platform.h"
21 struct TextRenderOptions {
24 DlColor
color = DlColor::kYellow();
29 const std::string& text,
30 const std::string_view& font_fixture,
32 const TextRenderOptions& options = {}) {
33 auto c_font_fixture = std::string(font_fixture);
34 auto mapping = flutter::testing::OpenFixtureAsSkData(c_font_fixture.c_str());
38 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
39 SkFont sk_font(font_mgr->makeFromData(mapping), options.font_size);
40 auto blob = SkTextBlob::MakeFromString(text.c_str(), sk_font);
48 text_paint.setColor(options.color);
49 text_paint.setMaskFilter(options.mask_filter);
54 canvas->DrawTextFrame(frame, position.x(), position.y(), text_paint);
62 auto draw = [&](DlCanvas* canvas,
63 const std::vector<std::unique_ptr<DlImage>>& images) {
64 canvas->DrawColor(DlColor(0xff111111));
65 canvas->Scale(content_scale.
x, content_scale.
y);
67 TextRenderOptions options;
69 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 10,
73 SkPoint::Make(101, 101), options));
74 options.mask_filter =
nullptr;
75 options.color = DlColor::kRed();
78 SkPoint::Make(100, 100), options));
81 DisplayListBuilder builder;
84 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
89 auto draw = [&](DlCanvas* canvas,
90 const std::vector<std::unique_ptr<DlImage>>& images) {
91 canvas->DrawColor(DlColor(0xff111111));
92 canvas->Scale(content_scale.
x, content_scale.
y);
94 TextRenderOptions options;
96 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 10,
100 SkPoint::Make(101, 101), options));
101 options.mask_filter =
nullptr;
102 options.color = DlColor::kRed();
104 "Roboto-Regular.ttf",
105 SkPoint::Make(100, 100), options));
108 DisplayListBuilder builder;
111 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
115 double CalculateDistance(
const uint8_t* left,
const uint8_t* right) {
117 static_cast<double>(left[0]) - right[0],
118 static_cast<double>(left[1]) - right[1],
119 static_cast<double>(left[2]) - right[2],
120 static_cast<double>(left[3]) - right[3]
122 return sqrt((diff[0] * diff[0]) +
123 (diff[1] * diff[1]) +
124 (diff[2] * diff[2]) +
125 (diff[3] * diff[3]));
138 const uint8_t* left_ptr = left->
GetBytes();
139 const uint8_t* right_ptr = right->
GetBytes();
140 for (int64_t i = 0; i < samples; ++i, left_ptr += 4, right_ptr += 4) {
141 double distance = CalculateDistance(left_ptr, right_ptr);
145 return sqrt(tally /
static_cast<double>(samples));
157 auto draw = [&](DlCanvas* canvas,
const std::vector<sk_sp<DlImage>>& images,
159 canvas->DrawColor(DlColor(0xff111111));
160 canvas->Scale(content_scale.
x, content_scale.
y);
163 canvas->DrawImage(images[0], SkPoint::Make(10.135, 10.36334),
164 DlImageSampling::kLinear, &paint);
166 SkRect save_layer_bounds = SkRect::MakeLTRB(0, 0, 1024, 768);
167 DlBlurImageFilter blur(sigma, sigma, DlTileMode::kDecal);
168 canvas->ClipRect(SkRect::MakeLTRB(11.125, 10.3737, 911.25, 755.3333));
169 canvas->SaveLayer(&save_layer_bounds,
nullptr, &blur);
173 std::vector<sk_sp<DlImage>> images;
174 images.emplace_back(CreateDlImageForFixture(
"boston.jpg"));
176 auto make_screenshot = [&](
float sigma) {
177 DisplayListBuilder builder;
178 draw(&builder, images, sigma);
180 std::unique_ptr<impeller::testing::Screenshot> screenshot =
181 MakeScreenshot(builder.Build());
185 float start_sigma = 10.0f;
186 std::unique_ptr<impeller::testing::Screenshot> left =
187 make_screenshot(start_sigma);
189 GTEST_SKIP() <<
"making screenshots not supported.";
192 double average_rmse = 0.0;
193 const int32_t sample_count = 200;
194 for (
int i = 1; i <= sample_count; ++i) {
195 float sigma = start_sigma + (i / 2.f);
196 std::unique_ptr<impeller::testing::Screenshot> right =
197 make_screenshot(sigma);
198 double rmse = RMSE(left.get(), right.get());
199 average_rmse += rmse;
214 left = std::move(right);
217 average_rmse = average_rmse / sample_count;
224 EXPECT_TRUE(average_rmse < 1.0) <<
"average_rmse: " << average_rmse;
226 EXPECT_TRUE(average_rmse >= 0.0) <<
"average_rmse: " << average_rmse;