X-Git-Url: http://cgit.sxemacs.org/?p=harmattan%2Fcameraplus;a=blobdiff_plain;f=lib%2Fqtcamgraphicsviewfinder.cpp;h=6ace1933315b61b19723da009dc5697fa69c669a;hp=342255a9174f36059acf11ca7a1c769ee42cc499;hb=f16f2d7afbd39e1adeb193031b3be10279e3cb85;hpb=4a213f853c86a308912f7cf2384934ce135a5cf3 diff --git a/lib/qtcamgraphicsviewfinder.cpp b/lib/qtcamgraphicsviewfinder.cpp index 342255a..6ace193 100644 --- a/lib/qtcamgraphicsviewfinder.cpp +++ b/lib/qtcamgraphicsviewfinder.cpp @@ -1,3 +1,23 @@ +/*! + * This file is part of CameraPlus. + * + * Copyright (C) 2012-2013 Mohammed Sameer + * + * 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) any later version. + * + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + #include "qtcamgraphicsviewfinder.h" #include "qtcamconfig.h" #include "qtcamdevice.h" @@ -5,6 +25,7 @@ #include "qtcamviewfinderrenderer.h" #include #include +#include class QtCamGraphicsViewfinderPrivate { public: @@ -18,6 +39,8 @@ public: renderer->resize(q_ptr->size()); QObject::connect(renderer, SIGNAL(updateRequested()), q_ptr, SLOT(updateRequested())); + QObject::connect(renderer, SIGNAL(renderAreaChanged()), q_ptr, SIGNAL(renderAreaChanged())); + QObject::connect(renderer, SIGNAL(videoResolutionChanged()), q_ptr, SIGNAL(videoResolutionChanged())); } } @@ -31,6 +54,7 @@ public: QtCamConfig *conf; QtCamDevice *dev; QtCamGraphicsViewfinder *q_ptr; + bool enabled; }; QtCamGraphicsViewfinder::QtCamGraphicsViewfinder(QtCamConfig *config, QGraphicsItem *parent) : @@ -39,9 +63,11 @@ QtCamGraphicsViewfinder::QtCamGraphicsViewfinder(QtCamConfig *config, QGraphicsI d_ptr->dev = 0; d_ptr->renderer = 0; d_ptr->q_ptr = this; + d_ptr->enabled = true; } QtCamGraphicsViewfinder::~QtCamGraphicsViewfinder() { + delete d_ptr->renderer; delete d_ptr; d_ptr = 0; } @@ -55,33 +81,6 @@ GstElement *QtCamGraphicsViewfinder::sinkElement() { return d_ptr->renderer->sinkElement(); } -bool QtCamGraphicsViewfinder::setDevice(QtCamDevice *device) { - if (device && d_ptr->dev == device) { - return true; - } - - if (d_ptr->dev) { - qWarning() << "QtCamGraphicsViewfinder: viewfinder cannot be replaced."; - return false; - } - - if (!device) { - qWarning() << "QtCamGraphicsViewfinder: viewfinder cannot be unset."; - return false; - } - - // This is to break the loop. - d_ptr->dev = device; - if (!device->setViewfinder(this)) { - d_ptr->dev = 0; - return false; - } - - d_ptr->resetBackend(); - - return true; -} - void QtCamGraphicsViewfinder::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(widget); @@ -89,11 +88,21 @@ void QtCamGraphicsViewfinder::paint(QPainter *painter, const QStyleOptionGraphic painter->fillRect(boundingRect(), Qt::black); - if (!d_ptr->renderer) { + if (!d_ptr->renderer || !d_ptr->enabled) { return; } - d_ptr->renderer->paint(painter); + bool needsNativePainting = d_ptr->renderer->needsNativePainting(); + + if (needsNativePainting) { + painter->beginNativePainting(); + } + + d_ptr->renderer->paint(QMatrix4x4(painter->combinedTransform()), painter->viewport()); + + if (needsNativePainting) { + painter->endNativePainting(); + } } void QtCamGraphicsViewfinder::resizeEvent(QGraphicsSceneResizeEvent *event) { @@ -107,5 +116,41 @@ void QtCamGraphicsViewfinder::resizeEvent(QGraphicsSceneResizeEvent *event) { } void QtCamGraphicsViewfinder::updateRequested() { - update(); + if (d_ptr->enabled) { + update(); + } +} + +void QtCamGraphicsViewfinder::stop() { + d_ptr->resetBackend(); + + setRenderingEnabled(true); +} + +QRectF QtCamGraphicsViewfinder::renderArea() const { + if (!d_ptr->renderer) { + return QRectF(); + } + + return d_ptr->renderer->renderArea(); +} + +QSizeF QtCamGraphicsViewfinder::videoResolution() const { + if (!d_ptr->renderer) { + return QSizeF(); + } + + return d_ptr->renderer->videoResolution(); +} + +bool QtCamGraphicsViewfinder::isRenderingEnabled() const { + return d_ptr->enabled; +} + +void QtCamGraphicsViewfinder::setRenderingEnabled(bool enabled) { + if (d_ptr->enabled != enabled) { + d_ptr->enabled = enabled; + + emit renderingEnabledChanged(); + } }