camerauis/cameraxui/cxengine/src/cxesnapshotcontrolprivate.cpp
branchRCL_3
changeset 24 bac7acad7cb3
parent 23 61bc0f252b2b
child 25 2c87b2808fd7
--- a/camerauis/cameraxui/cxengine/src/cxesnapshotcontrolprivate.cpp	Tue Aug 31 15:03:46 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,310 +0,0 @@
-/*
-* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
-
-#include <QSize>
-#include <QPixmap>
-// Note: Keep atleast one Qt include before preprocessor flags
-#ifdef Q_OS_SYMBIAN
-#include <e32base.h>
-#include <fbs.h>
-#include <ecam.h>
-#include <ecam/camerasnapshot.h>
-#endif // Q_OS_SYMBIAN
-
-#include "cxutils.h"
-#include "cxeerror.h"
-#include "cxeexception.h"
-#include "cxeerrormappingsymbian.h"
-#include "cxecameradevice.h"
-#include "cxestate.h"
-#include "cxesnapshotcontrol.h"
-#include "cxesnapshotcontrolprivate.h"
-
-
-namespace
-{
-    const int MAINTAIN_ASPECT = false;
-
-    const QSize ASPECT_RATIO_SIZE_4BY3  = QSize(4,3);
-    const QSize ASPECT_RATIO_SIZE_16BY9 = QSize(16, 9);
-    const QSize ASPECT_RATIO_SIZE_11BY9 = QSize(11, 9);
-
-#ifdef Q_OS_SYMBIAN
-    /*!
-    * Helper class for cleaning up MCameraBuffer instances.
-    */
-    class CxeCameraBufferCleanup
-    {
-    public:
-        explicit CxeCameraBufferCleanup(MCameraBuffer *buffer)
-            : mBuffer(buffer)
-        {
-        }
-
-        ~CxeCameraBufferCleanup()
-        {
-            if (mBuffer) {
-                CX_DEBUG(("CxeCameraBufferCleanup - releasing MCameraBuffer.."));
-                mBuffer->Release();
-                mBuffer = NULL;
-            }
-        }
-    private:
-        Q_DISABLE_COPY(CxeCameraBufferCleanup)
-        MCameraBuffer *mBuffer;
-    };
-#endif // Q_OS_SYMBIAN
-}
-
-
-/*!
-* Constructor.
-* @param parent Public interface of Snapshot control.
-* @param device Camera device interface, used for getting hold of adaptation snapshot API.
-*/
-CxeSnapshotControlPrivate::CxeSnapshotControlPrivate(CxeSnapshotControl *parent,
-                                                     CxeCameraDevice& device)
-    : CxeStateMachine("CxeSnapshotControlPrivate"),
-      q(parent),
-      mDevice(device)
-{
-    CX_DEBUG_ENTER_FUNCTION();
-    CX_ASSERT_ALWAYS(q);
-    initializeStates();
-    CX_DEBUG_EXIT_FUNCTION();
-}
-
-/*!
-* Destructor.
-*/
-CxeSnapshotControlPrivate::~CxeSnapshotControlPrivate()
-{
-    CX_DEBUG_ENTER_FUNCTION();
-    stop();
-    CX_DEBUG_EXIT_FUNCTION();
-}
-
-/*!
-* Called when state changes.
-* @param newStateId Id of the new state.
-* @param error Error code or CxeError::None in successful case.
-*/
-void CxeSnapshotControlPrivate::handleStateChanged(int newStateId, CxeError::Id error)
-{
-    emit q->stateChanged(static_cast<CxeSnapshotControl::State>(newStateId), error);
-}
-
-
-/*!
-* Get the state of Snapshot Control.
-* @return The current state.
-*/
-CxeSnapshotControl::State CxeSnapshotControlPrivate::state() const
-{
-    return static_cast<CxeSnapshotControl::State> (stateId());
-}
-
-/*!
-* Initialize Snapshot Control states
-*/
-void CxeSnapshotControlPrivate::initializeStates()
-{
-    CX_DEBUG_ENTER_FUNCTION();
-    // addState( id, name, allowed next states )
-    addState(new CxeState(CxeSnapshotControl::Idle, "Idle", CxeSnapshotControl::Active));
-    addState(new CxeState(CxeSnapshotControl::Active, "Active", CxeSnapshotControl::Idle));
-
-    setInitialState(CxeSnapshotControl::Idle);
-    CX_DEBUG_EXIT_FUNCTION();
-}
-
-/*!
-* Calculate snapshot size based on diplay size and image / video output resolution.
-* @param displaySize Display size in pixels.
-* @param Cxe::AspectRatio Aspect ratio of image/video resolution.
-* @return Proposed best snapshot size.
-*/
-
-QSize CxeSnapshotControlPrivate::calculateSnapshotSize(const QSize& displaySize, Cxe::AspectRatio aspectRatio) const
-{
-    CX_DEBUG_ENTER_FUNCTION();
-    CX_DEBUG(("CxeSnapshotControlPrivate - display size      (%d,%d)", displaySize.width(), displaySize.height()));
-
-    // Take resolution as reference for aspect ratio.
-    // Scale keeping aspect ratio to just fit display.
-    QSize size;
-    
-    if (aspectRatio == Cxe::AspectRatio4to3) {
-        size = ASPECT_RATIO_SIZE_4BY3;
-    } else if (aspectRatio == Cxe::AspectRatio16to9) {
-        size = ASPECT_RATIO_SIZE_16BY9;
-    } else if (aspectRatio == Cxe::AspectRatio11to9) {
-        size = ASPECT_RATIO_SIZE_11BY9;
-    }
-    size.scale(displaySize, Qt::KeepAspectRatio);
-
-    CX_DEBUG(("CxeSnapshotControlPrivate - adjusted final size, (%d,%d)", size.width(), size.height()));
-
-    CX_DEBUG_EXIT_FUNCTION();
-
-    return size;
-}
-
-
-/*!
-* Start getting snapshots from camera.
-* Throws CxeException with CxeError::Id if error encountered.
-* @param size Size of the snapshot in pixels.
-*/
-void CxeSnapshotControlPrivate::start(const QSize &size)
-{
-    CX_DEBUG_ENTER_FUNCTION();
-#ifdef Q_OS_SYMBIAN
-    CCamera::CCameraSnapshot *ss = mDevice.cameraSnapshot();
-    CX_ASSERT_ALWAYS(ss);
-
-    if (ss->IsSnapshotActive()) {
-        CX_DEBUG(("Stop currently active snapshot.."));
-        ss->StopSnapshot();
-    }
-
-    // Prepare snapshot
-    CCamera::TFormat snapFormat = CCamera::EFormatFbsBitmapColor16MU;
-    TSize snapSize = TSize(size.width(), size.height());
-
-    CX_DEBUG(("Prepare snapshot, size (%d x %d)..", size.width(), size.height()));
-    TRAPD(status, ss->PrepareSnapshotL(snapFormat, snapSize, MAINTAIN_ASPECT));
-    CxeException::throwIfError(CxeErrorHandlingSymbian::map(status));
-    CX_DEBUG(("After prepare ECAM modified size to (%d x %d)..", size.width(), size.height()));
-
-    CX_DEBUG(("Start snapshot.."));
-    ss->StartSnapshot();
-#else
-    Q_UNUSED(size);
-#endif // Q_OS_SYMBIAN
-    setState(CxeSnapshotControl::Active);
-
-    CX_DEBUG_EXIT_FUNCTION();
-}
-
-/*!
-* Stop getting snapshots from camera.
-*/
-void CxeSnapshotControlPrivate::stop()
-{
-    CX_DEBUG_ENTER_FUNCTION();
-#ifdef Q_OS_SYMBIAN
-    if (mDevice.cameraSnapshot()) {
-        mDevice.cameraSnapshot()->StopSnapshot();
-    }
-#endif // Q_OS_SYMBIAN
-    setState(CxeSnapshotControl::Idle);
-    CX_DEBUG_EXIT_FUNCTION();
-}
-
-/*!
-* Helper method for getting the snapshot.
-* Throws exception if fetching the snapshot fails.
-* @return QImage containing the snapshot.
-*/
-QImage CxeSnapshotControlPrivate::snapshot()
-{
-    CX_DEBUG_ENTER_FUNCTION();
-    QImage image;
-
-    #ifdef Q_OS_SYMBIAN
-
-        CFbsBitmap *snapshot = NULL;
-        TRAPD(status, {
-            RArray<TInt> frameIndex;
-            CleanupClosePushL(frameIndex);
-
-            MCameraBuffer &buffer(mDevice.cameraSnapshot()->SnapshotDataL(frameIndex));
-            // Make sure buffer is released on leave / exception.
-            // Buffer is released once the cleanup item goes out of scope.
-            CxeCameraBufferCleanup cleaner(&buffer);
-
-            TInt firstImageIndex(frameIndex.Find(0));
-            snapshot = &buffer.BitmapL(firstImageIndex);
-
-            CleanupStack::PopAndDestroy(); // frameIndex
-
-            TSize size = snapshot->SizeInPixels();
-            TInt sizeInWords = size.iHeight * CFbsBitmap::ScanLineLength(size.iWidth, EColor16MU) / sizeof(TUint32);
-            CX_DEBUG(("size %d x %d, sizeInWords = %d", size.iWidth, size.iHeight, sizeInWords ));
-
-            CX_DEBUG(("Creating QImage"));
-            image = QImage(size.iWidth, size.iHeight, QImage::Format_RGB32);
-
-            // Convert to QImage
-            snapshot->LockHeap();
-            const uchar *dataPtr = (const uchar*) snapshot->DataAddress();
-            uchar *dst = image.bits();
-            memcpy(dst, dataPtr, image.numBytes());
-            snapshot->UnlockHeap();
-
-        });
-        // We throw error with the Symbian error code if there was problems.
-        CxeException::throwIfError(status);
-
-
-    #endif // Q_OS_SYMBIAN
-
-        CX_DEBUG_EXIT_FUNCTION();
-        return image;
-}
-
-/*!
-* Handle camera snapshot events.
-* @param id Event uid.
-* @param error Status code of the event.
-*/
-void CxeSnapshotControlPrivate::handleCameraEvent(int id, int error)
-{
-    CX_DEBUG_ENTER_FUNCTION();
-
-    // Ignoring all events if not active.
-    if (state() == CxeSnapshotControl::Active) {
-#ifdef Q_OS_SYMBIAN
-        if (id == KUidECamEventSnapshotUidValue) {
-            QImage ss;
-
-            if (!error) {
-                try {
-                    ss = snapshot();
-                } catch (const CxeException& e) {
-                    // Note: Normally CxeException carries CxeError::Id,
-                    // but we intentionally use Symbian code in getSnapshot
-                    // as it's easier to handle here.
-                    error = e.error();
-                } catch (...) {
-                    error = KErrGeneral;
-                }
-            }
-
-            // Emit snapshot ready signal through the public interface.
-            emit q->snapshotReady(CxeErrorHandlingSymbian::map(error), ss);
-        }
-#else
-        Q_UNUSED(id)
-        Q_UNUSED(error)
-#endif // Q_OS_SYMBIAN
-    }
-    CX_DEBUG_EXIT_FUNCTION();
-}
-
-// end of file