14 * Description: Implementation of Camera image decoder |
14 * Description: Implementation of Camera image decoder |
15 * |
15 * |
16 */ |
16 */ |
17 |
17 |
18 |
18 |
19 |
|
20 |
|
21 #include <imageconversion.h> |
19 #include <imageconversion.h> |
22 #include <ExifRead.h> |
20 #include <ExifRead.h> |
23 #include <ecam.h> // MCameraBuffer |
21 #include <ecam.h> // MCameraBuffer |
24 |
22 |
25 #include <eikenv.h> |
23 #include <eikenv.h> |
|
24 #include <SvgCodecImageConstants.hrh> |
26 |
25 |
27 #include "camlogging.h" |
26 #include "camlogging.h" |
28 #include "camfilesaveutility.h" |
27 #include "camfilesaveutility.h" |
29 #include "cambuffershare.h" |
28 #include "cambuffershare.h" |
30 |
29 |
148 |
153 |
149 PRINT( _L("Camera <= CCamImageDecoder::StartConversionL") ); |
154 PRINT( _L("Camera <= CCamImageDecoder::StartConversionL") ); |
150 } |
155 } |
151 |
156 |
152 |
157 |
|
158 void CCamImageDecoder::StartIconConversionL( TDesC* aFilePath ) |
|
159 { |
|
160 PRINT( _L("Camera => CCamImageDecoder::StartConversionL 2") ); |
|
161 |
|
162 // Data for CImageDecoder must be available throughout the conversion. |
|
163 // Need to stop any outstanding operation before deleting the descriptor. |
|
164 Cancel(); |
|
165 |
|
166 PRINT( _L("Camera <> CCamImageDecoder: Creating decoder..") ); |
|
167 |
|
168 delete iDecoder; |
|
169 iDecoder = NULL; |
|
170 |
|
171 CImageDecoder::TOptions options = (CImageDecoder::TOptions) (CImageDecoder::EOptionNoDither ); |
|
172 iDecoder = CImageDecoder::FileNewL( iFs, *aFilePath , options, KImageTypeSVGUid ); |
|
173 |
|
174 if( iDecoder->FrameCount() > 0 ) |
|
175 { |
|
176 const TFrameInfo& info( iDecoder->FrameInfo() ); |
|
177 |
|
178 #ifdef _DEBUG |
|
179 TSize size = info.iOverallSizeInPixels; |
|
180 PRINT2( _L("Camera <> CCamImageDecoder: Bmp size(%d,%d)"), size.iWidth, size.iHeight ); |
|
181 PRINT1( _L("Camera <> CCamImageDecoder: Bmp dispmode(%d)"), info.iFrameDisplayMode ); |
|
182 #endif |
|
183 |
|
184 PRINT( _L("Camera <> CCamImageDecoder: Create bitmap for snapshot..") ); |
|
185 if( !iDecodedBitmap ) iDecodedBitmap = new (ELeave) CFbsBitmap; |
|
186 else iDecodedBitmap->Reset(); |
|
187 |
|
188 if( !iDecodedMask ) iDecodedMask = new (ELeave) CFbsBitmap; |
|
189 else iDecodedMask->Reset(); |
|
190 |
|
191 TRAPD ( createError, |
|
192 { |
|
193 iDecodedBitmap->Create( info.iOverallSizeInPixels, info.iFrameDisplayMode ); |
|
194 iDecodedMask->Create( info.iOverallSizeInPixels, EGray256 ); |
|
195 } ); |
|
196 if( KErrNone != createError ) |
|
197 { |
|
198 delete iDecodedBitmap; |
|
199 iDecodedBitmap = NULL; |
|
200 delete iDecodedMask; |
|
201 iDecodedMask = NULL; |
|
202 User::Leave( createError ); |
|
203 } |
|
204 |
|
205 PRINT( _L("Camera <> CCamImageDecoder: start conversion..") ); |
|
206 iRetryCounter = 0; |
|
207 iDecoder->Convert( &iStatus, *iDecodedBitmap, *iDecodedMask, 0 ); |
|
208 SetActive(); |
|
209 } |
|
210 else |
|
211 { |
|
212 PRINT( _L("Camera <> CCamImageDecoder: No frame provided, leave..") ); |
|
213 User::Leave( KErrNotFound ); |
|
214 } |
|
215 |
|
216 PRINT( _L("Camera <= CCamImageDecoder::StartConversionL 2") ); |
|
217 } |
|
218 |
153 // --------------------------------------------------------------------------- |
219 // --------------------------------------------------------------------------- |
154 // --------------------------------------------------------------------------- |
220 // --------------------------------------------------------------------------- |
155 // |
221 // |
156 TDesC8* |
222 TDesC8* |
157 CCamImageDecoder::GetImageDataL() |
223 CCamImageDecoder::GetImageDataL() |
251 case KErrNone : |
317 case KErrNone : |
252 { |
318 { |
253 // CImageDecoder has finished using the data, |
319 // CImageDecoder has finished using the data, |
254 // so we are able to free it. |
320 // so we are able to free it. |
255 SetImageData( NULL ); |
321 SetImageData( NULL ); |
256 iObserver.ImageDecoded( iStatus.Int(), iDecodedBitmap ); |
322 iObserver.ImageDecoded( iStatus.Int(), iDecodedBitmap, iDecodedMask ); |
257 break; |
323 break; |
258 } |
324 } |
259 case KErrUnderflow : |
325 case KErrUnderflow : |
260 { |
326 { |
261 // Decoder did not have enough data to convert. |
327 // Decoder did not have enough data to convert. |
296 PRINT1( _L("Camera => CCamImageDecoder::RunError(%d)"), aError ); |
362 PRINT1( _L("Camera => CCamImageDecoder::RunError(%d)"), aError ); |
297 |
363 |
298 SetImageData( NULL ); |
364 SetImageData( NULL ); |
299 // Leave has occurred in RunL. |
365 // Leave has occurred in RunL. |
300 // Notify observer with error. |
366 // Notify observer with error. |
301 iObserver.ImageDecoded( aError, NULL ); |
367 iObserver.ImageDecoded( aError, NULL, NULL ); |
302 |
368 |
303 PRINT( _L("Camera <= CCamImageDecoder::RunError") ); |
369 PRINT( _L("Camera <= CCamImageDecoder::RunError") ); |
304 return KErrNone; |
370 return KErrNone; |
305 } |
371 } |
306 |
372 |