summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Freitag <Thomas.Freitag@alfa.de>2012-11-02 22:44:27 +0100
committerAlbert Astals Cid <aacid@kde.org>2012-11-02 22:48:38 +0100
commitef11b4f0e642dff0be02bf3327eb56bf0b364847 (patch)
treed28489912c358202f52a51d7ecb19bd871fee735
parentae8fc0cbfc6123189e17b3cf1286e0540f181646 (diff)
Implement overprint in qt interface
With minor api fixes by me (Albert Astals Cid)
-rw-r--r--qt4/src/poppler-document.cc23
-rw-r--r--qt4/src/poppler-page.cc38
-rw-r--r--qt4/src/poppler-private.h69
-rw-r--r--qt4/src/poppler-qt4.h11
-rw-r--r--splash/SplashBitmap.cc70
-rw-r--r--splash/SplashBitmap.h5
6 files changed, 169 insertions, 47 deletions
diff --git a/qt4/src/poppler-document.cc b/qt4/src/poppler-document.cc
index e89b51e1..0cf1d451 100644
--- a/qt4/src/poppler-document.cc
+++ b/qt4/src/poppler-document.cc
@@ -5,6 +5,7 @@
* Copyright (C) 2006-2010, Pino Toscano <pino@kde.org>
* Copyright (C) 2010, 2011 Hib Eris <hib@hiberis.nl>
* Copyright (C) 2012 Koji Otani <sho@bbr.jp>
+ * Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -519,14 +520,20 @@ namespace Poppler {
void Document::setRenderHint( Document::RenderHint hint, bool on )
{
+ const bool touchesAntialias = hint & ( Document::Antialiasing | Document::TextAntialiasing | Document::TextHinting );
+ const bool touchesOverprinting = hint & Document::OverprintPreview;
+
+ int hintForOperation = hint;
+ if (touchesOverprinting && !isOverprintPreviewAvailable())
+ hintForOperation = hintForOperation & ~(int)Document::OverprintPreview;
+
if ( on )
- m_doc->m_hints |= hint;
+ m_doc->m_hints |= hintForOperation;
else
- m_doc->m_hints &= ~(int)hint;
+ m_doc->m_hints &= ~hintForOperation;
// the only way to set antialiasing for Splash is on creation
- if ( m_doc->m_backend == Document::SplashBackend &&
- ( hint & ( Document::Antialiasing | Document::TextAntialiasing | Document::TextHinting ) ) )
+ if ( m_doc->m_backend == Document::SplashBackend && (touchesAntialias || touchesOverprinting) )
{
delete m_doc->m_outputDev;
m_doc->m_outputDev = NULL;
@@ -645,4 +652,12 @@ namespace Poppler {
#endif
}
+ bool isOverprintPreviewAvailable() {
+#if defined(SPLASH_CMYK)
+ return true;
+#else
+ return false;
+#endif
+ }
+
}
diff --git a/qt4/src/poppler-page.cc b/qt4/src/poppler-page.cc
index 03aa1bb6..54756146 100644
--- a/qt4/src/poppler-page.cc
+++ b/qt4/src/poppler-page.cc
@@ -13,6 +13,7 @@
* Copyright (C) 2012 Tobias Koenig <tokoe@kdab.com>
* Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
* Copyright (C) 2012 Adam Reichold <adamreichold@myopera.com>
+ * Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -266,27 +267,30 @@ QImage Page::renderToImage(double xres, double yres, int x, int y, int w, int h,
int bw = bitmap->getWidth();
int bh = bitmap->getHeight();
- SplashColorPtr dataPtr = splash_output->getBitmap()->getDataPtr();
-
- if (QSysInfo::BigEndian == QSysInfo::ByteOrder)
+ if (bitmap->convertToXBGR())
{
- uchar c;
- int count = bw * bh * 4;
- for (int k = 0; k < count; k += 4)
- {
- c = dataPtr[k];
- dataPtr[k] = dataPtr[k+3];
- dataPtr[k+3] = c;
+ SplashColorPtr dataPtr = bitmap->getDataPtr();
- c = dataPtr[k+1];
- dataPtr[k+1] = dataPtr[k+2];
- dataPtr[k+2] = c;
+ if (QSysInfo::BigEndian == QSysInfo::ByteOrder)
+ {
+ uchar c;
+ int count = bw * bh * 4;
+ for (int k = 0; k < count; k += 4)
+ {
+ c = dataPtr[k];
+ dataPtr[k] = dataPtr[k+3];
+ dataPtr[k+3] = c;
+
+ c = dataPtr[k+1];
+ dataPtr[k+1] = dataPtr[k+2];
+ dataPtr[k+2] = c;
+ }
}
- }
- // construct a qimage SHARING the raw bitmap data in memory
- QImage tmpimg( dataPtr, bw, bh, QImage::Format_ARGB32 );
- img = tmpimg.copy();
+ // construct a qimage SHARING the raw bitmap data in memory
+ QImage tmpimg( dataPtr, bw, bh, QImage::Format_ARGB32 );
+ img = tmpimg.copy();
+ }
// unload underlying xpdf bitmap
splash_output->startPage( 0, NULL );
#endif
diff --git a/qt4/src/poppler-private.h b/qt4/src/poppler-private.h
index 6d2ef2a7..5a9e1b85 100644
--- a/qt4/src/poppler-private.h
+++ b/qt4/src/poppler-private.h
@@ -1,10 +1,11 @@
/* poppler-private.h: qt interface to poppler
* Copyright (C) 2005, Net Integration Technologies, Inc.
* Copyright (C) 2005, 2008, Brad Hards <bradh@frogmouth.net>
- * Copyright (C) 2006-2009, 2011 by Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2006-2009, 2011, 2012 by Albert Astals Cid <aacid@kde.org>
* Copyright (C) 2007-2009, 2011 by Pino Toscano <pino@kde.org>
* Copyright (C) 2011 Andreas Hartmetz <ahartmetz@gmail.com>
* Copyright (C) 2011 Hib Eris <hib@hiberis.nl>
+ * Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
* Inspired on code by
* Copyright (C) 2004 by Albert Astals Cid <tsdgeos@terra.es>
* Copyright (C) 2004 by Enrico Ros <eros.kde@email.it>
@@ -124,11 +125,46 @@ namespace Poppler {
{
#if defined(HAVE_SPLASH)
SplashColor bgColor;
- bgColor[0] = paperColor.blue();
- bgColor[1] = paperColor.green();
- bgColor[2] = paperColor.red();
+ GBool overprint = m_hints & Document::OverprintPreview ? gTrue : gFalse;
+ globalParams->setOverprintPreview(overprint);
+#if defined(SPLASH_CMYK)
+ if (overprint)
+ {
+ Guchar c, m, y, k;
+
+ c = 255 - paperColor.blue();
+ m = 255 - paperColor.red();
+ y = 255 - paperColor.green();
+ k = c;
+ if (m < k) {
+ k = m;
+ }
+ if (y < k) {
+ k = y;
+ }
+ bgColor[0] = c - k;
+ bgColor[1] = m - k;
+ bgColor[2] = y - k;
+ bgColor[3] = k;
+ for (int i = 4; i < SPOT_NCOMPS + 4; i++) {
+ bgColor[i] = 0;
+ }
+ }
+ else
+#endif
+ {
+ bgColor[0] = paperColor.blue();
+ bgColor[1] = paperColor.green();
+ bgColor[2] = paperColor.red();
+ }
GBool AA = m_hints & Document::TextAntialiasing ? gTrue : gFalse;
- SplashOutputDev * splashOutputDev = new SplashOutputDev(splashModeXBGR8, 4, gFalse, bgColor, gTrue, AA);
+ SplashOutputDev * splashOutputDev = new SplashOutputDev(
+#if defined(SPLASH_CMYK)
+ (overprint) ? splashModeDeviceN8 : splashModeXBGR8,
+#else
+ splashModeXBGR8,
+#endif
+ 4, gFalse, bgColor, gTrue, AA);
splashOutputDev->setVectorAntialias(m_hints & Document::Antialiasing ? gTrue : gFalse);
splashOutputDev->setFreeTypeHinting(m_hints & Document::TextHinting ? gTrue : gFalse, m_hints & Document::TextSlightHinting ? gTrue : gFalse);
splashOutputDev->startDoc(doc);
@@ -149,25 +185,10 @@ namespace Poppler {
return;
paperColor = color;
- if ( m_outputDev == NULL )
- return;
-
- switch ( m_backend )
- {
- case Document::SplashBackend:
- {
-#if defined(HAVE_SPLASH)
- SplashOutputDev *splash_output = static_cast<SplashOutputDev *>( m_outputDev );
- SplashColor bgColor;
- bgColor[0] = paperColor.blue();
- bgColor[1] = paperColor.green();
- bgColor[2] = paperColor.red();
- splash_output->setPaperColor(bgColor);
-#endif
- break;
- }
- default: ;
- }
+
+ // Make sure the new paper color will be picked up for the next rendering
+ delete m_outputDev;
+ m_outputDev = NULL;
}
void fillMembers()
diff --git a/qt4/src/poppler-qt4.h b/qt4/src/poppler-qt4.h
index 425b1e03..3002e655 100644
--- a/qt4/src/poppler-qt4.h
+++ b/qt4/src/poppler-qt4.h
@@ -13,6 +13,7 @@
* Copyright (C) 2012, Fabio D'Urso <fabiodurso@hotmail.it>
* Copyright (C) 2012, Tobias Koenig <tobias.koenig@kdab.com>
* Copyright (C) 2012 Adam Reichold <adamreichold@myopera.com>
+ * Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -846,7 +847,8 @@ delete it;
Antialiasing = 0x00000001, ///< Antialiasing for graphics
TextAntialiasing = 0x00000002, ///< Antialiasing for text
TextHinting = 0x00000004, ///< Hinting for text \since 0.12.1
- TextSlightHinting = 0x00000008 ///< Lighter hinting for text when combined with TextHinting \since 0.18
+ TextSlightHinting = 0x00000008, ///< Lighter hinting for text when combined with TextHinting \since 0.18
+ OverprintPreview = 0x00000010 ///< Overprint preview \since 0.22
};
Q_DECLARE_FLAGS( RenderHints, RenderHint )
@@ -1624,6 +1626,13 @@ height = dummy.height();
\since 0.12
*/
POPPLER_QT4_EXPORT bool isCmsAvailable();
+
+ /**
+ Whether the overprint preview functionality is available.
+
+ \since 0.22
+ */
+ POPPLER_QT4_EXPORT bool isOverprintPreviewAvailable();
class SoundData;
/**
diff --git a/splash/SplashBitmap.cc b/splash/SplashBitmap.cc
index 5fe61a2e..996f0aa9 100644
--- a/splash/SplashBitmap.cc
+++ b/splash/SplashBitmap.cc
@@ -441,6 +441,76 @@ void SplashBitmap::getRGBLine(int yl, SplashColorPtr line) {
}
}
+void SplashBitmap::getXBGRLine(int yl, SplashColorPtr line) {
+ SplashColor col;
+ double c, m, y, k, c1, m1, y1, k1, r, g, b;
+
+ for (int x = 0; x < width; x++) {
+ getPixel(x, yl, col);
+ c = byteToDbl(col[0]);
+ m = byteToDbl(col[1]);
+ y = byteToDbl(col[2]);
+ k = byteToDbl(col[3]);
+#if SPLASH_CMYK
+ if (separationList->getLength() > 0) {
+ for (int i = 0; i < separationList->getLength(); i++) {
+ if (col[i+4] > 0) {
+ GfxCMYK cmyk;
+ GfxColor input;
+ input.c[0] = byteToCol(col[i+4]);
+ GfxSeparationColorSpace *sepCS = (GfxSeparationColorSpace *)separationList->get(i);
+ sepCS->getCMYK(&input, &cmyk);
+ col[0] = colToByte(cmyk.c);
+ col[1] = colToByte(cmyk.m);
+ col[2] = colToByte(cmyk.y);
+ col[3] = colToByte(cmyk.k);
+ c += byteToDbl(col[0]);
+ m += byteToDbl(col[1]);
+ y += byteToDbl(col[2]);
+ k += byteToDbl(col[3]);
+ }
+ }
+ if (c > 1) c = 1;
+ if (m > 1) m = 1;
+ if (y > 1) y = 1;
+ if (k > 1) k = 1;
+ }
+#endif
+ c1 = 1 - c;
+ m1 = 1 - m;
+ y1 = 1 - y;
+ k1 = 1 - k;
+ cmykToRGBMatrixMultiplication(c, m, y, k, c1, m1, y1, k1, r, g, b);
+ *line++ = dblToByte(clip01(b));
+ *line++ = dblToByte(clip01(g));
+ *line++ = dblToByte(clip01(r));
+ *line++ = 255;
+ }
+}
+
+GBool SplashBitmap::convertToXBGR() {
+ if (mode == splashModeXBGR8)
+ return gTrue;
+
+ int newrowSize = width * 4;
+ SplashColorPtr newdata = (SplashColorPtr)gmallocn_checkoverflow(newrowSize, height);
+ if (newdata != NULL) {
+ for (int y = 0; y < height; y++) {
+ unsigned char *row = newdata + y * newrowSize;
+ getXBGRLine(y, row);
+ }
+ if (rowSize < 0) {
+ gfree(data + (height - 1) * rowSize);
+ } else {
+ gfree(data);
+ }
+ data = newdata;
+ rowSize = newrowSize;
+ mode = splashModeXBGR8;
+ }
+ return newdata != NULL;
+}
+
#if SPLASH_CMYK
void SplashBitmap::getCMYKLine(int yl, SplashColorPtr line) {
SplashColor col;
diff --git a/splash/SplashBitmap.h b/splash/SplashBitmap.h
index 0bff2050..70509abc 100644
--- a/splash/SplashBitmap.h
+++ b/splash/SplashBitmap.h
@@ -13,7 +13,7 @@
//
// Copyright (C) 2007 Ilmari Heikkinen <ilmari.heikkinen@gmail.com>
// Copyright (C) 2009 Shen Liang <shenzhuxi@gmail.com>
-// Copyright (C) 2009 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009, 2012 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
// Copyright (C) 2010 Adrian Johnson <ajohnson@redneon.com>
// Copyright (C) 2010 Harry Roberts <harry.roberts@midnight-labs.org>
@@ -75,8 +75,11 @@ public:
SplashError writeImgFile(SplashImageFileFormat format, FILE *f, int hDPI, int vDPI, const char *compressionString = "");
SplashError writeImgFile(ImgWriter *writer, FILE *f, int hDPI, int vDPI);
+ GBool convertToXBGR();
+
void getPixel(int x, int y, SplashColorPtr pixel);
void getRGBLine(int y, SplashColorPtr line);
+ void getXBGRLine(int y, SplashColorPtr line);
#if SPLASH_CMYK
void getCMYKLine(int y, SplashColorPtr line);
#endif