Browse Source

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

We can now show images loaded from local file:// URLs. Pretty neat :^)
Andreas Kling 5 years ago
parent
commit
958b395418

+ 16 - 0
Libraries/LibHTML/DOM/HTMLImageElement.cpp

@@ -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;
+}

+ 5 - 0
Libraries/LibHTML/DOM/HTMLImageElement.h

@@ -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;
 };

+ 6 - 1
Libraries/LibHTML/Layout/LayoutImage.cpp

@@ -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();
 }