From 92627154a7e1e7e5284f8db20ba18b93711d28fe Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 23 Mar 2019 12:37:33 +0100 Subject: [PATCH] FileManager: Add basic thumbnailing of PNG images. These use nearest neighbor and are computed synchronously on directory load so it's neither fast nor very beautiful. These issues both need work on other parts of the system to fix. --- Applications/FileManager/DirectoryModel.cpp | 16 ++++++++++++++-- Applications/FileManager/DirectoryModel.h | 2 ++ SharedGraphics/GraphicsBitmap.h | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Applications/FileManager/DirectoryModel.cpp b/Applications/FileManager/DirectoryModel.cpp index 8ec45ea55a..0b3bd1d50a 100644 --- a/Applications/FileManager/DirectoryModel.cpp +++ b/Applications/FileManager/DirectoryModel.cpp @@ -6,6 +6,8 @@ #include #include #include +#include +#include DirectoryModel::DirectoryModel() { @@ -79,8 +81,18 @@ const GraphicsBitmap& DirectoryModel::icon_for(const Entry& entry) const return *m_socket_icon; if (entry.mode & S_IXUSR) return *m_executable_icon; - if (entry.name.ends_with(".png")) - return *m_filetype_image_icon; + if (entry.name.ends_with(".png")) { + if (!entry.thumbnail) { + if (auto png_bitmap = GraphicsBitmap::load_from_file(entry.full_path(*this))) { + entry.thumbnail = GraphicsBitmap::create(png_bitmap->format(), { 32, 32 }); + Painter painter(*entry.thumbnail); + painter.draw_scaled_bitmap(entry.thumbnail->rect(), *png_bitmap, png_bitmap->rect()); + } + } + if (!entry.thumbnail) + return *m_filetype_image_icon; + return *entry.thumbnail; + } return *m_file_icon; } diff --git a/Applications/FileManager/DirectoryModel.h b/Applications/FileManager/DirectoryModel.h index 592eac9887..6e743596e5 100644 --- a/Applications/FileManager/DirectoryModel.h +++ b/Applications/FileManager/DirectoryModel.h @@ -45,8 +45,10 @@ private: uid_t uid { 0 }; uid_t gid { 0 }; ino_t inode { 0 }; + mutable RetainPtr thumbnail; bool is_directory() const { return S_ISDIR(mode); } bool is_executable() const { return mode & S_IXUSR; } + String full_path(const DirectoryModel& model) const { return String::format("%s/%s", model.path().characters(), name.characters()); } }; const Entry& entry(int index) const diff --git a/SharedGraphics/GraphicsBitmap.h b/SharedGraphics/GraphicsBitmap.h index 26f3efa396..e48584df69 100644 --- a/SharedGraphics/GraphicsBitmap.h +++ b/SharedGraphics/GraphicsBitmap.h @@ -30,6 +30,7 @@ public: int shared_buffer_id() const { return m_shared_buffer ? m_shared_buffer->shared_buffer_id() : -1; } bool has_alpha_channel() const { return m_format == Format::RGBA32; } + Format format() const { return m_format; } private: GraphicsBitmap(Format, const Size&);