diff -r 2edacbf5d3f9 -r 7197e789b953 imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailscaletask.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailscaletask.cpp Fri Mar 19 09:35:30 2010 +0200 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailscaletask.cpp Fri Apr 16 15:16:16 2010 +0300 @@ -42,14 +42,14 @@ aBitmap, const TSize& aOriginalSize, const TSize& aTargetSize, TBool aCrop, TDisplayMode aDisplayMode, TInt aPriority, const TDesC& aTargetUri, const TThumbnailSize aThumbnailSize, const TInt64 aModified, - TBool aBitmapToPool, const TBool aEXIF) + TBool aBitmapToPool, const TBool aEXIF, const TThumbnailServerRequestId aRequestId) { // We take ownership of aBitmap CleanupStack::PushL( aBitmap ); CThumbnailScaleTask* self = new( ELeave )CThumbnailScaleTask( aProcessor, aServer, aFilename, aBitmap, aOriginalSize, aTargetSize, aCrop, aDisplayMode, aPriority, aTargetUri, aThumbnailSize, aModified, - aBitmapToPool, aEXIF); + aBitmapToPool, aEXIF, aRequestId); CleanupStack::Pop( aBitmap ); CleanupStack::PushL( self ); self->ConstructL(); @@ -68,7 +68,7 @@ const TSize& aOriginalSize, const TSize& aTargetSize, TBool aCrop, TDisplayMode aDisplayMode, TInt aPriority, const TDesC& aTargetUri, const TThumbnailSize aThumbnailSize, const TInt64 aModified, - TBool aBitmapToPool, const TBool aEXIF): + TBool aBitmapToPool, const TBool aEXIF, const TThumbnailServerRequestId aRequestId): CThumbnailTask( aProcessor, aPriority ), iServer( aServer ), iOwnBitmap( aBitmap ), iOriginalSize( aOriginalSize ), iTargetSize(aTargetSize), iTargetSizeTN( aTargetSize ), iCrop( aCrop ), iDisplayMode( aDisplayMode ), iFilename( aFilename ), iTargetUri( aTargetUri ), @@ -76,6 +76,8 @@ iBitmapToPool(aBitmapToPool), iEXIF(aEXIF) { TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::CThumbnailScaleTask()", this ); + + iRequestId = aRequestId; } @@ -95,7 +97,6 @@ iBitmapInPool = ETrue; iScaledBitmap = NULL; - iScaledBitmapHandle = 0; } @@ -116,14 +117,6 @@ iServer.DeleteBitmapFromPool( iBitmap->Handle()); } - if ( iScaledBitmapHandle ) - { - TN_DEBUG1("CThumbnailScaleTask()::~CThumbnailScaleTask() delete scaled bitmap from pool"); - - // Scaled bitmap is owned by server, decrease reference count - iServer.DeleteBitmapFromPool( iScaledBitmapHandle ); - } - // Scaled bitmap is owned by us, delete now delete iScaledBitmap; } @@ -150,6 +143,8 @@ CalculateCropRectangle(); } + TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() - sizes calculated", this ); + #ifdef _DEBUG aStart.UniversalTime(); #endif @@ -162,6 +157,8 @@ if(bitmapSize.iHeight == iTargetSize.iHeight && bitmapSize.iWidth == iTargetSize.iWidth) { + TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() - no need for scaling", this); + // copy bitmap 1:1 User::LeaveIfError( iScaledBitmap->Create( bitmapSize, iBitmap->DisplayMode() )); CFbsBitmapDevice* device = CFbsBitmapDevice::NewL(iScaledBitmap); @@ -172,7 +169,6 @@ gc->BitBlt(TPoint(0, 0), iBitmap); CleanupStack::PopAndDestroy(2, device); // gc - TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() - no need for scaling", this); TRAPD( err, StoreAndCompleteL()); Complete( err ); ResetMessageData(); @@ -180,11 +176,13 @@ else { TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() - scaling", this); + User::LeaveIfError( iScaledBitmap->Create( iTargetSize, iBitmap->DisplayMode() )); iServer.ScaleBitmapL( iStatus, * iBitmap, * iScaledBitmap, iCropRectangle ); SetActive(); - } - + } + + TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() end", this ); } @@ -362,46 +360,38 @@ if ( ClientThreadAlive() ) { - TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() scaled bitmap handle to params"); - TThumbnailRequestParams& params = iParamsBuf(); iMessage.ReadL( 0, iParamsBuf ); // if need to add scaled bitmap to pool if (iBitmapToPool) { - TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() scaled bitmap to pool"); + TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() scaled bitmap handle to params"); params.iBitmapHandle = iScaledBitmap->Handle(); - - iServer.AddBitmapToPoolL( iRequestId.iSession, iScaledBitmap, iRequestId ); - iScaledBitmapHandle = params.iBitmapHandle; } if( params.iQualityPreference == CThumbnailManager::EOptimizeForQualityWithPreview && iEXIF && !iDoStore) { + TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() EThumbnailPreviewThumbnail"); + // this is upscaled preview image params.iControlFlags = EThumbnailPreviewThumbnail; - TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() EThumbnailPreviewThumbnail"); } - - // Server owns the bitmap now. If the code below leaves, we will - // release the bitmap reference in destructor using iScaledBitmapHandle. - if (iBitmapToPool) - { - iScaledBitmap = NULL; - } TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() write params to message"); // pass bitmap handle to client iMessage.WriteL( 0, iParamsBuf ); - // Successfully completed the message. The client will send - // EReleaseBitmap message later to delete the bitmap from pool. - // CThumbnailScaleTask is no longer responsible for that. - iScaledBitmapHandle = 0; + if (iBitmapToPool) + { + TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() scaled bitmap to pool"); + + iServer.AddBitmapToPoolL( iRequestId.iSession, iScaledBitmap, iRequestId ); + iScaledBitmap = NULL; // Server owns the bitmap now + } } TN_DEBUG1("CThumbnailScaleTask()::StoreAndCompleteL() - end");