blob: 26b9049163f2c52ec21f62feae4462ce010f9c07 [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"
vitalybukaa73fc372015-02-06 18:40:3718#include "skia/ext/platform_canvas.h"
[email protected]8f879292011-04-08 00:21:2019
20#if defined(OS_WIN)
21#include <windows.h>
22#endif
23
24namespace printing {
25
Wei Liab754772018-08-22 22:41:1726struct MetafileSkiaData;
[email protected]8f879292011-04-08 00:21:2027
Lei Zhang662e4222017-12-14 20:18:3428// This class uses Skia graphics library to generate a PDF or MSKP document.
Wei Liab754772018-08-22 22:41:1729class PRINTING_EXPORT MetafileSkia : public Metafile {
[email protected]8f879292011-04-08 00:21:2030 public:
Wei Lie13ea642018-02-17 07:55:1931 // Default constructor, for SkiaDocumentType::PDF type only.
32 // TODO(weili): we should split up this use case into a different class, see
33 // comments before InitFromData()'s implementation.
Wei Liab754772018-08-22 22:41:1734 MetafileSkia();
35 MetafileSkia(SkiaDocumentType type, int document_cookie);
36 ~MetafileSkia() override;
[email protected]8f879292011-04-08 00:21:2037
[email protected]7d7489902011-04-11 21:54:0638 // Metafile methods.
dchengd5a0f182014-10-22 00:04:3439 bool Init() override;
thestig6b4461f2016-10-28 19:34:3040 bool InitFromData(const void* src_buffer, size_t src_buffer_size) override;
[email protected]8f879292011-04-08 00:21:2041
thestig192677ec2016-06-09 07:43:1742 void StartPage(const gfx::Size& page_size,
dchengd5a0f182014-10-22 00:04:3443 const gfx::Rect& content_area,
44 const float& scale_factor) override;
45 bool FinishPage() override;
46 bool FinishDocument() override;
[email protected]8f879292011-04-08 00:21:2047
thestig707a24b22015-09-14 18:16:3348 uint32_t GetDataSize() const override;
49 bool GetData(void* dst_buffer, uint32_t dst_buffer_size) const override;
[email protected]8f879292011-04-08 00:21:2050
dchengd5a0f182014-10-22 00:04:3451 gfx::Rect GetPageBounds(unsigned int page_number) const override;
52 unsigned int GetPageCount() const override;
[email protected]8f879292011-04-08 00:21:2053
Nico Weber8e559562017-10-03 01:25:2654 printing::NativeDrawingContext context() const override;
[email protected]8f879292011-04-08 00:21:2055
56#if defined(OS_WIN)
Nico Weber8e559562017-10-03 01:25:2657 bool Playback(printing::NativeDrawingContext hdc,
thestig3109df12017-04-26 21:57:2558 const RECT* rect) const override;
Nico Weber8e559562017-10-03 01:25:2659 bool SafePlayback(printing::NativeDrawingContext hdc) const override;
thestig99fc2132017-04-27 03:37:5460#elif defined(OS_MACOSX)
61 bool RenderPage(unsigned int page_number,
Nico Weber8e559562017-10-03 01:25:2662 printing::NativeDrawingContext context,
thestig99fc2132017-04-27 03:37:5463 const CGRect rect,
64 const MacRenderPageParams& params) const override;
[email protected]b8d85bc2011-06-22 13:34:5765#endif
[email protected]8f879292011-04-08 00:21:2066
halcanary5be808e2014-11-10 22:20:0567 bool SaveTo(base::File* file) const override;
68
Wei Li5bb659742018-02-14 03:07:5869 // Unlike FinishPage() or FinishDocument(), this is for out-of-process
70 // subframe printing. It will just serialize the content into SkPicture
71 // format and store it as final data.
72 void FinishFrameContent();
73
[email protected]597516372011-07-01 05:10:4474 // Return a new metafile containing just the current page in draft mode.
Wei Liab754772018-08-22 22:41:1775 std::unique_ptr<MetafileSkia> GetMetafileForCurrentPage(
halcanaryffa005b2016-06-15 17:13:1676 SkiaDocumentType type);
[email protected]597516372011-07-01 05:10:4477
vitalybuka9de71ea2014-11-05 09:22:3478 // This method calls StartPage and then returns an appropriate
vitalybukaa73fc372015-02-06 18:40:3779 // PlatformCanvas implementation bound to the context created by
enne7b64edf32017-02-16 20:10:0280 // StartPage or NULL on error. The PaintCanvas pointer that
Wei Liab754772018-08-22 22:41:1781 // is returned is owned by this MetafileSkia object and does not
halcanary5be808e2014-11-10 22:20:0582 // need to be ref()ed or unref()ed. The canvas will remain valid
83 // until FinishPage() or FinishDocument() is called.
enne7b64edf32017-02-16 20:10:0284 cc::PaintCanvas* GetVectorCanvasForNewPage(const gfx::Size& page_size,
85 const gfx::Rect& content_area,
86 const float& scale_factor);
halcanary5be808e2014-11-10 22:20:0587
Wei Lie13ea642018-02-17 07:55:1988 // This is used for painting content of out-of-process subframes.
89 // For such a subframe, since the content is in another process, we create a
90 // place holder picture now, and replace it with actual content by pdf
91 // compositor service later.
92 uint32_t CreateContentForRemoteFrame(const gfx::Rect& rect,
93 int render_proxy_id);
94
95 int GetDocumentCookie() const;
96 const ContentToProxyIdMap& GetSubframeContentInfo() const;
97
[email protected]8f879292011-04-08 00:21:2098 private:
Wei Liab754772018-08-22 22:41:1799 FRIEND_TEST_ALL_PREFIXES(MetafileSkiaTest, TestFrameContent);
Wei Li1d345bf2018-08-10 02:52:37100
101 // The following three functions are used for tests only.
102 void AppendPage(const SkSize& page_size, sk_sp<cc::PaintRecord> record);
103 void AppendSubframeInfo(uint32_t content_id,
104 int proxy_id,
105 sk_sp<SkPicture> subframe_pic_holder);
106 SkStreamAsset* GetPdfData() const;
107
Wei Lie13ea642018-02-17 07:55:19108 // Callback function used during page content drawing to replace a custom
109 // data holder with corresponding place holder SkPicture.
110 void CustomDataToSkPictureCallback(SkCanvas* canvas, uint32_t content_id);
111
Wei Liab754772018-08-22 22:41:17112 std::unique_ptr<MetafileSkiaData> data_;
[email protected]8f879292011-04-08 00:21:20113
Wei Liab754772018-08-22 22:41:17114 DISALLOW_COPY_AND_ASSIGN(MetafileSkia);
[email protected]8f879292011-04-08 00:21:20115};
116
117} // namespace printing
118
Wei Liab754772018-08-22 22:41:17119#endif // PRINTING_METAFILE_SKIA_H_