KD Reports API Documentation  2.1
KDReportsImageElement.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** This file is part of the KD Reports library.
4 **
5 ** SPDX-FileCopyrightText: 2007-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
6 **
7 ** SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDAB-KDReports OR LicenseRef-KDAB-KDReports-US
8 **
9 ** Licensees holding valid commercial KD Reports licenses may use this file in
10 ** accordance with the KD Reports Commercial License Agreement provided with
11 ** the Software.
12 **
13 ** Contact info@kdab.com if any conditions of this licensing are not clear to you.
14 **
15 ****************************************************************************/
16 
17 #include "KDReportsImageElement.h"
19 #include "KDReportsReport.h"
20 #include "KDReportsReport_p.h"
21 #include <QDebug>
22 #include <QPainter>
23 #include <QPixmap>
24 #include <QTextDocument>
25 #include <QUrl>
26 
27 class KDReports::ImageElementPrivate
28 {
29 public:
30  QVariant m_pixmap; // pixmap or image, can't use QPixmap directly in threads
31  QSize m_pixmapSize; // = m_pixmap.size()
32 
33  // size in final document, chosen by the user:
34  qreal m_width = 0;
35  qreal m_height = 0;
36  bool m_fitToPage = false;
38  QString m_id;
39 };
40 
42  : d(new ImageElementPrivate)
43 {
45 }
46 
48  : d(new ImageElementPrivate)
49 {
50  setImage(image);
51 }
52 
54  : Element(other)
55  , d(new ImageElementPrivate(*other.d))
56 {
57 }
58 
60 {
61  if (&other == this)
62  return *this;
63  Element::operator=(other);
64  *d = *other.d;
65  return *this;
66 }
67 
69 {
70 }
71 
73 {
74  // the call to toImage() is a workaround for a bug in QTextOdfWriter
75  // https://codereview.qt-project.org/c/qt/qtbase/+/369642
76  d->m_pixmap = QVariant::fromValue(pixmap.toImage());
77  d->m_pixmapSize = pixmap.size();
78 }
79 
81 {
82  return d->m_pixmap.value<QPixmap>();
83 }
84 
86 {
87  d->m_pixmap = QVariant::fromValue(image);
88  d->m_pixmapSize = image.size();
89 }
90 
92 {
93  return d->m_pixmap.value<QImage>();
94 }
95 
96 void KDReports::ImageElement::setWidth(qreal width, Unit unit)
97 {
98  d->m_width = width;
99  d->m_unit = unit;
100  d->m_height = 0; // mutually exclusive!
101  d->m_fitToPage = false; // "
102 }
103 
105 {
106  return d->m_width;
107 }
108 
109 void KDReports::ImageElement::setHeight(qreal height, Unit unit)
110 {
111  d->m_height = height;
112  d->m_unit = unit;
113  d->m_width = 0; // mutually exclusive!
114  d->m_fitToPage = false; // "
115 }
116 
118 {
119  return d->m_height;
120 }
121 
123 {
124  d->m_width = 0; // mutually exclusive!
125  d->m_height = 0; // mutually exclusive!
126  d->m_fitToPage = true;
127 }
128 
130 {
131  return d->m_fitToPage;
132 }
133 
135 {
136 #if 0
137  if ( d->m_width && d->m_unit == Millimeters ) {
138  const QSize sz( qRound( mmToPixels( d->m_width.width() ) ),
139  qRound( mmToPixels( d->m_width.height() ) ) );
140  d->m_pixmap = d->m_pixmap.scaled( sz, Qt::KeepAspectRatio, Qt::SmoothTransformation );
141  qDebug() << "ImageElement: m_width (mm) =" << d->m_width << " sz (pixels) =" << sz;
142  }
143 #endif
144 
145  if (d->m_pixmapSize.isNull())
146  return;
147 
148  static int imageNumber = 0;
149  const QString name = QStringLiteral("image%1.png").arg(++imageNumber);
150  builder.currentDocument().addResource(QTextDocument::ImageResource, QUrl(name), d->m_pixmap);
151  builder.currentDocumentData().addResourceName(name);
152 
153  QTextImageFormat imageFormat;
154  imageFormat.setName(name);
155  imageFormat.setWidth(d->m_pixmapSize.width());
156  imageFormat.setHeight(d->m_pixmapSize.height());
157 #if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)
158  // Another workaround for https://codereview.qt-project.org/c/qt/qtbase/+/369642
159  imageFormat.setQuality(100);
160 #endif
161 
162  if (d->m_width) {
163  if (d->m_unit == Millimeters) {
164  const qreal pixelWidth = mmToPixels(d->m_width);
165  const qreal pixelHeight = pixelWidth * imageFormat.height() / imageFormat.width();
166  imageFormat.setWidth(pixelWidth);
167  imageFormat.setHeight(pixelHeight);
168  } else {
169  imageFormat.setProperty(ResizableImageProperty, QString(QLatin1Char('W') + QString::number(d->m_width)));
170  KDReports::TextDocumentData::updatePercentSize(imageFormat, QSizeF(builder.report()->d->textDocumentWidth(), -1 /*unknown*/));
172  }
173  } else if (d->m_height) {
174  if (d->m_unit == Millimeters) {
175  const qreal pixelHeight = qRound(mmToPixels(d->m_height));
176  const qreal pixelWidth = pixelHeight * imageFormat.width() / imageFormat.height();
177  imageFormat.setHeight(pixelHeight);
178  imageFormat.setWidth(pixelWidth);
179  } else {
180  imageFormat.setProperty(ResizableImageProperty, QString(QLatin1Char('H') + QString::number(d->m_height)));
182  // can't calc size yet, will be done at layouting time... hopefully.
183  }
184  } else if (d->m_fitToPage) {
187  }
188 
189  QTextCursor &cursor = builder.cursor();
190  cursor.insertImage(imageFormat);
191 }
192 
194 {
195  d->m_id = id;
196 }
197 
199 {
200  return d->m_id;
201 }
202 
204 {
205  return new ImageElement(*this);
206 }
207 
209 {
210  return d->m_unit;
211 }
212 
214 {
215  d->m_unit = unit;
216 }
KDReports::ImageElement::clone
Element * clone() const override
Definition: KDReportsImageElement.cpp:203
QTextImageFormat::setWidth
void setWidth(qreal width)
KDReports::ReportBuilder
Definition: KDReportsReportBuilder_p.h:42
KDReports::ReportBuilder::currentDocumentData
TextDocumentData & currentDocumentData()
Definition: KDReportsReportBuilder_p.h:69
QString::number
QString number(int n, int base)
KDReports::ReportBuilder::report
Report * report()
Definition: KDReportsReportBuilder_p.h:53
KDReports::ImageElement::setFitToPage
void setFitToPage()
Definition: KDReportsImageElement.cpp:122
KDReports::ImageElement::operator=
ImageElement & operator=(const ImageElement &other)
Definition: KDReportsImageElement.cpp:59
QVariant::fromValue
QVariant fromValue(const T &value)
QUrl
QPixmap::size
QSize size() const const
KDReports::Millimeters
@ Millimeters
Millimeters (the default)
Definition: KDReportsUnit.h:26
KDReports::TextDocumentData::setHasResizableImages
void setHasResizableImages()
Definition: KDReportsTextDocumentData.cpp:410
QTextImageFormat::setName
void setName(const QString &name)
QTextDocument::ImageResource
ImageResource
KDReports::ImageElement::ImageElement
ImageElement(const QPixmap &pixmap)
Definition: KDReportsImageElement.cpp:41
QSize
KDReportsReport_p.h
KDReports::ResizableImageProperty
static const int ResizableImageProperty
Definition: KDReportsLayoutHelper_p.h:44
QTextCursor::insertImage
void insertImage(const QTextImageFormat &format, QTextFrameFormat::Position alignment)
KDReports::Element
Definition: KDReportsElement.h:41
KDReports::ImageElement::pixmap
QPixmap pixmap() const
Definition: KDReportsImageElement.cpp:80
QPixmap
Qt::KeepAspectRatio
KeepAspectRatio
QTextImageFormat::height
qreal height() const const
QString
KDReportsReport.h
KDReports::Element::operator=
Element & operator=(const Element &other)
Definition: KDReportsElement.cpp:36
KDReports::Unit
Unit
Definition: KDReportsUnit.h:25
KDReports::ImageElement::setWidth
void setWidth(qreal width, Unit unit=Millimeters)
Definition: KDReportsImageElement.cpp:96
KDReports::ImageElement::id
QString id() const
Definition: KDReportsImageElement.cpp:198
QTextImageFormat::setQuality
void setQuality(int quality)
KDReports::ImageElement::unit
Unit unit() const
Definition: KDReportsImageElement.cpp:208
QImage::size
QSize size() const const
KDReports::TextDocumentData::updatePercentSize
static void updatePercentSize(QTextImageFormat &format, QSizeF size)
Definition: KDReportsTextDocumentData.cpp:199
KDReports::ImageElement::setId
void setId(const QString &id)
Definition: KDReportsImageElement.cpp:193
QTextFormat::setProperty
void setProperty(int propertyId, const QVariant &value)
QPixmap::toImage
QImage toImage() const const
KDReportsImageElement.h
KDReports::ImageElement::build
void build(ReportBuilder &) const override
Definition: KDReportsImageElement.cpp:134
KDReports::ImageElement::~ImageElement
~ImageElement() override
Definition: KDReportsImageElement.cpp:68
KDReports::ImageElement::image
QImage image() const
Definition: KDReportsImageElement.cpp:91
QLatin1Char
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
KDReports::mmToPixels
KDREPORTS_EXPORT qreal mmToPixels(qreal mm)
Definition: KDReportsLayoutHelper.cpp:23
KDReportsLayoutHelper_p.h
QSizeF
KDReports::ImageElement::width
qreal width() const
Definition: KDReportsImageElement.cpp:104
QTextImageFormat::setHeight
void setHeight(qreal height)
KDReports::ReportBuilder::cursor
QTextCursor & cursor()
Definition: KDReportsReportBuilder_p.h:48
KDReports::ImageElement::fitToPage
bool fitToPage() const
Definition: KDReportsImageElement.cpp:129
QTextDocument::addResource
void addResource(int type, const QUrl &name, const QVariant &resource)
KDReports::TextDocumentData::addResourceName
void addResourceName(const QString &resourceName)
Definition: KDReportsTextDocumentData.cpp:405
KDReports::ImageElement::setHeight
void setHeight(qreal height, Unit unit=Millimeters)
Definition: KDReportsImageElement.cpp:109
QVariant
KDReports::ImageElement::height
qreal height() const
Definition: KDReportsImageElement.cpp:117
Qt::SmoothTransformation
SmoothTransformation
KDReports::ReportBuilder::currentDocument
QTextDocument & currentDocument()
Definition: KDReportsReportBuilder_p.h:71
QImage
QTextImageFormat
KDReports::ImageElement
Definition: KDReportsImageElement.h:36
KDReports::ImageElement::setUnit
void setUnit(Unit unit)
Definition: KDReportsImageElement.cpp:213
QTextCursor
QTextImageFormat::width
qreal width() const const
KDReports::ImageElement::setImage
void setImage(const QImage &image)
Definition: KDReportsImageElement.cpp:85
KDReports::ImageElement::setPixmap
void setPixmap(const QPixmap &pixmap)
Definition: KDReportsImageElement.cpp:72

© 2007-2021 Klarälvdalens Datakonsult AB (KDAB)
"The Qt, C++ and OpenGL Experts"
https://www.kdab.com/
https://www.kdab.com/development-resources/qt-tools/kd-reports/
Generated on Fri Jul 15 2022 13:09:06 for KD Reports API Documentation by doxygen 1.8.20