/* * Copyright (c) 2018-2022, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include #include #include namespace Web::Painting { GC_DEFINE_ALLOCATOR(NavigableContainerViewportPaintable); GC::Ref NavigableContainerViewportPaintable::create(Layout::NavigableContainerViewport const& layout_box) { return layout_box.heap().allocate(layout_box); } NavigableContainerViewportPaintable::NavigableContainerViewportPaintable(Layout::NavigableContainerViewport const& layout_box) : PaintableBox(layout_box) { } void NavigableContainerViewportPaintable::paint(DisplayListRecordingContext& context, PaintPhase phase) const { if (!is_visible()) return; PaintableBox::paint(context, phase); if (phase == PaintPhase::Foreground) { auto absolute_rect = this->absolute_rect(); auto clip_rect = context.rounded_device_rect(absolute_rect); ScopedCornerRadiusClip corner_clip { context, clip_rect, normalized_border_radii_data(ShrinkRadiiForBorders::Yes) }; auto const& navigable_container = this->navigable_container(); auto* hosted_document = const_cast(navigable_container.content_document_without_origin_check()); if (!hosted_document) return; if (hosted_document->is_render_blocked()) return; auto content_navigable = navigable_container.content_navigable(); VERIFY(content_navigable); context.display_list_recorder().save(); context.display_list_recorder().add_clip_rect(clip_rect.to_type()); context.display_list_recorder().draw_external_content( context.enclosing_device_rect(absolute_rect).to_type(), content_navigable->external_content_source(), Gfx::ScalingMode::NearestNeighbor); context.display_list_recorder().restore(); if constexpr (HIGHLIGHT_FOCUSED_FRAME_DEBUG) { if (content_navigable->is_focused()) { context.display_list_recorder().draw_rect(clip_rect.to_type(), Color::Cyan); } } } } }