Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
impeller::interop::testing Namespace Reference

Classes

class  ContextSub
 
class  FlagObject
 
class  PlaygroundTest
 
class  TestObject
 

Typedefs

using InteropPlaygroundTest = PlaygroundTest
 

Functions

 INSTANTIATE_PLAYGROUND_SUITE (InteropPlaygroundTest)
 
 TEST_P (InteropPlaygroundTest, CanCreateContext)
 
 TEST_P (InteropPlaygroundTest, CanCreateDisplayListBuilder)
 
 TEST_P (InteropPlaygroundTest, CanCreateSurface)
 
 TEST_P (InteropPlaygroundTest, CanDrawRect)
 
 TEST_P (InteropPlaygroundTest, CanDrawImage)
 
 TEST_P (InteropPlaygroundTest, CanCreateOpenGLImage)
 
 TEST_P (InteropPlaygroundTest, ClearsOpenGLStancilStateAfterTransition)
 
 TEST_P (InteropPlaygroundTest, CanCreateParagraphs)
 
 TEST_P (InteropPlaygroundTest, CanCreateDecorations)
 
 TEST_P (InteropPlaygroundTest, CanCreateShapes)
 
 TEST_P (InteropPlaygroundTest, CanCreateParagraphsWithCustomFont)
 
static void DrawTextFrame (const hpp::TypographyContext &tc, hpp::DisplayListBuilder &builder, hpp::ParagraphStyle &p_style, const hpp::Paint &bg, ImpellerColor color, ImpellerTextAlignment align, float x_offset)
 
 TEST_P (InteropPlaygroundTest, CanRenderTextAlignments)
 
 TEST_P (InteropPlaygroundTest, CanRenderShadows)
 
 TEST_P (InteropPlaygroundTest, CanMeasureText)
 
 TEST_P (InteropPlaygroundTest, CanGetPathBounds)
 
 TEST_P (InteropPlaygroundTest, CanControlEllipses)
 
 TEST_P (InteropPlaygroundTest, CanCreateFragmentProgramColorFilters)
 
 TEST_P (InteropPlaygroundTest, MappingsReleaseTheirDataOnDestruction)
 
 IMPELLER_DEFINE_HANDLE (FlagHandle)
 
 IMPELLER_DEFINE_HANDLE (TestHandle)
 
 TEST (InteropObjectTest, CanCreateScoped)
 
 TEST (InteropObjectTest, CanCreate)
 
 TEST (InteropObjectTest, CanCopyAssignMove)
 
static void SetupImpellerHPPProcTableOnce ()
 
static ScopedObject< SurfaceCreateSharedSurface (PlaygroundBackend backend, Context &context, std::shared_ptr< impeller::Surface > shared_surface)
 
static ScopedObject< ContextCreateSharedContext (PlaygroundBackend backend, std::shared_ptr< impeller::Context > shared_context)
 

Typedef Documentation

◆ InteropPlaygroundTest

Function Documentation

◆ CreateSharedContext()

static ScopedObject< Context > impeller::interop::testing::CreateSharedContext ( PlaygroundBackend  backend,
std::shared_ptr< impeller::Context shared_context 
)
static

Definition at line 150 of file playground_test.cc.

152 {
153 switch (backend) {
154#if IMPELLER_ENABLE_METAL
155 case PlaygroundBackend::kMetal:
156 case PlaygroundBackend::kMetalSDF:
157 return ContextMTL::Create(shared_context);
158#endif
159#if IMPELLER_ENABLE_OPENGLES
160 case PlaygroundBackend::kOpenGLES:
161 case PlaygroundBackend::kOpenGLESSDF:
162 return ContextGLES::Create(std::move(shared_context));
163#endif
164#if IMPELLER_ENABLE_VULKAN
165 case PlaygroundBackend::kVulkan:
166 return ContextVK::Create(std::move(shared_context));
167#endif
168 default:
169 return nullptr;
170 }
172}
#define FML_UNREACHABLE()
Definition logging.h:128

References impeller::interop::ContextMTL::Create(), impeller::interop::ContextVK::Create(), impeller::interop::ContextGLES::Create(), FML_UNREACHABLE, impeller::kMetal, impeller::kMetalSDF, impeller::kOpenGLES, impeller::kOpenGLESSDF, and impeller::kVulkan.

Referenced by impeller::interop::testing::PlaygroundTest::GetInteropContext().

◆ CreateSharedSurface()

static ScopedObject< Surface > impeller::interop::testing::CreateSharedSurface ( PlaygroundBackend  backend,
Context context,
std::shared_ptr< impeller::Surface shared_surface 
)
static

Definition at line 103 of file playground_test.cc.

106 {
107 switch (backend) {
108#if IMPELLER_ENABLE_METAL
109 case PlaygroundBackend::kMetal:
110 case PlaygroundBackend::kMetalSDF:
111 return Adopt<Surface>(new SurfaceMTL(context, std::move(shared_surface)));
112#endif
113
114#if IMPELLER_ENABLE_OPENGLES
115 case PlaygroundBackend::kOpenGLES:
116 case PlaygroundBackend::kOpenGLESSDF:
117 return Adopt<Surface>(
118 new SurfaceGLES(context, std::move(shared_surface)));
119#endif
120
121#if IMPELLER_ENABLE_VULKAN
122 case PlaygroundBackend::kVulkan:
123 return Adopt<Surface>(new SurfaceVK(context, std::move(shared_surface)));
124#endif
125 default:
126 return nullptr;
127 }
129}
std::shared_ptr< ContextGLES > context

References context, FML_UNREACHABLE, impeller::kMetal, impeller::kMetalSDF, impeller::kOpenGLES, impeller::kOpenGLESSDF, and impeller::kVulkan.

Referenced by impeller::interop::testing::PlaygroundTest::OpenPlaygroundHere().

◆ DrawTextFrame()

static void impeller::interop::testing::DrawTextFrame ( const hpp::TypographyContext &  tc,
hpp::DisplayListBuilder &  builder,
hpp::ParagraphStyle &  p_style,
const hpp::Paint &  bg,
ImpellerColor  color,
ImpellerTextAlignment  align,
float  x_offset 
)
static

Definition at line 430 of file impeller_unittests.cc.

436 {
437 const char text[] =
438 "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
439
440 hpp::Paint fg;
441
442 // Draw a box.
443 fg.SetColor(color);
444 fg.SetDrawStyle(kImpellerDrawStyleStroke);
445 ImpellerRect box_rect = {10 + x_offset, 10, 200, 200};
446 builder.DrawRect(box_rect, fg);
447
448 // Draw text.
449 fg.SetDrawStyle(kImpellerDrawStyleFill);
450 p_style.SetForeground(fg);
451 p_style.SetBackground(bg);
452 p_style.SetTextAlignment(align);
453
454 hpp::ParagraphBuilder p_builder(tc);
455 p_builder.PushStyle(p_style);
456 p_builder.AddText(reinterpret_cast<const uint8_t*>(text), sizeof(text));
457
458 auto left_p = p_builder.Build(box_rect.width - 20.0);
459 ImpellerPoint pt = {20.0f + x_offset, 20.0f};
460 float w = left_p.GetMaxWidth();
461 float h = left_p.GetHeight();
462 builder.DrawParagraph(left_p, pt);
463 fg.SetDrawStyle(kImpellerDrawStyleStroke);
464
465 // Draw an inner box around the paragraph layout.
466 ImpellerRect inner_box_rect = {pt.x, pt.y, w, h};
467 builder.DrawRect(inner_box_rect, fg);
468}
@ kImpellerDrawStyleStroke
Definition impeller.h:408
@ kImpellerDrawStyleFill
Definition impeller.h:407
std::u16string text
float width
Definition impeller.h:505

