/* Copyright 2015 Adam Reichold This file is part of qpdfview. qpdfview is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. qpdfview 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 General Public License for more details. You should have received a copy of the GNU General Public License along with qpdfview. If not, see . */ #include "imagemodel.h" #include #include namespace { using namespace qpdfview; using namespace qpdfview::Model; inline qreal dotsPerInchX(const QImage& image) { return 0.0254 * image.dotsPerMeterX(); } inline qreal dotsPerInchY(const QImage& image) { return 0.0254 * image.dotsPerMeterY(); } } // anonymous namespace qpdfview { namespace Model { ImagePage::ImagePage(const QImage& image) : m_image(image) { } QSizeF ImagePage::size() const { return QSizeF(m_image.width() * 72.0 / dotsPerInchX(m_image), m_image.height() * 72.0 / dotsPerInchY(m_image)); } QImage ImagePage::render(qreal horizontalResolution, qreal verticalResolution, Rotation rotation, QRect boundingRect) const { QTransform transform; transform.scale(horizontalResolution / dotsPerInchX(m_image), verticalResolution / dotsPerInchY(m_image)); switch(rotation) { default: case RotateBy0: break; case RotateBy90: transform.rotate(90.0); break; case RotateBy180: transform.rotate(180.0); break; case RotateBy270: transform.rotate(270.0); break; } QImage image = m_image.transformed(transform, Qt::SmoothTransformation); if(!boundingRect.isNull()) { image = image.copy(boundingRect); } return image; } ImageDocument::ImageDocument(const QImage& image) : m_image(image) { } int ImageDocument::numberOfPages() const { return 1; } Page* ImageDocument::page(int index) const { return index == 0 ? new ImagePage(m_image) : 0; } QStringList ImageDocument::saveFilter() const { QStringList formats; foreach(const QByteArray& format, QImageWriter::supportedImageFormats()) { const QString name = QString::fromLocal8Bit(format); formats.append(QLatin1String("*.") + name); } return QStringList() << tr("Image (%1)").arg(formats.join(QLatin1String(" "))); } bool ImageDocument::canSave() const { return true; } bool ImageDocument::save(const QString& filePath, bool withChanges) const { Q_UNUSED(withChanges); QImageWriter writer(filePath); if(!writer.write(m_image)) { qWarning() << writer.errorString(); return false; } return true; } Properties ImageDocument::properties() const { Properties properties; properties.push_back(qMakePair(tr("Size"), QString("%1 px x %2 px").arg(m_image.width()).arg(m_image.height()))); properties.push_back(qMakePair(tr("Resolution"), QString("%1 dpi x %2 dpi").arg(dotsPerInchX(m_image), 0, 'f', 1).arg(dotsPerInchY(m_image), 0, 'f', 1))); properties.push_back(qMakePair(tr("Depth"), QString("%1 bits").arg(m_image.depth()))); switch(m_image.format()) { default: break; case QImage::Format_Mono: case QImage::Format_MonoLSB: properties.push_back(qMakePair(tr("Format"), tr("Monochrome"))); break; case QImage::Format_Indexed8: properties.push_back(qMakePair(tr("Format"), tr("Indexed"))); break; case QImage::Format_RGB32: properties.push_back(qMakePair(tr("Format"), tr("32 bits RGB"))); break; case QImage::Format_ARGB32: properties.push_back(qMakePair(tr("Format"), tr("32 bits ARGB"))); break; case QImage::Format_RGB16: case QImage::Format_RGB555: case QImage::Format_RGB444: properties.push_back(qMakePair(tr("Format"), tr("16 bits RGB"))); break; case QImage::Format_RGB666: case QImage::Format_RGB888: properties.push_back(qMakePair(tr("Format"), tr("24 bits RGB"))); break; } foreach(const QString& key, m_image.textKeys()) { properties.push_back(qMakePair(key, m_image.text(key))); } return properties; } } // Model ImagePlugin::ImagePlugin(QObject* parent) : QObject(parent) { setObjectName("ImagePlugin"); } Model::Document* ImagePlugin::loadDocument(const QString& filePath) const { QImage image(filePath); return !image.isNull() ? new Model::ImageDocument(image) : 0; } } // qpdfview #if QT_VERSION < QT_VERSION_CHECK(5,0,0) Q_EXPORT_PLUGIN2(qpdfview_image, qpdfview::ImagePlugin) #endif // QT_VERSION