blob: 945a8b7281205ba14bd0461b0fc5a5dc874029f8 [file] [log] [blame]
[email protected]b5cf844c2012-06-18 21:49:201// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]8f879292011-04-08 00:21:202// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Wei Liab754772018-08-22 22:41:175#ifndef PRINTING_METAFILE_SKIA_H_
6#define PRINTING_METAFILE_SKIA_H_
[email protected]8f879292011-04-08 00:21:207
avi126e93c2015-12-21 21:48:168#include <stdint.h>
9
dchengc3df9ba2016-04-07 23:09:3210#include <memory>
11
Wei Li1d345bf2018-08-10 02:52:3712#include "base/gtest_prod_util.h"
[email protected]8f879292011-04-08 00:21:2013#include "build/build_config.h"
enne7b64edf32017-02-16 20:10:0214#include "cc/paint/paint_canvas.h"
Wei Liab754772018-08-22 22:41:1715#include "printing/common/metafile_utils.h"
[email protected]7d7489902011-04-11 21:54:0616#include "printing/metafile.h"
Julie Jeongeun Kime1abed92020-06-11 11:01:4817#include "printing/mojom/print.mojom-forward.h"
vitalybukaa73fc372015-02-06 18:40:3718#include "skia/ext/platform_canvas.h"
Dominic Mazzoni0a39059c2020-01-08 19:30:4519#include "ui/accessibility/ax_tree_update.h"
[email protected]8f879292011-04-08 00:21:2020
21#if defined(OS_WIN)
22#include <windows.h>
23#endif
24
Gyuyoung Kim5f7f4c72020-07-14 13:09:0325namespace base {
26class UnguessableToken;
27} // namespace base
28
[email protected]8f879292011-04-08 00:21:2029namespace printing {
30
Wei Liab754772018-08-22 22:41:1731struct MetafileSkiaData;
[email protected]8f879292011-04-08 00:21:2032
Lei Zhang662e4222017-12-14 20:18:3433// This class uses Skia graphics library to generate a PDF or MSKP document.
Wei Liab754772018-08-22 22:41:1734class PRINTING_EXPORT MetafileSkia : public Metafile {
[email protected]8f879292011-04-08 00:21:2035 public:
Julie Jeongeun Kime1abed92020-06-11 11:01:4836 // Default constructor, for mojom::SkiaDocumentType::kPDF type only.
Wei Lie13ea642018-02-17 07:55:1937 // TODO(weili): we should split up this use case into a different class, see
38 // comments before InitFromData()'s implementation.
Wei Liab754772018-08-22 22:41:1739 MetafileSkia();
Julie Jeongeun Kime1abed92020-06-11 11:01:4840 MetafileSkia(mojom::SkiaDocumentType type, int document_cookie);
Lei Zhangdd3e9b02020-08-19 23:04:4241 MetafileSkia(const MetafileSkia&) = delete;
42 MetafileSkia& operator=(const MetafileSkia&) = delete;
Wei Liab754772018-08-22 22:41:1743 ~MetafileSkia() override;
[email protected]8f879292011-04-08 00:21:2044
[email protected]7d7489902011-04-11 21:54:0645 // Metafile methods.
dchengd5a0f182014-10-22 00:04:3446 bool Init() override;
Lei Zhangb4ef0d5d2020-03-27 23:18:2947 bool InitFromData(base::span<const uint8_t> data) override;
[email protected]8f879292011-04-08 00:21:2048
thestig192677ec2016-06-09 07:43:1749 void StartPage(const gfx::Size& page_size,
dchengd5a0f182014-10-22 00:04:3450 const gfx::Rect& content_area,
Morten Stenshorneeebf2db2020-05-25 09:00:0551 float scale_factor,
52 mojom::PageOrientation page_orientation) override;
dchengd5a0f182014-10-22 00:04:3453 bool FinishPage() override;
54 bool FinishDocument() override;
[email protected]8f879292011-04-08 00:21:2055
thestig707a24b22015-09-14 18:16:3356 uint32_t GetDataSize() const override;
57 bool GetData(void* dst_buffer, uint32_t dst_buffer_size) const override;
[email protected]8f879292011-04-08 00:21:2058
dchengd5a0f182014-10-22 00:04:3459 gfx::Rect GetPageBounds(unsigned int page_number) const override;
60 unsigned int GetPageCount() const override;
[email protected]8f879292011-04-08 00:21:2061
Nico Weber8e559562017-10-03 01:25:2662 printing::NativeDrawingContext context() const override;
[email protected]8f879292011-04-08 00:21:2063
64#if defined(OS_WIN)
Nico Weber8e559562017-10-03 01:25:2665 bool Playback(printing::NativeDrawingContext hdc,
thestig3109df12017-04-26 21:57:2566 const RECT* rect) const override;
Nico Weber8e559562017-10-03 01:25:2667 bool SafePlayback(printing::NativeDrawingContext hdc) const override;
Avi Drissman578cd722020-07-29 17:21:1568#elif defined(OS_MAC)
thestig99fc2132017-04-27 03:37:5469 bool RenderPage(unsigned int page_number,
Nico Weber8e559562017-10-03 01:25:2670 printing::NativeDrawingContext context,
Lei Zhangf69ea3b2020-03-24 17:53:4871 const CGRect& rect,
Daniel Hosseinian345ecfa2020-04-08 03:45:1672 bool autorotate,
73 bool fit_to_page) const override;
[email protected]b8d85bc2011-06-22 13:34:5774#endif
[email protected]8f879292011-04-08 00:21:2075
Shimi Zhang5ccdf202020-02-13 01:13:1976#if defined(OS_ANDROID)
77 bool SaveToFileDescriptor(int fd) const override;
78#else
halcanary5be808e2014-11-10 22:20:0579 bool SaveTo(base::File* file) const override;
Shimi Zhang5ccdf202020-02-13 01:13:1980#endif // defined(OS_ANDROID)
halcanary5be808e2014-11-10 22:20:0581
Wei Li5bb659742018-02-14 03:07:5882 // Unlike FinishPage() or FinishDocument(), this is for out-of-process
83 // subframe printing. It will just serialize the content into SkPicture
84 // format and store it as final data.
85 void FinishFrameContent();
86
[email protected]597516372011-07-01 05:10:4487 // Return a new metafile containing just the current page in draft mode.
Wei Liab754772018-08-22 22:41:1788 std::unique_ptr<MetafileSkia> GetMetafileForCurrentPage(
Julie Jeongeun Kime1abed92020-06-11 11:01:4889 mojom::SkiaDocumentType type);
[email protected]597516372011-07-01 05:10:4490
vitalybuka9de71ea2014-11-05 09:22:3491 // This method calls StartPage and then returns an appropriate
vitalybukaa73fc372015-02-06 18:40:3792 // PlatformCanvas implementation bound to the context created by
enne7b64edf32017-02-16 20:10:0293 // StartPage or NULL on error. The PaintCanvas pointer that
Wei Liab754772018-08-22 22:41:1794 // is returned is owned by this MetafileSkia object and does not
halcanary5be808e2014-11-10 22:20:0595 // need to be ref()ed or unref()ed. The canvas will remain valid
96 // until FinishPage() or FinishDocument() is called.
Morten Stenshorneeebf2db2020-05-25 09:00:0597 cc::PaintCanvas* GetVectorCanvasForNewPage(
98 const gfx::Size& page_size,
99 const gfx::Rect& content_area,
100 float scale_factor,
101 mojom::PageOrientation page_orientation);
halcanary5be808e2014-11-10 22:20:05102
Wei Lie13ea642018-02-17 07:55:19103 // This is used for painting content of out-of-process subframes.
104 // For such a subframe, since the content is in another process, we create a
105 // place holder picture now, and replace it with actual content by pdf
106 // compositor service later.
Gyuyoung Kim5f7f4c72020-07-14 13:09:03107 uint32_t CreateContentForRemoteFrame(
108 const gfx::Rect& rect,
109 const base::UnguessableToken& render_proxy_token);
Wei Lie13ea642018-02-17 07:55:19110
111 int GetDocumentCookie() const;
Gyuyoung Kim5f7f4c72020-07-14 13:09:03112 const ContentToProxyTokenMap& GetSubframeContentInfo() const;
Wei Lie13ea642018-02-17 07:55:19113
Alan Screen06d20162020-06-26 17:42:12114 void UtilizeTypefaceContext(ContentProxySet* typeface_content_info);
115
Dominic Mazzoni0a39059c2020-01-08 19:30:45116 const ui::AXTreeUpdate& accessibility_tree() const {
117 return accessibility_tree_;
118 }
119 ui::AXTreeUpdate& accessibility_tree() { return accessibility_tree_; }
120
[email protected]8f879292011-04-08 00:21:20121 private:
Wei Liab754772018-08-22 22:41:17122 FRIEND_TEST_ALL_PREFIXES(MetafileSkiaTest, TestFrameContent);
Alan Screen06d20162020-06-26 17:42:12123 FRIEND_TEST_ALL_PREFIXES(MetafileSkiaTest, TestMultiPictureDocumentTypefaces);
Wei Li1d345bf2018-08-10 02:52:37124
125 // The following three functions are used for tests only.
126 void AppendPage(const SkSize& page_size, sk_sp<cc::PaintRecord> record);
127 void AppendSubframeInfo(uint32_t content_id,
Gyuyoung Kim5f7f4c72020-07-14 13:09:03128 const base::UnguessableToken& proxy_token,
Wei Li1d345bf2018-08-10 02:52:37129 sk_sp<SkPicture> subframe_pic_holder);
130 SkStreamAsset* GetPdfData() const;
131
Wei Lie13ea642018-02-17 07:55:19132 // Callback function used during page content drawing to replace a custom
133 // data holder with corresponding place holder SkPicture.
134 void CustomDataToSkPictureCallback(SkCanvas* canvas, uint32_t content_id);
135
Wei Liab754772018-08-22 22:41:17136 std::unique_ptr<MetafileSkiaData> data_;
[email protected]8f879292011-04-08 00:21:20137
Dominic Mazzoni0a39059c2020-01-08 19:30:45138 ui::AXTreeUpdate accessibility_tree_;
[email protected]8f879292011-04-08 00:21:20139};
140
141} // namespace printing
142
Wei Liab754772018-08-22 22:41:17143#endif // PRINTING_METAFILE_SKIA_H_