References kImpellerDrawStyleFill, kImpellerDrawStyleStroke, text, ImpellerRect::width, ImpellerPoint::x, and ImpellerPoint::y.

Referenced by TEST_P().

◆ IMPELLER_DEFINE_HANDLE() [1/2]

impeller::interop::testing::IMPELLER_DEFINE_HANDLE ( FlagHandle  )

◆ IMPELLER_DEFINE_HANDLE() [2/2]

impeller::interop::testing::IMPELLER_DEFINE_HANDLE ( TestHandle  )

◆ INSTANTIATE_PLAYGROUND_SUITE()

impeller::interop::testing::INSTANTIATE_PLAYGROUND_SUITE ( InteropPlaygroundTest  )

◆ SetupImpellerHPPProcTableOnce()

static void impeller::interop::testing::SetupImpellerHPPProcTableOnce ( )
static

Definition at line 30 of file playground_test.cc.

30 {
31 static std::once_flag sOnceFlag;
32 std::call_once(sOnceFlag, []() {
33 std::map<std::string, void*> proc_map;
34#define IMPELLER_HPP_PROC(name) \
35 proc_map[#name] = reinterpret_cast<void*>(&name);
36 IMPELLER_HPP_EACH_PROC(IMPELLER_HPP_PROC)
37#undef IMPELLER_HPP_PROC
38 hpp::gGlobalProcTable.Initialize(
39 [&](auto name) { return proc_map.at(name); });
40 });
41}
const char * name
Definition fuchsia.cc:50
#define IMPELLER_HPP_PROC(name)

References IMPELLER_HPP_PROC, and name.

Referenced by impeller::interop::testing::PlaygroundTest::PlaygroundTest().

◆ TEST() [1/3]

impeller::interop::testing::TEST ( InteropObjectTest  ,
CanCopyAssignMove   
)

Definition at line 77 of file object_unittests.cc.

77 {
78 auto o = Create<TestObject>(1, 2.3, 'd');
79 ASSERT_EQ(o->GetRefCountForTests(), 1u);
80 {
81 auto o1 = o; // NOLINT(performance-unnecessary-copy-initialization)
82 ASSERT_EQ(o->GetRefCountForTests(), 2u);
83 auto o2 = o; // NOLINT(performance-unnecessary-copy-initialization)
84 ASSERT_EQ(o->GetRefCountForTests(), 3u);
85 auto o3 = o1; // NOLINT(performance-unnecessary-copy-initialization)
86 ASSERT_EQ(o->GetRefCountForTests(), 4u);
87 }
88 ASSERT_EQ(o->GetRefCountForTests(), 1u);
89
90 {
91 auto o1(o); // NOLINT(performance-unnecessary-copy-initialization)
92 ASSERT_EQ(o->GetRefCountForTests(), 2u);
93 ASSERT_EQ(o1->GetRefCountForTests(), 2u);
94 }
95
96 auto move_o = std::move(o);
97 ASSERT_EQ(move_o->GetRefCountForTests(), 1u);
98}

◆ TEST() [2/3]

impeller::interop::testing::TEST ( InteropObjectTest  ,
CanCreate   
)

Definition at line 70 of file object_unittests.cc.

70 {
71 auto object = Create<TestObject>(1, 1.3, 'c');
72 ASSERT_EQ(object->GetArg1(), 1);
73 ASSERT_EQ(object->GetArg2(), 1.3);
74 ASSERT_EQ(object->GetArg3(), 'c');
75}

◆ TEST() [3/3]

impeller::interop::testing::TEST ( InteropObjectTest  ,
CanCreateScoped   
)

Definition at line 54 of file object_unittests.cc.

54 {
55 bool destructed = false;
56 {
57 auto object = Adopt(new FlagObject(destructed)); //
58 }
59 ASSERT_TRUE(destructed);
60
61 destructed = false;
62 {
63 auto object = Ref(new FlagObject(destructed));
64 // New objects start with retain count of 1.
65 object->Release();
66 }
67 ASSERT_TRUE(destructed);
68}
ScopedObject< Object > Adopt(Object *object)
Definition object.h:151

References impeller::interop::Adopt(), and impeller::interop::Ref().

◆ TEST_P() [1/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanControlEllipses   
)

Definition at line 636 of file impeller_unittests.cc.

636 {
637 hpp::TypographyContext context;
638 auto style = hpp::ParagraphStyle{};
639 style.SetFontSize(50);
640 style.SetForeground(hpp::Paint{}.SetColor({.red = 1.0, .alpha = 1.0}));
641 const auto text = std::string{"The quick brown fox jumped over the lazy dog"};
642 style.SetEllipsis("🐶");
643 auto para1 =
644 hpp::ParagraphBuilder{context}.PushStyle(style).AddText(text).Build(250);
645 style.SetForeground(hpp::Paint{}.SetColor({.green = 1.0, .alpha = 1.0}));
646 style.SetEllipsis(nullptr);
647 auto para2 =
648 hpp::ParagraphBuilder{context}.PushStyle(style).AddText(text).Build(250);
649 auto dl = hpp::DisplayListBuilder{}
650 .DrawParagraph(para1, {100, 100})
651 .DrawParagraph(para2, {100, 200})
652 .Build();
653 ASSERT_TRUE(
654 OpenPlaygroundHere([&](const auto& context, const auto& surface) -> bool {
655 hpp::Surface window(surface.GetC());
656 window.Draw(dl);
657 return true;
658 }));
659}
GLFWwindow * window
Definition main.cc:60
VkSurfaceKHR surface
Definition main.cc:65

References context, surface, text, and window.

◆ TEST_P() [2/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanCreateContext   
)

Definition at line 33 of file impeller_unittests.cc.

33 {
34 auto context = CreateContext();
35 ASSERT_TRUE(context);
36}

References context.

◆ TEST_P() [3/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanCreateDecorations   
)

Definition at line 297 of file impeller_unittests.cc.

297 {
298 hpp::TypographyContext context;
299 auto para =
300 hpp::ParagraphBuilder(context)
301 .PushStyle(
302 hpp::ParagraphStyle{}
303 .SetForeground(hpp::Paint{}.SetColor({1.0, 0.0, 0.0, 1.0}))
304 .SetFontSize(150.0f)
305 .SetTextDecoration(ImpellerTextDecoration{
308 .color = ImpellerColor{0.0, 1.0, 0.0, 0.75},
310 .thickness_multiplier = 1.5,
311 }))
312 .AddText(std::string{"Holy text decorations Batman!"})
313 .Build(900);
314 auto dl = hpp::DisplayListBuilder{}.DrawParagraph(para, {100, 100}).Build();
315 ASSERT_TRUE(
316 OpenPlaygroundHere([&](const auto& context, const auto& surface) -> bool {
317 hpp::Surface window(surface.GetC());
318 window.Draw(dl);
319 return true;
320 }));
321}
@ kImpellerTextDecorationTypeLineThrough
Definition impeller.h:488
@ kImpellerTextDecorationTypeUnderline
Definition impeller.h:486
@ kImpellerTextDecorationStyleWavy
Definition impeller.h:496
int types
A mask of ImpellerTextDecorationTypes to enable.
Definition impeller.h:648

References context, kImpellerTextDecorationStyleWavy, kImpellerTextDecorationTypeLineThrough, kImpellerTextDecorationTypeUnderline, surface, ImpellerTextDecoration::types, and window.

◆ TEST_P() [4/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanCreateDisplayListBuilder   
)

Definition at line 38 of file impeller_unittests.cc.

38 {
39 hpp::DisplayListBuilder builder;
40 ASSERT_TRUE(builder);
41 ASSERT_TRUE(ToImpellerType(builder.GetTransform()).IsIdentity());
42 ASSERT_EQ(builder.GetSaveCount(), 1u);
43 builder.Save();
44 ASSERT_EQ(builder.GetSaveCount(), 2u);
45 builder.Restore();
46 ASSERT_EQ(builder.GetSaveCount(), 1u);
47}
constexpr Matrix ToImpellerType(const ImpellerMatrix &m)
Definition formats.h:213
constexpr bool IsIdentity() const
Definition matrix.h:475

References impeller::Matrix::IsIdentity(), and impeller::interop::ToImpellerType().

◆ TEST_P() [5/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanCreateFragmentProgramColorFilters   
)

Definition at line 661 of file impeller_unittests.cc.

661 {
662 auto iplr = OpenAssetAsHPPMapping("interop_runtime_stage_cs.frag.iplr");
663 ASSERT_TRUE(!!iplr);
664 auto program = hpp::FragmentProgram::WithData(std::move(iplr));
665 ASSERT_TRUE(program);
666 auto context = GetHPPContext();
667 auto filter =
668 hpp::ImageFilter::FragmentProgram(context, program, {}, nullptr);
669 ASSERT_TRUE(filter);
670 auto bay_bridge = OpenAssetAsHPPTexture("bay_bridge.jpg");
671 ASSERT_TRUE(bay_bridge);
672
673 float size_data[4] = {500, 500};
674 auto uniform_data = hpp::Mapping{reinterpret_cast<const uint8_t*>(&size_data),
675 sizeof(size_data), nullptr};
676
677 auto dl = hpp::DisplayListBuilder{}
678 .DrawRect({10, 10, 500, 500},
679 hpp::Paint{}
680 .SetColor({1.0, 1.0, 1.0, 1.0})
681 .SetColorSource(hpp::ColorSource::FragmentProgram(
682 context, //
683 program, //
684 {bay_bridge.Get()}, // samplers
685 &uniform_data // uniform data
686 )))
687 .Build();
688 ASSERT_TRUE(
689 OpenPlaygroundHere([&](const auto& context, const auto& surface) -> bool {
690 hpp::Surface window(surface.GetC());
691 window.Draw(dl);
692 return true;
693 }));
694}

References context, surface, and window.

◆ TEST_P() [6/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanCreateOpenGLImage   
)

Definition at line 134 of file impeller_unittests.cc.

134 {
135 auto context = GetInteropContext();
136
137 auto impeller_context = context->GetContext();
138
139 if (impeller_context->GetBackendType() !=
141 GTEST_SKIP() << "This test works with OpenGL handles is only suitable for "
142 "that backend.";
143 return;
144 }
145
146 const auto& gl_context = ContextGLES::Cast(*impeller_context);
147 const auto& gl = gl_context.GetReactor()->GetProcTable();
148
149 constexpr ISize external_texture_size = {200, 300};
150
151 Allocation texture_data;
152 ASSERT_TRUE(
153 texture_data.Truncate(Bytes{external_texture_size.Area() * 4u}, false));
154
155 const auto kClearColor = Color::Fuchsia().ToR8G8B8A8();
156
157 for (size_t i = 0; i < external_texture_size.Area() * 4u; i += 4u) {
158 memcpy(texture_data.GetBuffer() + i, kClearColor.data(), 4);
159 }
160
161 GLuint external_texture = GL_NONE;
162 gl.GenTextures(1u, &external_texture);
163 ASSERT_NE(external_texture, 0u);
164 gl.BindTexture(GL_TEXTURE_2D, external_texture);
165 gl.TexImage2D(GL_TEXTURE_2D, //
166 0, //
167 GL_RGBA, //
168 external_texture_size.width, //
169 external_texture_size.height, //
170 0, //
171 GL_RGBA, //
172 GL_UNSIGNED_BYTE, //
173 texture_data.GetBuffer() //
174 );
175
177 desc.pixel_format = ImpellerPixelFormat::kImpellerPixelFormatRGBA8888;
178 desc.size = {external_texture_size.width, external_texture_size.height};
179 desc.mip_count = 1u;
181 context.GetC(), //
182 &desc, //
183 external_texture //
184 ));
185 ASSERT_TRUE(texture);
186
187 ASSERT_EQ(ImpellerTextureGetOpenGLHandle(texture.GetC()), external_texture);
188
189 auto builder =
190 Adopt<DisplayListBuilder>(ImpellerDisplayListBuilderNew(nullptr));
191 ImpellerPoint point = {100, 100};
192 ImpellerDisplayListBuilderDrawTexture(builder.GetC(), texture.GetC(), &point,
194 nullptr);
195 auto dl = Adopt<DisplayList>(
197 ASSERT_TRUE(
198 OpenPlaygroundHere([&](const auto& context, const auto& surface) -> bool {
199 ImpellerSurfaceDrawDisplayList(surface.GetC(), dl.GetC());
200 return true;
201 }));
202}
Describes an allocation on the heap.
Definition allocation.h:22
uint8_t * GetBuffer() const
Gets the pointer to the start of the allocation.
Definition allocation.cc:20
bool Truncate(Bytes length, bool npot=true)
Resize the underlying allocation to at least given number of bytes.
Definition allocation.cc:32
@ kImpellerTextureSamplingLinear
Definition impeller.h:430
IMPELLER_EXPORT void ImpellerDisplayListBuilderDrawTexture(ImpellerDisplayListBuilder IMPELLER_NONNULL builder, ImpellerTexture IMPELLER_NONNULL texture, const ImpellerPoint *IMPELLER_NONNULL point, ImpellerTextureSampling sampling, ImpellerPaint IMPELLER_NULLABLE paint)
Draw a texture at the specified point.
IMPELLER_EXPORT uint64_t ImpellerTextureGetOpenGLHandle(ImpellerTexture IMPELLER_NONNULL texture)
Get the OpenGL handle associated with this texture. If this is not an OpenGL texture,...
IMPELLER_EXPORT IMPELLER_NODISCARD ImpellerDisplayList IMPELLER_NULLABLE ImpellerDisplayListBuilderCreateDisplayListNew(ImpellerDisplayListBuilder IMPELLER_NONNULL builder)
Create a new display list using the rendering intent already encoded in the builder....
IMPELLER_EXPORT bool ImpellerSurfaceDrawDisplayList(ImpellerSurface IMPELLER_NONNULL surface, ImpellerDisplayList IMPELLER_NONNULL display_list)
Draw a display list onto the surface. The same display list can be drawn multiple times to different ...
IMPELLER_EXPORT IMPELLER_NODISCARD ImpellerTexture IMPELLER_NULLABLE ImpellerTextureCreateWithOpenGLTextureHandleNew(ImpellerContext IMPELLER_NONNULL context, const ImpellerTextureDescriptor *IMPELLER_NONNULL descriptor, uint64_t handle)
Create a texture with an externally created OpenGL texture handle.
IMPELLER_EXPORT IMPELLER_NODISCARD ImpellerDisplayListBuilder IMPELLER_NULLABLE ImpellerDisplayListBuilderNew(const ImpellerRect *IMPELLER_NULLABLE cull_rect)
Create a new display list builder.
FlTexture * texture
ImpellerPixelFormat pixel_format
Definition impeller.h:621
constexpr Type Area() const
Definition size.h:120
Type height
Definition size.h:29
Type width
Definition size.h:28

References impeller::TSize< T >::Area(), impeller::BackendCast< ContextGLES, Context >::Cast(), context, impeller::Color::Fuchsia(), impeller::Allocation::GetBuffer(), impeller::TSize< T >::height, i, impeller::interop::ImpellerDisplayListBuilderCreateDisplayListNew(), impeller::interop::ImpellerDisplayListBuilderDrawTexture(), impeller::interop::ImpellerDisplayListBuilderNew(), impeller::interop::ImpellerSurfaceDrawDisplayList(), impeller::interop::ImpellerTextureCreateWithOpenGLTextureHandleNew(), impeller::interop::ImpellerTextureGetOpenGLHandle(), kImpellerTextureSamplingLinear, impeller::Context::kOpenGLES, ImpellerTextureDescriptor::mip_count, ImpellerTextureDescriptor::pixel_format, ImpellerTextureDescriptor::size, surface, texture, impeller::Color::ToR8G8B8A8(), impeller::Allocation::Truncate(), and impeller::TSize< T >::width.

◆ TEST_P() [7/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanCreateParagraphs   
)

Definition at line 242 of file impeller_unittests.cc.

242 {
243 // Create a typography context.
244 hpp::TypographyContext type_context;
245 ASSERT_TRUE(type_context);
246
247 // Create a builder.
248 hpp::ParagraphBuilder builder(type_context);
249 ASSERT_TRUE(builder);
250
251 // Create a paragraph style with the font size and foreground and background
252 // colors.
253 hpp::ParagraphStyle style;
254 ASSERT_TRUE(style);
255 style.SetFontSize(150.0f);
256 style.SetHeight(2.0f);
257
258 {
259 hpp::Paint paint;
260 ASSERT_TRUE(paint);
261 paint.SetColor({1.0, 0.0, 0.0, 1.0});
262 style.SetForeground(paint);
263 }
264
265 {
266 hpp::Paint paint;
267 paint.SetColor({1.0, 1.0, 1.0, 1.0});
268 style.SetBackground(paint);
269 }
270
271 // Push the style onto the style stack.
272 builder.PushStyle(style);
273 std::string text = "the ⚡️ quick ⚡️ brown 🦊 fox jumps over the lazy dog 🐶.";
274
275 // Add the paragraph text data.
276 builder.AddText(text);
277
278 // Layout and build the paragraph.
279 auto paragraph = builder.Build(1200.0f);
280 ASSERT_TRUE(paragraph);
281
282 // Create a display list with just the paragraph drawn into it.
283 hpp::DisplayListBuilder dl_builder;
284 dl_builder.DrawParagraph(paragraph, {20, 20});
285
286 // Build the display list.
287 auto dl = dl_builder.Build();
288
289 ASSERT_TRUE(
290 OpenPlaygroundHere([&](const auto& context, const auto& surface) -> bool {
291 hpp::Surface window(surface.GetC());
292 window.Draw(dl);
293 return true;
294 }));
295}

