diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 81d903a..792c0e3 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -12,4 +12,5 @@ endmacro() kimageformats_executable_tests( imageconverter + imagedump ) diff --git a/tests/imagedump.cpp b/tests/imagedump.cpp new file mode 100644 index 0000000..4b38c07 --- /dev/null +++ b/tests/imagedump.cpp @@ -0,0 +1,231 @@ +/* + * Copyright 2013 Alex Merry + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QImage::Format formatFromString(const QString &str) +{ + if (str.compare(QLatin1String("Mono"), Qt::CaseInsensitive) == 0) { + return QImage::Format_Mono; + } else if (str.compare(QLatin1String("MonoLSB"), Qt::CaseInsensitive) == 0) { + return QImage::Format_MonoLSB; + } else if (str.compare(QLatin1String("Indexed8"), Qt::CaseInsensitive) == 0) { + return QImage::Format_Indexed8; + } else if (str.compare(QLatin1String("RGB32"), Qt::CaseInsensitive) == 0) { + return QImage::Format_RGB32; + } else if (str.compare(QLatin1String("ARGB32"), Qt::CaseInsensitive) == 0) { + return QImage::Format_ARGB32; + } else if (str.compare(QLatin1String("ARGB32_Premultiplied"), Qt::CaseInsensitive) == 0) { + return QImage::Format_ARGB32_Premultiplied; + } else if (str.compare(QLatin1String("RGB16"), Qt::CaseInsensitive) == 0) { + return QImage::Format_RGB16; + } else if (str.compare(QLatin1String("ARGB8565_Premultiplied"), Qt::CaseInsensitive) == 0) { + return QImage::Format_ARGB8565_Premultiplied; + } else if (str.compare(QLatin1String("RGB666"), Qt::CaseInsensitive) == 0) { + return QImage::Format_RGB666; + } else if (str.compare(QLatin1String("ARGB6666_Premultiplied"), Qt::CaseInsensitive) == 0) { + return QImage::Format_ARGB6666_Premultiplied; + } else if (str.compare(QLatin1String("RGB555"), Qt::CaseInsensitive) == 0) { + return QImage::Format_RGB555; + } else if (str.compare(QLatin1String("ARGB8555_Premultiplied"), Qt::CaseInsensitive) == 0) { + return QImage::Format_ARGB8555_Premultiplied; + } else if (str.compare(QLatin1String("RGB888"), Qt::CaseInsensitive) == 0) { + return QImage::Format_RGB888; + } else if (str.compare(QLatin1String("RGB444"), Qt::CaseInsensitive) == 0) { + return QImage::Format_RGB444; + } else if (str.compare(QLatin1String("ARGB4444_Premultiplied"), Qt::CaseInsensitive) == 0) { + return QImage::Format_ARGB4444_Premultiplied; + } else if (str.compare(QLatin1String("RGBX8888"), Qt::CaseInsensitive) == 0) { + return QImage::Format_RGBX8888; + } else if (str.compare(QLatin1String("RGBA8888"), Qt::CaseInsensitive) == 0) { + return QImage::Format_RGBA8888; + } else if (str.compare(QLatin1String("RGBA8888_Premultiplied"), Qt::CaseInsensitive) == 0) { + return QImage::Format_RGBA8888_Premultiplied; + } else { + return QImage::Format_Invalid; + } +} + +QString formatToString(QImage::Format format) +{ + switch (format) { + case QImage::Format_Invalid: + return QStringLiteral("Invalid"); + case QImage::Format_Mono: + return QStringLiteral("Mono"); + case QImage::Format_MonoLSB: + return QStringLiteral("MonoLSB"); + case QImage::Format_Indexed8: + return QStringLiteral("Indexed8"); + case QImage::Format_RGB32: + return QStringLiteral("RGB32"); + case QImage::Format_ARGB32: + return QStringLiteral("ARGB32"); + case QImage::Format_ARGB32_Premultiplied: + return QStringLiteral("ARGB32_Premultiplied"); + case QImage::Format_RGB16: + return QStringLiteral("RGB16"); + case QImage::Format_ARGB8565_Premultiplied: + return QStringLiteral("ARGB8565_Premultiplied"); + case QImage::Format_RGB666: + return QStringLiteral("RGB666"); + case QImage::Format_ARGB6666_Premultiplied: + return QStringLiteral("ARGB6666_Premultiplied"); + case QImage::Format_RGB555: + return QStringLiteral("RGB555"); + case QImage::Format_ARGB8555_Premultiplied: + return QStringLiteral("ARGB8555_Premultiplied"); + case QImage::Format_RGB888: + return QStringLiteral("RGB888"); + case QImage::Format_RGB444: + return QStringLiteral("RGB444"); + case QImage::Format_ARGB4444_Premultiplied: + return QStringLiteral("ARGB4444_Premultiplied"); + case QImage::Format_RGBX8888: + return QStringLiteral("RGBX8888"); + case QImage::Format_RGBA8888: + return QStringLiteral("RGBA8888"); + case QImage::Format_RGBA8888_Premultiplied: + return QStringLiteral("RGBA8888_Premultiplied"); + default: + return QLatin1String(""); + } +} + +int main(int argc, char **argv) +{ + QCoreApplication app(argc, argv); + QCoreApplication::addLibraryPath(QStringLiteral(PLUGIN_DIR)); + QCoreApplication::setApplicationName(QStringLiteral("imagedump")); + QCoreApplication::setApplicationVersion(QStringLiteral("1.0.0.0")); + + QCommandLineParser parser; + parser.setApplicationDescription(QStringLiteral("Dumps the content of QImage::bits()")); + parser.addHelpOption(); + parser.addVersionOption(); + parser.addPositionalArgument(QStringLiteral("image"), QStringLiteral("image file")); + parser.addPositionalArgument(QStringLiteral("datafile"), QStringLiteral("file QImage data should be written to")); + QCommandLineOption informat( + QStringList() << QStringLiteral("f") << QStringLiteral("file-format"), + QStringLiteral("Image file format"), + QStringLiteral("format")); + parser.addOption(informat); + QCommandLineOption qimgformat( + QStringList() << QStringLiteral("q") << QStringLiteral("qimage-format"), + QStringLiteral("QImage data format"), + QStringLiteral("format")); + parser.addOption(qimgformat); + QCommandLineOption listformats( + QStringList() << QStringLiteral("l") << QStringLiteral("list-file-formats"), + QStringLiteral("List supported image file formats")); + parser.addOption(listformats); + QCommandLineOption listqformats( + QStringList() << QStringLiteral("p") << QStringLiteral("list-qimage-formats"), + QStringLiteral("List supported QImage data formats")); + parser.addOption(listqformats); + + parser.process(app); + + const QStringList files = parser.positionalArguments(); + + if (parser.isSet(listformats)) { + QTextStream out(stdout); + out << "File formats:\n"; + foreach (const QByteArray &fmt, QImageReader::supportedImageFormats()) { + out << " " << fmt << '\n'; + } + return 0; + } + if (parser.isSet(listqformats)) { + QTextStream(stdout) + << "QImage formats:\n" + << " Mono\n" + << " MonoLSB\n" + << " Indexed8\n" + << " RGB32\n" + << " ARGB32\n" + << " ARGB32_Premultiplied\n" + << " RGB16\n" + << " ARGB8565_Premultiplied\n" + << " RGB666\n" + << " ARGB6666_Premultiplied\n" + << " RGB555\n" + << " ARGB8555_Premultiplied\n" + << " RGB888\n" + << " RGB444\n" + << " ARGB4444_Premultiplied\n" + << " RGBX8888\n" + << " RGBA8888\n" + << " RGBA8888_Premultiplied\n"; + return 0; + } + + if (files.count() != 2) { + QTextStream(stderr) << "Must provide exactly two files\n"; + parser.showHelp(1); + } + QImageReader reader(files.at(0), parser.value(informat).toLatin1()); + QImage img = reader.read(); + if (img.isNull()) { + QTextStream(stderr) << "Could not read image: " + << reader.errorString() << '\n'; + return 2; + } + + QFile output(files.at(1)); + if (!output.open(QIODevice::WriteOnly)) { + QTextStream(stderr) << "Could not open " << files.at(1) + << " for writing: " + << output.errorString() << '\n'; + return 3; + } + if (parser.isSet(qimgformat)) { + QImage::Format qformat = formatFromString(parser.value(qimgformat)); + if (qformat == QImage::Format_Invalid) { + QTextStream(stderr) << "Unknown QImage data format " + << parser.value(qimgformat) << '\n'; + return 4; + } + img = img.convertToFormat(qformat); + } + qint64 written = output.write(reinterpret_cast(img.bits()), img.byteCount()); + if (written != img.byteCount()) { + QTextStream(stderr) << "Could not write image data to " << files.at(1) + << ":" << output.errorString() << "\n"; + return 5; + } + QTextStream(stdout) << "Created " << files.at(1) << " with data format " + << formatToString(img.format()) << "\n"; + + return 0; +}