diff options
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Libraries/LibPDF/Document.cpp | 12 | ||||
-rw-r--r-- | Userland/Libraries/LibPDF/Document.h | 14 |
2 files changed, 19 insertions, 7 deletions
diff --git a/Userland/Libraries/LibPDF/Document.cpp b/Userland/Libraries/LibPDF/Document.cpp index 54b67d3c0d..a8f85e8a23 100644 --- a/Userland/Libraries/LibPDF/Document.cpp +++ b/Userland/Libraries/LibPDF/Document.cpp @@ -232,9 +232,15 @@ PDFErrorOr<Destination> Document::create_destination_from_parameters(NonnullRefP auto page_ref = array->at(0); auto type_name = TRY(array->get_name_at(this, 1))->name(); - Vector<float> parameters; - for (size_t i = 2; i < array->size(); i++) - parameters.append(array->at(i).to_float()); + Vector<Optional<float>> parameters; + TRY(parameters.try_ensure_capacity(array->size() - 2)); + for (size_t i = 2; i < array->size(); i++) { + auto& param = array->at(i); + if (param.has<nullptr_t>()) + parameters.unchecked_append({}); + else + parameters.append(param.to_float()); + } Destination::Type type; if (type_name == CommonNames::XYZ) { diff --git a/Userland/Libraries/LibPDF/Document.h b/Userland/Libraries/LibPDF/Document.h index d58598e2b3..15305bb0c1 100644 --- a/Userland/Libraries/LibPDF/Document.h +++ b/Userland/Libraries/LibPDF/Document.h @@ -51,7 +51,7 @@ struct Destination { Type type; Optional<u32> page; - Vector<float> parameters; + Vector<Optional<float>> parameters; }; struct OutlineItem final : public RefCounted<OutlineItem> { @@ -232,9 +232,15 @@ struct Formatter<PDF::Destination> : Formatter<FormatString> { TRY(builder.put_literal("{{}}"sv)); else TRY(builder.put_u64(destination.page.value())); - for (auto& param : destination.parameters) { - TRY(builder.put_f64(double(param))); - TRY(builder.put_literal(" "sv)); + if (!destination.parameters.is_empty()) { + TRY(builder.put_literal(" parameters="sv)); + for (auto const& param : destination.parameters) { + if (param.has_value()) + TRY(builder.put_f64(double(param.value()))); + else + TRY(builder.put_literal("{{}}"sv)); + TRY(builder.put_literal(" "sv)); + } } return builder.put_literal(" }}"sv); } |