[PATCH 2/7] PrintLayout: disable the QPainter scalling

Lubomir I. Ivanov neolit123 at gmail.com
Thu Jul 24 17:50:40 PDT 2014


From: "Lubomir I. Ivanov" <neolit123 at gmail.com>

This is wrong because we don't really need to scale. We already
have the estimated page dimentions in pixels, so taking the
quotient of the printer DPI and screen DPI and then scalling
(probably up) our rendered widgets via the QPainter introduces
blur (due to the oversampling), and a performance penalty.

By rendering at the exact dimensions we ensure that the widgets
are crisp at a 100% printout.

Signed-off-by: Lubomir I. Ivanov <neolit123 at gmail.com>
---
 qt-ui/printlayout.cpp | 21 ++++++++-------------
 qt-ui/printlayout.h   |  3 +--
 2 files changed, 9 insertions(+), 15 deletions(-)

diff --git a/qt-ui/printlayout.cpp b/qt-ui/printlayout.cpp
index c874471..11be39c 100644
--- a/qt-ui/printlayout.cpp
+++ b/qt-ui/printlayout.cpp
@@ -89,12 +89,9 @@ void PrintLayout::setup()
 	printerDpi = printer->resolution();
 	pageRect = printer->pageRect();
 
-	scaleX = (qreal)printerDpi / (qreal)screenDpiX;
-	scaleY = (qreal)printerDpi / (qreal)screenDpiY;
-
-	// a printer page scalled to screen DPI
-	scaledPageW = pageRect.width() / scaleX;
-	scaledPageH = pageRect.height() / scaleY;
+	// a printer page in pixels
+	pageW = pageRect.width();
+	pageH = pageRect.height();
 }
 
 // go trought the dive table and find how many dives we are a going to print
@@ -139,7 +136,6 @@ void PrintLayout::printProfileDives(int divesPerRow, int divesPerColumn)
 	painter.begin(printer);
 	painter.setRenderHint(QPainter::Antialiasing);
 	painter.setRenderHint(QPainter::SmoothPixmapTransform);
-	painter.scale(scaleX, scaleY);
 
 	QPicture pic;
 	QPainter picPainter;
@@ -163,8 +159,8 @@ void PrintLayout::printProfileDives(int divesPerRow, int divesPerColumn)
 	const int padW = (divesPerColumn < 2) ? 0 : padDef;
 	const int padH = (divesPerRow < 2) ? 0 : padDef;
 	// estimate dimensions for a single dive
-	const int scaledW = ESTIMATE_DIVE_DIM(scaledPageW, divesPerColumn, padW);
-	const int scaledH = ESTIMATE_DIVE_DIM(scaledPageH, divesPerRow, padH);
+	const int scaledW = ESTIMATE_DIVE_DIM(pageW, divesPerColumn, padW);
+	const int scaledH = ESTIMATE_DIVE_DIM(pageH, divesPerRow, padH);
 	// padding in pixels between profile and table
 	const int padPT = 5;
 	// create a model and table
@@ -328,7 +324,7 @@ void PrintLayout::printTable()
 	table.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
 	table.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
 	// fit table to one page initially
-	table.resize(scaledPageW, scaledPageH);
+	table.resize(pageW, pageH);
 
 	// don't show border
 	table.setStyleSheet(
@@ -388,7 +384,7 @@ void PrintLayout::printTable()
 				headings += rowH;
 				isHeading = false;
 			}
-			if (accH > scaledPageH) {
+			if (accH > pageH) {
 				lastAccIndex = i;
 				pageIndexes.append(pageIndexes.last() + (accH - rowH));
 				addTablePrintHeadingRow(&model, i);
@@ -404,13 +400,12 @@ void PrintLayout::printTable()
 	}
 	done = 90;
 	pageIndexes.append(pageIndexes.last() + accH + headings);
-	table.resize(scaledPageW, tableHeight);
+	table.resize(pageW, tableHeight);
 
 	// attach a painter and render pages by using pageIndexes
 	QPainter painter(printer);
 	painter.setRenderHint(QPainter::Antialiasing);
 	painter.setRenderHint(QPainter::SmoothPixmapTransform);
-	painter.scale(scaleX, scaleY);
 	total = pageIndexes.size() - 1;
 	progress = 0;
 	for (i = 0; i < total; i++) {
diff --git a/qt-ui/printlayout.h b/qt-ui/printlayout.h
index efd3159..9a816a3 100644
--- a/qt-ui/printlayout.h
+++ b/qt-ui/printlayout.h
@@ -25,8 +25,7 @@ private:
 	QPrinter *printer;
 	struct options *printOptions;
 
-	int screenDpiX, screenDpiY, printerDpi, scaledPageW, scaledPageH;
-	qreal scaleX, scaleY;
+	int screenDpiX, screenDpiY, printerDpi, pageW, pageH;
 	QRect pageRect;
 
 	QVector<QString> tablePrintColumnNames;
-- 
1.7.11.msysgit.0



More information about the subsurface mailing list