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:
parent
9858e2632c
commit
958b395418
3 changed files with 27 additions and 1 deletions
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue