forked from chromium/chromium
-
-
Notifications
You must be signed in to change notification settings - Fork 93
/
Copy pathmetafile_skia.h
163 lines (129 loc) · 5.64 KB
/
metafile_skia.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PRINTING_METAFILE_SKIA_H_
#define PRINTING_METAFILE_SKIA_H_
#include <stdint.h>
#include <memory>
#include <utility>
#include "base/gtest_prod_util.h"
#include "build/build_config.h"
#include "cc/paint/paint_canvas.h"
#include "printing/common/metafile_utils.h"
#include "printing/metafile.h"
#include "printing/mojom/print.mojom.h"
#include "skia/ext/platform_canvas.h"
#include "third_party/skia/include/core/SkRefCnt.h"
#include "ui/accessibility/ax_tree_update.h"
#if BUILDFLAG(IS_WIN)
#include <windows.h>
#endif
class SkCanvas;
class SkPicture;
class SkStreamAsset;
namespace base {
class UnguessableToken;
} // namespace base
namespace printing {
struct MetafileSkiaData;
// This class uses Skia graphics library to generate a PDF or MSKP document.
class COMPONENT_EXPORT(PRINTING_METAFILE) MetafileSkia : public Metafile {
public:
// Default constructor, for mojom::SkiaDocumentType::kPDF type only.
// TODO(weili): we should split up this use case into a different class, see
// comments before InitFromData()'s implementation.
MetafileSkia();
MetafileSkia(mojom::SkiaDocumentType type, int document_cookie);
MetafileSkia(const MetafileSkia&) = delete;
MetafileSkia& operator=(const MetafileSkia&) = delete;
~MetafileSkia() override;
// Metafile methods.
bool Init() override;
bool InitFromData(base::span<const uint8_t> data) override;
void StartPage(const gfx::Size& page_size,
const gfx::Rect& content_area,
float scale_factor,
mojom::PageOrientation page_orientation) override;
bool FinishPage() override;
bool FinishDocument() override;
uint32_t GetDataSize() const override;
bool GetData(void* dst_buffer, uint32_t dst_buffer_size) const override;
bool ShouldCopySharedMemoryRegionData() const override;
mojom::MetafileDataType GetDataType() const override;
gfx::Rect GetPageBounds(unsigned int page_number) const override;
unsigned int GetPageCount() const override;
printing::NativeDrawingContext context() const override;
#if BUILDFLAG(IS_WIN)
bool Playback(printing::NativeDrawingContext hdc,
const RECT* rect) const override;
bool SafePlayback(printing::NativeDrawingContext hdc) const override;
#elif BUILDFLAG(IS_APPLE)
bool RenderPage(unsigned int page_number,
printing::NativeDrawingContext context,
const CGRect& rect,
bool autorotate,
bool fit_to_page) const override;
#endif
#if BUILDFLAG(IS_ANDROID)
bool SaveToFileDescriptor(int fd) const override;
#else
bool SaveTo(base::File* file) const override;
#endif // BUILDFLAG(IS_ANDROID)
// Unlike FinishPage() or FinishDocument(), this is for out-of-process
// subframe printing. It will just serialize the content into SkPicture
// format and store it as final data.
void FinishFrameContent();
// Return a new metafile containing just the current page in draft mode.
std::unique_ptr<MetafileSkia> GetMetafileForCurrentPage(
mojom::SkiaDocumentType type);
// This method calls StartPage and then returns an appropriate
// PlatformCanvas implementation bound to the context created by
// StartPage or NULL on error. The PaintCanvas pointer that
// is returned is owned by this MetafileSkia object and does not
// need to be ref()ed or unref()ed. The canvas will remain valid
// until FinishPage() or FinishDocument() is called.
cc::PaintCanvas* GetVectorCanvasForNewPage(
const gfx::Size& page_size,
const gfx::Rect& content_area,
float scale_factor,
mojom::PageOrientation page_orientation);
// This is used for painting content of out-of-process subframes.
// For such a subframe, since the content is in another process, we create a
// place holder picture now, and replace it with actual content by pdf
// compositor service later.
uint32_t CreateContentForRemoteFrame(
const gfx::Rect& rect,
const base::UnguessableToken& render_proxy_token);
int GetDocumentCookie() const;
const ContentToProxyTokenMap& GetSubframeContentInfo() const;
void UtilizeTypefaceContext(ContentProxySet* typeface_content_info);
const ui::AXTreeUpdate& accessibility_tree() const {
return accessibility_tree_;
}
ui::AXTreeUpdate& accessibility_tree() { return accessibility_tree_; }
void set_generate_document_outline(
mojom::GenerateDocumentOutline generate_document_outline) {
generate_document_outline_ = generate_document_outline;
}
void set_title(std::string title) { title_ = std::move(title); }
private:
FRIEND_TEST_ALL_PREFIXES(MetafileSkiaTest, FrameContent);
FRIEND_TEST_ALL_PREFIXES(MetafileSkiaTest, GetPageBounds);
FRIEND_TEST_ALL_PREFIXES(MetafileSkiaTest, MultiPictureDocumentTypefaces);
void AppendPage(const SkSize& page_size, cc::PaintRecord record);
void AppendSubframeInfo(uint32_t content_id,
const base::UnguessableToken& proxy_token,
sk_sp<SkPicture> subframe_pic_holder);
// This is used for tests only.
SkStreamAsset* GetPdfData() const;
// Callback function used during page content drawing to replace a custom
// data holder with corresponding place holder SkPicture.
void CustomDataToSkPictureCallback(SkCanvas* canvas, uint32_t content_id);
std::unique_ptr<MetafileSkiaData> data_;
ui::AXTreeUpdate accessibility_tree_;
mojom::GenerateDocumentOutline generate_document_outline_ =
mojom::GenerateDocumentOutline::kNone;
std::string title_;
};
} // namespace printing
#endif // PRINTING_METAFILE_SKIA_H_