Преглед на файлове

LibPDF: Move code to compute full page contents into Page

Pure code move, no behavior change.
Nico Weber преди 2 години
родител
ревизия
69c965b987
променени са 4 файла, в които са добавени 41 реда и са изтрити 22 реда
  1. 1 0
      Userland/Libraries/LibPDF/CMakeLists.txt
  2. 37 0
      Userland/Libraries/LibPDF/Page.cpp
  3. 2 0
      Userland/Libraries/LibPDF/Page.h
  4. 1 22
      Userland/Libraries/LibPDF/Renderer.cpp

+ 1 - 0
Userland/Libraries/LibPDF/CMakeLists.txt

@@ -16,6 +16,7 @@ set(SOURCES
     Fonts/Type1FontProgram.cpp
     Interpolation.cpp
     ObjectDerivatives.cpp
+    Page.cpp
     Parser.cpp
     Reader.cpp
     Renderer.cpp

+ 37 - 0
Userland/Libraries/LibPDF/Page.cpp

@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2021-2022, Matthew Olsson <mattco@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibPDF/Document.h>
+#include <LibPDF/ObjectDerivatives.h>
+#include <LibPDF/Page.h>
+
+namespace PDF {
+
+PDFErrorOr<ByteBuffer> Page::page_contents(Document& document) const
+{
+    if (contents.is_null())
+        return ByteBuffer {};
+
+    // Use our own vector, as the /Content can be an array with multiple
+    // streams which gets concatenated.
+    // FIXME: Text operators are supposed to only have effects on the current
+    // stream object. Do the text operators treat this concatenated stream
+    // as one stream or multiple?
+    ByteBuffer byte_buffer;
+    if (contents->is<ArrayObject>()) {
+        auto array = contents->cast<ArrayObject>();
+        for (auto& ref : *array) {
+            auto bytes = TRY(document.resolve_to<StreamObject>(ref))->bytes();
+            byte_buffer.append(bytes.data(), bytes.size());
+        }
+    } else {
+        auto bytes = contents->cast<StreamObject>()->bytes();
+        byte_buffer.append(bytes.data(), bytes.size());
+    }
+    return byte_buffer;
+}
+
+}

+ 2 - 0
Userland/Libraries/LibPDF/Page.h

@@ -28,6 +28,8 @@ struct Page {
     Rectangle crop_box;
     float user_unit;
     int rotate;
+
+    PDFErrorOr<ByteBuffer> page_contents(Document&) const;
 };
 
 }

+ 1 - 22
Userland/Libraries/LibPDF/Renderer.cpp

@@ -85,28 +85,7 @@ Renderer::Renderer(RefPtr<Document> document, Page const& page, RefPtr<Gfx::Bitm
 
 PDFErrorsOr<void> Renderer::render()
 {
-    if (m_page.contents.is_null())
-        return {};
-
-    // Use our own vector, as the /Content can be an array with multiple
-    // streams which gets concatenated
-    // FIXME: Text operators are supposed to only have effects on the current
-    // stream object. Do the text operators treat this concatenated stream
-    // as one stream or multiple?
-    ByteBuffer byte_buffer;
-
-    if (m_page.contents->is<ArrayObject>()) {
-        auto contents = m_page.contents->cast<ArrayObject>();
-        for (auto& ref : *contents) {
-            auto bytes = TRY(m_document->resolve_to<StreamObject>(ref))->bytes();
-            byte_buffer.append(bytes.data(), bytes.size());
-        }
-    } else {
-        auto bytes = m_page.contents->cast<StreamObject>()->bytes();
-        byte_buffer.append(bytes.data(), bytes.size());
-    }
-
-    auto operators = TRY(Parser::parse_operators(m_document, byte_buffer));
+    auto operators = TRY(Parser::parse_operators(m_document, TRY(m_page.page_contents(*m_document))));
 
     Errors errors;
     for (auto& op : operators) {