From c98bda8ce6e492e0cb2f8006fbca362f8204b249 Mon Sep 17 00:00:00 2001 From: Matthew Olsson Date: Sun, 20 Mar 2022 11:07:47 -0700 Subject: [PATCH] LibPDF: Get rid of PlainText/Encoded StreamObject This was a small optimization to allow a stream object to simply hold a reference to the bytes in a PDF document rather than duplicating them. However, as we move into features such as encryption, this optimization does more harm than good. This can be revisited in the future if necessary. --- Userland/Libraries/LibPDF/Forward.h | 3 -- Userland/Libraries/LibPDF/ObjectDerivatives.h | 39 ++----------------- Userland/Libraries/LibPDF/Parser.cpp | 4 +- 3 files changed, 6 insertions(+), 40 deletions(-) diff --git a/Userland/Libraries/LibPDF/Forward.h b/Userland/Libraries/LibPDF/Forward.h index 7cd61f78ca..c93b3c6c10 100644 --- a/Userland/Libraries/LibPDF/Forward.h +++ b/Userland/Libraries/LibPDF/Forward.h @@ -14,9 +14,6 @@ namespace PDF { class Document; class Object; -// Note: This macro doesn't care about PlainTextStreamObject and EncodedStreamObject because -// we never need to work directly with either of them. - #define ENUMERATE_OBJECT_TYPES(V) \ V(StringObject, string) \ V(NameObject, name) \ diff --git a/Userland/Libraries/LibPDF/ObjectDerivatives.h b/Userland/Libraries/LibPDF/ObjectDerivatives.h index 8576a4f0b8..99e93b133f 100644 --- a/Userland/Libraries/LibPDF/ObjectDerivatives.h +++ b/Userland/Libraries/LibPDF/ObjectDerivatives.h @@ -143,55 +143,24 @@ private: class StreamObject : public Object { public: - explicit StreamObject(NonnullRefPtr const& dict) + explicit StreamObject(NonnullRefPtr const& dict, ByteBuffer const& bytes) : m_dict(dict) + , m_buffer(bytes) { } virtual ~StreamObject() override = default; [[nodiscard]] ALWAYS_INLINE NonnullRefPtr dict() const { return m_dict; } - [[nodiscard]] virtual ReadonlyBytes bytes() const = 0; + [[nodiscard]] ReadonlyBytes bytes() const { return m_buffer.bytes(); }; const char* type_name() const override { return "stream"; } String to_string(int indent) const override; -protected: +private: bool is_stream() const override { return true; } -private: NonnullRefPtr m_dict; -}; - -class PlainTextStreamObject final : public StreamObject { -public: - PlainTextStreamObject(NonnullRefPtr const& dict, ReadonlyBytes bytes) - : StreamObject(dict) - , m_bytes(bytes) - { - } - - virtual ~PlainTextStreamObject() override = default; - - [[nodiscard]] ALWAYS_INLINE virtual ReadonlyBytes bytes() const override { return m_bytes; } - -private: - ReadonlyBytes m_bytes; -}; - -class EncodedStreamObject final : public StreamObject { -public: - EncodedStreamObject(NonnullRefPtr const& dict, ByteBuffer&& buffer) - : StreamObject(dict) - , m_buffer(buffer) - { - } - - virtual ~EncodedStreamObject() override = default; - - [[nodiscard]] ALWAYS_INLINE virtual ReadonlyBytes bytes() const override { return m_buffer.bytes(); } - -private: ByteBuffer m_buffer; }; diff --git a/Userland/Libraries/LibPDF/Parser.cpp b/Userland/Libraries/LibPDF/Parser.cpp index 38df8fb0db..2a5bbddcf5 100644 --- a/Userland/Libraries/LibPDF/Parser.cpp +++ b/Userland/Libraries/LibPDF/Parser.cpp @@ -997,10 +997,10 @@ PDFErrorOr> Parser::parse_stream(NonnullRefPtr(dict, move(maybe_bytes.value())); + return make_object(dict, maybe_bytes.value()); } - return make_object(dict, bytes); + return make_object(dict, MUST(ByteBuffer::copy(bytes))); } PDFErrorOr> Parser::parse_graphics_commands()