From f6f647bf131098e3acb02e325c40e32eaba25ffe Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Sun, 21 Jan 2024 15:21:56 -0500 Subject: [PATCH] LibGfx/TIFF: Add an alternative entry point to only request metadata A lot of images format use Exif to store there metadata. As Exif is based on the TIFF structure, the TIFF decoder can, without modification be able to decode the metadata. We only need a new API to explicitly mention that we only need the metadata. --- Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.cpp | 8 ++++++++ Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.h | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.cpp index d8389986b19..6356d73738e 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.cpp @@ -622,4 +622,12 @@ ErrorOr> TIFFImageDecoderPlugin::icc_data() return m_context->metadata().icc_profile().map([](auto const& buffer) -> ReadonlyBytes { return buffer.bytes(); }); } +ErrorOr> TIFFImageDecoderPlugin::read_exif_metadata(ReadonlyBytes data) +{ + auto stream = TRY(try_make(data)); + auto plugin = TRY(adopt_nonnull_own_or_enomem(new (nothrow) TIFFImageDecoderPlugin(move(stream)))); + TRY(plugin->m_context->decode_image_header()); + return try_make(plugin->m_context->metadata()); +} + } diff --git a/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.h b/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.h index 59b4ee0f8e2..02847a2e2ba 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.h +++ b/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.h @@ -7,10 +7,13 @@ #pragma once #include +#include #include namespace Gfx { +class ExifMetadata; + // This is a link to the main TIFF specification from 1992 // https://www.itu.int/itudoc/itu-t/com16/tiff-fx/docs/tiff6.pdf @@ -33,6 +36,7 @@ class TIFFImageDecoderPlugin : public ImageDecoderPlugin { public: static bool sniff(ReadonlyBytes); static ErrorOr> create(ReadonlyBytes); + static ErrorOr> read_exif_metadata(ReadonlyBytes); virtual ~TIFFImageDecoderPlugin() override = default;