Make it possible to disable font embedding

When font embedding is explicitly disabled, fall back to painter paths
as we would if the font prohibits embedding. Note that this flag was
never respected on any platform in any version of Qt, as far as I've
been able to tell, because the handling of it in the X11 print
engine was removed shortly after it was introduced in 2005.

[ChangeLog][Printing] Disabling font embedding is now possible using
the QPrinter::setFontEmbedding() function.

Task-number: QTBUG-41943
Change-Id: Ice5e893f9893c5243310ae7892bec7497dd55c4a
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
This commit is contained in:
Eskil Abrahamsen Blomfeldt 2014-10-28 10:00:56 +01:00 committed by Jani Heikkinen
parent 2f1d22c8b4
commit 1ffe39dfd1
7 changed files with 32 additions and 34 deletions

View File

@ -2501,7 +2501,8 @@ void QPdfEnginePrivate::drawTextItem(const QPointF &p, const QTextItemInt &ti)
QFontEngine::FaceId face_id = fe->faceId();
bool noEmbed = false;
if (face_id.filename.isEmpty()
if (!embedFonts
|| face_id.filename.isEmpty()
|| fe->fsType & 0x200 /* bitmap embedding only */
|| fe->fsType == 2 /* no embedding allowed */) {
*currentPage << "Q\n";

View File

@ -412,7 +412,10 @@ void QMacPrintEngine::drawTextItem(const QPointF &p, const QTextItem &ti)
{
Q_D(QMacPrintEngine);
Q_ASSERT(d->state == QPrinter::Active);
d->paintEngine->drawTextItem(p, ti);
if (!d->embedFonts)
QPaintEngine::drawTextItem(p, ti);
else
d->paintEngine->drawTextItem(p, ti);
}
void QMacPrintEngine::drawTiledPixmap(const QRectF &dr, const QPixmap &pixmap, const QPointF &sr)
@ -457,8 +460,6 @@ void QMacPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va
break;
case PPK_CustomBase:
break;
case PPK_FontEmbedding:
break;
case PPK_PageOrder:
// TODO Check if can be supported via Cups Options
break;
@ -471,6 +472,9 @@ void QMacPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va
break;
// The following keys are properties and settings that are supported by the Mac PrintEngine
case PPK_FontEmbedding:
d->embedFonts = value.toBool();
break;
case PPK_Resolution: {
// TODO It appears the old code didn't actually set the resolution??? Can we delete all this???
int bestResolution = 0;
@ -622,9 +626,6 @@ QVariant QMacPrintEngine::property(PrintEnginePropertyKey key) const
case PPK_CustomBase:
// Special case, leave null
break;
case PPK_FontEmbedding:
ret = false;
break;
case PPK_PageOrder:
// TODO Check if can be supported via Cups Options
ret = QPrinter::FirstPageFirst;
@ -648,6 +649,9 @@ QVariant QMacPrintEngine::property(PrintEnginePropertyKey key) const
break;
// The following keys are properties and settings that are supported by the Mac PrintEngine
case PPK_FontEmbedding:
ret = d->embedFonts;
break;
case PPK_CollateCopies: {
Boolean status;
PMGetCollate(d->settings(), &status);

View File

@ -124,10 +124,11 @@ public:
QString m_creator;
QPaintEngine *paintEngine;
QHash<QMacPrintEngine::PrintEnginePropertyKey, QVariant> valueCache;
uint embedFonts;
QMacPrintEnginePrivate() : mode(QPrinter::ScreenResolution), state(QPrinter::Idle),
m_pageLayout(QPageLayout(QPageSize(QPageSize::A4), QPageLayout::Portrait, QMarginsF(0, 0, 0, 0))),
printInfo(0), paintEngine(0) {}
printInfo(0), paintEngine(0), embedFonts(true) {}
~QMacPrintEnginePrivate();
void initialize();

View File

@ -269,7 +269,8 @@ void QWin32PrintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem
bool fallBack = state->pen().brush().style() != Qt::SolidPattern
|| qAlpha(brushColor) != 0xff
|| d->txop >= QTransform::TxProject
|| ti.fontEngine->type() != QFontEngine::Win;
|| ti.fontEngine->type() != QFontEngine::Win
|| !d->embed_fonts;
if (!fallBack) {
const QVariantMap userData = ti.fontEngine->userData().toMap();
@ -1001,8 +1002,6 @@ void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &
// The following keys are settings that are unsupported by the Windows PrintEngine
case PPK_CustomBase:
break;
case PPK_FontEmbedding:
break;
case PPK_PageOrder:
break;
case PPK_PrinterProgram:
@ -1011,6 +1010,10 @@ void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &
break;
// The following keys are properties and settings that are supported by the Windows PrintEngine
case PPK_FontEmbedding:
d->embed_fonts = value.toBool();
break;
case PPK_CollateCopies:
{
if (!d->devMode)
@ -1282,9 +1285,6 @@ QVariant QWin32PrintEngine::property(PrintEnginePropertyKey key) const
// The following keys are settings that are unsupported by the Windows PrintEngine
// Return sensible default values to ensure consistent behavior across platforms
case PPK_FontEmbedding:
value = false;
break;
case PPK_PageOrder:
value = QPrinter::FirstPageFirst;
break;
@ -1296,6 +1296,10 @@ QVariant QWin32PrintEngine::property(PrintEnginePropertyKey key) const
break;
// The following keys are properties and settings that are supported by the Windows PrintEngine
case PPK_FontEmbedding:
value = d->embed_fonts;
break;
case PPK_CollateCopies:
value = d->devMode->dmCollate == DMCOLLATE_TRUE;
break;

View File

@ -125,7 +125,8 @@ public:
m_pageLayout(QPageLayout(QPageSize(QPageSize::A4), QPageLayout::Portrait, QMarginsF(0, 0, 0, 0))),
num_copies(1),
printToFile(false),
reinit(false)
reinit(false),
embed_fonts(true)
{
}
@ -216,6 +217,7 @@ public:
uint has_pen : 1;
uint has_brush : 1;
uint has_custom_paper_size : 1;
uint embed_fonts : 1;
uint txop;

View File

@ -1632,8 +1632,6 @@ QPrinter::PaperSource QPrinter::paperSource() const
Enabled or disables font embedding depending on \a enable.
Currently this option is only supported on X11.
\sa fontEmbeddingEnabled()
*/
void QPrinter::setFontEmbeddingEnabled(bool enable)
@ -1647,8 +1645,6 @@ void QPrinter::setFontEmbeddingEnabled(bool enable)
Returns \c true if font embedding is enabled.
Currently this option is only supported on X11.
\sa setFontEmbeddingEnabled()
*/
bool QPrinter::fontEmbeddingEnabled() const

View File

@ -1103,9 +1103,7 @@ void tst_QPrinter::fontEmbedding()
{
// fontEmbeddingEnabled() / setFontEmbeddingEnabled() / PPK_FontEmbedding
// PdfFormat: Supported, default true
// NativeFormat, Cups: Supported, default true
// NativeFormat, Win: Unsupported, always false
// NativeFormat, Mac: Unsupported, always false
// NativeFormat: Supported, default true
QPrinter pdf;
pdf.setOutputFormat(QPrinter::PdfFormat);
@ -1116,25 +1114,17 @@ void tst_QPrinter::fontEmbedding()
QPrinter native;
if (native.outputFormat() == QPrinter::NativeFormat) {
// Test default
#if defined Q_OS_MAC || defined Q_OS_WIN
QCOMPARE(native.fontEmbeddingEnabled(), false);
#else
QCOMPARE(native.fontEmbeddingEnabled(), true);
#endif // Q_OS_MAC || Q_OS_WIN
// Test set/get
bool expected = true;
native.setFontEmbeddingEnabled(expected);
#if defined Q_OS_MAC || defined Q_OS_WIN
expected = false;
#endif // Q_OS_MAC || Q_OS_WIN
QCOMPARE(native.fontEmbeddingEnabled(), expected);
native.setFontEmbeddingEnabled(true);
QCOMPARE(native.fontEmbeddingEnabled(), true);
// Test value preservation
native.setOutputFormat(QPrinter::PdfFormat);
QCOMPARE(native.fontEmbeddingEnabled(), expected);
QCOMPARE(native.fontEmbeddingEnabled(), true);
native.setOutputFormat(QPrinter::NativeFormat);
QCOMPARE(native.fontEmbeddingEnabled(), expected);
QCOMPARE(native.fontEmbeddingEnabled(), true);
} else {
QSKIP("No printers installed, cannot test NativeFormat, please install printers to test");
}