summaryrefslogtreecommitdiffstats
path: root/printing/native_metafile_win.h
blob: fa00121e98eedbec304396f621616e36fc1719d8 (plain)
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
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef PRINTING_NATIVE_METAFILE_WIN_H_
#define PRINTING_NATIVE_METAFILE_WIN_H_

#include <windows.h>
#include <vector>

#include "base/basictypes.h"

class FilePath;

namespace gfx {
class Rect;
}

namespace printing {

// Simple wrapper class that manages a data stream and its virtual HDC.
class NativeMetafile {
 public:
  virtual ~NativeMetafile() {}

  // Initializes the data stream with the data in |src_buffer|. Returns
  // true on success.
  virtual bool Init(const void* src_buffer, uint32 src_buffer_size) = 0;

  // Generates a virtual HDC that will record every GDI commands and compile it
  // in a EMF data stream.
  // hdc is used to setup the default DPI and color settings. hdc is optional.
  // rect specifies the dimensions (in .01-millimeter units) of the EMF. rect is
  // optional.
  virtual bool CreateDc(HDC sibling, const RECT* rect) = 0;

  // Similar to the above method but the metafile is backed by a file.
  virtual bool CreateFileBackedDc(HDC sibling,
                                  const RECT* rect,
                                  const FilePath& path) = 0;

  // Load a data stream from file.
  virtual bool CreateFromFile(const FilePath& metafile_path) = 0;

  // TODO(maruel): CreateFromFile(). If ever used. Maybe users would like to
  // have the ability to save web pages to an EMF file? Afterward, it is easy to
  // convert to PDF.

  // Closes the HDC created by CreateDc() and generates the compiled EMF
  // data.
  virtual bool CloseDc() = 0;

  // Closes the EMF data handle when it is not needed anymore.
  virtual void CloseEmf() = 0;

  // "Plays" the EMF buffer in a HDC. It is the same effect as calling the
  // original GDI function that were called when recording the EMF. |rect| is in
  // "logical units" and is optional. If |rect| is NULL, the natural EMF bounds
  // are used.
  // Note: Windows has been known to have stack buffer overflow in its GDI
  // functions, whether used directly or indirectly through precompiled EMF
  // data. We have to accept the risk here. Since it is used only for printing,
  // it requires user intervention.
  virtual bool Playback(HDC hdc, const RECT* rect) const = 0;

  // The slow version of Playback(). It enumerates all the records and play them
  // back in the HDC. The trick is that it skip over the records known to have
  // issue with some printers. See Emf::Record::SafePlayback implementation for
  // details.
  virtual bool SafePlayback(HDC hdc) const = 0;

  // Retrieves the bounds of the painted area by this EMF buffer. This value
  // should be passed to Playback to keep the exact same size.
  virtual gfx::Rect GetBounds() const = 0;

  // Retrieves the data stream size.
  virtual uint32 GetDataSize() const = 0;

  // Retrieves the data stream.
  virtual bool GetData(void* buffer, uint32 size) const = 0;

  // Retrieves the data stream. It is an helper function.
  virtual bool GetData(std::vector<uint8>* buffer) const = 0;

  virtual HENHMETAFILE emf() const = 0;

  virtual HDC hdc() const = 0;

  // Inserts a custom GDICOMMENT records indicating StartPage/EndPage calls
  // (since StartPage and EndPage do not work in a metafile DC). Only valid
  // when hdc_ is non-NULL.
  virtual bool StartPage() = 0;
  virtual bool EndPage() = 0;

  // Saves the EMF data to a file as-is. It is recommended to use the .emf file
  // extension but it is not enforced. This function synchronously writes to the
  // file. For testing only.
  virtual bool SaveTo(const std::wstring& filename) const = 0;
};

}  // namespace printing

#endif  // PRINTING_NATIVE_METAFILE_WIN_H_