imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailscaletask.cpp
changeset 15 7197e789b953
parent 14 2edacbf5d3f9
child 29 4bdfb6b5c9b4
equal deleted inserted replaced
14:2edacbf5d3f9 15:7197e789b953
    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()
    93     iBitmap = iOwnBitmap;
    95     iBitmap = iOwnBitmap;
    94     iOwnBitmap = NULL;
    96     iOwnBitmap = NULL;
    95     iBitmapInPool = ETrue;
    97     iBitmapInPool = ETrue;
    96     
    98     
    97     iScaledBitmap = NULL;
    99     iScaledBitmap = NULL;
    98     iScaledBitmapHandle = 0;
       
    99     }
   100     }
   100 
   101 
   101 
   102 
   102 // ---------------------------------------------------------------------------
   103 // ---------------------------------------------------------------------------
   103 // CThumbnailScaleTask::~CThumbnailScaleTask()
   104 // CThumbnailScaleTask::~CThumbnailScaleTask()
   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 
   147     else
   140     else
   148         {
   141         {
   149         // exact target size, crop excess
   142         // exact target size, crop excess
   150         CalculateCropRectangle();
   143         CalculateCropRectangle();
   151         }
   144         }
       
   145     
       
   146     TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() - sizes calculated", this );
   152     
   147     
   153 #ifdef _DEBUG
   148 #ifdef _DEBUG
   154     aStart.UniversalTime();
   149     aStart.UniversalTime();
   155 #endif
   150 #endif
   156     
   151     
   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