40 CThumbnailScaleTask* CThumbnailScaleTask::NewL( CThumbnailTaskProcessor& |
40 CThumbnailScaleTask* CThumbnailScaleTask::NewL( CThumbnailTaskProcessor& |
41 aProcessor, CThumbnailServer& aServer, const TDesC& aFilename, CFbsBitmap* |
41 aProcessor, CThumbnailServer& aServer, const TDesC& aFilename, CFbsBitmap* |
42 aBitmap, const TSize& aOriginalSize, const TSize& aTargetSize, TBool aCrop, |
42 aBitmap, const TSize& aOriginalSize, const TSize& aTargetSize, TBool aCrop, |
43 TDisplayMode aDisplayMode, TInt aPriority, const TDesC& aTargetUri, |
43 TDisplayMode aDisplayMode, TInt aPriority, const TDesC& aTargetUri, |
44 const TThumbnailSize aThumbnailSize, const TInt64 aModified, |
44 const TThumbnailSize aThumbnailSize, const TInt64 aModified, |
45 TBool aBitmapToPool, const TBool aEXIF) |
45 TBool aBitmapToPool, const TBool aEXIF, const TThumbnailServerRequestId aRequestId) |
46 { |
46 { |
47 // We take ownership of aBitmap |
47 // We take ownership of aBitmap |
48 CleanupStack::PushL( aBitmap ); |
48 CleanupStack::PushL( aBitmap ); |
49 CThumbnailScaleTask* self = new( ELeave )CThumbnailScaleTask( aProcessor, |
49 CThumbnailScaleTask* self = new( ELeave )CThumbnailScaleTask( aProcessor, |
50 aServer, aFilename, aBitmap, aOriginalSize, aTargetSize, aCrop, |
50 aServer, aFilename, aBitmap, aOriginalSize, aTargetSize, aCrop, |
51 aDisplayMode, aPriority, aTargetUri, aThumbnailSize, aModified, |
51 aDisplayMode, aPriority, aTargetUri, aThumbnailSize, aModified, |
52 aBitmapToPool, aEXIF); |
52 aBitmapToPool, aEXIF, aRequestId); |
53 CleanupStack::Pop( aBitmap ); |
53 CleanupStack::Pop( aBitmap ); |
54 CleanupStack::PushL( self ); |
54 CleanupStack::PushL( self ); |
55 self->ConstructL(); |
55 self->ConstructL(); |
56 CleanupStack::Pop( self ); |
56 CleanupStack::Pop( self ); |
57 return self; |
57 return self; |
66 CThumbnailScaleTask::CThumbnailScaleTask( CThumbnailTaskProcessor& aProcessor, |
66 CThumbnailScaleTask::CThumbnailScaleTask( CThumbnailTaskProcessor& aProcessor, |
67 CThumbnailServer& aServer, const TDesC& aFilename, CFbsBitmap* aBitmap, |
67 CThumbnailServer& aServer, const TDesC& aFilename, CFbsBitmap* aBitmap, |
68 const TSize& aOriginalSize, const TSize& aTargetSize, TBool aCrop, |
68 const TSize& aOriginalSize, const TSize& aTargetSize, TBool aCrop, |
69 TDisplayMode aDisplayMode, TInt aPriority, const TDesC& aTargetUri, |
69 TDisplayMode aDisplayMode, TInt aPriority, const TDesC& aTargetUri, |
70 const TThumbnailSize aThumbnailSize, const TInt64 aModified, |
70 const TThumbnailSize aThumbnailSize, const TInt64 aModified, |
71 TBool aBitmapToPool, const TBool aEXIF): |
71 TBool aBitmapToPool, const TBool aEXIF, const TThumbnailServerRequestId aRequestId): |
72 CThumbnailTask( aProcessor, aPriority ), iServer( aServer ), iOwnBitmap( aBitmap ), |
72 CThumbnailTask( aProcessor, aPriority ), iServer( aServer ), iOwnBitmap( aBitmap ), |
73 iOriginalSize( aOriginalSize ), iTargetSize(aTargetSize), iTargetSizeTN( aTargetSize ), iCrop( aCrop ), |
73 iOriginalSize( aOriginalSize ), iTargetSize(aTargetSize), iTargetSizeTN( aTargetSize ), iCrop( aCrop ), |
74 iDisplayMode( aDisplayMode ), iFilename( aFilename ), iTargetUri( aTargetUri ), |
74 iDisplayMode( aDisplayMode ), iFilename( aFilename ), iTargetUri( aTargetUri ), |
75 iThumbnailSize(aThumbnailSize), iModified(aModified), |
75 iThumbnailSize(aThumbnailSize), iModified(aModified), |
76 iBitmapToPool(aBitmapToPool), iEXIF(aEXIF) |
76 iBitmapToPool(aBitmapToPool), iEXIF(aEXIF) |
77 { |
77 { |
78 TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::CThumbnailScaleTask()", this ); |
78 TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::CThumbnailScaleTask()", this ); |
|
79 |
|
80 iRequestId = aRequestId; |
79 } |
81 } |
80 |
82 |
81 |
83 |
82 // --------------------------------------------------------------------------- |
84 // --------------------------------------------------------------------------- |
83 // CThumbnailScaleTask::ConstructL() |
85 // CThumbnailScaleTask::ConstructL() |
114 |
115 |
115 // Original bitmap is owned by server, decrease reference count |
116 // Original bitmap is owned by server, decrease reference count |
116 iServer.DeleteBitmapFromPool( iBitmap->Handle()); |
117 iServer.DeleteBitmapFromPool( iBitmap->Handle()); |
117 } |
118 } |
118 |
119 |
119 if ( iScaledBitmapHandle ) |
|
120 { |
|
121 TN_DEBUG1("CThumbnailScaleTask()::~CThumbnailScaleTask() delete scaled bitmap from pool"); |
|
122 |
|
123 // Scaled bitmap is owned by server, decrease reference count |
|
124 iServer.DeleteBitmapFromPool( iScaledBitmapHandle ); |
|
125 } |
|
126 |
|
127 // Scaled bitmap is owned by us, delete now |
120 // Scaled bitmap is owned by us, delete now |
128 delete iScaledBitmap; |
121 delete iScaledBitmap; |
129 } |
122 } |
130 |
123 |
131 |
124 |
160 |
155 |
161 TSize bitmapSize = iBitmap->SizeInPixels(); |
156 TSize bitmapSize = iBitmap->SizeInPixels(); |
162 |
157 |
163 if(bitmapSize.iHeight == iTargetSize.iHeight && bitmapSize.iWidth == iTargetSize.iWidth) |
158 if(bitmapSize.iHeight == iTargetSize.iHeight && bitmapSize.iWidth == iTargetSize.iWidth) |
164 { |
159 { |
|
160 TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() - no need for scaling", this); |
|
161 |
165 // copy bitmap 1:1 |
162 // copy bitmap 1:1 |
166 User::LeaveIfError( iScaledBitmap->Create( bitmapSize, iBitmap->DisplayMode() )); |
163 User::LeaveIfError( iScaledBitmap->Create( bitmapSize, iBitmap->DisplayMode() )); |
167 CFbsBitmapDevice* device = CFbsBitmapDevice::NewL(iScaledBitmap); |
164 CFbsBitmapDevice* device = CFbsBitmapDevice::NewL(iScaledBitmap); |
168 CleanupStack::PushL(device); |
165 CleanupStack::PushL(device); |
169 CFbsBitGc* gc = NULL; |
166 CFbsBitGc* gc = NULL; |
170 User::LeaveIfError(device->CreateContext(gc)); |
167 User::LeaveIfError(device->CreateContext(gc)); |
171 CleanupStack::PushL(gc); |
168 CleanupStack::PushL(gc); |
172 gc->BitBlt(TPoint(0, 0), iBitmap); |
169 gc->BitBlt(TPoint(0, 0), iBitmap); |
173 CleanupStack::PopAndDestroy(2, device); // gc |
170 CleanupStack::PopAndDestroy(2, device); // gc |
174 |
171 |
175 TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() - no need for scaling", this); |
|
176 TRAPD( err, StoreAndCompleteL()); |
172 TRAPD( err, StoreAndCompleteL()); |
177 Complete( err ); |
173 Complete( err ); |
178 ResetMessageData(); |
174 ResetMessageData(); |
179 } |
175 } |
180 else |
176 else |
181 { |
177 { |
182 TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() - scaling", this); |
178 TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() - scaling", this); |
|
179 |
183 User::LeaveIfError( iScaledBitmap->Create( iTargetSize, iBitmap->DisplayMode() )); |
180 User::LeaveIfError( iScaledBitmap->Create( iTargetSize, iBitmap->DisplayMode() )); |
184 iServer.ScaleBitmapL( iStatus, * iBitmap, * iScaledBitmap, iCropRectangle ); |
181 iServer.ScaleBitmapL( iStatus, * iBitmap, * iScaledBitmap, iCropRectangle ); |
185 SetActive(); |
182 SetActive(); |
186 } |
183 } |
187 |
184 |
|
185 TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() end", this ); |
188 } |
186 } |
189 |
187 |
190 |
188 |
191 // --------------------------------------------------------------------------- |
189 // --------------------------------------------------------------------------- |
192 // CThumbnailScaleTask::RunL() |
190 // CThumbnailScaleTask::RunL() |
360 } |
358 } |
361 } |
359 } |
362 |
360 |
363 if ( ClientThreadAlive() ) |
361 if ( ClientThreadAlive() ) |
364 { |
362 { |
365 TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() scaled bitmap handle to params"); |
|
366 |
|
367 TThumbnailRequestParams& params = iParamsBuf(); |
363 TThumbnailRequestParams& params = iParamsBuf(); |
368 iMessage.ReadL( 0, iParamsBuf ); |
364 iMessage.ReadL( 0, iParamsBuf ); |
369 |
365 |
370 // if need to add scaled bitmap to pool |
366 // if need to add scaled bitmap to pool |
371 if (iBitmapToPool) |
367 if (iBitmapToPool) |
372 { |
368 { |
373 TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() scaled bitmap to pool"); |
369 TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() scaled bitmap handle to params"); |
374 |
370 |
375 params.iBitmapHandle = iScaledBitmap->Handle(); |
371 params.iBitmapHandle = iScaledBitmap->Handle(); |
376 |
|
377 iServer.AddBitmapToPoolL( iRequestId.iSession, iScaledBitmap, iRequestId ); |
|
378 iScaledBitmapHandle = params.iBitmapHandle; |
|
379 } |
372 } |
380 |
373 |
381 if( params.iQualityPreference == CThumbnailManager::EOptimizeForQualityWithPreview |
374 if( params.iQualityPreference == CThumbnailManager::EOptimizeForQualityWithPreview |
382 && iEXIF && !iDoStore) |
375 && iEXIF && !iDoStore) |
383 { |
376 { |
|
377 TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() EThumbnailPreviewThumbnail"); |
|
378 |
384 // this is upscaled preview image |
379 // this is upscaled preview image |
385 params.iControlFlags = EThumbnailPreviewThumbnail; |
380 params.iControlFlags = EThumbnailPreviewThumbnail; |
386 TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() EThumbnailPreviewThumbnail"); |
|
387 } |
381 } |
388 |
|
389 // Server owns the bitmap now. If the code below leaves, we will |
|
390 // release the bitmap reference in destructor using iScaledBitmapHandle. |
|
391 if (iBitmapToPool) |
|
392 { |
|
393 iScaledBitmap = NULL; |
|
394 } |
|
395 |
382 |
396 TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() write params to message"); |
383 TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() write params to message"); |
397 |
384 |
398 // pass bitmap handle to client |
385 // pass bitmap handle to client |
399 iMessage.WriteL( 0, iParamsBuf ); |
386 iMessage.WriteL( 0, iParamsBuf ); |
400 |
387 |
401 // Successfully completed the message. The client will send |
388 if (iBitmapToPool) |
402 // EReleaseBitmap message later to delete the bitmap from pool. |
389 { |
403 // CThumbnailScaleTask is no longer responsible for that. |
390 TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() scaled bitmap to pool"); |
404 iScaledBitmapHandle = 0; |
391 |
|
392 iServer.AddBitmapToPoolL( iRequestId.iSession, iScaledBitmap, iRequestId ); |
|
393 iScaledBitmap = NULL; // Server owns the bitmap now |
|
394 } |
405 } |
395 } |
406 |
396 |
407 TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() - end"); |
397 TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() - end"); |
408 } |
398 } |
409 |
399 |