diff options
author | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2023-10-18 18:42:05 +0200 |
---|---|---|
committer | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2024-02-02 16:06:45 +0100 |
commit | 0092f06a648ba29c9643ae19a88ed2eb6ea1300f (patch) | |
tree | 2923ebdfc8023b8da36faf0e4c91d99808cde93e /src/gui/painting/qpdf_p.h | |
parent | efc579145ef33655a4aaad5a41124cb103bfbe7a (diff) |
Add CMYK support for pens/fills in the PDF engine
Insofar, painting with a CMYK color (pen/brush) was completely ignored
by QPdfWriter, although the PDF format can faithfully represent CMYK
colors.
This commit adds support for CMYK colors in the PDF engine. The support
is opt-in, in the name of backwards compatibility; an enumeration on
QPdfWriter controls the output.
QPrinter was using a hidden hook in QPdfEngine in order to do grayscale
printing; this hook can now be made public API through the same
enumeration.
This work has been kindly sponsored by the QGIS project
(https://qgis.org/).
[ChangeLog][QtGui][QPdfWriter] QPdfWriter can now use CMYK colors
directly, without converting them into RGB colors.
Change-Id: Ia27c19ec81a58ab68ddc8b9c89c4e57d7d637301
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
Diffstat (limited to 'src/gui/painting/qpdf_p.h')
-rw-r--r-- | src/gui/painting/qpdf_p.h | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/src/gui/painting/qpdf_p.h b/src/gui/painting/qpdf_p.h index 2c70ddf664..b97d0df31f 100644 --- a/src/gui/painting/qpdf_p.h +++ b/src/gui/painting/qpdf_p.h @@ -142,7 +142,7 @@ public: }; QPdfEngine(); - QPdfEngine(QPdfEnginePrivate &d); + explicit QPdfEngine(QPdfEnginePrivate &d); ~QPdfEngine() {} void setOutputFilename(const QString &filename); @@ -157,6 +157,18 @@ public: void addFileAttachment(const QString &fileName, const QByteArray &data, const QString &mimeType); + // keep in sync with QPdfWriter + enum class ColorModel + { + RGB, + Grayscale, + CMYK, + Auto, + }; + + ColorModel colorModel() const; + void setColorModel(ColorModel model); + // reimplementations QPaintEngine bool begin(QPaintDevice *pdev) override; bool end() override; @@ -240,6 +252,7 @@ public: bool needsTransform; qreal opacity; QPdfEngine::PdfVersion pdfVersion; + QPdfEngine::ColorModel colorModel; QHash<QFontEngine::FaceId, QFontSubset *> fonts; @@ -255,7 +268,6 @@ public: QString creator; bool embedFonts; int resolution; - bool grayscale; // Page layout: size, orientation and margins QPageLayout m_pageLayout; @@ -265,8 +277,22 @@ private: int generateGradientShader(const QGradient *gradient, const QTransform &matrix, bool alpha = false); int generateLinearGradientShader(const QLinearGradient *lg, const QTransform &matrix, bool alpha); int generateRadialGradientShader(const QRadialGradient *gradient, const QTransform &matrix, bool alpha); - int createShadingFunction(const QGradient *gradient, int from, int to, bool reflect, bool alpha); + struct ShadingFunctionResult + { + int function; + QPdfEngine::ColorModel colorModel; + void writeColorSpace(QPdf::ByteStream *stream) const; + }; + ShadingFunctionResult createShadingFunction(const QGradient *gradient, int from, int to, bool reflect, bool alpha); + + enum class ColorDomain { + Stroking, + NonStroking, + NonStrokingPattern, + }; + QPdfEngine::ColorModel colorModelForColor(const QColor &color) const; + void writeColor(ColorDomain domain, const QColor &color); void writeInfo(); int writeXmpDcumentMetaData(); int writeOutputIntent(); @@ -316,7 +342,10 @@ private: // various PDF objects int pageRoot, namesRoot, destsRoot, attachmentsRoot, catalog, info; - int graphicsState, patternColorSpace; + int graphicsState; + int patternColorSpaceRGB; + int patternColorSpaceGrayscale; + int patternColorSpaceCMYK; QList<uint> pages; QHash<qint64, uint> imageCache; QHash<QPair<uint, uint>, uint > alphaCache; |