Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Side by Side Diff: components/printing/service/pdf_compositor_impl.cc

Issue 2832633002: Add PDF compositor service (Closed)
Patch Set: rebase Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/printing/service/pdf_compositor_impl.h"
6
7 #include <utility>
8 #include <vector>
9
10 #include "base/logging.h"
11 #include "base/memory/shared_memory.h"
12 #include "base/memory/shared_memory_handle.h"
13 #include "base/time/time.h"
14 #include "mojo/public/cpp/system/platform_handle.h"
15 #include "printing/common/pdf_metafile_utils.h"
16 #include "third_party/skia/include/core/SkCanvas.h"
17 #include "third_party/skia/include/core/SkDocument.h"
18 #include "third_party/skia/include/core/SkSize.h"
19 #include "third_party/skia/include/core/SkStream.h"
20 #include "third_party/skia/include/core/SkTypes.h"
21 #include "third_party/skia/src/utils/SkMultiPictureDocument.h"
22
23 namespace printing {
24
25 PdfCompositorImpl::PdfCompositorImpl(
26 const std::string& creator,
27 std::unique_ptr<service_manager::ServiceContextRef> service_ref)
28 : service_ref_(std::move(service_ref)), creator_(creator) {}
29
30 PdfCompositorImpl::~PdfCompositorImpl() = default;
31
32 void PdfCompositorImpl::CompositePdf(
33 mojo::ScopedSharedBufferHandle sk_handle,
34 const mojom::PdfCompositor::CompositePdfCallback& callback) {
35 DCHECK(sk_handle.is_valid());
36
37 base::SharedMemoryHandle memory_handle;
38 size_t memory_size = 0;
39 bool read_only_flag = false;
40
41 const MojoResult result = mojo::UnwrapSharedMemoryHandle(
42 std::move(sk_handle), &memory_handle, &memory_size, &read_only_flag);
43 DCHECK_EQ(MOJO_RESULT_OK, result);
44 DCHECK_GT(memory_size, 0u);
45
46 std::unique_ptr<base::SharedMemory> shm =
47 base::MakeUnique<base::SharedMemory>(memory_handle, true);
48 if (!shm->Map(memory_size) || shm->mapped_size() == 0) {
49 DLOG(ERROR) << "CompositePdf: Shared memory map failed.";
50 callback.Run(mojo::ScopedSharedBufferHandle());
51 return;
52 }
53
54 SkMemoryStream stream(shm->memory(), memory_size);
55 int page_count = SkMultiPictureDocumentReadPageCount(&stream);
56 if (!page_count) {
57 DLOG(ERROR) << "CompositePdf: No page is read.";
58 callback.Run(mojo::ScopedSharedBufferHandle());
59 return;
60 }
61
62 std::vector<SkDocumentPage> pages(page_count);
63 if (!SkMultiPictureDocumentRead(&stream, pages.data(), page_count)) {
64 DLOG(ERROR) << "CompositePdf: Page reading failed.";
65 callback.Run(mojo::ScopedSharedBufferHandle());
66 return;
67 }
68
69 SkDynamicMemoryWStream wstream;
70 sk_sp<SkDocument> doc =
71 MakePdfDocument(creator_.size() ? creator_ : "Chromium", &wstream);
72
73 for (const auto& page : pages) {
74 SkCanvas* canvas = doc->beginPage(page.fSize.width(), page.fSize.height());
75 canvas->drawPicture(page.fPicture);
76 doc->endPage();
77 }
78 doc->close();
79
80 mojo::ScopedSharedBufferHandle buffer =
81 mojo::SharedBufferHandle::Create(wstream.bytesWritten());
82 DCHECK(buffer.is_valid());
83
84 mojo::ScopedSharedBufferMapping mapping = buffer->Map(wstream.bytesWritten());
85 DCHECK(mapping);
86 wstream.copyToAndReset(mapping.get());
87
88 callback.Run(std::move(buffer));
89 }
90
91 } // namespace printing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698