blob: 6521b8f590f913cf560c9f8b54bf2ce83dc92111 [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"
avi126e93c2015-12-21 21:48:1613#include "base/macros.h"
[email protected]8f879292011-04-08 00:21:2014#include "build/build_config.h"
enne7b64edf32017-02-16 20:10:0215#include "cc/paint/paint_canvas.h"
Wei Liab754772018-08-22 22:41:1716#include "printing/common/metafile_utils.h"
[email protected]7d7489902011-04-11 21:54:0617#include "printing/metafile.h"
Julie Jeongeun Kime1abed92020-06-11 11:01:4818#include "printing/mojom/print.mojom-forward.h"
vitalybukaa73fc372015-02-06 18:40:3719#include "skia/ext/platform_canvas.h"
Dominic Mazzoni0a39059c2020-01-08 19:30:4520#include "ui/accessibility/ax_tree_update.h"
[email protected]8f879292011-04-08 00:21:2021
22#if defined(OS_WIN)
23#include <windows.h>
24#endif
25
Gyuyoung Kim5f7f4c72020-07-14 13:09:0326namespace base {
27class UnguessableToken;
28} // namespace base
29
[email protected]8f879292011-04-08 00:21:2030namespace printing {
31
Wei Liab754772018-08-22 22:41:1732struct MetafileSkiaData;
[email protected]8f879292011-04-08 00:21:2033
Lei Zhang662e4222017-12-14 20:18:3434// This class uses Skia graphics library to generate a PDF or MSKP document.
Wei Liab754772018-08-22 22:41:1735class PRINTING_EXPORT MetafileSkia : public Metafile {
[email protected]8f879292011-04-08 00:21:2036 public:
Julie Jeongeun Kime1abed92020-06-11 11:01:4837 // Default constructor, for mojom::SkiaDocumentType::kPDF type only.
Wei Lie13ea642018-02-17 07:55:1938 // TODO(weili): we should split up this use case into a different class, see
39 // comments before InitFromData()'s implementation.
Wei Liab754772018-08-22 22:41:1740 MetafileSkia();
Julie Jeongeun Kime1abed92020-06-11 11:01:4841 MetafileSkia(mojom::SkiaDocumentType type, int document_cookie);
Wei Liab754772018-08-22 22:41:1742 ~MetafileSkia() override;
[email protected]8f879292011-04-08 00:21:2043
[email protected]7d7489902011-04-11 21:54:0644 // Metafile methods.
dchengd5a0f182014-10-22 00:04:3445 bool Init() override;
Lei Zhangb4ef0d5d2020-03-27 23:18:2946 bool InitFromData(base::span<const uint8_t> data) override;
[email protected]8f879292011-04-08 00:21:2047
thestig192677ec2016-06-09 07:43:1748 void StartPage(const gfx::Size& page_size,
dchengd5a0f182014-10-22 00:04:3449 const gfx::Rect& content_area,
Morten Stenshorneeebf2db2020-05-25 09:00:0550 float scale_factor,
51 mojom::PageOrientation page_orientation) override;
dchengd5a0f182014-10-22 00:04:3452 bool FinishPage() override;
53 bool FinishDocument() override;
[email protected]8f879292011-04-08 00:21:2054
thestig707a24b22015-09-14 18:16:3355 uint32_t GetDataSize() const override;
56 bool GetData(void* dst_buffer, uint32_t dst_buffer_size) const override;
[email protected]8f879292011-04-08 00:21:2057
dchengd5a0f182014-10-22 00:04:3458 gfx::Rect GetPageBounds(unsigned int page_number) const override;
59 unsigned int GetPageCount() const override;
[email protected]8f879292011-04-08 00:21:2060
Nico Weber8e559562017-10-03 01:25:2661 printing::NativeDrawingContext context() const override;
[email protected]8f879292011-04-08 00:21:2062
63#if defined(OS_WIN)
Nico Weber8e559562017-10-03 01:25:2664 bool Playback(printing::NativeDrawingContext hdc,
thestig3109df12017-04-26 21:57:2565 const RECT* rect) const override;
Nico Weber8e559562017-10-03 01:25:2666 bool SafePlayback(printing::NativeDrawingContext hdc) const override;
thestig99fc2132017-04-27 03:37:5467#elif defined(OS_MACOSX)
68 bool RenderPage(unsigned int page_number,
Nico Weber8e559562017-10-03 01:25:2669 printing::NativeDrawingContext context,
Lei Zhangf69ea3b2020-03-24 17:53:4870 const CGRect& rect,
Daniel Hosseinian345ecfa2020-04-08 03:45:1671 bool autorotate,
72 bool fit_to_page) const override;
[email protected]b8d85bc2011-06-22 13:34:5773#endif
[email protected]8f879292011-04-08 00:21:2074
Shimi Zhang5ccdf202020-02-13 01:13:1975#if defined(OS_ANDROID)
76 bool SaveToFileDescriptor(int fd) const override;
77#else
halcanary5be808e2014-11-10 22:20:0578 bool SaveTo(base::File* file) const override;
Shimi Zhang5ccdf202020-02-13 01:13:1979#endif // defined(OS_ANDROID)
halcanary5be808e2014-11-10 22:20:0580
Wei Li5bb659742018-02-14 03:07:5881 // Unlike FinishPage() or FinishDocument(), this is for out-of-process
82 // subframe printing. It will just serialize the content into SkPicture
83 // format and store it as final data.
84 void FinishFrameContent();
85
[email protected]597516372011-07-01 05:10:4486 // Return a new metafile containing just the current page in draft mode.
Wei Liab754772018-08-22 22:41:1787 std::unique_ptr<MetafileSkia> GetMetafileForCurrentPage(
Julie Jeongeun Kime1abed92020-06-11 11:01:4888 mojom::SkiaDocumentType type);
[email protected]597516372011-07-01 05:10:4489
vitalybuka9de71ea2014-11-05 09:22:3490 // This method calls StartPage and then returns an appropriate
vitalybukaa73fc372015-02-06 18:40:3791 // PlatformCanvas implementation bound to the context created by
enne7b64edf32017-02-16 20:10:0292 // StartPage or NULL on error. The PaintCanvas pointer that
Wei Liab754772018-08-22 22:41:1793 // is returned is owned by this MetafileSkia object and does not
halcanary5be808e2014-11-10 22:20:0594 // need to be ref()ed or unref()ed. The canvas will remain valid
95 // until FinishPage() or FinishDocument() is called.
Morten Stenshorneeebf2db2020-05-25 09:00:0596 cc::PaintCanvas* GetVectorCanvasForNewPage(
97 const gfx::Size& page_size,
98 const gfx::Rect& content_area,
99 float scale_factor,
100 mojom::PageOrientation page_orientation);
halcanary5be808e2014-11-10 22:20:05101
Wei Lie13ea642018-02-17 07:55:19102 // This is used for painting content of out-of-process subframes.
103 // For such a subframe, since the content is in another process, we create a
104 // place holder picture now, and replace it with actual content by pdf
105 // compositor service later.
Gyuyoung Kim5f7f4c72020-07-14 13:09:03106 uint32_t CreateContentForRemoteFrame(
107 const gfx::Rect& rect,
108 const base::UnguessableToken& render_proxy_token);
Wei Lie13ea642018-02-17 07:55:19109
110 int GetDocumentCookie() const;
Gyuyoung Kim5f7f4c72020-07-14 13:09:03111 const ContentToProxyTokenMap& GetSubframeContentInfo() const;
Wei Lie13ea642018-02-17 07:55:19112
Alan Screen06d20162020-06-26 17:42:12113 void UtilizeTypefaceContext(ContentProxySet* typeface_content_info);
114
Dominic Mazzoni0a39059c2020-01-08 19:30:45115 const ui::AXTreeUpdate& accessibility_tree() const {
116 return accessibility_tree_;
117 }
118 ui::AXTreeUpdate& accessibility_tree() { return accessibility_tree_; }
119
[email protected]8f879292011-04-08 00:21:20120 private:
Wei Liab754772018-08-22 22:41:17121 FRIEND_TEST_ALL_PREFIXES(MetafileSkiaTest, TestFrameContent);
Alan Screen06d20162020-06-26 17:42:12122 FRIEND_TEST_ALL_PREFIXES(MetafileSkiaTest, TestMultiPictureDocumentTypefaces);
Wei Li1d345bf2018-08-10 02:52:37123
124 // The following three functions are used for tests only.
125 void AppendPage(const SkSize& page_size, sk_sp<cc::PaintRecord> record);
126 void AppendSubframeInfo(uint32_t content_id,
Gyuyoung Kim5f7f4c72020-07-14 13:09:03127 const base::UnguessableToken& proxy_token,
Wei Li1d345bf2018-08-10 02:52:37128 sk_sp<SkPicture> subframe_pic_holder);
129 SkStreamAsset* GetPdfData() const;
130
Wei Lie13ea642018-02-17 07:55:19131 // Callback function used during page content drawing to replace a custom
132 // data holder with corresponding place holder SkPicture.
133 void CustomDataToSkPictureCallback(SkCanvas* canvas, uint32_t content_id);
134
Wei Liab754772018-08-22 22:41:17135 std::unique_ptr<MetafileSkiaData> data_;
[email protected]8f879292011-04-08 00:21:20136
Dominic Mazzoni0a39059c2020-01-08 19:30:45137 ui::AXTreeUpdate accessibility_tree_;
138
Wei Liab754772018-08-22 22:41:17139 DISALLOW_COPY_AND_ASSIGN(MetafileSkia);
[email protected]8f879292011-04-08 00:21:20140};
141
142} // namespace printing
143
Wei Liab754772018-08-22 22:41:17144#endif // PRINTING_METAFILE_SKIA_H_