1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 18:17:44 +00:00

LibHTML: Support rendering <img src> with file:// URLs

We can now show images loaded from local file:// URLs. Pretty neat :^)
This commit is contained in:
Andreas Kling 2019-10-05 23:41:14 +02:00
parent 9858e2632c
commit 958b395418
3 changed files with 27 additions and 1 deletions

View file

@ -1,4 +1,5 @@
#include <LibHTML/CSS/StyleResolver.h> #include <LibHTML/CSS/StyleResolver.h>
#include <LibHTML/DOM/Document.h>
#include <LibHTML/DOM/HTMLImageElement.h> #include <LibHTML/DOM/HTMLImageElement.h>
#include <LibHTML/Layout/LayoutImage.h> #include <LibHTML/Layout/LayoutImage.h>
@ -22,3 +23,18 @@ RefPtr<LayoutNode> HTMLImageElement::create_layout_node(const StyleResolver& res
return nullptr; return nullptr;
return adopt(*new LayoutImage(*this, move(style))); return adopt(*new LayoutImage(*this, move(style)));
} }
const GraphicsBitmap* HTMLImageElement::bitmap() const
{
if (!m_bitmap) {
URL src_url = document().complete_url(this->src());
if (src_url.protocol() == "file") {
m_bitmap = GraphicsBitmap::load_from_file(src_url.path());
} else {
// FIXME: Implement! This whole thing should be at a different layer though..
ASSERT_NOT_REACHED();
}
}
return m_bitmap;
}

View file

@ -1,5 +1,6 @@
#pragma once #pragma once
#include <LibDraw/GraphicsBitmap.h>
#include <LibHTML/DOM/HTMLElement.h> #include <LibHTML/DOM/HTMLElement.h>
class HTMLImageElement : public HTMLElement { class HTMLImageElement : public HTMLElement {
@ -10,6 +11,10 @@ public:
String alt() const { return attribute("alt"); } String alt() const { return attribute("alt"); }
String src() const { return attribute("src"); } String src() const { return attribute("src"); }
const GraphicsBitmap* bitmap() const;
private: private:
virtual RefPtr<LayoutNode> create_layout_node(const StyleResolver&, const StyleProperties* parent_style) const override; virtual RefPtr<LayoutNode> create_layout_node(const StyleResolver&, const StyleProperties* parent_style) const override;
mutable RefPtr<GraphicsBitmap> m_bitmap;
}; };

View file

@ -18,6 +18,9 @@ void LayoutImage::layout()
auto& font = Font::default_font(); auto& font = Font::default_font();
rect().set_width(font.width(node().alt()) + 16); rect().set_width(font.width(node().alt()) + 16);
rect().set_height(font.glyph_height() + 16); rect().set_height(font.glyph_height() + 16);
} else {
rect().set_width(node().bitmap()->width());
rect().set_height(node().bitmap()->height());
} }
LayoutReplaced::layout(); LayoutReplaced::layout();
@ -29,11 +32,13 @@ void LayoutImage::render(RenderingContext& context)
context.painter().set_font(Font::default_font()); context.painter().set_font(Font::default_font());
StylePainter::paint_frame(context.painter(), rect(), FrameShape::Container, FrameShadow::Sunken, 2); StylePainter::paint_frame(context.painter(), rect(), FrameShape::Container, FrameShadow::Sunken, 2);
context.painter().draw_text(rect(), node().alt(), TextAlignment::Center, Color::White); context.painter().draw_text(rect(), node().alt(), TextAlignment::Center, Color::White);
} else {
context.painter().draw_scaled_bitmap(rect(), *node().bitmap(), node().bitmap()->rect());
} }
LayoutReplaced::render(context); LayoutReplaced::render(context);
} }
bool LayoutImage::renders_as_alt_text() const bool LayoutImage::renders_as_alt_text() const
{ {
return true; return !node().bitmap();
} }