From 3124c1616ca7110656c79fa35ef126b9d08345ff Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Thu, 11 Jan 2024 23:41:37 -0500 Subject: [PATCH] LibGfx/TIFF: Generate code for the u16 to TIFF::Type conversion --- .../LibGfx/ImageFormats/TIFFLoader.cpp | 29 ++----------------- Userland/Libraries/LibGfx/TIFFGenerator.py | 14 +++++++++ 2 files changed, 16 insertions(+), 27 deletions(-) diff --git a/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.cpp index b4e42709ed..42dfa83c0e 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.cpp @@ -423,32 +423,6 @@ private: return {}; } - ErrorOr read_type() - { - switch (TRY(read_value())) { - case to_underlying(Type::Byte): - return Type::Byte; - case to_underlying(Type::ASCII): - return Type::ASCII; - case to_underlying(Type::UnsignedShort): - return Type::UnsignedShort; - case to_underlying(Type::UnsignedLong): - return Type::UnsignedLong; - case to_underlying(Type::UnsignedRational): - return Type::UnsignedRational; - case to_underlying(Type::Undefined): - return Type::Undefined; - case to_underlying(Type::SignedLong): - return Type::SignedLong; - case to_underlying(Type::SignedRational): - return Type::SignedRational; - case to_underlying(Type::UTF8): - return Type::UTF8; - default: - return Error::from_string_literal("TIFFImageDecoderPlugin: Unknown type"); - } - } - static constexpr u8 size_of_type(Type type) { switch (type) { @@ -541,7 +515,8 @@ private: ErrorOr read_tag() { auto const tag = TRY(read_value()); - auto const type = TRY(read_type()); + auto const raw_type = TRY(read_value()); + auto const type = TRY(tiff_type_from_u16(raw_type)); auto const count = TRY(read_value()); Checked checked_size = size_of_type(type); diff --git a/Userland/Libraries/LibGfx/TIFFGenerator.py b/Userland/Libraries/LibGfx/TIFFGenerator.py index a5a563eb55..73337e8a46 100755 --- a/Userland/Libraries/LibGfx/TIFFGenerator.py +++ b/Userland/Libraries/LibGfx/TIFFGenerator.py @@ -136,6 +136,7 @@ HANDLE_TAG_SIGNATURE = HANDLE_TAG_SIGNATURE_TEMPLATE.format(namespace="") HANDLE_TAG_SIGNATURE_TIFF_NAMESPACE = HANDLE_TAG_SIGNATURE_TEMPLATE.format(namespace="TIFF::") ENSURE_BASELINE_TAG_PRESENCE = "ErrorOr ensure_baseline_tags_are_present(Metadata const& metadata)" +TIFF_TYPE_FROM_U16 = "ErrorOr tiff_type_from_u16(u16 type)" LICENSE = R"""/* * Copyright (c) 2023, Lucas Chollet @@ -369,6 +370,7 @@ using Value = Variant, i32, Rational {HANDLE_TAG_SIGNATURE}; {ENSURE_BASELINE_TAG_PRESENCE}; +{TIFF_TYPE_FROM_U16}; }} @@ -459,6 +461,9 @@ def generate_tag_handler_file(tags: List[Tag]) -> str: return Error::from_string_literal("Unable to decode image, missing required tag {tag.name}."); """ for tag in filter(lambda tag: tag.is_required, known_tags)]) + tiff_type_from_u16_cases = '\n'.join([fR""" case to_underlying(Type::{t.name}): + return Type::{t.name};""" for t in TIFFType]) + output = fR"""{LICENSE} #include @@ -498,6 +503,15 @@ static String value_formatter(u32 tag_id, Value const& v) {{ return {{}}; }} +{TIFF_TYPE_FROM_U16} +{{ + switch (type) {{ +{tiff_type_from_u16_cases} + default: + return Error::from_string_literal("TIFFImageDecoderPlugin: Unknown type"); + }} +}} + {HANDLE_TAG_SIGNATURE} {{