mirror of
https://github.com/RGBCube/serenity
synced 2025-06-25 11:52:07 +00:00
LibPDF: Extract a Parser::unfilter_stream() method
No behavior change.
This commit is contained in:
parent
b21f867e88
commit
3285502ec6
2 changed files with 43 additions and 32 deletions
|
@ -435,6 +435,46 @@ PDFErrorOr<NonnullRefPtr<DictObject>> Parser::parse_dict()
|
||||||
return make_object<DictObject>(move(map));
|
return make_object<DictObject>(move(map));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PDFErrorOr<void> Parser::unfilter_stream(NonnullRefPtr<StreamObject> stream_object)
|
||||||
|
{
|
||||||
|
auto const& dict = stream_object->dict();
|
||||||
|
if (!dict->contains(CommonNames::Filter))
|
||||||
|
return {};
|
||||||
|
|
||||||
|
Vector<DeprecatedFlyString> filters = TRY(m_document->read_filters(dict));
|
||||||
|
|
||||||
|
// Every filter may get its own parameter dictionary
|
||||||
|
Vector<RefPtr<DictObject>> decode_parms_vector;
|
||||||
|
RefPtr<Object> decode_parms_object;
|
||||||
|
if (dict->contains(CommonNames::DecodeParms)) {
|
||||||
|
decode_parms_object = TRY(dict->get_object(m_document, CommonNames::DecodeParms));
|
||||||
|
if (decode_parms_object->is<ArrayObject>()) {
|
||||||
|
auto decode_parms_array = decode_parms_object->cast<ArrayObject>();
|
||||||
|
for (size_t i = 0; i < decode_parms_array->size(); ++i) {
|
||||||
|
RefPtr<DictObject> decode_parms;
|
||||||
|
auto entry = decode_parms_array->at(i);
|
||||||
|
if (entry.has<NonnullRefPtr<Object>>())
|
||||||
|
decode_parms = entry.get<NonnullRefPtr<Object>>()->cast<DictObject>();
|
||||||
|
decode_parms_vector.append(decode_parms);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
decode_parms_vector.append(decode_parms_object->cast<DictObject>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VERIFY(decode_parms_vector.is_empty() || decode_parms_vector.size() == filters.size());
|
||||||
|
|
||||||
|
for (size_t i = 0; i < filters.size(); ++i) {
|
||||||
|
RefPtr<DictObject> decode_parms;
|
||||||
|
if (!decode_parms_vector.is_empty())
|
||||||
|
decode_parms = decode_parms_vector.at(i);
|
||||||
|
|
||||||
|
stream_object->buffer() = TRY(Filter::decode(stream_object->bytes(), filters.at(i), decode_parms));
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
PDFErrorOr<NonnullRefPtr<StreamObject>> Parser::parse_stream(NonnullRefPtr<DictObject> dict)
|
PDFErrorOr<NonnullRefPtr<StreamObject>> Parser::parse_stream(NonnullRefPtr<DictObject> dict)
|
||||||
{
|
{
|
||||||
if (!m_reader.matches("stream"))
|
if (!m_reader.matches("stream"))
|
||||||
|
@ -474,38 +514,8 @@ PDFErrorOr<NonnullRefPtr<StreamObject>> Parser::parse_stream(NonnullRefPtr<DictO
|
||||||
if (m_document->security_handler() && m_enable_encryption)
|
if (m_document->security_handler() && m_enable_encryption)
|
||||||
m_document->security_handler()->decrypt(stream_object, m_current_reference_stack.last());
|
m_document->security_handler()->decrypt(stream_object, m_current_reference_stack.last());
|
||||||
|
|
||||||
if (dict->contains(CommonNames::Filter) && m_enable_filters) {
|
if (m_enable_filters)
|
||||||
Vector<DeprecatedFlyString> filters = TRY(m_document->read_filters(dict));
|
TRY(unfilter_stream(stream_object));
|
||||||
|
|
||||||
// Every filter may get its own parameter dictionary
|
|
||||||
Vector<RefPtr<DictObject>> decode_parms_vector;
|
|
||||||
RefPtr<Object> decode_parms_object;
|
|
||||||
if (dict->contains(CommonNames::DecodeParms)) {
|
|
||||||
decode_parms_object = TRY(dict->get_object(m_document, CommonNames::DecodeParms));
|
|
||||||
if (decode_parms_object->is<ArrayObject>()) {
|
|
||||||
auto decode_parms_array = decode_parms_object->cast<ArrayObject>();
|
|
||||||
for (size_t i = 0; i < decode_parms_array->size(); ++i) {
|
|
||||||
RefPtr<DictObject> decode_parms;
|
|
||||||
auto entry = decode_parms_array->at(i);
|
|
||||||
if (entry.has<NonnullRefPtr<Object>>())
|
|
||||||
decode_parms = entry.get<NonnullRefPtr<Object>>()->cast<DictObject>();
|
|
||||||
decode_parms_vector.append(decode_parms);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
decode_parms_vector.append(decode_parms_object->cast<DictObject>());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
VERIFY(decode_parms_vector.is_empty() || decode_parms_vector.size() == filters.size());
|
|
||||||
|
|
||||||
for (size_t i = 0; i < filters.size(); ++i) {
|
|
||||||
RefPtr<DictObject> decode_parms;
|
|
||||||
if (!decode_parms_vector.is_empty())
|
|
||||||
decode_parms = decode_parms_vector.at(i);
|
|
||||||
|
|
||||||
stream_object->buffer() = TRY(Filter::decode(stream_object->bytes(), filters.at(i), decode_parms));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return stream_object;
|
return stream_object;
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,6 +55,7 @@ public:
|
||||||
PDFErrorOr<NonnullRefPtr<ArrayObject>> parse_array();
|
PDFErrorOr<NonnullRefPtr<ArrayObject>> parse_array();
|
||||||
PDFErrorOr<HashMap<DeprecatedFlyString, Value>> parse_dict_contents_until(char const*);
|
PDFErrorOr<HashMap<DeprecatedFlyString, Value>> parse_dict_contents_until(char const*);
|
||||||
PDFErrorOr<NonnullRefPtr<DictObject>> parse_dict();
|
PDFErrorOr<NonnullRefPtr<DictObject>> parse_dict();
|
||||||
|
PDFErrorOr<void> unfilter_stream(NonnullRefPtr<StreamObject>);
|
||||||
PDFErrorOr<NonnullRefPtr<StreamObject>> parse_stream(NonnullRefPtr<DictObject> dict);
|
PDFErrorOr<NonnullRefPtr<StreamObject>> parse_stream(NonnullRefPtr<DictObject> dict);
|
||||||
PDFErrorOr<Vector<Operator>> parse_operators();
|
PDFErrorOr<Vector<Operator>> parse_operators();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue