diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index f2022bb..b3f751b 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -83,72 +83,57 @@ namespace std::map()>> filter_factories; } // namespace -std::string -QPDF_Stream::Members::expand_filter_name(std::string const& name) const +std::function()> +QPDF_Stream::Members::filter_factory(std::string const& name) const { - // The PDF specification provides these filter abbreviations for use in inline images, but - // according to table H.1 in the pre-ISO versions of the PDF specification, Adobe Reader also - // accepts them for stream filters. - if (name == "/AHx") { - return "/ASCIIHexDecode"; + if (name == "/FlateDecode") { + return SF_FlateLzwDecode::flate_factory; } - if (name == "/A85") { - return "/ASCII85Decode"; + if (name == "/Crypt") { + return []() { return std::make_shared(); }; } - if (name == "/LZW") { - return "/LZWDecode"; + if (name == "/LZWDecode") { + return SF_FlateLzwDecode::lzw_factory; } - if (name == "/Fl") { - return "/FlateDecode"; + if (name == "/RunLengthDecode") { + return SF_RunLengthDecode::factory; } - if (name == "/RL") { - return "/RunLengthDecode"; + if (name == "/DCTDecode") { + return SF_DCTDecode::factory; } - if (name == "/CCF") { - return "/CCITTFaxDecode"; + if (name == "/ASCII85Decode") { + return SF_ASCII85Decode::factory; } - if (name == "/DCT") { - return "/DCTDecode"; + if (name == "/ASCIIHexDecode") { + return SF_ASCIIHexDecode::factory; } - return name; -}; + // The PDF specification provides these filter abbreviations for use in inline images, but + // according to table H.1 in the pre-ISO versions of the PDF specification, Adobe Reader also + // accepts them for stream filters. -std::function()> -QPDF_Stream::Members::filter_factory(std::string const& name) const -{ - auto e_name = expand_filter_name(name); - if (e_name == "/Crypt") { - return []() { return std::make_shared(); }; - } - if (e_name == "/FlateDecode") { + if (name == "/Fl") { return SF_FlateLzwDecode::flate_factory; } - if (e_name == "/LZWDecode") { - return SF_FlateLzwDecode::lzw_factory; - } - if (e_name == "/RunLengthDecode") { - return SF_RunLengthDecode::factory; - } - if (e_name == "/DCTDecode") { - return SF_DCTDecode::factory; + if (name == "/AHx") { + return SF_ASCIIHexDecode::factory; } - if (e_name == "/ASCII85Decode") { + if (name == "/A85") { return SF_ASCII85Decode::factory; } - if (e_name == "/RunLengthDecode") { + if (name == "/LZW") { + return SF_FlateLzwDecode::lzw_factory; + } + if (name == "/RL") { return SF_RunLengthDecode::factory; } - if (e_name == "/DCTDecode") { + if (name == "/DCT") { return SF_DCTDecode::factory; } - if (e_name == "/ASCII85Decode") { - return SF_ASCII85Decode::factory; - } - if (e_name == "/ASCIIHexDecode") { - return SF_ASCIIHexDecode::factory; + if (filter_factories.empty()) { + return nullptr; } - - auto ff = filter_factories.find(e_name); + auto ff = + name == "/CCF" ? filter_factories.find("/CCITTFaxDecode") : filter_factories.find(name); if (ff == filter_factories.end()) { return nullptr; } diff --git a/libqpdf/qpdf/QPDFObject_private.hh b/libqpdf/qpdf/QPDFObject_private.hh index 8518665..ce68f1f 100644 --- a/libqpdf/qpdf/QPDFObject_private.hh +++ b/libqpdf/qpdf/QPDFObject_private.hh @@ -226,7 +226,6 @@ class QPDF_Stream final std::shared_ptr stream_data; std::shared_ptr stream_provider; std::vector> token_filters; - std::string expand_filter_name(std::string const& name) const; std::function()> filter_factory(std::string const& name) const; };