diff --git a/src/QuickEditor/QuickEditor.cpp b/src/QuickEditor/QuickEditor.cpp index 9858f55..7df9089 100644 --- a/src/QuickEditor/QuickEditor.cpp +++ b/src/QuickEditor/QuickEditor.cpp @@ -1,169 +1,166 @@ /* * Copyright (C) 2016 Boudhayan Gupta * * This program 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 of the License, or * (at your option) any later version. * * This program 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 Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "QuickEditor.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "SpectacleConfig.h" struct QuickEditor::ImageStore : public QQuickImageProvider { ImageStore(const QPixmap &pixmap) : QQuickImageProvider(QQuickImageProvider::Pixmap), mPixmap(pixmap) {} QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) { Q_UNUSED(id); if (size) { *size = mPixmap.size(); } if (requestedSize.isEmpty()) { return mPixmap; } return mPixmap.scaled(requestedSize, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation); } QPixmap mPixmap; }; struct QuickEditor::QuickEditorPrivate { KDeclarative::KDeclarative *mDecl; QQuickView *mQuickView; QQmlEngine *mQmlEngine; QRect mGrabRect; QSharedPointer mCurrentGrabResult; }; QuickEditor::QuickEditor(const QPixmap &pixmap, QObject *parent) : QObject(parent), mImageStore(new ImageStore(pixmap)), d_ptr(new QuickEditorPrivate) { Q_D(QuickEditor); d->mQmlEngine = new QQmlEngine(); d->mDecl = new KDeclarative::KDeclarative; d->mDecl->setDeclarativeEngine(d->mQmlEngine); d->mDecl->setupBindings(); d->mQmlEngine->addImageProvider(QStringLiteral("snapshot"), mImageStore); d->mQuickView = new QQuickView(d->mQmlEngine, 0); d->mQuickView->setSource(QUrl("qrc:///QuickEditor/EditorRoot.qml")); d->mQuickView->setFlags(Qt::BypassWindowManagerHint | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::Tool); d->mQuickView->setGeometry(0, 0, pixmap.width(), pixmap.height()); d->mQuickView->showFullScreen(); // connect up the signals QQuickItem *rootItem = d->mQuickView->rootObject(); connect(rootItem, SIGNAL(acceptImage(int, int, int, int, QVariant, int, int)), this, SLOT(acceptImageHandler(int, int, int, int, QVariant, int, int))); connect(rootItem, SIGNAL(cancelImage()), this, SIGNAL(grabCancelled())); // set up initial config SpectacleConfig *config = SpectacleConfig::instance(); if (config->rememberLastRectangularRegion()) { QRect cropRegion = config->cropRegion(); if (!cropRegion.isEmpty()) { QMetaObject::invokeMethod( rootItem, "setInitialSelection", Q_ARG(QVariant, cropRegion.x()), Q_ARG(QVariant, cropRegion.y()), Q_ARG(QVariant, cropRegion.width()), Q_ARG(QVariant, cropRegion.height()) ); } } if (config->useLightRegionMaskColour()) { rootItem->setProperty("maskColour", QColor(255, 255, 255, 192)); rootItem->setProperty("strokeColour", QColor(96, 96, 96, 255)); } } QuickEditor::~QuickEditor() { Q_D(QuickEditor); delete d->mQuickView; delete d->mDecl; delete d->mQmlEngine; delete d_ptr; } void QuickEditor::acceptImageHandler(int x, int y, int width, int height, QVariant canvasdata, int canvaswidth, int canvasheight) { Q_D(QuickEditor); if ((x == -1) && (y == -1) && (width == -1) && (height == -1)) { SpectacleConfig::instance()->setCropRegion(QRect()); emit grabCancelled(); return; } - QImage canvasImg = imageFromCanvasData(canvasdata.toList(), canvaswidth, canvasheight); - d->mGrabRect = QRect(x, y, width, height); SpectacleConfig::instance()->setCropRegion(d->mGrabRect); - d->mQuickView->hide(); - //emit grabDone(mImageStore->mPixmap.copy(d->mGrabRect), d->mGrabRect); + QImage canvasImg = imageFromCanvasData(canvasdata.toList(), canvaswidth, canvasheight); QImage surface(mImageStore->mPixmap.size(), QImage::Format_ARGB32_Premultiplied); { QPainter painter(&surface); painter.eraseRect(0, 0, mImageStore->mPixmap.width(), mImageStore->mPixmap.height()); painter.drawImage(QPoint(0, 0), mImageStore->mPixmap.toImage()); painter.drawImage(QPoint(0,0), canvasImg); } emit grabDone(QPixmap::fromImage(surface).copy(d->mGrabRect), d->mGrabRect); } QImage QuickEditor::imageFromCanvasData(QList data, int width, int height) { QByteArray imgBuf; { QDataStream writer(&imgBuf, QIODevice::WriteOnly); Q_FOREACH(auto item, data) { writer << item.value(); } } return QImage((quint8*)imgBuf.constData(), width, height, QImage::Format_RGBA8888).copy(0, 0, width, height); }