From 73c9f7ebf4ae07492367c1c39f940603046b780e Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 14 Jun 2020 19:32:23 +0200 Subject: [PATCH] LibWeb: Move "visible in viewport" state tracking to ImageLoader This should technically apply to any LayoutImage, so let's just move it to ImageLoader. --- Libraries/LibWeb/DOM/HTMLImageElement.cpp | 5 ----- Libraries/LibWeb/DOM/HTMLImageElement.h | 2 -- Libraries/LibWeb/Layout/LayoutDocument.cpp | 3 +-- Libraries/LibWeb/Layout/LayoutImage.cpp | 5 +++++ Libraries/LibWeb/Layout/LayoutImage.h | 2 ++ Libraries/LibWeb/Loader/ImageLoader.cpp | 4 ++-- Libraries/LibWeb/Loader/ImageLoader.h | 4 ++-- 7 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Libraries/LibWeb/DOM/HTMLImageElement.cpp b/Libraries/LibWeb/DOM/HTMLImageElement.cpp index 91d48622d1..52d9601d17 100644 --- a/Libraries/LibWeb/DOM/HTMLImageElement.cpp +++ b/Libraries/LibWeb/DOM/HTMLImageElement.cpp @@ -87,9 +87,4 @@ const Gfx::Bitmap* HTMLImageElement::bitmap() const return m_image_loader.bitmap(); } -void HTMLImageElement::set_visible_in_viewport(Badge, bool visible_in_viewport) -{ - m_image_loader.set_visible_in_viewport(visible_in_viewport); -} - } diff --git a/Libraries/LibWeb/DOM/HTMLImageElement.h b/Libraries/LibWeb/DOM/HTMLImageElement.h index aa14947f9e..a981bb432c 100644 --- a/Libraries/LibWeb/DOM/HTMLImageElement.h +++ b/Libraries/LibWeb/DOM/HTMLImageElement.h @@ -51,8 +51,6 @@ public: const Gfx::Bitmap* bitmap() const; const Gfx::ImageDecoder* image_decoder() const; - void set_visible_in_viewport(Badge, bool); - private: void animate(); diff --git a/Libraries/LibWeb/Layout/LayoutDocument.cpp b/Libraries/LibWeb/Layout/LayoutDocument.cpp index 75c5eace8e..e49807e82f 100644 --- a/Libraries/LibWeb/Layout/LayoutDocument.cpp +++ b/Libraries/LibWeb/Layout/LayoutDocument.cpp @@ -71,8 +71,7 @@ void LayoutDocument::did_set_viewport_rect(Badge, const Gfx::IntRect& a_v { Gfx::FloatRect viewport_rect(a_viewport_rect.x(), a_viewport_rect.y(), a_viewport_rect.width(), a_viewport_rect.height()); for_each_in_subtree_of_type([&](auto& layout_image) { - if (is(layout_image.node())) - const_cast(to(layout_image.node())).set_visible_in_viewport({}, viewport_rect.intersects(layout_image.absolute_rect())); + const_cast(layout_image).set_visible_in_viewport({}, viewport_rect.intersects(layout_image.absolute_rect())); return IterationDecision::Continue; }); } diff --git a/Libraries/LibWeb/Layout/LayoutImage.cpp b/Libraries/LibWeb/Layout/LayoutImage.cpp index c4200faa9e..3e27608574 100644 --- a/Libraries/LibWeb/Layout/LayoutImage.cpp +++ b/Libraries/LibWeb/Layout/LayoutImage.cpp @@ -108,4 +108,9 @@ bool LayoutImage::renders_as_alt_text() const return false; } +void LayoutImage::set_visible_in_viewport(Badge, bool visible_in_viewport) +{ + m_image_loader.set_visible_in_viewport(visible_in_viewport); +} + } diff --git a/Libraries/LibWeb/Layout/LayoutImage.h b/Libraries/LibWeb/Layout/LayoutImage.h index a972d51167..f7d59dac72 100644 --- a/Libraries/LibWeb/Layout/LayoutImage.h +++ b/Libraries/LibWeb/Layout/LayoutImage.h @@ -45,6 +45,8 @@ public: bool renders_as_alt_text() const; + void set_visible_in_viewport(Badge, bool); + private: virtual const char* class_name() const override { return "LayoutImage"; } virtual bool is_image() const override { return true; } diff --git a/Libraries/LibWeb/Loader/ImageLoader.cpp b/Libraries/LibWeb/Loader/ImageLoader.cpp index e3e3502805..a6b3ecae58 100644 --- a/Libraries/LibWeb/Loader/ImageLoader.cpp +++ b/Libraries/LibWeb/Loader/ImageLoader.cpp @@ -44,7 +44,7 @@ void ImageLoader::load(const URL& url) set_resource(ResourceLoader::the().load_resource(Resource::Type::Image, request)); } -void ImageLoader::set_visible_in_viewport(bool visible_in_viewport) +void ImageLoader::set_visible_in_viewport(bool visible_in_viewport) const { if (m_visible_in_viewport == visible_in_viewport) return; @@ -54,7 +54,7 @@ void ImageLoader::set_visible_in_viewport(bool visible_in_viewport) // the whole document, updating "is visible in viewport" flags, and this could lead // to the same bitmap being marked volatile back and forth unnecessarily. if (resource()) - resource()->update_volatility(); + const_cast(resource())->update_volatility(); } void ImageLoader::resource_did_load() diff --git a/Libraries/LibWeb/Loader/ImageLoader.h b/Libraries/LibWeb/Loader/ImageLoader.h index 14c8cd3288..71cd48ff64 100644 --- a/Libraries/LibWeb/Loader/ImageLoader.h +++ b/Libraries/LibWeb/Loader/ImageLoader.h @@ -41,7 +41,7 @@ public: const Gfx::Bitmap* bitmap() const; const Gfx::ImageDecoder* image_decoder() const; - void set_visible_in_viewport(bool); + void set_visible_in_viewport(bool) const; Function on_load; Function on_fail; @@ -57,7 +57,7 @@ private: void animate(); RefPtr m_decoder; - bool m_visible_in_viewport { false }; + mutable bool m_visible_in_viewport { false }; size_t m_current_frame_index { 0 }; size_t m_loops_completed { 0 };