1 #include "QCameraControllerWidget.h"
\r
4 QCameraControllerWidget::QCameraControllerWidget(QWidget* parent) : QWidget(parent),
\r
5 iCameraWrapper(NULL), iBackBuffer(NULL), iBackBufferDevice(NULL), iBackBufferContext(NULL)
\r
7 timer = new QTimer(this);
\r
8 connect(timer, SIGNAL(timeout()), this, SLOT(sendBackbufferToDecode()));
\r
12 QCameraControllerWidget::~QCameraControllerWidget()
\r
16 iCameraWrapper->ReleaseAndPowerOff();
\r
19 delete iCameraWrapper;
\r
27 ReleaseBackBuffer();
\r
30 void QCameraControllerWidget::CaptureImage()
\r
32 if (iCameraWrapper && iCameraWrapper->State() == CCameraEngine::EEngineViewFinding)
\r
34 emit logMessage("Capturing picture");
\r
35 iCameraWrapper->StopViewFinder();
\r
36 TRAPD(err,iCameraWrapper->CaptureL());
\r
39 emit logMessage("Camera capture error");
\r
44 void QCameraControllerWidget::paintEvent(QPaintEvent* event)
\r
48 QPainter paint(this);
\r
49 paint.drawPixmap(0,0,QPixmap::fromSymbianCFbsBitmap(iBackBuffer));
\r
53 void QCameraControllerWidget::resizeEvent(QResizeEvent* event)
\r
55 static int savedWidth = 0;
\r
56 static int savedHeight = 0;
\r
58 if(!savedWidth || !savedHeight)
\r
61 savedWidth = geometry().width();
\r
62 savedHeight = geometry().height();
\r
66 void QCameraControllerWidget::InitializeCamera()
\r
68 // Create camera wrapper class here because
\r
69 // whole camera wrapper and all handles have to reset
\r
70 // while orientatio of the application changes.
\r
73 // Power off camera if it is on
\r
74 iCameraWrapper->StopViewFinder();
\r
75 iCameraWrapper->ReleaseAndPowerOff();
\r
76 delete iCameraWrapper; iCameraWrapper = NULL;
\r
78 TInt camErr(KErrNotSupported);
\r
79 if(CCameraEngine::CamerasAvailable() > 0)
\r
81 TRAP(camErr, iCameraWrapper = CCameraEngine::NewL(0,0,this));
\r
84 // iViewFinderSize is picture size for viewfinder.
\r
85 // iCaptureSize is picture size for capturing picture.
\r
86 // We want fill whole screen
\r
87 if (geometry().width() > geometry().height())
\r
89 iViewFinderSize = TSize(geometry().width(),geometry().width());
\r
90 iCaptureSize = TSize(geometry().width(),geometry().width()); // Captured picture size
\r
94 iViewFinderSize = TSize(geometry().height(), geometry().height());
\r
95 iCaptureSize = TSize(geometry().height(),geometry().height()); // Captured picture size
\r
98 // Create back buffer where recieved camera pictures are copied
\r
99 ReleaseBackBuffer();
\r
100 CreateBackBufferL();
\r
102 // Power on camera, start viewfinder when MceoCameraReady() received
\r
103 if(camErr == KErrNone)
\r
105 iCameraWrapper->ReserveAndPowerOn();
\r
106 emit logMessage("Camera power on");
\r
110 emit logMessage("no camera found");
\r
114 void QCameraControllerWidget::CreateBackBufferL()
\r
116 // create back buffer bitmap
\r
117 iBackBuffer = q_check_ptr(new CFbsBitmap);
\r
121 size.iHeight = this->geometry().height();
\r
122 size.iWidth = this->geometry().width();
\r
123 QT_TRAP_THROWING( iBackBuffer->Create(size,EColor64K));
\r
125 catch(std::exception& e)
\r
130 // create back buffer graphics context
\r
131 iBackBufferDevice = CFbsBitmapDevice::NewL(iBackBuffer);
\r
132 User::LeaveIfError(iBackBufferDevice->CreateContext(iBackBufferContext));
\r
133 iBackBufferContext->SetPenStyle(CGraphicsContext::ESolidPen);
\r
135 iBackBufferContext->SetBrushColor(KRgbBlack);
\r
136 iBackBufferContext->Clear();
\r
139 void QCameraControllerWidget::ReleaseBackBuffer()
\r
141 if (iBackBufferContext)
\r
143 delete iBackBufferContext;
\r
144 iBackBufferContext = NULL;
\r
146 if (iBackBufferDevice)
\r
148 delete iBackBufferDevice;
\r
149 iBackBufferDevice = NULL;
\r
153 delete iBackBuffer;
\r
154 iBackBuffer = NULL;
\r
158 void QCameraControllerWidget::MceoCameraReady()
\r
160 if (iCameraWrapper->State() == CCameraEngine::EEngineIdle)
\r
164 imageSize.iHeight = 480;
\r
165 imageSize.iWidth = 640;
\r
167 CCamera::TFormat format = CCamera::EFormatFbsBitmapColor64K;
\r
169 TRAPD(err,iCameraWrapper->PrepareL(imageSize, format));
\r
172 emit logMessage("Camera prepare error");
\r
176 // Start viewfinder. Viewfinder pictures starts coming into MceoViewFinderFrameReady();
\r
179 finderSize.iHeight = this->geometry().height();
\r
180 finderSize.iWidth = this->geometry().width();
\r
181 TRAPD(err2,iCameraWrapper->StartViewFinderL(finderSize));
\r
184 emit logMessage("Camera start viewfinder error");
\r
188 emit logMessage("Camera viewfinder started");
\r
192 void QCameraControllerWidget::MceoFocusComplete()
\r
194 // CameraEngine state is EEngineIdle
\r
195 emit logMessage("Focused");
\r
197 // Capture picture after it has focused
\r
198 iCameraWrapper->StopViewFinder();
\r
199 TRAPD(err,iCameraWrapper->CaptureL());
\r
202 emit logMessage("Camera capture error");
\r
206 void QCameraControllerWidget::MceoCapturedDataReady( TDesC8* aData )
\r
211 void QCameraControllerWidget::MceoCapturedBitmapReady( CFbsBitmap* aBitmap )
\r
213 if (iBackBufferContext)
\r
215 emit logMessage("Succesfull capture");
\r
217 QPixmap pix(QPixmap::fromSymbianCFbsBitmap(aBitmap));
\r
218 emit imageCaptured(pix.toImage());
\r
221 finderSize.iHeight = this->geometry().height();
\r
222 finderSize.iWidth = this->geometry().width();
\r
223 TRAPD(err2,iCameraWrapper->StartViewFinderL(finderSize));
\r
226 emit logMessage("Camera start viewfinder error");
\r
230 if (iCameraWrapper)
\r
231 iCameraWrapper->ReleaseImageBuffer();
\r
234 void QCameraControllerWidget::MceoViewFinderFrameReady( CFbsBitmap& aFrame )
\r
236 if (iBackBufferContext)
\r
238 TSize bmpSizeInPixels = aFrame.SizeInPixels();
\r
241 TPoint pos( xDelta, yDelta );
\r
243 // Copy received viewfinder picture to back buffer
\r
244 iBackBufferContext->BitBlt( pos, &aFrame, TRect( TPoint( 0, 0 ), bmpSizeInPixels ));
\r
246 // Update backbuffer into screen
\r
249 if (iCameraWrapper)
\r
250 iCameraWrapper->ReleaseViewFinderBuffer();
\r
253 void QCameraControllerWidget::MceoHandleError( TCameraEngineError aErrorType, TInt aError )
\r
255 // NOTE: CameraEngine state seems to go into CCameraEngine::EEngineIdle state
\r
257 if (aErrorType == EErrReserve)
\r
259 return; //-18 comes on application startup, but everything works ok
\r
262 switch (aErrorType)
\r
266 emit logMessage("Camera reserved error");
\r
271 emit logMessage("Camera power on error");
\r
274 case EErrViewFinderReady:
\r
276 emit logMessage("Camera viewfinder error");
\r
279 case EErrImageReady:
\r
281 emit logMessage("Camera image ready error");
\r
284 case EErrAutoFocusInit:
\r
285 case EErrAutoFocusMode:
\r
286 case EErrAutoFocusArea:
\r
287 case EErrAutoFocusRange:
\r
288 case EErrAutoFocusType:
\r
289 case EErrOptimisedFocusComplete:
\r
291 //emit logMessage("Try focusing again");
\r
296 emit logMessage("Unknown error");
\r
301 // Try handle error
\r
302 //CancelCapturedPicture(EFalse);
\r
303 // iAppUi->UseOptionsExitCbaL();
\r
306 void QCameraControllerWidget::MceoHandleOtherEvent( const TECAMEvent& /*aEvent*/ )
\r
311 void QCameraControllerWidget::sendBackbufferToDecode()
\r
316 QPixmap pix(QPixmap::fromSymbianCFbsBitmap(iBackBuffer));
\r
317 emit imageCaptured(pix.toImage());
\r