diff -r 2e2a89493e2b -r 48dd0f169f0d imagehandlingutilities/thumbnailmanager/plugins/image/src/thumbnailimagedecoder.cpp --- a/imagehandlingutilities/thumbnailmanager/plugins/image/src/thumbnailimagedecoder.cpp Fri Sep 03 10:29:37 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,674 +0,0 @@ -/* -* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Image thumbnail decoder - * -*/ - - - -//INCLUDE FILES -#include -#include -#include -#include - -#include -#include "thumbnailimagedecoder.h" -#include "thumbnaillog.h" -#include "thumbnailpanic.h" -#include "OstTraceDefinitions.h" -#ifdef OST_TRACE_COMPILER_IN_USE -#include "thumbnailimagedecoderTraces.h" -#endif - - -const TUid KImageTypeSVGUid = - { - 0x102073E7 -}; - -// CImageDecoder supports up to 1/8 size reduction if EFullyScaleable is -// not set. -const TInt KMaximumReductionFactor = 8; - -// Matchers for recognizing JPEG files -_LIT( KJpegMime, "image/jpeg" ); - -// Matcher for recognizing SVG files -_LIT( KSvgMime, "image/svg+xml" ); - - - -// ============================ MEMBER FUNCTIONS =============================== - -// --------------------------------------------------------------------------- -// CThumbnailImageDecoder::CThumbnailImageDecoder() -// C++ default constructor can NOT contain any code, that might leave. -// --------------------------------------------------------------------------- -// -CThumbnailImageDecoder::CThumbnailImageDecoder( RFs& aFs ): - CActive(EPriorityStandard ), iBitmap( NULL ), iJpegReadBuffer( NULL ), - iExifThumbImage( NULL ), iFs( aFs ), iBuffer( NULL ) - { - CActiveScheduler::Add( this ); - } - - -// --------------------------------------------------------------------------- -// CThumbnailImageDecoder::~CThumbnailImageDecoder() -// Destructor. -// --------------------------------------------------------------------------- -// -CThumbnailImageDecoder::~CThumbnailImageDecoder() - { - Release(); - } - - -// ----------------------------------------------------------------------------- -// CThumbnailImageDecoder::CreateL() -// Creates thumbnail of image -// ----------------------------------------------------------------------------- -// -void CThumbnailImageDecoder::CreateL( RFile64& aFile, MThumbnailProviderObserver& - aObserver, const CThumbnailManager::TThumbnailQualityPreference aQualityPreference, const - TDataType& aMimeType, const TSize& aSize) - { - TN_DEBUG1( "CThumbnailImageDecoder::CreateL() start" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILIMAGEDECODER_CREATEL, "CThumbnailImageDecoder::CreateL - start" ); - - iBuffer = NULL; - iSize = aSize; - iMimeType = aMimeType; - iObserver = &aObserver; - iFile = aFile; - - CreateDecoderL( aQualityPreference ); - - const TFrameInfo info( iDecoder->FrameInfo()); - if (( info.iOverallSizeInPixels.iWidth < 1 ) || ( - info.iOverallSizeInPixels.iHeight < 1 )) - { - User::Leave( KErrCorrupt ); - } - iFrameInfoFlags = info.iFlags; - iOriginalSize = info.iOverallSizeInPixels; - - TN_DEBUG1( "CThumbnailImageDecoder::CreateL() end" ); - OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILIMAGEDECODER_CREATEL, "CThumbnailImageDecoder::CreateL - end" ); - } - - -// ----------------------------------------------------------------------------- -// CThumbnailImageDecoder::CreateL() -// Creates thumbnail of image -// ----------------------------------------------------------------------------- -// -void CThumbnailImageDecoder::CreateL( const TDesC8* aBuffer, MThumbnailProviderObserver& - aObserver, const CThumbnailManager::TThumbnailQualityPreference aQualityPreference, const - TDataType& aMimeType, const TSize& aSize) - { - TN_DEBUG1( "CThumbnailImageDecoder::CreateL() start" ); - OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILIMAGEDECODER_CREATEL, "CThumbnailImageDecoder::CreateL - start" ); - - iSize = aSize; - iMimeType = aMimeType; - iObserver = &aObserver; - iBuffer = aBuffer; - - CreateDecoderL( aQualityPreference ); - - const TFrameInfo info( iDecoder->FrameInfo()); - if (( info.iOverallSizeInPixels.iWidth < 1 ) || ( - info.iOverallSizeInPixels.iHeight < 1 )) - { - User::Leave( KErrCorrupt ); - } - iFrameInfoFlags = info.iFlags; - iOriginalSize = info.iOverallSizeInPixels; - - TN_DEBUG1( "CThumbnailImageDecoder::CreateL() end" ); - OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILIMAGEDECODER_CREATEL, "CThumbnailImageDecoder::CreateL - end" ); - } - -// ----------------------------------------------------------------------------- -// CThumbnailImageDecoder::DecodeL() -// Decode the thumbnail image -// ----------------------------------------------------------------------------- -// -void CThumbnailImageDecoder::DecodeL( const TDisplayMode aDisplayMode, const CThumbnailManager::TThumbnailFlags aFlags) - { - TN_DEBUG1( "CThumbnailImageDecoder::DecodeL() start" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL - start" ); - - // Create the bitmap - if ( !iBitmap ) - { - iBitmap = new( ELeave )CFbsBitmap(); - } - - TN_DEBUG3( "CThumbnailImageDecoder::DecodeL() %d x %d", iSize.iWidth, iSize.iHeight ); - OstTraceExt2( TRACE_NORMAL, DUP1_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL;iSize.iWidth=%d;iSize.iHeight=%d", iSize.iWidth, iSize.iHeight ); - if( iOriginalSize.iWidth < iOriginalSize.iHeight ) - { - TInt height = iSize.iHeight; - iSize.iHeight = iSize.iWidth; - iSize.iWidth = height; - iPortrait = ETrue; - TN_DEBUG3( "CThumbnailImageDecoder::DecodeL() %d x %d", iSize.iWidth, iSize.iHeight ); - OstTraceExt2( TRACE_NORMAL, DUP2_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL;iSize.iWidth=%d;iSize.iHeight=%d", iSize.iWidth, iSize.iHeight ); - } - else - { - iPortrait = EFalse; - } - - TN_DEBUG3( "CThumbnailImageDecoder::DecodeL() iOriginalSize = %d x %d", iOriginalSize.iWidth, iOriginalSize.iHeight ); - OstTraceExt2( TRACE_NORMAL, DUP3_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL;iOriginalSize.iWidth=%d;iOriginalSize.iHeight=%d", iOriginalSize.iWidth, iOriginalSize.iHeight ); - - //Size in both x and y dimension must be non-zero, positive value - TSize loadSize( iOriginalSize) ; - - if(iOriginalSize.iHeight < iSize.iHeight || iOriginalSize.iWidth < iSize.iWidth ) - { - loadSize = iOriginalSize; - TN_DEBUG1( "CThumbnailImageDecoder::DecodeL() LoadSize is OriginalSize" ); - OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL - LoadSize is OriginalSize" ); - } - else if((iFrameInfoFlags& TFrameInfo::EFullyScaleable || IsSvg()) && aFlags == !CThumbnailManager::ECropToAspectRatio) - { - loadSize = iSize; - TN_DEBUG1( "CThumbnailImageDecoder::DecodeL() EFullyScaleable start" ); - OstTrace0( TRACE_NORMAL, DUP5_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL - EFullyScaleable start" ); - const TReal32 srcAspect = static_cast < TReal32 > ( - iOriginalSize.iWidth ) / iOriginalSize.iHeight; - - // set loadsize to maximum size within target size - if ( (loadSize.iHeight * srcAspect) <= loadSize.iWidth ) - { - TReal trg = 0; - TReal src( loadSize.iHeight * srcAspect ); - Math::Round( trg, src, 0 ); - loadSize.SetSize( trg, loadSize.iHeight ); - } - else - { - TReal trg; - TReal src( loadSize.iWidth / srcAspect ); - Math::Round( trg, src, 0 ); - loadSize.SetSize( loadSize.iWidth, trg ); - } - - TN_DEBUG3( "CThumbnailImageDecoder::DecodeL() EFullyScaleable loadSize = %d x %d", loadSize.iWidth, loadSize.iHeight ); - OstTraceExt2( TRACE_NORMAL, DUP6_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL - EFullyScaleable;loadSize.iWidth=%d;loadSize.iHeight=%d", loadSize.iWidth, loadSize.iHeight ); - } - else - { - - // Size reduction factor. 1/1, 1/2, 1/4, and 1/8 are possible values for all - // plug-ins. SVG graphics can be rendered at any size. - TInt reductionFactor = 1; - while ( reductionFactor < KMaximumReductionFactor && ( iSize.iWidth < - loadSize.iWidth / 2 ) && ( iSize.iHeight < loadSize.iHeight / 2 )) - { - // magic: use loadSize that is half of previous size - loadSize.iWidth /= 2; - loadSize.iHeight /= 2; - reductionFactor *= 2; - } - // If original size is not an exact multiple of reduction factor, - // we need to round loadSize up - if ( reductionFactor && iOriginalSize.iWidth % reductionFactor ) - { - loadSize.iWidth++; - } - if ( reductionFactor && iOriginalSize.iHeight % reductionFactor ) - { - loadSize.iHeight++; - } - TN_DEBUG4( - "CThumbnailImageDecoder::DecodeL() - loadSize = (%d,%d) reduction = 1/%d ", loadSize.iWidth, loadSize.iHeight, reductionFactor ); - OstTraceExt3( TRACE_NORMAL, DUP7_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL;loadSize.iWidth=%d;loadSize.iHeight=%d;reductionFactor=%d", loadSize.iWidth, loadSize.iHeight, reductionFactor ); - } - - TInt err = iBitmap->Create( loadSize, aDisplayMode ); - if (err != KErrNone) - { - delete iBitmap; - iBitmap = NULL; - User::Leave(err); - } - - iDecoder->Convert( &iStatus, * iBitmap ); - - SetActive(); - - TN_DEBUG1( "CThumbnailImageDecoder::DecodeL() end" ); - OstTrace0( TRACE_NORMAL, DUP8_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL - end" ); - } - - -// ----------------------------------------------------------------------------- -// CThumbnailImageDecoder::Release() -// Releases resources -// ----------------------------------------------------------------------------- -// -void CThumbnailImageDecoder::Release() - { - Cancel(); - - delete iDecoder; - iDecoder = NULL; - - delete iBitmap; - iBitmap = NULL; - delete iJpegReadBuffer; - iJpegReadBuffer = NULL; - delete iExifThumbImage; - iExifThumbImage = NULL; - - iBuffer = NULL; // we don't own the buffer - } - - -// ----------------------------------------------------------------------------- -// CThumbnailImageDecoder::DoCancel() -// ----------------------------------------------------------------------------- -// -void CThumbnailImageDecoder::DoCancel() - { - if ( iDecoder ) - { - iDecoder->Cancel(); - delete iDecoder; - iDecoder = NULL; - } - - delete iBitmap; - iBitmap = NULL; - delete iJpegReadBuffer; - iJpegReadBuffer = NULL; - delete iExifThumbImage; - iExifThumbImage = NULL; - - iBuffer = NULL; // we don't own the buffer - } - - -// ----------------------------------------------------------------------------- -// CThumbnailImageDecoder::RunL() -// ----------------------------------------------------------------------------- -// -void CThumbnailImageDecoder::RunL() - { - // This call takes ownership of iBitmap - iObserver->ThumbnailProviderReady( iStatus.Int(), iBitmap, iOriginalSize, iEXIF, iPortrait ); - - iBitmap = NULL; // owned by server now - iBuffer = NULL; // we don't own the buffer - - Release(); - } - - -// ----------------------------------------------------------------------------- -// CThumbnailImageDecoder::IsJpeg() -// ----------------------------------------------------------------------------- -// -TBool CThumbnailImageDecoder::IsJpeg() - { - __ASSERT_DEBUG(( iMimeType.Des() != KNullDesC ), ThumbnailPanic( - EThumbnailEmptyDescriptor )); - - if ( KJpegMime() == iMimeType.Des()) - { - return ETrue; - } - return EFalse; - } - - -// ----------------------------------------------------------------------------- -// CThumbnailImageDecoder::IsSvg() -// ----------------------------------------------------------------------------- -// -TBool CThumbnailImageDecoder::IsSvg() - { - __ASSERT_DEBUG(( iMimeType.Des() != KNullDesC ), ThumbnailPanic( - EThumbnailEmptyDescriptor )); - - if ( KSvgMime() == iMimeType.Des()) - { - return ETrue; - } - return EFalse; - } - - -// ----------------------------------------------------------------------------- -// CThumbnailImageDecoder::CreateDecoderL -// Creates image decoder -// ----------------------------------------------------------------------------- -// -void CThumbnailImageDecoder::CreateDecoderL( CThumbnailManager::TThumbnailQualityPreference - aFlags ) - { - TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() start" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - start" ); - - TBool thumbFound( EFalse ); - - // If the image is in jpeg format, try to get thumbnail from EXIF data (if EOptimizeForQuality not set) - if ( IsJpeg() && !( aFlags == CThumbnailManager::EOptimizeForQuality )) - { - TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() create exif decoder" ); - OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - create exif decoder" ); - TRAPD( err, CreateExifDecoderL( aFlags )); - thumbFound = ( err == KErrNone ); - iEXIF = ETrue; - } - - if ( !thumbFound ) - { - iEXIF = EFalse; - TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() create normal decoder" ); - OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - create normal decoder" ); - - delete iDecoder; - iDecoder = NULL; - - TFileName fullName; - if ( !iBuffer ) - { - iFile.FullName( fullName ); - } - - CImageDecoder::TOptions options; - if ( aFlags == CThumbnailManager::EOptimizeForQuality ) - { - options = ( CImageDecoder::TOptions )( CImageDecoder - ::EOptionNoDither ); - } - else - { - options = ( CImageDecoder::TOptions )( CImageDecoder - ::EOptionNoDither | CImageDecoder::EPreferFastDecode ); - } - - if ( IsSvg()) - { - if ( !iBuffer ) - { - iDecoder = CImageDecoder::FileNewL( iFile, ContentAccess::EPeek, - options, KImageTypeSVGUid, KNullUid, KNullUid ); - - TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder created" ); - OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder created" ); - } - else - { - TRAPD( decErr, iDecoder = CImageDecoder::DataNewL( iFs, *iBuffer, options, KImageTypeSVGUid ) ); - - if ( decErr != KErrNone ) - { - TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - error 1" ); - OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - error 1" ); - - User::Leave( decErr ); - } - - TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder created" ); - OstTrace0( TRACE_NORMAL, DUP5_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder created" ); - } - } - else if ( !IsJpeg()) - { - if ( !iBuffer ) - { - iDecoder = CImageDecoder::FileNewL( iFile, ContentAccess::EPeek, options ); - - TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder created" ); - OstTrace0( TRACE_NORMAL, DUP6_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder created" ); - } - else - { - TRAPD( decErr, iDecoder = CImageDecoder::DataNewL( iFs, *iBuffer, iMimeType.Des8(), options) ); - - if ( decErr != KErrNone ) - { - TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder error %d", decErr ); - OstTrace1( TRACE_NORMAL, DUP7_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder error;decErr=%d", decErr ); - LeaveIfCorruptL(decErr); - - // don't force any mime type - TRAPD( decErr, iDecoder = CImageDecoder::DataNewL( iFs, *iBuffer, options ) ); - - if ( decErr != KErrNone ) - { - TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder no mime error %d", decErr ); - OstTrace1( TRACE_NORMAL, DUP8_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder no mime error;decErr=%d", decErr ); - - User::Leave( decErr ); - } - } - - TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder created" ); - OstTrace0( TRACE_NORMAL, DUP9_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder created" ); - } - } - else - { - if ( !iBuffer ) - { - TRAPD( decErr, iDecoder = CExtJpegDecoder::FileNewL( - CExtJpegDecoder::EHwImplementation, iFs, fullName, options) ); - - if ( decErr != KErrNone ) - { - TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - HW CExtJpegDecoder failed %d", decErr); - OstTrace1( TRACE_NORMAL, DUP10_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL;decErr=%d - HW CExtJpegDecoder failed ", decErr ); - LeaveIfCorruptL(decErr); - - TRAP( decErr, iDecoder = CExtJpegDecoder::FileNewL( - CExtJpegDecoder::ESwImplementation, iFs, fullName, options) ); - - if ( decErr != KErrNone ) - { - TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - SW CExtJpegDecoder failed %d", decErr); - OstTrace1( TRACE_NORMAL, DUP11_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - SW CExtJpegDecoder failed;decErr=%d", decErr ); - LeaveIfCorruptL(decErr); - - TRAP( decErr, iDecoder = CImageDecoder::FileNewL( iFile, ContentAccess::EPeek, options )); - - if( decErr != KErrNone) - { - TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder failed %d", decErr); - OstTrace1( TRACE_NORMAL, DUP12_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder failed ;decErr=%d", decErr ); - User::Leave( decErr ); - } - - TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder created" ); - OstTrace0( TRACE_NORMAL, DUP13_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder created" ); - } - else - { - TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - SW CExtJpegDecoder created" ); - OstTrace0( TRACE_NORMAL, DUP14_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - SW CExtJpegDecoder created" ); - } - } - else - { - TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - HW CExtJpegDecoder created" ); - OstTrace0( TRACE_NORMAL, DUP15_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL" ); - } - } - else - { - TRAPD( decErr, iDecoder = CExtJpegDecoder::DataNewL( - CExtJpegDecoder::EHwImplementation, iFs, *iBuffer, options )); - - if ( decErr != KErrNone ) - { - TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - HW CExtJpegDecoder failed %d", decErr); - OstTrace1( TRACE_NORMAL, DUP16_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - HW CExtJpegDecoder failed;decErr=%d", decErr ); - LeaveIfCorruptL(decErr); - - TRAP( decErr, iDecoder = CExtJpegDecoder::DataNewL( - CExtJpegDecoder::ESwImplementation, iFs, *iBuffer, options )); - - if ( decErr != KErrNone ) - { - TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - SW CExtJpegDecoder failed %d", decErr); - OstTrace1( TRACE_NORMAL, DUP17_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - SW CExtJpegDecoder failed;decErr=%d", decErr ); - LeaveIfCorruptL(decErr); - TRAPD( decErr, iDecoder = CImageDecoder::DataNewL( iFs, *iBuffer, iMimeType.Des8(), options) ); - - if ( decErr != KErrNone ) - { - TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder failed %d", decErr); - OstTrace1( TRACE_NORMAL, DUP18_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder failed;decErr=%d", decErr ); - LeaveIfCorruptL(decErr); - // don't force any mime type - TRAPD( decErr, iDecoder = CImageDecoder::DataNewL( iFs, *iBuffer, options ) ); - - if ( decErr != KErrNone ) - { - TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder no mime failed %d", decErr); - OstTrace1( TRACE_NORMAL, DUP19_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder no mime failed;decErr=%d", decErr ); - User::Leave( decErr ); - } - } - - TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder created" ); - OstTrace0( TRACE_NORMAL, DUP20_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder created" ); - } - else - { - TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - SW CExtJpegDecoder created" ); - OstTrace0( TRACE_NORMAL, DUP21_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - SW CExtJpegDecoder created" ); - } - } - else - { - TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - HW CExtJpegDecoder created" ); - OstTrace0( TRACE_NORMAL, DUP22_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - HW CExtJpegDecoder created" ); - } - } - } - } - - TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() end" ); - OstTrace0( TRACE_NORMAL, DUP23_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - end" ); - } - - -// ----------------------------------------------------------------------------- -// CThumbnailImageDecoder::CreateExifDecoderL() -// ----------------------------------------------------------------------------- -// -void CThumbnailImageDecoder::CreateExifDecoderL( CThumbnailManager - ::TThumbnailQualityPreference aFlags ) - { - TN_DEBUG1( "CThumbnailImageDecoder::CreateExifDecoderL() start" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILIMAGEDECODER_CREATEEXIFDECODERL, "CThumbnailImageDecoder::CreateExifDecoderL - start" ); - - // If the image is in jpeg format, try to get thumbnail from EXIF data. - CExifRead* reader = NULL; - - if ( !iBuffer ) - { - TInt64 size( 0 ); - User::LeaveIfError( iFile.Size( size )); - - TInt readSize = Min( size, KJpegLoadBufferSize ); - - delete iJpegReadBuffer; - iJpegReadBuffer = NULL; - iJpegReadBuffer = HBufC8::NewL( readSize ); - TPtr8 localBuffer = iJpegReadBuffer->Des(); - - User::LeaveIfError( iFile.Read( localBuffer, readSize )); - reader = CExifRead::NewL( localBuffer, CExifRead::ENoJpeg ); - } - else - { - reader = CExifRead::NewL( *iBuffer, CExifRead::ENoJpeg ); - } - - CleanupStack::PushL( reader ); - - iExifThumbImage = reader->GetThumbnailL(); - CleanupStack::PopAndDestroy( reader ); - - User::LeaveIfNull( iExifThumbImage ); - - delete iDecoder; - iDecoder = NULL; - - CImageDecoder::TOptions options; - if ( aFlags == CThumbnailManager::EOptimizeForQuality ) - { - options = ( CImageDecoder::TOptions )( CImageDecoder::EOptionNoDither ); - } - else - { - options = ( CImageDecoder::TOptions )( CImageDecoder::EOptionNoDither | - CImageDecoder::EPreferFastDecode ); - } - - TRAPD( err, iDecoder = CExtJpegDecoder::DataNewL( iFs, * iExifThumbImage, options )); - - if ( err == KErrNotFound || err == KErrNotSupported ) - { - delete iDecoder; - iDecoder = NULL; - - iDecoder = CImageDecoder::DataNewL( iFs, * iExifThumbImage, options ); - } - else - { - TN_DEBUG2( "CThumbnailImageDecoder::CreateExifDecoderL() - CExtJpegDecoder err == %d", err ); - User::LeaveIfError( err ); - } - - TN_DEBUG1( "CThumbnailImageDecoder::CreateExifDecoderL() end" ); - OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILIMAGEDECODER_CREATEEXIFDECODERL, "CThumbnailImageDecoder::CreateExifDecoderL - end" ); - } - - -// ----------------------------------------------------------------------------- -// CThumbnailImageDecoder::CreateExifDecoderL() -// Returns size of original image -// ----------------------------------------------------------------------------- -// -const TSize& CThumbnailImageDecoder::OriginalSize()const - { - return iOriginalSize; - } - -// ----------------------------------------------------------------------------- -// CThumbnailImageDecoder::LeaveIfCorruptL() -// Leave is image is corrupted -// ----------------------------------------------------------------------------- -// -void CThumbnailImageDecoder::LeaveIfCorruptL(const TInt aError ) - { - //no sense to try other codecs if image is corrupted - if( aError == KErrCorrupt || aError == KErrUnderflow) - { - User::Leave( aError ); - } - } - -//End of file