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/DOM/Document.h>
#include <LibHTML/DOM/HTMLImageElement.h>
#include <LibHTML/Layout/LayoutImage.h>
@ -22,3 +23,18 @@ RefPtr<LayoutNode> HTMLImageElement::create_layout_node(const StyleResolver& res
return nullptr;
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
#include <LibDraw/GraphicsBitmap.h>
#include <LibHTML/DOM/HTMLElement.h>
class HTMLImageElement : public HTMLElement {
@ -10,6 +11,10 @@ public:
String alt() const { return attribute("alt"); }
String src() const { return attribute("src"); }
const GraphicsBitmap* bitmap() const;
private:
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();
rect().set_width(font.width(node().alt()) + 16);
rect().set_height(font.glyph_height() + 16);
} else {
rect().set_width(node().bitmap()->width());
rect().set_height(node().bitmap()->height());
}
LayoutReplaced::layout();
@ -29,11 +32,13 @@ void LayoutImage::render(RenderingContext& context)
context.painter().set_font(Font::default_font());
StylePainter::paint_frame(context.painter(), rect(), FrameShape::Container, FrameShadow::Sunken, 2);
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);
}
bool LayoutImage::renders_as_alt_text() const
{
return true;
return !node().bitmap();
}