References context, surface, text, and window.

◆ TEST_P() [8/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanCreateParagraphsWithCustomFont   
)

Definition at line 356 of file impeller_unittests.cc.

356 {
357 // Create a typography context.
358 auto type_context = Adopt<TypographyContext>(ImpellerTypographyContextNew());
359 ASSERT_TRUE(type_context);
360
361 // Open the custom font file.
362 std::unique_ptr<fml::Mapping> font_data =
364 ASSERT_NE(font_data, nullptr);
365 ASSERT_GT(font_data->GetSize(), 0u);
366 ImpellerMapping font_data_mapping = {
367 .data = font_data->GetMapping(),
368 .length = font_data->GetSize(),
369 .on_release = [](auto ctx) {
370 delete reinterpret_cast<fml::Mapping*>(ctx);
371 }};
372 auto registered =
373 ImpellerTypographyContextRegisterFont(type_context.GetC(), //
374 &font_data_mapping, //
375 font_data.release(), //
376 nullptr //
377 );
378 ASSERT_TRUE(registered);
379
380 // Create a builder.
381 auto builder =
382 Adopt<ParagraphBuilder>(ImpellerParagraphBuilderNew(type_context.GetC()));
383 ASSERT_TRUE(builder);
384
385 // Create a paragraph style with the font size and foreground and background
386 // colors.
387 auto style = Adopt<ParagraphStyle>(ImpellerParagraphStyleNew());
388 ASSERT_TRUE(style);
389 ImpellerParagraphStyleSetFontSize(style.GetC(), 150.0f);
390 ImpellerParagraphStyleSetFontFamily(style.GetC(), "WhatTheFlutter");
391
392 {
393 auto paint = Adopt<Paint>(ImpellerPaintNew());
394 ASSERT_TRUE(paint);
395 ImpellerColor color = {0.0, 1.0, 1.0, 1.0};
396 ImpellerPaintSetColor(paint.GetC(), &color);
397 ImpellerParagraphStyleSetForeground(style.GetC(), paint.GetC());
398 }
399
400 // Push the style onto the style stack.
401 ImpellerParagraphBuilderPushStyle(builder.GetC(), style.GetC());
402 std::string text = "0F0F0F0";
403
404 // Add the paragraph text data.
405 ImpellerParagraphBuilderAddText(builder.GetC(),
406 reinterpret_cast<const uint8_t*>(text.data()),
407 text.size());
408
409 // Layout and build the paragraph.
410 auto paragraph = Adopt<Paragraph>(
411 ImpellerParagraphBuilderBuildParagraphNew(builder.GetC(), 1200.0f));
412 ASSERT_TRUE(paragraph);
413
414 // Create a display list with just the paragraph drawn into it.
415 auto dl_builder =
416 Adopt<DisplayListBuilder>(ImpellerDisplayListBuilderNew(nullptr));
417 ImpellerPoint point = {20, 20};
418 ImpellerDisplayListBuilderDrawParagraph(dl_builder.GetC(), paragraph.GetC(),
419 &point);
420 auto dl = Adopt<DisplayList>(
422
423 ASSERT_TRUE(
424 OpenPlaygroundHere([&](const auto& context, const auto& surface) -> bool {
425 ImpellerSurfaceDrawDisplayList(surface.GetC(), dl.GetC());
426 return true;
427 }));
428} // namespace impeller::interop::testing
IMPELLER_EXPORT void ImpellerDisplayListBuilderDrawParagraph(ImpellerDisplayListBuilder IMPELLER_NONNULL builder, ImpellerParagraph IMPELLER_NONNULL paragraph, const ImpellerPoint *IMPELLER_NONNULL point)
Draw a paragraph at the specified point.
IMPELLER_EXPORT bool ImpellerTypographyContextRegisterFont(ImpellerTypographyContext IMPELLER_NONNULL context, const ImpellerMapping *IMPELLER_NONNULL contents, void *IMPELLER_NULLABLE contents_on_release_user_data, const char *IMPELLER_NULLABLE family_name_alias)
Register a custom font.
IMPELLER_EXPORT void ImpellerParagraphBuilderAddText(ImpellerParagraphBuilder IMPELLER_NONNULL paragraph_builder, const uint8_t *IMPELLER_NULLABLE data, uint32_t length)
Add UTF-8 encoded text to the paragraph. The text will be styled according to the paragraph style alr...
IMPELLER_EXPORT IMPELLER_NODISCARD ImpellerPaint IMPELLER_NULLABLE ImpellerPaintNew()
Create a new paint with default values.
IMPELLER_EXPORT void ImpellerPaintSetColor(ImpellerPaint IMPELLER_NONNULL paint, const ImpellerColor *IMPELLER_NONNULL color)
Set the paint color.
IMPELLER_EXPORT IMPELLER_NODISCARD ImpellerParagraph IMPELLER_NULLABLE ImpellerParagraphBuilderBuildParagraphNew(ImpellerParagraphBuilder IMPELLER_NONNULL paragraph_builder, float width)
Layout and build a new paragraph using the specified width. The resulting paragraph is immutable....
IMPELLER_EXPORT void ImpellerParagraphBuilderPushStyle(ImpellerParagraphBuilder IMPELLER_NONNULL paragraph_builder, ImpellerParagraphStyle IMPELLER_NONNULL style)
Push a new paragraph style onto the paragraph style stack managed by the paragraph builder.
IMPELLER_EXPORT void ImpellerParagraphStyleSetFontSize(ImpellerParagraphStyle IMPELLER_NONNULL paragraph_style, float size)
Set the font size.
IMPELLER_EXPORT IMPELLER_NODISCARD ImpellerParagraphStyle IMPELLER_NULLABLE ImpellerParagraphStyleNew()
Create a new paragraph style.
IMPELLER_EXPORT void ImpellerParagraphStyleSetForeground(ImpellerParagraphStyle IMPELLER_NONNULL paragraph_style, ImpellerPaint IMPELLER_NONNULL paint)
Set the paint used to render the text glyph contents.
IMPELLER_EXPORT IMPELLER_NODISCARD ImpellerTypographyContext IMPELLER_NULLABLE ImpellerTypographyContextNew()
Create a new typography contents.
IMPELLER_EXPORT void ImpellerParagraphStyleSetFontFamily(ImpellerParagraphStyle IMPELLER_NONNULL paragraph_style, const char *IMPELLER_NONNULL family_name)
Set the font family.
IMPELLER_EXPORT IMPELLER_NODISCARD ImpellerParagraphBuilder IMPELLER_NULLABLE ImpellerParagraphBuilderNew(ImpellerTypographyContext IMPELLER_NONNULL context)
Create a new paragraph builder.
std::unique_ptr< fml::Mapping > OpenFixtureAsMapping(const std::string &fixture_name)
Opens a fixture of the given file name and returns a mapping to its contents.
Definition testing.cc:58
const uint8_t *IMPELLER_NONNULL data
Definition impeller.h:627

References context, ImpellerMapping::data, impeller::interop::ImpellerDisplayListBuilderCreateDisplayListNew(), impeller::interop::ImpellerDisplayListBuilderDrawParagraph(), impeller::interop::ImpellerDisplayListBuilderNew(), impeller::interop::ImpellerPaintNew(), impeller::interop::ImpellerPaintSetColor(), impeller::interop::ImpellerParagraphBuilderAddText(), impeller::interop::ImpellerParagraphBuilderBuildParagraphNew(), impeller::interop::ImpellerParagraphBuilderNew(), impeller::interop::ImpellerParagraphBuilderPushStyle(), impeller::interop::ImpellerParagraphStyleNew(), impeller::interop::ImpellerParagraphStyleSetFontFamily(), impeller::interop::ImpellerParagraphStyleSetFontSize(), impeller::interop::ImpellerParagraphStyleSetForeground(), impeller::interop::ImpellerSurfaceDrawDisplayList(), impeller::interop::ImpellerTypographyContextNew(), impeller::interop::ImpellerTypographyContextRegisterFont(), flutter::testing::OpenFixtureAsMapping(), surface, and text.

◆ TEST_P() [9/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanCreateShapes   
)

Definition at line 323 of file impeller_unittests.cc.

323 {
324 hpp::DisplayListBuilder builder;
325
326 hpp::Paint red_paint;
327 red_paint.SetColor({1.0, 0.0, 0.0, 1.0});
328 red_paint.SetStrokeWidth(10.0);
329
330 builder.Translate(10, 10);
331 builder.DrawRect({0, 0, 100, 100}, red_paint);
332 builder.Translate(100, 100);
333 builder.DrawOval({0, 0, 100, 100}, red_paint);
334 builder.Translate(100, 100);
335 builder.DrawLine({0, 0}, {100, 100}, red_paint);
336
337 builder.Translate(100, 100);
338 ImpellerRoundingRadii radii = {};
339 radii.top_left = {10, 10};
340 radii.bottom_right = {10, 10};
341 builder.DrawRoundedRect({0, 0, 100, 100}, radii, red_paint);
342
343 builder.Translate(100, 100);
344 builder.DrawPath(hpp::PathBuilder{}.AddOval({0, 0, 100, 100}).Build(),
345 red_paint);
346
347 auto dl = builder.Build();
348 ASSERT_TRUE(
349 OpenPlaygroundHere([&](const auto& context, const auto& surface) -> bool {
350 hpp::Surface window(surface.GetC());
351 window.Draw(dl);
352 return true;
353 }));
354}
ImpellerPoint top_left
Definition impeller.h:606
ImpellerPoint bottom_right
Definition impeller.h:609

References ImpellerRoundingRadii::bottom_right, context, surface, ImpellerRoundingRadii::top_left, and window.

◆ TEST_P() [10/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanCreateSurface   
)

Definition at line 49 of file impeller_unittests.cc.

49 {
50 if (GetBackend() != PlaygroundBackend::kOpenGLES &&
51 GetBackend() != PlaygroundBackend::kOpenGLESSDF) {
52 GTEST_SKIP()
53 << "This test checks wrapping FBOs which is an OpenGL ES only call.";
54 return;
55 }
56 auto context = CreateContext();
57 ASSERT_TRUE(context);
58 const auto window_size = GetWindowSize();
59 ImpellerISize size = {window_size.width, window_size.height};
60 auto surface = Adopt<Surface>(ImpellerSurfaceCreateWrappedFBONew(
61 context.GetC(), //
62 0u, //
63 ImpellerPixelFormat::kImpellerPixelFormatRGBA8888, //
64 &size) //
65 );
66 ASSERT_TRUE(surface);
67}
IMPELLER_EXPORT IMPELLER_NODISCARD ImpellerSurface IMPELLER_NULLABLE ImpellerSurfaceCreateWrappedFBONew(ImpellerContext IMPELLER_NONNULL context, uint64_t fbo, ImpellerPixelFormat format, const ImpellerISize *IMPELLER_NONNULL size)
Create a new surface by wrapping an existing framebuffer object. The framebuffer must be complete as ...

References context, impeller::interop::ImpellerSurfaceCreateWrappedFBONew(), impeller::kOpenGLES, impeller::kOpenGLESSDF, and surface.

◆ TEST_P() [11/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanDrawImage   
)

Definition at line 100 of file impeller_unittests.cc.

100 {
101 auto compressed = LoadFixtureImageCompressed(
103 ASSERT_NE(compressed, nullptr);
104 auto decompressed = std::make_shared<impeller::DecompressedImage>(
105 compressed->Decode().ConvertToRGBA());
106 ASSERT_TRUE(decompressed->IsValid());
107 auto mapping = std::make_unique<hpp::Mapping>(
108 decompressed->GetAllocation()->GetMapping(),
109 decompressed->GetAllocation()->GetSize(), [decompressed]() {
110 // Mapping will be dropped on the floor.
111 });
112
113 auto context = GetHPPContext();
115 desc.pixel_format = ImpellerPixelFormat::kImpellerPixelFormatRGBA8888;
116 desc.size = {decompressed->GetSize().width, decompressed->GetSize().height};
117 desc.mip_count = 1u;
118 auto texture = hpp::Texture::WithContents(context, desc, std::move(mapping));
119 ASSERT_TRUE(texture);
120
121 auto dl = hpp::DisplayListBuilder{}
122 .DrawTexture(texture, {100, 100},
123 kImpellerTextureSamplingLinear, hpp::Paint{})
124 .Build();
125
126 ASSERT_TRUE(
127 OpenPlaygroundHere([&](const auto& context, const auto& surface) -> bool {
128 hpp::Surface window(surface.GetC());
129 window.Draw(dl);
130 return true;
131 }));
132}
int64_t width
Definition impeller.h:520

References context, kImpellerTextureSamplingLinear, ImpellerTextureDescriptor::mip_count, flutter::testing::OpenFixtureAsMapping(), ImpellerTextureDescriptor::pixel_format, ImpellerTextureDescriptor::size, surface, texture, ImpellerISize::width, and window.

◆ TEST_P() [12/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanDrawRect   
)

Definition at line 69 of file impeller_unittests.cc.

69 {
70 auto builder =
71 Adopt<DisplayListBuilder>(ImpellerDisplayListBuilderNew(nullptr));
72 auto paint = Adopt<Paint>(ImpellerPaintNew());
73 ImpellerColor color = {0.0, 0.0, 1.0, 1.0};
74 ImpellerPaintSetColor(paint.GetC(), &color);
75 ImpellerRect rect = {10, 20, 100, 200};
76 ImpellerDisplayListBuilderDrawRect(builder.GetC(), &rect, paint.GetC());
77 color = {1.0, 0.0, 0.0, 1.0};
78 ImpellerPaintSetColor(paint.GetC(), &color);
79 ImpellerDisplayListBuilderTranslate(builder.GetC(), 110, 210);
80 ImpellerMatrix scale_transform = {
81 // clang-format off
82 2.0, 0.0, 0.0, 0.0, //
83 0.0, 2.0, 0.0, 0.0, //
84 0.0, 0.0, 1.0, 0.0, //
85 0.0, 0.0, 0.0, 1.0, //
86 // clang-format on
87 };
88 ImpellerDisplayListBuilderTransform(builder.GetC(), &scale_transform);
89 ImpellerDisplayListBuilderDrawRect(builder.GetC(), &rect, paint.GetC());
90 auto dl = Adopt<DisplayList>(
92 ASSERT_TRUE(dl);
93 ASSERT_TRUE(
94 OpenPlaygroundHere([&](const auto& context, const auto& surface) -> bool {
95 ImpellerSurfaceDrawDisplayList(surface.GetC(), dl.GetC());
96 return true;
97 }));
98}
IMPELLER_EXPORT void ImpellerDisplayListBuilderTranslate(ImpellerDisplayListBuilder IMPELLER_NONNULL builder, float x_translation, float y_translation)
Apply a translation to the transformation matrix currently on top of the save stack.
IMPELLER_EXPORT void ImpellerDisplayListBuilderTransform(ImpellerDisplayListBuilder IMPELLER_NONNULL builder, const ImpellerMatrix *IMPELLER_NONNULL transform)
Appends the the provided transformation to the transformation already on the save stack.
IMPELLER_EXPORT void ImpellerDisplayListBuilderDrawRect(ImpellerDisplayListBuilder IMPELLER_NONNULL builder, const ImpellerRect *IMPELLER_NONNULL rect, ImpellerPaint IMPELLER_NONNULL paint)
Draws a rectangle.

References context, impeller::interop::ImpellerDisplayListBuilderCreateDisplayListNew(), impeller::interop::ImpellerDisplayListBuilderDrawRect(), impeller::interop::ImpellerDisplayListBuilderNew(), impeller::interop::ImpellerDisplayListBuilderTransform(), impeller::interop::ImpellerDisplayListBuilderTranslate(), impeller::interop::ImpellerPaintNew(), impeller::interop::ImpellerPaintSetColor(), impeller::interop::ImpellerSurfaceDrawDisplayList(), and surface.

◆ TEST_P() [13/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanGetPathBounds   
)

Definition at line 626 of file impeller_unittests.cc.

626 {
627 const auto path =
628 hpp::PathBuilder{}.MoveTo({100, 100}).LineTo({200, 200}).Build();
629 const auto bounds = path.GetBounds();
630 ASSERT_EQ(bounds.x, 100);
631 ASSERT_EQ(bounds.y, 100);
632 ASSERT_EQ(bounds.width, 100);
633 ASSERT_EQ(bounds.height, 100);
634}
void LineTo(PathBuilder *builder, Scalar x, Scalar y)

References impeller::LineTo().

◆ TEST_P() [14/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanMeasureText   
)

Definition at line 538 of file impeller_unittests.cc.

538 {
539 hpp::TypographyContext type_context;
540 hpp::ParagraphBuilder paragraph_builder(type_context);
541 hpp::ParagraphStyle paragraph_style;
542 paragraph_style.SetFontSize(50);
543 paragraph_builder.PushStyle(paragraph_style);
544 const std::string text =
545 "🏁 Can 👨‍👨‍👦‍👦 Measure 🔍 Text\nAnd this is line "
546 "two.\nWhoa! Three lines. How high does this go?\r\nI stopped counting.";
547 const auto u16text = fml::Utf8ToUtf16(text);
548 ASSERT_NE(text.size(), u16text.size());
549 paragraph_builder.AddText(reinterpret_cast<const uint8_t*>(text.data()),
550 text.size());
551 hpp::DisplayListBuilder builder;
552 // Don't rely on implicit line breaks in this test to make it less brittle to
553 // different fonts being picked.
554 hpp::Paragraph paragraph = paragraph_builder.Build(FLT_MAX);
555 const auto line_count = paragraph.GetLineCount();
556 ASSERT_EQ(line_count, 4u);
557
558 // Line Metrics.
559 {
560 auto metrics = paragraph.GetLineMetrics();
561 ASSERT_GT(metrics.GetAscent(0), 0.0);
562 ASSERT_GT(metrics.GetUnscaledAscent(0), 0.0);
563 ASSERT_GT(metrics.GetDescent(0), 0.0);
564 ASSERT_GT(metrics.GetBaseline(0), 0.0);
565 ASSERT_TRUE(metrics.IsHardbreak(0));
566 ASSERT_DOUBLE_EQ(metrics.GetLeft(0), 0.0);
567 ASSERT_EQ(metrics.GetCodeUnitStartIndex(0), 0u);
568 ASSERT_EQ(metrics.GetCodeUnitEndIndexIncludingNewline(0),
569 metrics.GetCodeUnitEndIndex(0) + 1u);
570 ASSERT_GT(metrics.GetCodeUnitStartIndex(1), 0u);
571 // Last line should cover the entire range.
572 ASSERT_EQ(metrics.GetCodeUnitEndIndex(3), u16text.size());
573 }
574
575 // Glyph info by code point.
576 {
577 auto glyph = paragraph.GlyphInfoAtCodeUnitIndex(0u);
578 ASSERT_TRUE(glyph);
579 ASSERT_EQ(glyph.GetGraphemeClusterCodeUnitRangeBegin(), 0u);
580 ASSERT_EQ(glyph.GetGraphemeClusterCodeUnitRangeEnd(),
581 fml::Utf8ToUtf16("🏁").size());
582 auto bounds = glyph.GetGraphemeClusterBounds();
583 ASSERT_GT(bounds.width, 0.0);
584 ASSERT_GT(bounds.height, 0.0);
585 ASSERT_FALSE(glyph.IsEllipsis());
586 ASSERT_EQ(glyph.GetTextDirection(), kImpellerTextDirectionLTR);
587
588 ImpellerRect bounds2 = {};
589 ImpellerGlyphInfoGetGraphemeClusterBounds(glyph.Get(), &bounds2);
590 ASSERT_EQ(bounds.width, bounds2.width);
591 ASSERT_EQ(bounds.height, bounds2.height);
592 }
593
594 // Glyph info by coordinates.
595 {
596 auto glyph = paragraph.GlyphInfoAtParagraphCoordinates(0.0, 0.0);
597 ASSERT_TRUE(glyph);
598 ASSERT_EQ(glyph.GetGraphemeClusterCodeUnitRangeEnd(),
599 fml::Utf8ToUtf16("🏁").size());
600 }
601
602 // Glyph Figure out word boundaries.
603 {
604 auto glyph = paragraph.GlyphInfoAtCodeUnitIndex(0u);
605 ASSERT_TRUE(glyph);
606 auto range =
607 paragraph.GetWordBoundary(glyph.GetGraphemeClusterCodeUnitRangeEnd());
608 ASSERT_GT(range.end, 0u);
609 ImpellerRange range2 = {};
611 paragraph.Get(), glyph.GetGraphemeClusterCodeUnitRangeEnd(), &range2);
612 ASSERT_EQ(range.start, range2.start);
613 ASSERT_EQ(range.end, range2.end);
614 }
615
616 builder.DrawParagraph(paragraph, ImpellerPoint{100, 100});
617 auto dl = builder.Build();
618 ASSERT_TRUE(
619 OpenPlaygroundHere([&](const auto& context, const auto& surface) -> bool {
620 hpp::Surface window(surface.GetC());
621 window.Draw(dl);
622 return true;
623 }));
624}
IMPELLER_EXPORT void ImpellerParagraphGetWordBoundary(ImpellerParagraph IMPELLER_NONNULL paragraph, size_t code_unit_index, ImpellerRange *IMPELLER_NONNULL out_range)
Get the range into the UTF-16 code unit buffer that represents the word at the specified caret locati...
@ kImpellerTextDirectionLTR
Definition impeller.h:481
IMPELLER_EXPORT void ImpellerGlyphInfoGetGraphemeClusterBounds(ImpellerGlyphInfo IMPELLER_NONNULL glyph_info, ImpellerRect *IMPELLER_NONNULL out_bounds)
Fetch the bounds of the grapheme cluster for the glyph in the coordinate space of the paragraph.
std::u16string Utf8ToUtf16(const std::string_view string)
uint64_t end
Definition impeller.h:526
uint64_t start
Definition impeller.h:525
float height
Definition impeller.h:506

References context, ImpellerRange::end, ImpellerRect::height, impeller::interop::ImpellerGlyphInfoGetGraphemeClusterBounds(), impeller::interop::ImpellerParagraphGetWordBoundary(), kImpellerTextDirectionLTR, ImpellerRange::start, surface, text, fml::Utf8ToUtf16(), ImpellerRect::width, and window.

◆ TEST_P() [15/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanRenderShadows   
)

Definition at line 509 of file impeller_unittests.cc.

509 {
510 hpp::DisplayListBuilder builder;
511 {
512 builder.DrawRect(ImpellerRect{0, 0, 400, 400},
513 hpp::Paint{}.SetColor(ImpellerColor{
514 0.0, 1.0, 0.0, 1.0, kImpellerColorSpaceSRGB}));
515 }
516 ImpellerRect box = {100, 100, 100, 100};
517 {
518 hpp::PathBuilder path_builder;
519 path_builder.AddRect(box);
520 ImpellerColor shadow_color = {0.0, 0.0, 0.0, 1.0, kImpellerColorSpaceSRGB};
521 builder.DrawShadow(path_builder.Build(), shadow_color, 4.0f, false, 1.0f);
522 }
523 {
524 hpp::Paint red_paint;
525 red_paint.SetColor(
526 ImpellerColor{1.0, 0.0, 0.0, 1.0, kImpellerColorSpaceSRGB});
527 builder.DrawRect(box, red_paint);
528 }
529 auto dl = builder.Build();
530 ASSERT_TRUE(
531 OpenPlaygroundHere([&](const auto& context, const auto& surface) -> bool {
532 hpp::Surface window(surface.GetC());
533 window.Draw(dl);
534 return true;
535 }));
536}
@ kImpellerColorSpaceSRGB
Definition impeller.h:448

References context, kImpellerColorSpaceSRGB, surface, and window.

◆ TEST_P() [16/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
CanRenderTextAlignments   
)

Definition at line 470 of file impeller_unittests.cc.

470 {
471 hpp::TypographyContext tc;
472
473 hpp::DisplayListBuilder builder;
474 hpp::Paint bg;
475 hpp::ParagraphStyle p_style;
476 p_style.SetFontFamily("Roboto");
477 p_style.SetFontSize(24.0);
478 p_style.SetFontWeight(kImpellerFontWeight400);
479
480 // Clear the background to a white color.
481 ImpellerColor clear_color = {1.0, 1.0, 1.0, 1.0};
482 bg.SetColor(clear_color);
483 builder.DrawPaint(bg);
484
485 // Draw red, left-aligned text.
486 ImpellerColor red = {1.0, 0.0, 0.0, 1.0};
487 DrawTextFrame(tc, builder, p_style, bg, red, kImpellerTextAlignmentLeft, 0.0);
488
489 // Draw green, centered text.
490 ImpellerColor green = {0.0, 1.0, 0.0, 1.0};
491 DrawTextFrame(tc, builder, p_style, bg, green, kImpellerTextAlignmentCenter,
492 220.0);
493
494 // Draw blue, right-aligned text.
495 ImpellerColor blue = {0.0, 0.0, 1.0, 1.0};
496 DrawTextFrame(tc, builder, p_style, bg, blue, kImpellerTextAlignmentRight,
497 440.0);
498
499 auto dl = builder.Build();
500
501 ASSERT_TRUE(
502 OpenPlaygroundHere([&](const auto& context, const auto& surface) -> bool {
503 hpp::Surface window(surface.GetC());
504 window.Draw(dl);
505 return true;
506 }));
507}
@ kImpellerFontWeight400
Definition impeller.h:457
@ kImpellerTextAlignmentLeft
Definition impeller.h:471
@ kImpellerTextAlignmentCenter
Definition impeller.h:473
@ kImpellerTextAlignmentRight
Definition impeller.h:472
static void DrawTextFrame(const hpp::TypographyContext &tc, hpp::DisplayListBuilder &builder, hpp::ParagraphStyle &p_style, const hpp::Paint &bg, ImpellerColor color, ImpellerTextAlignment align, float x_offset)

References context, DrawTextFrame(), kImpellerFontWeight400, kImpellerTextAlignmentCenter, kImpellerTextAlignmentLeft, kImpellerTextAlignmentRight, surface, and window.

◆ TEST_P() [17/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
ClearsOpenGLStancilStateAfterTransition   
)

Definition at line 204 of file impeller_unittests.cc.

204 {
205 auto context = GetInteropContext();
206 auto impeller_context = context->GetContext();
207 if (impeller_context->GetBackendType() !=
209 GTEST_SKIP() << "This test works with OpenGL handles is only suitable for "
210 "that backend.";
211 return;
212 }
213 const auto& gl_context = ContextGLES::Cast(*impeller_context);
214 const auto& gl = gl_context.GetReactor()->GetProcTable();
215 auto builder =
216 Adopt<DisplayListBuilder>(ImpellerDisplayListBuilderNew(nullptr));
217 auto paint = Adopt<Paint>(ImpellerPaintNew());
218 ImpellerColor color = {0.0, 0.0, 1.0, 1.0};
219 ImpellerPaintSetColor(paint.GetC(), &color);
220 ImpellerRect rect = {10, 20, 100, 200};
221 ImpellerDisplayListBuilderDrawRect(builder.GetC(), &rect, paint.GetC());
222 color = {1.0, 0.0, 0.0, 1.0};
223 ImpellerPaintSetColor(paint.GetC(), &color);
224 ImpellerDisplayListBuilderTranslate(builder.GetC(), 110, 210);
225 ImpellerDisplayListBuilderClipRect(builder.GetC(), &rect,
227 ImpellerDisplayListBuilderDrawRect(builder.GetC(), &rect, paint.GetC());
228 auto dl = Adopt<DisplayList>(
230 ASSERT_TRUE(dl);
231 ASSERT_TRUE(
232 OpenPlaygroundHere([&](const auto& context, const auto& surface) -> bool {
233 ImpellerSurfaceDrawDisplayList(surface.GetC(), dl.GetC());
234 // OpenGL state is reset even though the operations above enable a
235 // stencil check.
236 GLboolean stencil_enabled = true;
237 gl.GetBooleanv(GL_STENCIL_TEST, &stencil_enabled);
238 return stencil_enabled == GL_FALSE;
239 }));
240}
IMPELLER_EXPORT void ImpellerDisplayListBuilderClipRect(ImpellerDisplayListBuilder IMPELLER_NONNULL builder, const ImpellerRect *IMPELLER_NONNULL rect, ImpellerClipOperation op)
Reduces the clip region to the intersection of the current clip and the given rectangle taking into a...
@ kImpellerClipOperationDifference
Definition impeller.h:370

References impeller::BackendCast< ContextGLES, Context >::Cast(), context, impeller::interop::ImpellerDisplayListBuilderClipRect(), impeller::interop::ImpellerDisplayListBuilderCreateDisplayListNew(), impeller::interop::ImpellerDisplayListBuilderDrawRect(), impeller::interop::ImpellerDisplayListBuilderNew(), impeller::interop::ImpellerDisplayListBuilderTranslate(), impeller::interop::ImpellerPaintNew(), impeller::interop::ImpellerPaintSetColor(), impeller::interop::ImpellerSurfaceDrawDisplayList(), kImpellerClipOperationDifference, impeller::Context::kOpenGLES, and surface.

◆ TEST_P() [18/18]

impeller::interop::testing::TEST_P ( InteropPlaygroundTest  ,
MappingsReleaseTheirDataOnDestruction   
)

Definition at line 696 of file impeller_unittests.cc.

696 {
697 bool deleted = false;
698 {
699 hpp::Mapping mapping(nullptr, 0, [&deleted]() { deleted = true; });
700 }
701 ASSERT_TRUE(deleted);
702}