mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 19:37:36 +00:00
LibGfx/TIFF: Make TIFFLoadingContext::handle_tag
be a free function
And move it to another file. This code is going to be generated soon, so let's put it in another file.
This commit is contained in:
parent
34d91dec5b
commit
4ab2903e25
4 changed files with 171 additions and 153 deletions
|
@ -36,6 +36,7 @@ set(SOURCES
|
||||||
ImageFormats/BMPWriter.cpp
|
ImageFormats/BMPWriter.cpp
|
||||||
ImageFormats/BooleanDecoder.cpp
|
ImageFormats/BooleanDecoder.cpp
|
||||||
ImageFormats/TIFFLoader.cpp
|
ImageFormats/TIFFLoader.cpp
|
||||||
|
ImageFormats/TIFFTagHandler.cpp
|
||||||
ImageFormats/DDSLoader.cpp
|
ImageFormats/DDSLoader.cpp
|
||||||
ImageFormats/GIFLoader.cpp
|
ImageFormats/GIFLoader.cpp
|
||||||
ImageFormats/ICOLoader.cpp
|
ImageFormats/ICOLoader.cpp
|
||||||
|
|
|
@ -416,159 +416,7 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TRY(handle_tag(tag, type, count, tiff_value));
|
TRY(handle_tag(m_metadata, tag, type, count, tiff_value));
|
||||||
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
ErrorOr<void> handle_tag(u16 tag, Type type, u32 count, Vector<Value> const& value)
|
|
||||||
{
|
|
||||||
// FIXME: Make that easy to extend
|
|
||||||
switch (tag) {
|
|
||||||
case 256:
|
|
||||||
// ImageWidth
|
|
||||||
if ((type != Type::UnsignedShort && type != Type::UnsignedLong) || count != 1)
|
|
||||||
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 256");
|
|
||||||
|
|
||||||
value[0].visit(
|
|
||||||
[this]<OneOf<u16, u32> T>(T const& width) {
|
|
||||||
m_metadata.size.set_width(width);
|
|
||||||
},
|
|
||||||
[&](auto const&) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 257:
|
|
||||||
// ImageLength
|
|
||||||
if ((type != Type::UnsignedShort && type != Type::UnsignedLong) || count != 1)
|
|
||||||
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 257");
|
|
||||||
|
|
||||||
value[0].visit(
|
|
||||||
[this]<OneOf<u16, u32> T>(T const& width) {
|
|
||||||
m_metadata.size.set_height(width);
|
|
||||||
},
|
|
||||||
[&](auto const&) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 258:
|
|
||||||
// BitsPerSample
|
|
||||||
if (type != Type::UnsignedShort || count != 3)
|
|
||||||
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 258");
|
|
||||||
|
|
||||||
for (u8 i = 0; i < m_metadata.bits_per_sample.size(); ++i) {
|
|
||||||
value[i].visit(
|
|
||||||
[this, i](u16 const& bits_per_sample) {
|
|
||||||
m_metadata.bits_per_sample[i] = bits_per_sample;
|
|
||||||
},
|
|
||||||
[&](auto const&) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 259:
|
|
||||||
// Compression
|
|
||||||
if (type != Type::UnsignedShort || count != 1)
|
|
||||||
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 259");
|
|
||||||
|
|
||||||
TRY(value[0].visit(
|
|
||||||
[this](u16 const& compression) -> ErrorOr<void> {
|
|
||||||
if (compression > 6 && compression != to_underlying(Compression::PackBits))
|
|
||||||
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid compression value");
|
|
||||||
|
|
||||||
m_metadata.compression = static_cast<Compression>(compression);
|
|
||||||
return {};
|
|
||||||
},
|
|
||||||
[&](auto const&) -> ErrorOr<void> {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 273:
|
|
||||||
// StripOffsets
|
|
||||||
if (type != Type::UnsignedShort && type != Type::UnsignedLong)
|
|
||||||
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 273");
|
|
||||||
|
|
||||||
TRY(m_metadata.strip_offsets.try_ensure_capacity(count));
|
|
||||||
for (u32 i = 0; i < count; ++i) {
|
|
||||||
value[i].visit(
|
|
||||||
[this]<OneOf<u16, u32> T>(T const& offset) {
|
|
||||||
m_metadata.strip_offsets.append(offset);
|
|
||||||
},
|
|
||||||
[&](auto const&) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 277:
|
|
||||||
// SamplesPerPixel
|
|
||||||
if (type != Type::UnsignedShort || count != 1)
|
|
||||||
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 277");
|
|
||||||
TRY(value[0].visit(
|
|
||||||
[](u16 const& samples_per_pixels) -> ErrorOr<void> {
|
|
||||||
if (samples_per_pixels != 3)
|
|
||||||
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 277");
|
|
||||||
return {};
|
|
||||||
},
|
|
||||||
[&](auto const&) -> ErrorOr<void> {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 278:
|
|
||||||
// RowsPerStrip
|
|
||||||
if ((type != Type::UnsignedShort && type != Type::UnsignedLong) || count != 1)
|
|
||||||
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 278");
|
|
||||||
|
|
||||||
value[0].visit(
|
|
||||||
[this]<OneOf<u16, u32> T>(T const& rows_per_strip) {
|
|
||||||
m_metadata.rows_per_strip = rows_per_strip;
|
|
||||||
},
|
|
||||||
[&](auto const&) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 279:
|
|
||||||
// StripByteCounts
|
|
||||||
if (type != Type::UnsignedShort && type != Type::UnsignedLong)
|
|
||||||
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 279");
|
|
||||||
|
|
||||||
TRY(m_metadata.strip_bytes_count.try_ensure_capacity(count));
|
|
||||||
for (u32 i = 0; i < count; ++i) {
|
|
||||||
value[i].visit(
|
|
||||||
[this]<OneOf<u16, u32> T>(T const& offset) {
|
|
||||||
m_metadata.strip_bytes_count.append(offset);
|
|
||||||
},
|
|
||||||
[&](auto const&) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 317:
|
|
||||||
// Predictor
|
|
||||||
if (type != Type::UnsignedShort || count != 1)
|
|
||||||
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 317");
|
|
||||||
|
|
||||||
TRY(value[0].visit(
|
|
||||||
[this](u16 const& predictor) -> ErrorOr<void> {
|
|
||||||
if (predictor != 1 && predictor != 2)
|
|
||||||
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid predictor value");
|
|
||||||
|
|
||||||
m_metadata.predictor = static_cast<Predictor>(predictor);
|
|
||||||
return {};
|
|
||||||
},
|
|
||||||
[&](auto const&) -> ErrorOr<void> {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
dbgln_if(TIFF_DEBUG, "Unknown tag: {}", tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
|
|
||||||
namespace Gfx {
|
namespace Gfx {
|
||||||
|
|
||||||
|
struct Metadata;
|
||||||
|
|
||||||
namespace TIFF {
|
namespace TIFF {
|
||||||
|
|
||||||
enum class Type {
|
enum class Type {
|
||||||
|
@ -54,6 +56,8 @@ enum class Predictor {
|
||||||
HorizontalDifferencing = 2,
|
HorizontalDifferencing = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ErrorOr<void> handle_tag(Metadata& metadata, u16 tag, Type type, u32 count, Vector<Value> const& value);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Metadata {
|
struct Metadata {
|
||||||
|
|
165
Userland/Libraries/LibGfx/ImageFormats/TIFFTagHandler.cpp
Normal file
165
Userland/Libraries/LibGfx/ImageFormats/TIFFTagHandler.cpp
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Lucas Chollet <lucas.chollet@serenityos.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <AK/Debug.h>
|
||||||
|
#include <AK/String.h>
|
||||||
|
#include <LibGfx/ImageFormats/TIFFMetadata.h>
|
||||||
|
|
||||||
|
namespace Gfx::TIFF {
|
||||||
|
|
||||||
|
ErrorOr<void> handle_tag(Metadata& metadata, u16 tag, Type type, u32 count, Vector<Value> const& value)
|
||||||
|
{
|
||||||
|
// FIXME: Make that easy to extend
|
||||||
|
switch (tag) {
|
||||||
|
case 256:
|
||||||
|
// ImageWidth
|
||||||
|
if ((type != Type::UnsignedShort && type != Type::UnsignedLong) || count != 1)
|
||||||
|
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 256");
|
||||||
|
|
||||||
|
value[0].visit(
|
||||||
|
[&metadata]<OneOf<u16, u32> T>(T const& width) {
|
||||||
|
metadata.size.set_width(width);
|
||||||
|
},
|
||||||
|
[&](auto const&) {
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 257:
|
||||||
|
// ImageLength
|
||||||
|
if ((type != Type::UnsignedShort && type != Type::UnsignedLong) || count != 1)
|
||||||
|
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 257");
|
||||||
|
|
||||||
|
value[0].visit(
|
||||||
|
[&metadata]<OneOf<u16, u32> T>(T const& width) {
|
||||||
|
metadata.size.set_height(width);
|
||||||
|
},
|
||||||
|
[&](auto const&) {
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 258:
|
||||||
|
// BitsPerSample
|
||||||
|
if (type != Type::UnsignedShort || count != 3)
|
||||||
|
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 258");
|
||||||
|
|
||||||
|
for (u8 i = 0; i < metadata.bits_per_sample.size(); ++i) {
|
||||||
|
value[i].visit(
|
||||||
|
[&metadata, i](u16 const& bits_per_sample) {
|
||||||
|
metadata.bits_per_sample[i] = bits_per_sample;
|
||||||
|
},
|
||||||
|
[&](auto const&) {
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 259:
|
||||||
|
// Compression
|
||||||
|
if (type != Type::UnsignedShort || count != 1)
|
||||||
|
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 259");
|
||||||
|
|
||||||
|
TRY(value[0].visit(
|
||||||
|
[&metadata](u16 const& compression) -> ErrorOr<void> {
|
||||||
|
if (compression > 6 && compression != to_underlying(Compression::PackBits))
|
||||||
|
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid compression value");
|
||||||
|
|
||||||
|
metadata.compression = static_cast<Compression>(compression);
|
||||||
|
return {};
|
||||||
|
},
|
||||||
|
[&](auto const&) -> ErrorOr<void> {
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
}));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 273:
|
||||||
|
// StripOffsets
|
||||||
|
if (type != Type::UnsignedShort && type != Type::UnsignedLong)
|
||||||
|
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 273");
|
||||||
|
|
||||||
|
TRY(metadata.strip_offsets.try_ensure_capacity(count));
|
||||||
|
for (u32 i = 0; i < count; ++i) {
|
||||||
|
value[i].visit(
|
||||||
|
[&metadata]<OneOf<u16, u32> T>(T const& offset) {
|
||||||
|
metadata.strip_offsets.append(offset);
|
||||||
|
},
|
||||||
|
[&](auto const&) {
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 277:
|
||||||
|
// SamplesPerPixel
|
||||||
|
if (type != Type::UnsignedShort || count != 1)
|
||||||
|
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 277");
|
||||||
|
TRY(value[0].visit(
|
||||||
|
[](u16 const& samples_per_pixels) -> ErrorOr<void> {
|
||||||
|
if (samples_per_pixels != 3)
|
||||||
|
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 277");
|
||||||
|
return {};
|
||||||
|
},
|
||||||
|
[&](auto const&) -> ErrorOr<void> {
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
}));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 278:
|
||||||
|
// RowsPerStrip
|
||||||
|
if ((type != Type::UnsignedShort && type != Type::UnsignedLong) || count != 1)
|
||||||
|
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 278");
|
||||||
|
|
||||||
|
value[0].visit(
|
||||||
|
[&metadata]<OneOf<u16, u32> T>(T const& rows_per_strip) {
|
||||||
|
metadata.rows_per_strip = rows_per_strip;
|
||||||
|
},
|
||||||
|
[&](auto const&) {
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 279:
|
||||||
|
// StripByteCounts
|
||||||
|
if (type != Type::UnsignedShort && type != Type::UnsignedLong)
|
||||||
|
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 279");
|
||||||
|
|
||||||
|
TRY(metadata.strip_bytes_count.try_ensure_capacity(count));
|
||||||
|
for (u32 i = 0; i < count; ++i) {
|
||||||
|
value[i].visit(
|
||||||
|
[&metadata]<OneOf<u16, u32> T>(T const& offset) {
|
||||||
|
metadata.strip_bytes_count.append(offset);
|
||||||
|
},
|
||||||
|
[&](auto const&) {
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 317:
|
||||||
|
// Predictor
|
||||||
|
if (type != Type::UnsignedShort || count != 1)
|
||||||
|
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid tag 317");
|
||||||
|
|
||||||
|
TRY(value[0].visit(
|
||||||
|
[&metadata](u16 const& predictor) -> ErrorOr<void> {
|
||||||
|
if (predictor != 1 && predictor != 2)
|
||||||
|
return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid predictor value");
|
||||||
|
|
||||||
|
metadata.predictor = static_cast<Predictor>(predictor);
|
||||||
|
return {};
|
||||||
|
},
|
||||||
|
[&](auto const&) -> ErrorOr<void> {
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
}));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
dbgln_if(TIFF_DEBUG, "Unknown tag: {}", tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue