/* * Copyright (c) 2018-2021, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Gfx { static OwnPtr probe_and_sniff_for_appropriate_plugin(ReadonlyBytes bytes) { auto* data = bytes.data(); auto size = bytes.size(); OwnPtr plugin; plugin = make(data, size); if (plugin->sniff()) return plugin; plugin = make(data, size); if (plugin->sniff()) return plugin; plugin = make(data, size); if (plugin->sniff()) return plugin; plugin = make(data, size); if (plugin->sniff()) return plugin; plugin = make(data, size); if (plugin->sniff()) return plugin; plugin = make(data, size); if (plugin->sniff()) return plugin; plugin = make(data, size); if (plugin->sniff()) return plugin; plugin = make(data, size); if (plugin->sniff()) return plugin; plugin = make(data, size); if (plugin->sniff()) return plugin; plugin = make(data, size); if (plugin->sniff()) return plugin; return {}; } RefPtr ImageDecoder::try_create_for_raw_bytes(ReadonlyBytes bytes) { OwnPtr plugin = probe_and_sniff_for_appropriate_plugin(bytes); if (!plugin) return {}; return adopt_ref_if_nonnull(new (nothrow) ImageDecoder(plugin.release_nonnull())); } static OwnPtr probe_and_sniff_for_appropriate_plugin_with_known_path(StringView path, ReadonlyBytes bytes) { LexicalPath lexical_mapped_file_path(path); auto* data = bytes.data(); auto size = bytes.size(); OwnPtr plugin; if (lexical_mapped_file_path.extension() == "tga"sv) { plugin = make(data, size); if (plugin->sniff()) return plugin; } return {}; } RefPtr ImageDecoder::try_create_for_raw_bytes_with_known_path(StringView path, ReadonlyBytes bytes) { OwnPtr plugin = probe_and_sniff_for_appropriate_plugin_with_known_path(path, bytes); if (!plugin) return try_create_for_raw_bytes(bytes); return adopt_ref_if_nonnull(new (nothrow) ImageDecoder(plugin.release_nonnull())); } ImageDecoder::ImageDecoder(NonnullOwnPtr plugin) : m_plugin(move(plugin)) { } }