/* * 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 {}; } static OwnPtr probe_and_sniff_for_appropriate_plugin_with_known_mime_type(StringView mime_type, ReadonlyBytes bytes) { auto* data = bytes.data(); auto size = bytes.size(); OwnPtr plugin; if (mime_type == "image/x-targa"sv) { plugin = make(data, size); if (plugin->sniff()) return plugin; } return {}; } RefPtr ImageDecoder::try_create_for_raw_bytes(ReadonlyBytes bytes, Optional mime_type) { OwnPtr plugin = probe_and_sniff_for_appropriate_plugin(bytes); if (!plugin) { if (mime_type.has_value()) { plugin = probe_and_sniff_for_appropriate_plugin_with_known_mime_type(mime_type.value(), bytes); if (!plugin) return {}; } else { return {}; } } return adopt_ref_if_nonnull(new (nothrow) ImageDecoder(plugin.release_nonnull())); } ImageDecoder::ImageDecoder(NonnullOwnPtr plugin) : m_plugin(move(plugin)) { } }