Commit f126bfa7443410f7b4ae8a03eaf1a62d1cc63252

Authored by m-holger
1 parent 96228864

Refactor filter name expansion logic in QPDF_Stream

Removed `expand_filter_name` method and integrated its functionality directly into `filter_factory` for improved clarity and maintainability. Consolidated filter handling logic to eliminate redundant operations and streamline code execution.
libqpdf/QPDF_Stream.cc
@@ -83,72 +83,57 @@ namespace @@ -83,72 +83,57 @@ namespace
83 std::map<std::string, std::function<std::shared_ptr<QPDFStreamFilter>()>> filter_factories; 83 std::map<std::string, std::function<std::shared_ptr<QPDFStreamFilter>()>> filter_factories;
84 } // namespace 84 } // namespace
85 85
86 -std::string  
87 -QPDF_Stream::Members::expand_filter_name(std::string const& name) const 86 +std::function<std::shared_ptr<QPDFStreamFilter>()>
  87 +QPDF_Stream::Members::filter_factory(std::string const& name) const
88 { 88 {
89 - // The PDF specification provides these filter abbreviations for use in inline images, but  
90 - // according to table H.1 in the pre-ISO versions of the PDF specification, Adobe Reader also  
91 - // accepts them for stream filters.  
92 - if (name == "/AHx") {  
93 - return "/ASCIIHexDecode"; 89 + if (name == "/FlateDecode") {
  90 + return SF_FlateLzwDecode::flate_factory;
94 } 91 }
95 - if (name == "/A85") {  
96 - return "/ASCII85Decode"; 92 + if (name == "/Crypt") {
  93 + return []() { return std::make_shared<SF_Crypt>(); };
97 } 94 }
98 - if (name == "/LZW") {  
99 - return "/LZWDecode"; 95 + if (name == "/LZWDecode") {
  96 + return SF_FlateLzwDecode::lzw_factory;
100 } 97 }
101 - if (name == "/Fl") {  
102 - return "/FlateDecode"; 98 + if (name == "/RunLengthDecode") {
  99 + return SF_RunLengthDecode::factory;
103 } 100 }
104 - if (name == "/RL") {  
105 - return "/RunLengthDecode"; 101 + if (name == "/DCTDecode") {
  102 + return SF_DCTDecode::factory;
106 } 103 }
107 - if (name == "/CCF") {  
108 - return "/CCITTFaxDecode"; 104 + if (name == "/ASCII85Decode") {
  105 + return SF_ASCII85Decode::factory;
109 } 106 }
110 - if (name == "/DCT") {  
111 - return "/DCTDecode"; 107 + if (name == "/ASCIIHexDecode") {
  108 + return SF_ASCIIHexDecode::factory;
112 } 109 }
113 - return name;  
114 -}; 110 + // The PDF specification provides these filter abbreviations for use in inline images, but
  111 + // according to table H.1 in the pre-ISO versions of the PDF specification, Adobe Reader also
  112 + // accepts them for stream filters.
115 113
116 -std::function<std::shared_ptr<QPDFStreamFilter>()>  
117 -QPDF_Stream::Members::filter_factory(std::string const& name) const  
118 -{  
119 - auto e_name = expand_filter_name(name);  
120 - if (e_name == "/Crypt") {  
121 - return []() { return std::make_shared<SF_Crypt>(); };  
122 - }  
123 - if (e_name == "/FlateDecode") { 114 + if (name == "/Fl") {
124 return SF_FlateLzwDecode::flate_factory; 115 return SF_FlateLzwDecode::flate_factory;
125 } 116 }
126 - if (e_name == "/LZWDecode") {  
127 - return SF_FlateLzwDecode::lzw_factory;  
128 - }  
129 - if (e_name == "/RunLengthDecode") {  
130 - return SF_RunLengthDecode::factory;  
131 - }  
132 - if (e_name == "/DCTDecode") {  
133 - return SF_DCTDecode::factory; 117 + if (name == "/AHx") {
  118 + return SF_ASCIIHexDecode::factory;
134 } 119 }
135 - if (e_name == "/ASCII85Decode") { 120 + if (name == "/A85") {
136 return SF_ASCII85Decode::factory; 121 return SF_ASCII85Decode::factory;
137 } 122 }
138 - if (e_name == "/RunLengthDecode") { 123 + if (name == "/LZW") {
  124 + return SF_FlateLzwDecode::lzw_factory;
  125 + }
  126 + if (name == "/RL") {
139 return SF_RunLengthDecode::factory; 127 return SF_RunLengthDecode::factory;
140 } 128 }
141 - if (e_name == "/DCTDecode") { 129 + if (name == "/DCT") {
142 return SF_DCTDecode::factory; 130 return SF_DCTDecode::factory;
143 } 131 }
144 - if (e_name == "/ASCII85Decode") {  
145 - return SF_ASCII85Decode::factory;  
146 - }  
147 - if (e_name == "/ASCIIHexDecode") {  
148 - return SF_ASCIIHexDecode::factory; 132 + if (filter_factories.empty()) {
  133 + return nullptr;
149 } 134 }
150 -  
151 - auto ff = filter_factories.find(e_name); 135 + auto ff =
  136 + name == "/CCF" ? filter_factories.find("/CCITTFaxDecode") : filter_factories.find(name);
152 if (ff == filter_factories.end()) { 137 if (ff == filter_factories.end()) {
153 return nullptr; 138 return nullptr;
154 } 139 }
libqpdf/qpdf/QPDFObject_private.hh
@@ -226,7 +226,6 @@ class QPDF_Stream final @@ -226,7 +226,6 @@ class QPDF_Stream final
226 std::shared_ptr<Buffer> stream_data; 226 std::shared_ptr<Buffer> stream_data;
227 std::shared_ptr<QPDFObjectHandle::StreamDataProvider> stream_provider; 227 std::shared_ptr<QPDFObjectHandle::StreamDataProvider> stream_provider;
228 std::vector<std::shared_ptr<QPDFObjectHandle::TokenFilter>> token_filters; 228 std::vector<std::shared_ptr<QPDFObjectHandle::TokenFilter>> token_filters;
229 - std::string expand_filter_name(std::string const& name) const;  
230 std::function<std::shared_ptr<QPDFStreamFilter>()> 229 std::function<std::shared_ptr<QPDFStreamFilter>()>
231 filter_factory(std::string const& name) const; 230 filter_factory(std::string const& name) const;
232 }; 231 };