38
38
#include "printoptionspage.h"
43
43
struct PrintHelperPrivate {
46
QSize adjustSize(PrintOptionsPage* optionsPage, Document::Ptr doc, int printerResolution, const QSize & viewportSize) {
47
QSize size = doc->size();
48
PrintOptionsPage::ScaleMode scaleMode = optionsPage->scaleMode();
49
if (scaleMode == PrintOptionsPage::ScaleToPage) {
50
bool imageBiggerThanPaper =
51
size.width() > viewportSize.width()
52
|| size.height() > viewportSize.height();
54
if (imageBiggerThanPaper || optionsPage->enlargeSmallerImages()) {
55
size.scale(viewportSize, Qt::KeepAspectRatio);
58
} else if (scaleMode == PrintOptionsPage::ScaleToCustomSize) {
59
double wImg = optionsPage->scaleWidth();
60
double hImg = optionsPage->scaleHeight();
61
size.setWidth( int(wImg * printerResolution) );
62
size.setHeight( int(hImg * printerResolution) );
66
const double INCHES_PER_METER = 100. / 2.54;
67
int dpmX = doc->image().dotsPerMeterX();
68
int dpmY = doc->image().dotsPerMeterY();
69
if (dpmX > 0 && dpmY > 0) {
70
double wImg = double(size.width()) / double(dpmX) * INCHES_PER_METER;
71
double hImg = double(size.height()) / double(dpmY) * INCHES_PER_METER;
72
size.setWidth( int(wImg * printerResolution) );
73
size.setHeight( int(hImg * printerResolution) );
80
QPoint adjustPosition(PrintOptionsPage* optionsPage, const QSize& imageSize, const QSize & viewportSize) {
81
Qt::Alignment alignment = optionsPage->alignment();
84
if (alignment & Qt::AlignLeft) {
86
} else if (alignment & Qt::AlignHCenter) {
87
posX = (viewportSize.width() - imageSize.width()) / 2;
89
posX = viewportSize.width() - imageSize.width();
92
if (alignment & Qt::AlignTop) {
94
} else if (alignment & Qt::AlignVCenter) {
95
posY = (viewportSize.height() - imageSize.height()) / 2;
97
posY = viewportSize.height() - imageSize.height();
100
return QPoint(posX, posY);
46
QSize adjustSize(PrintOptionsPage* optionsPage, Document::Ptr doc, int printerResolution, const QSize & viewportSize)
48
QSize size = doc->size();
49
PrintOptionsPage::ScaleMode scaleMode = optionsPage->scaleMode();
50
if (scaleMode == PrintOptionsPage::ScaleToPage) {
51
bool imageBiggerThanPaper =
52
size.width() > viewportSize.width()
53
|| size.height() > viewportSize.height();
55
if (imageBiggerThanPaper || optionsPage->enlargeSmallerImages()) {
56
size.scale(viewportSize, Qt::KeepAspectRatio);
59
} else if (scaleMode == PrintOptionsPage::ScaleToCustomSize) {
60
double wImg = optionsPage->scaleWidth();
61
double hImg = optionsPage->scaleHeight();
62
size.setWidth(int(wImg * printerResolution));
63
size.setHeight(int(hImg * printerResolution));
67
const double INCHES_PER_METER = 100. / 2.54;
68
int dpmX = doc->image().dotsPerMeterX();
69
int dpmY = doc->image().dotsPerMeterY();
70
if (dpmX > 0 && dpmY > 0) {
71
double wImg = double(size.width()) / double(dpmX) * INCHES_PER_METER;
72
double hImg = double(size.height()) / double(dpmY) * INCHES_PER_METER;
73
size.setWidth(int(wImg * printerResolution));
74
size.setHeight(int(hImg * printerResolution));
80
QPoint adjustPosition(PrintOptionsPage* optionsPage, const QSize& imageSize, const QSize & viewportSize)
82
Qt::Alignment alignment = optionsPage->alignment();
85
if (alignment & Qt::AlignLeft) {
87
} else if (alignment & Qt::AlignHCenter) {
88
posX = (viewportSize.width() - imageSize.width()) / 2;
90
posX = viewportSize.width() - imageSize.width();
93
if (alignment & Qt::AlignTop) {
95
} else if (alignment & Qt::AlignVCenter) {
96
posY = (viewportSize.height() - imageSize.height()) / 2;
98
posY = viewportSize.height() - imageSize.height();
101
return QPoint(posX, posY);
105
105
PrintHelper::PrintHelper(QWidget* parent)
106
: d(new PrintHelperPrivate) {
111
PrintHelper::~PrintHelper() {
116
void PrintHelper::print(Document::Ptr doc) {
117
doc->startLoadingFullImage();
118
doc->waitUntilLoaded();
121
PrintOptionsPage* optionsPage = new PrintOptionsPage(doc->size());
122
optionsPage->loadConfig();
124
std::auto_ptr<QPrintDialog> dialog(
125
KdePrint::createPrintDialog(&printer,
126
QList<QWidget*>() << optionsPage,
129
dialog->setWindowTitle(i18n("Print Image"));
130
bool wantToPrint = dialog->exec();
132
optionsPage->saveConfig();
137
QPainter painter(&printer);
138
QRect rect = painter.viewport();
139
QSize size = d->adjustSize(optionsPage, doc, printer.resolution(), rect.size());
140
QPoint pos = d->adjustPosition(optionsPage, size, rect.size());
141
painter.setViewport(pos.x(), pos.y(), size.width(), size.height());
143
QImage image = doc->image();
144
painter.setWindow(image.rect());
145
painter.drawImage(0, 0, image);
106
: d(new PrintHelperPrivate)
111
PrintHelper::~PrintHelper()
116
void PrintHelper::print(Document::Ptr doc)
118
doc->startLoadingFullImage();
119
doc->waitUntilLoaded();
122
PrintOptionsPage* optionsPage = new PrintOptionsPage(doc->size());
123
optionsPage->loadConfig();
125
std::auto_ptr<QPrintDialog> dialog(
126
KdePrint::createPrintDialog(&printer,
127
QList<QWidget*>() << optionsPage,
130
dialog->setWindowTitle(i18n("Print Image"));
131
bool wantToPrint = dialog->exec();
133
optionsPage->saveConfig();
138
QPainter painter(&printer);
139
QRect rect = painter.viewport();
140
QSize size = d->adjustSize(optionsPage, doc, printer.resolution(), rect.size());
141
QPoint pos = d->adjustPosition(optionsPage, size, rect.size());
142
painter.setViewport(pos.x(), pos.y(), size.width(), size.height());
144
QImage image = doc->image();
145
painter.setWindow(image.rect());
146
painter.drawImage(0, 0, image);