From 3aba9afa56ddc30a6a2f50519072b077b67dd8ac Mon Sep 17 00:00:00 2001
From: Szabolcs David <davidsz@inf.u-szeged.hu>
Date: Thu, 11 Apr 2019 14:32:56 +0200
Subject: [PATCH] Fix printing of landscape orientation
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

QPageLayout::pageSize() is always defined in portrait orientation.
Removing margins without considering the actual orientation was incorrent.
Use QPageLayout::paintRect() instead.

Task-number: QTBUG-75092
Change-Id: I34c19d3f0587ae21da2d985e3107b6ec673f53d0
Reviewed-by: Michael Brüning <michael.bruning@qt.io>
---
 src/core/printing/print_view_manager_qt.cpp | 28 +++++++++++----------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/src/core/printing/print_view_manager_qt.cpp b/src/core/printing/print_view_manager_qt.cpp
index ff9fc76be..65c059d88 100644
--- a/src/core/printing/print_view_manager_qt.cpp
+++ b/src/core/printing/print_view_manager_qt.cpp
@@ -158,21 +158,12 @@ static base::DictionaryValue *createPrintSettingsFromQPageLayout(const QPageLayo
                                                                  bool useCustomMargins)
 {
     base::DictionaryValue *printSettings = createPrintSettings();
-
-    //Set page size attributes, chromium expects these in micrometers
-    QRectF pageSizeInMillimeter = pageLayout.pageSize().rect(QPageSize::Millimeter);
-    if (!useCustomMargins) {
-        // QPrinter will extend this size with its margins
-        QMarginsF margins = pageLayout.margins(QPageLayout::Millimeter);
-        pageSizeInMillimeter = pageSizeInMillimeter.marginsRemoved(margins);
-    }
-    std::unique_ptr<base::DictionaryValue> sizeDict(new base::DictionaryValue);
-    sizeDict->SetInteger(printing::kSettingMediaSizeWidthMicrons, pageSizeInMillimeter.width() * kMicronsToMillimeter);
-    sizeDict->SetInteger(printing::kSettingMediaSizeHeightMicrons, pageSizeInMillimeter.height() * kMicronsToMillimeter);
-    printSettings->Set(printing::kSettingMediaSize, std::move(sizeDict));
+    QRectF pageSizeInMillimeter;
 
     if (useCustomMargins) {
         // Apply page margins when printing to PDF
+        pageSizeInMillimeter = pageLayout.pageSize().rect(QPageSize::Millimeter);
+
         QMargins pageMarginsInPoints = pageLayout.marginsPoints();
         std::unique_ptr<base::DictionaryValue> marginsDict(new base::DictionaryValue);
         marginsDict->SetInteger(printing::kSettingMarginTop, pageMarginsInPoints.top());
@@ -182,12 +173,23 @@ static base::DictionaryValue *createPrintSettingsFromQPageLayout(const QPageLayo
 
         printSettings->Set(printing::kSettingMarginsCustom, std::move(marginsDict));
         printSettings->SetInteger(printing::kSettingMarginsType, printing::CUSTOM_MARGINS);
+
+        // pageSizeInMillimeter is in portrait orientation. Transpose it if necessary.
+        printSettings->SetBoolean(printing::kSettingLandscape, pageLayout.orientation() == QPageLayout::Landscape);
     } else {
         // QPrinter will handle margins
+        pageSizeInMillimeter = pageLayout.paintRect(QPageLayout::Millimeter);
         printSettings->SetInteger(printing::kSettingMarginsType, printing::NO_MARGINS);
+
+        // pageSizeInMillimeter already contains the orientation.
+        printSettings->SetBoolean(printing::kSettingLandscape, false);
     }
 
-    printSettings->SetBoolean(printing::kSettingLandscape, pageLayout.orientation() == QPageLayout::Landscape);
+    //Set page size attributes, chromium expects these in micrometers
+    std::unique_ptr<base::DictionaryValue> sizeDict(new base::DictionaryValue);
+    sizeDict->SetInteger(printing::kSettingMediaSizeWidthMicrons, pageSizeInMillimeter.width() * kMicronsToMillimeter);
+    sizeDict->SetInteger(printing::kSettingMediaSizeHeightMicrons, pageSizeInMillimeter.height() * kMicronsToMillimeter);
+    printSettings->Set(printing::kSettingMediaSize, std::move(sizeDict));
 
     return printSettings;
 }
-- 
GitLab