Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qpdf_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QPDF_P_H
6#define QPDF_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtGui/private/qtguiglobal_p.h>
20
21#ifndef QT_NO_PDF
22
23#include "QtCore/qlist.h"
24#include "QtCore/qstring.h"
25#include "QtCore/quuid.h"
26#include "private/qfontengine_p.h"
27#include "private/qfontsubset_p.h"
28#include "private/qpaintengine_p.h"
29#include "private/qstroker_p.h"
30#include "qpagelayout.h"
32
33QT_BEGIN_NAMESPACE
34
35const char *qt_real_to_string(qreal val, char *buf);
36const char *qt_int_to_string(int val, char *buf);
37
38namespace QPdf {
39
41 {
42 public:
43 // fileBacking means that ByteStream will buffer the contents on disk
44 // if the size exceeds a certain threshold. In this case, if a byte
45 // array was passed in, its contents may no longer correspond to the
46 // ByteStream contents.
47 explicit ByteStream(bool fileBacking = false);
48 explicit ByteStream(QByteArray *ba, bool fileBacking = false);
49 ~ByteStream();
50 ByteStream &operator <<(char chr);
51 ByteStream &operator <<(const char *str);
52 ByteStream &operator <<(const QByteArray &str);
53 ByteStream &operator <<(const ByteStream &src);
54 ByteStream &operator <<(qreal val);
55 ByteStream &operator <<(int val);
56 ByteStream &operator <<(uint val) { return (*this << int(val)); }
57 ByteStream &operator <<(qint64 val) { return (*this << int(val)); }
58 ByteStream &operator <<(const QPointF &p);
59 // Note that the stream may be invalidated by calls that insert data.
61 void clear();
62
63 static inline int maxMemorySize() { return 100000000; }
64 static inline int chunkSize() { return 10000000; }
65
66 private:
67 void prepareBuffer();
68
69 private:
70 QIODevice *dev;
71 QByteArray ba;
72 bool fileBackingEnabled;
73 bool fileBackingActive;
74 bool handleDirty;
75 };
76
83 QByteArray generatePath(const QPainterPath &path, const QTransform &matrix, PathFlags flags);
84 QByteArray generateMatrix(const QTransform &matrix);
85 QByteArray generateDashes(const QPen &pen);
86 QByteArray patternForBrush(const QBrush &b);
87
88 struct Stroker {
89 Stroker();
90 void setPen(const QPen &pen, QPainter::RenderHints hints);
91 void strokePath(const QPainterPath &path);
93 bool first;
96 private:
97 QStroker basicStroker;
98 QDashStroker dashStroker;
99 QStrokerOps *stroker;
100 };
101
102 QByteArray ascii85Encode(const QByteArray &input);
103
104 const char *toHex(ushort u, char *buffer);
105 const char *toHex(uchar u, char *buffer);
106
107}
108
109
110class QPdfPage : public QPdf::ByteStream
111{
112public:
113 QPdfPage();
114
120
121 void streamImage(int w, int h, uint object);
122
124private:
125};
126
127class QPdfWriter;
128class QPdfEnginePrivate;
129
130class Q_GUI_EXPORT QPdfEngine : public QPaintEngine
131{
132 Q_DECLARE_PRIVATE(QPdfEngine)
133 friend class QPdfWriter;
134public:
135 // keep in sync with QPagedPaintDevice::PdfVersion and QPdfEnginePrivate::writeHeader()::mapping!
136 enum PdfVersion
137 {
138 Version_1_4,
139 Version_A1b,
140 Version_1_6,
141 Version_X4,
142 };
143
144 QPdfEngine();
145 explicit QPdfEngine(QPdfEnginePrivate &d);
146 ~QPdfEngine() {}
147
148 void setOutputFilename(const QString &filename);
149
150 void setResolution(int resolution);
151 int resolution() const;
152
153 void setPdfVersion(PdfVersion version);
154
155 void setDocumentXmpMetadata(const QByteArray &xmpMetadata);
156 QByteArray documentXmpMetadata() const;
157
158 void addFileAttachment(const QString &fileName, const QByteArray &data, const QString &mimeType);
159
160 // keep in sync with QPdfWriter
161 enum class ColorModel
162 {
163 RGB,
164 Grayscale,
165 CMYK,
166 Auto,
167 };
168
169 ColorModel colorModel() const;
170 void setColorModel(ColorModel model);
171
172 // reimplementations QPaintEngine
173 bool begin(QPaintDevice *pdev) override;
174 bool end() override;
175
176 void drawPoints(const QPointF *points, int pointCount) override;
177 void drawLines(const QLineF *lines, int lineCount) override;
178 void drawRects(const QRectF *rects, int rectCount) override;
179 void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) override;
180 void drawPath (const QPainterPath & path) override;
181
182 void drawTextItem(const QPointF &p, const QTextItem &textItem) override;
183
184 void drawPixmap (const QRectF & rectangle, const QPixmap & pixmap, const QRectF & sr) override;
185 void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr,
186 Qt::ImageConversionFlags flags = Qt::AutoColor) override;
187 void drawTiledPixmap (const QRectF & rectangle, const QPixmap & pixmap, const QPointF & point) override;
188
189 void drawHyperlink(const QRectF &r, const QUrl &url);
190
191 void updateState(const QPaintEngineState &state) override;
192
193 int metric(QPaintDevice::PaintDeviceMetric metricType) const;
194 Type type() const override;
195 // end reimplementations QPaintEngine
196
197 // Printer stuff...
198 bool newPage();
199
200 // Page layout stuff
201 void setPageLayout(const QPageLayout &pageLayout);
202 void setPageSize(const QPageSize &pageSize);
203 void setPageOrientation(QPageLayout::Orientation orientation);
204 void setPageMargins(const QMarginsF &margins, QPageLayout::Unit units = QPageLayout::Point);
205
206 QPageLayout pageLayout() const;
207
208 void setPen();
209 void setBrush();
210 void setupGraphicsState(QPaintEngine::DirtyFlags flags);
211
212private:
213 void updateClipPath(const QPainterPath & path, Qt::ClipOperation op);
214};
215
216class Q_GUI_EXPORT QPdfEnginePrivate : public QPaintEnginePrivate
217{
218 Q_DECLARE_PUBLIC(QPdfEngine)
219public:
220 QPdfEnginePrivate();
221 ~QPdfEnginePrivate();
222
223 inline uint requestObject() { return currentObject++; }
224
225 void writeHeader();
226 void writeTail();
227
228 int addImage(const QImage &image, bool *bitmap, bool lossless, qint64 serial_no);
229 int addConstantAlphaObject(int brushAlpha, int penAlpha = 255);
230 int addBrushPattern(const QTransform &matrix, bool *specifyColor, int *gStateObject);
231
232 void drawTextItem(const QPointF &p, const QTextItemInt &ti);
233
234 QTransform pageMatrix() const;
235
236 void newPage();
237
238 int currentObject;
239
240 QPdfPage* currentPage;
241 QPdf::Stroker stroker;
242
243 QPointF brushOrigin;
244 QBrush brush;
245 QPen pen;
246 QList<QPainterPath> clips;
247 bool clipEnabled;
248 bool allClipped;
249 bool hasPen;
250 bool hasBrush;
251 bool simplePen;
252 bool needsTransform;
253 qreal opacity;
254 QPdfEngine::PdfVersion pdfVersion;
255 QPdfEngine::ColorModel colorModel;
256
257 QHash<QFontEngine::FaceId, QFontSubset *> fonts;
258
259 QPaintDevice *pdev;
260
261 // the device the output is in the end streamed to.
262 QIODevice *outDevice;
263 bool ownsDevice;
264
265 // printer options
266 QString outputFileName;
267 QString title;
268 QString creator;
269 QString author;
270 QUuid documentId = QUuid::createUuid();
271 bool embedFonts;
272 int resolution;
273 QPdfOutputIntent outputIntent;
274
275 // Page layout: size, orientation and margins
276 QPageLayout m_pageLayout;
277
278private:
279 int gradientBrush(const QBrush &b, const QTransform &matrix, int *gStateObject);
280 int generateGradientShader(const QGradient *gradient, const QTransform &matrix, bool alpha = false);
281 int generateLinearGradientShader(const QLinearGradient *lg, const QTransform &matrix, bool alpha);
282 int generateRadialGradientShader(const QRadialGradient *gradient, const QTransform &matrix, bool alpha);
283 struct ShadingFunctionResult
284 {
285 int function;
286 QPdfEngine::ColorModel colorModel;
287 void writeColorSpace(QPdf::ByteStream *stream) const;
288 };
289 ShadingFunctionResult createShadingFunction(const QGradient *gradient, int from, int to, bool reflect, bool alpha);
290
291 enum class ColorDomain {
292 Stroking,
293 NonStroking,
294 NonStrokingPattern,
295 };
296
297 QPdfEngine::ColorModel colorModelForColor(const QColor &color) const;
298 void writeColor(ColorDomain domain, const QColor &color);
299 void writeInfo(const QDateTime &date);
300 int writeXmpDocumentMetaData(const QDateTime &date);
301 int writeOutputIntent();
302 void writePageRoot();
303 void writeDestsRoot();
304 void writeAttachmentRoot();
305 void writeNamesRoot();
306 void writeFonts();
307 void embedFont(QFontSubset *font);
308 qreal calcUserUnit() const;
309
310 QList<int> xrefPositions;
311 QDataStream* stream;
312 int streampos;
313
314 enum class WriteImageOption
315 {
316 Monochrome,
317 Grayscale,
318 RGB,
319 CMYK,
320 };
321
322 int writeImage(const QByteArray &data, int width, int height, WriteImageOption option,
323 int maskObject, int softMaskObject, bool dct = false, bool isMono = false);
324 void writePage();
325
326 int addXrefEntry(int object, bool printostr = true);
327 void printString(QStringView string);
328 void xprintf(const char* fmt, ...) Q_ATTRIBUTE_FORMAT_PRINTF(2, 3);
329 inline void write(QByteArrayView data) {
330 stream->writeRawData(data.constData(), data.size());
331 streampos += data.size();
332 }
333
334 int writeCompressed(const char *src, int len);
335 inline int writeCompressed(const QByteArray &data) { return writeCompressed(data.constData(), data.size()); }
336 int writeCompressed(QIODevice *dev);
337
338 struct AttachmentInfo
339 {
340 AttachmentInfo (const QString &fileName, const QByteArray &data, const QString &mimeType)
341 : fileName(fileName), data(data), mimeType(mimeType) {}
342 QString fileName;
343 QByteArray data;
344 QString mimeType;
345 };
346
347 struct DestInfo
348 {
349 QString anchor;
350 uint pageObj;
351 QPointF coords;
352 };
353
354 // various PDF objects
355 int pageRoot, namesRoot, destsRoot, attachmentsRoot, catalog, info;
356 int graphicsState;
357 int patternColorSpaceRGB;
358 int patternColorSpaceGrayscale;
359 int patternColorSpaceCMYK;
360 QList<uint> pages;
361 QHash<qint64, uint> imageCache;
362 QHash<std::pair<uint, uint>, uint > alphaCache;
363 QList<DestInfo> destCache;
364 QList<AttachmentInfo> fileCache;
365 QByteArray xmpDocumentMetadata;
366};
367
368QT_END_NAMESPACE
369
370#endif // QT_NO_PDF
371
372#endif // QPDF_P_H
QSize pageSize
Definition qpdf_p.h:123
QList< uint > patterns
Definition qpdf_p.h:117
QList< uint > fonts
Definition qpdf_p.h:118
QList< uint > images
Definition qpdf_p.h:115
void streamImage(int w, int h, uint object)
Definition qpdf.cpp:754
QList< uint > graphicStates
Definition qpdf_p.h:116
QList< uint > annotations
Definition qpdf_p.h:119
QPdfPage()
Definition qpdf.cpp:749
ByteStream(QByteArray *ba, bool fileBacking=false)
Definition qpdf.cpp:184
ByteStream(bool fileBacking=false)
Definition qpdf.cpp:193
static int chunkSize()
Definition qpdf_p.h:64
QIODevice * stream()
Definition qpdf.cpp:268
static int maxMemorySize()
Definition qpdf_p.h:63
Definition qpdf.cpp:183
const char * toHex(ushort u, char *buffer)
Definition qpdf.cpp:716
QByteArray generatePath(const QPainterPath &path, const QTransform &matrix, PathFlags flags)
Definition qpdf.cpp:309
PathFlags
Definition qpdf_p.h:77
@ StrokePath
Definition qpdf_p.h:80
@ FillAndStrokePath
Definition qpdf_p.h:81
@ FillPath
Definition qpdf_p.h:79
@ ClipPath
Definition qpdf_p.h:78
QByteArray ascii85Encode(const QByteArray &input)
Definition qpdf.cpp:660
QByteArray generateDashes(const QPen &pen)
Definition qpdf.cpp:385
QByteArray patternForBrush(const QBrush &b)
Definition qpdf.cpp:561
QByteArray generateMatrix(const QTransform &matrix)
Definition qpdf.cpp:371
Q_GUI_EXPORT bool qt_isExtendedRadialGradient(const QBrush &brush)
Definition qbrush.cpp:876
const char * qt_int_to_string(int val, char *buf)
Definition qpdf.cpp:158
static void initResources()
Definition qpdf.cpp:45
static bool is_monochrome(const QList< QRgb > &colorTable)
Definition qpdf.cpp:3187
Q_DECLARE_TYPEINFO(QGradientBound, Q_PRIMITIVE_TYPE)
static void removeTransparencyFromBrush(QBrush &brush)
Definition qpdf.cpp:67
static void lineToHook(qfixed x, qfixed y, void *data)
Definition qpdf.cpp:581
const char * qt_real_to_string(qreal val, char *buf)
Definition qpdf.cpp:106
constexpr QPaintEngine::PaintEngineFeatures qt_pdf_decide_features()
Definition qpdf.cpp:54
static const bool interpolateImages
Definition qpdf.cpp:43
static void moveToHook(qfixed x, qfixed y, void *data)
Definition qpdf.cpp:570
static const char *const pattern_for_brush[]
Definition qpdf.cpp:408
static void cubicToHook(qfixed c1x, qfixed c1y, qfixed c2x, qfixed c2y, qfixed ex, qfixed ey, void *data)
Definition qpdf.cpp:589
static const bool do_compress
Definition qpdf.cpp:38
bool first
Definition qpdf_p.h:93
bool cosmeticPen
Definition qpdf_p.h:95
ByteStream * stream
Definition qpdf_p.h:92
QTransform matrix
Definition qpdf_p.h:94
void setPen(const QPen &pen, QPainter::RenderHints hints)
Definition qpdf.cpp:619
void strokePath(const QPainterPath &path)
Definition qpdf.cpp:650