mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 08:37:45 +00:00
LibGfx/TIFF: Explore underlying Image File Directories
Every TIFF containers is composed of a main IFD. Some entries of this one can be a pointer to a sub-IFD. We are now capable of exploring these underlying structures. Note that we don't do anything with them yet.
This commit is contained in:
parent
4a7236cabf
commit
a43793ee0d
2 changed files with 19 additions and 4 deletions
|
@ -453,7 +453,6 @@ private:
|
||||||
m_next_ifd = Optional<u32> { next_block_position };
|
m_next_ifd = Optional<u32> { next_block_position };
|
||||||
else
|
else
|
||||||
m_next_ifd = OptionalNone {};
|
m_next_ifd = OptionalNone {};
|
||||||
dbgln_if(TIFF_DEBUG, "Setting image file directory pointer to {}", m_next_ifd);
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -491,6 +490,8 @@ private:
|
||||||
if (!m_next_ifd.has_value())
|
if (!m_next_ifd.has_value())
|
||||||
return Error::from_string_literal("TIFFImageDecoderPlugin: Missing an Image File Directory");
|
return Error::from_string_literal("TIFFImageDecoderPlugin: Missing an Image File Directory");
|
||||||
|
|
||||||
|
dbgln_if(TIFF_DEBUG, "Reading image file directory at offset {}", m_next_ifd);
|
||||||
|
|
||||||
TRY(m_stream->seek(m_next_ifd.value()));
|
TRY(m_stream->seek(m_next_ifd.value()));
|
||||||
|
|
||||||
auto const number_of_field = TRY(read_value<u16>());
|
auto const number_of_field = TRY(read_value<u16>());
|
||||||
|
@ -597,7 +598,13 @@ private:
|
||||||
return read_tiff_value(type, count, offset);
|
return read_tiff_value(type, count, offset);
|
||||||
}()));
|
}()));
|
||||||
|
|
||||||
TRY(handle_tag(m_metadata, tag, type, count, move(tiff_value)));
|
auto subifd_handler = [&](u32 ifd_offset) -> ErrorOr<void> {
|
||||||
|
m_next_ifd = ifd_offset;
|
||||||
|
TRY(read_next_image_file_directory());
|
||||||
|
return {};
|
||||||
|
};
|
||||||
|
|
||||||
|
TRY(handle_tag(move(subifd_handler), m_metadata, tag, type, count, move(tiff_value)));
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
|
@ -148,8 +148,9 @@ known_tags: List[Tag] = [
|
||||||
Tag('34675', [TIFFType.Undefined], [], None, "ICCProfile"),
|
Tag('34675', [TIFFType.Undefined], [], None, "ICCProfile"),
|
||||||
]
|
]
|
||||||
|
|
||||||
HANDLE_TAG_SIGNATURE_TEMPLATE = ("ErrorOr<void> {namespace}handle_tag(ExifMetadata& metadata, u16 tag,"
|
HANDLE_TAG_SIGNATURE_TEMPLATE = ("ErrorOr<void> {namespace}handle_tag(Function<ErrorOr<void>(u32)>&& subifd_handler, "
|
||||||
" {namespace}Type type, u32 count, Vector<{namespace}Value>&& value)")
|
"ExifMetadata& metadata, u16 tag, {namespace}Type type, u32 count, "
|
||||||
|
"Vector<{namespace}Value>&& value)")
|
||||||
HANDLE_TAG_SIGNATURE = HANDLE_TAG_SIGNATURE_TEMPLATE.format(namespace="")
|
HANDLE_TAG_SIGNATURE = HANDLE_TAG_SIGNATURE_TEMPLATE.format(namespace="")
|
||||||
HANDLE_TAG_SIGNATURE_TIFF_NAMESPACE = HANDLE_TAG_SIGNATURE_TEMPLATE.format(namespace="TIFF::")
|
HANDLE_TAG_SIGNATURE_TIFF_NAMESPACE = HANDLE_TAG_SIGNATURE_TEMPLATE.format(namespace="TIFF::")
|
||||||
|
|
||||||
|
@ -478,6 +479,12 @@ def generate_tag_handler(tag: Tag) -> str:
|
||||||
}}
|
}}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
handle_subifd = ''
|
||||||
|
if TIFFType.IFD in tag.types:
|
||||||
|
if tag.counts != [1]:
|
||||||
|
raise RuntimeError("Accessing `value[0]` in the C++ code might fail!")
|
||||||
|
handle_subifd = f'TRY(subifd_handler(value[0].get<{tiff_type_to_cpp(TIFFType.IFD)}>()));'
|
||||||
|
|
||||||
output = fR""" case {tag.id}:
|
output = fR""" case {tag.id}:
|
||||||
// {tag.name}
|
// {tag.name}
|
||||||
|
|
||||||
|
@ -485,6 +492,7 @@ def generate_tag_handler(tag: Tag) -> str:
|
||||||
|
|
||||||
{pre_condition}
|
{pre_condition}
|
||||||
{check_value}
|
{check_value}
|
||||||
|
{handle_subifd}
|
||||||
metadata.add_entry("{tag.name}"sv, move(value));
|
metadata.add_entry("{tag.name}"sv, move(value));
|
||||||
break;
|
break;
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue