From 7682542b4b487003e43c4081be01c06655db3c7e Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Tue, 5 Apr 2016 12:05:18 +0300 Subject: Factor out qt_getImageText() and qt_getImageTextFromDescription() ... and re-use them in QImageReader, QJpegHandler, QPngHandler. Change-Id: Iec89e47205f3c420e1e7eb4a2d3c1fbfe887fd8c Reviewed-by: Edward Welbourne --- src/gui/image/qimage.cpp | 29 ++++++++++++++++++++++++++ src/gui/image/qimage_p.h | 3 +++ src/gui/image/qimagereader.cpp | 17 +++++---------- src/gui/image/qpnghandler.cpp | 21 +++---------------- src/plugins/imageformats/jpeg/jpeg.pro | 2 +- src/plugins/imageformats/jpeg/qjpeghandler.cpp | 25 +++------------------- 6 files changed, 44 insertions(+), 53 deletions(-) diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index 9bd7d57c2b..3abfac1575 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -5216,4 +5216,33 @@ Q_GUI_EXPORT void qt_imageTransform(QImage &src, QImageIOHandler::Transformation } } +QMap qt_getImageText(const QImage &image, const QString &description) +{ + QMap text = qt_getImageTextFromDescription(description); + const auto textKeys = image.textKeys(); + for (const QString &key : textKeys) { + if (!key.isEmpty() && !text.contains(key)) + text.insert(key, image.text(key)); + } + return text; +} + +QMap qt_getImageTextFromDescription(const QString &description) +{ + QMap text; + const auto pairs = description.splitRef(QLatin1String("\n\n")); + for (const QStringRef &pair : pairs) { + int index = pair.indexOf(QLatin1Char(':')); + if (index >= 0 && pair.indexOf(QLatin1Char(' ')) < index) { + if (!pair.trimmed().isEmpty()) + text.insert(QLatin1String("Description"), pair.toString().simplified()); + } else { + const QStringRef key = pair.left(index); + if (!key.trimmed().isEmpty()) + text.insert(key.toString(), pair.mid(index + 2).toString().simplified()); + } + } + return text; +} + QT_END_NAMESPACE diff --git a/src/gui/image/qimage_p.h b/src/gui/image/qimage_p.h index b6eacc6af8..775ab6d541 100644 --- a/src/gui/image/qimage_p.h +++ b/src/gui/image/qimage_p.h @@ -212,6 +212,9 @@ inline QImage::Format qt_alphaVersionForPainting(QImage::Format format) return toFormat; } +Q_GUI_EXPORT QMap qt_getImageText(const QImage &image, const QString &description); +Q_GUI_EXPORT QMap qt_getImageTextFromDescription(const QString &description); + QT_END_NAMESPACE #endif // QIMAGE_P_H diff --git a/src/gui/image/qimagereader.cpp b/src/gui/image/qimagereader.cpp index 0102ff5981..45d57856aa 100644 --- a/src/gui/image/qimagereader.cpp +++ b/src/gui/image/qimagereader.cpp @@ -147,6 +147,9 @@ #include #include +// for qt_getImageText +#include + // image handlers #include #include @@ -592,18 +595,8 @@ bool QImageReaderPrivate::initHandler() */ void QImageReaderPrivate::getText() { - if (!text.isEmpty() || (!handler && !initHandler()) || !handler->supportsOption(QImageIOHandler::Description)) - return; - foreach (const QString &pair, handler->option(QImageIOHandler::Description).toString().split( - QLatin1String("\n\n"))) { - int index = pair.indexOf(QLatin1Char(':')); - if (index >= 0 && pair.indexOf(QLatin1Char(' ')) < index) { - text.insert(QLatin1String("Description"), pair.simplified()); - } else { - QString key = pair.left(index); - text.insert(key, pair.mid(index + 2).simplified()); - } - } + if (text.isEmpty() && (handler || initHandler()) && handler->supportsOption(QImageIOHandler::Description)) + text = qt_getImageTextFromDescription(handler->option(QImageIOHandler::Description).toString()); } /*! diff --git a/src/gui/image/qpnghandler.cpp b/src/gui/image/qpnghandler.cpp index 96d6be502d..fdf77e162c 100644 --- a/src/gui/image/qpnghandler.cpp +++ b/src/gui/image/qpnghandler.cpp @@ -49,6 +49,8 @@ #include #include +#include // for qt_getImageText + #include #include @@ -718,27 +720,10 @@ void QPNGImageWriter::setGamma(float g) gamma = g; } - static void set_text(const QImage &image, png_structp png_ptr, png_infop info_ptr, const QString &description) { - QMap text; - foreach (const QString &key, image.textKeys()) { - if (!key.isEmpty()) - text.insert(key, image.text(key)); - } - foreach (const QString &pair, description.split(QLatin1String("\n\n"))) { - int index = pair.indexOf(QLatin1Char(':')); - if (index >= 0 && pair.indexOf(QLatin1Char(' ')) < index) { - QString s = pair.simplified(); - if (!s.isEmpty()) - text.insert(QLatin1String("Description"), s); - } else { - QString key = pair.left(index); - if (!key.simplified().isEmpty()) - text.insert(key, pair.mid(index + 2).simplified()); - } - } + const QMap text = qt_getImageText(image, description); if (text.isEmpty()) return; diff --git a/src/plugins/imageformats/jpeg/jpeg.pro b/src/plugins/imageformats/jpeg/jpeg.pro index 9181abb465..8954cc6402 100644 --- a/src/plugins/imageformats/jpeg/jpeg.pro +++ b/src/plugins/imageformats/jpeg/jpeg.pro @@ -1,6 +1,6 @@ TARGET = qjpeg -QT += core-private +QT += core-private gui-private SOURCES += main.cpp qjpeghandler.cpp HEADERS += main.h qjpeghandler_p.h diff --git a/src/plugins/imageformats/jpeg/qjpeghandler.cpp b/src/plugins/imageformats/jpeg/qjpeghandler.cpp index 52e8b39f11..d89b8d398b 100644 --- a/src/plugins/imageformats/jpeg/qjpeghandler.cpp +++ b/src/plugins/imageformats/jpeg/qjpeghandler.cpp @@ -45,6 +45,7 @@ #include #include #include +#include // for qt_getImageText #include // jpeglib needs this to be pre-included #include @@ -491,30 +492,10 @@ inline my_jpeg_destination_mgr::my_jpeg_destination_mgr(QIODevice *device) free_in_buffer = max_buf; } - static inline void set_text(const QImage &image, j_compress_ptr cinfo, const QString &description) { - QMap text; - foreach (const QString &key, image.textKeys()) { - if (!key.isEmpty()) - text.insert(key, image.text(key)); - } - foreach (const QString &pair, description.split(QLatin1String("\n\n"))) { - int index = pair.indexOf(QLatin1Char(':')); - if (index >= 0 && pair.indexOf(QLatin1Char(' ')) < index) { - QString s = pair.simplified(); - if (!s.isEmpty()) - text.insert(QLatin1String("Description"), s); - } else { - QString key = pair.left(index); - if (!key.simplified().isEmpty()) - text.insert(key, pair.mid(index + 2).simplified()); - } - } - if (text.isEmpty()) - return; - - for (QMap::ConstIterator it = text.constBegin(); it != text.constEnd(); ++it) { + const QMap text = qt_getImageText(image, description); + for (auto it = text.begin(), end = text.end(); it != end; ++it) { QByteArray comment = it.key().toLatin1(); if (!comment.isEmpty()) comment += ": "; -- cgit v1.2.3