imagehandlinglib/Src/CIHLImageViewerExtJpg.cpp
changeset 54 48dd0f169f0d
parent 42 2e2a89493e2b
--- a/imagehandlinglib/Src/CIHLImageViewerExtJpg.cpp	Fri Sep 03 10:29:37 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1037 +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:  Implementation of Image Viewer class.
-*
-*/
-
-
-// INCLUDE FILES
-#include "CIHLImageViewerExtJpg.h"
-
-#include "CIHLBitmap.h"
-#include "CIHLBitmapProcessor.h"
-#include "IHLImplementationIds.h"
-#include <IHLInterfaceIds.h>
-#include <IclExtJpegApi.h>
-#include <imagecodecdata.h>
-#include <MIHLViewerObserver.h>
-#include "MIHLFileImageExtJpg.h"
-#include <fbs.h>
-
-// Private namespace for constants and functions
-namespace
-	{
-	// Panic function
-	_LIT( KIHLImageViewerExtJpgPanic, "IHLImageViewerExtJpg" );
-	void Panic( TInt aPanicCode ) { User::Panic( KIHLImageViewerExtJpgPanic, aPanicCode ); }
-	}
-
-// ============================ MEMBER FUNCTIONS ===============================
-// -----------------------------------------------------------------------------
-//
-// C++ constructor can NOT contain any code, that might leave.
-// -----------------------------------------------------------------------------
-CIHLImageViewerExtJpg::CIHLImageViewerExtJpg( const TSize& aViewerSize,
-								  MIHLFileImageExtJpg& aSource,
-								  MIHLBitmap& aDestination,
-								  MIHLViewerObserver& aObserver,
-								  const TUint32 aOptions )
-: CTimer( EPriorityNormal ), iObserver( aObserver ),
-iSource( aSource ), iDestination( aDestination ),
-iOptions( aOptions ), iViewerSize( aViewerSize ), iSrcBitmapScaleFactor(1)
-    {
-
-	CActiveScheduler::Add( this );
-    }
-
-// -----------------------------------------------------------------------------
-//
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-CIHLImageViewerExtJpg* CIHLImageViewerExtJpg::NewL( const TSize& aViewerSize,
-										MIHLFileImageExtJpg& aSource,
-										MIHLBitmap& aDestination,
-										MIHLViewerObserver& aObserver,
-										const TUint32 aOptions )
-    {
-    CIHLImageViewerExtJpg* self = new( ELeave ) CIHLImageViewerExtJpg(
-		aViewerSize, aSource, aDestination, aObserver, aOptions );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-	CleanupStack::Pop(); // self
-    return self;
-    }
-
-// -----------------------------------------------------------------------------
-//
-// Symbian constructor can leave.
-// -----------------------------------------------------------------------------
-void CIHLImageViewerExtJpg::ConstructL()
-	{
-	CTimer::ConstructL();
-
-	iCacheSource = CIHLBitmap::NewL();
-	iCacheDestination = CIHLBitmap::NewL();
-
-	// Check codec capabilities
-	iCapabilities = iSource.CapabilitiesL();
-	if( !( iCapabilities & ( CExtJpegDecoder::ECapRotation +
-						CExtJpegDecoder::ECapMirroring +
-						CExtJpegDecoder::ECapFlipping ) ) )
-		{
-		iInternalProcessingNeeded = ETrue;
-		iProcessor = CIHLBitmapProcessor::NewL( iOptions );
-		}
-
-	// Initialize settings and start load (default is zoom to fit)
-	iSourceSize = iSource.Size();
-	CalculateZoomToFitRatio();
-	User::LeaveIfError( SetZoomRatio( iZoomToFitRatio ) );
-	}
-
-// -----------------------------------------------------------------------------
-// Destructor
-// -----------------------------------------------------------------------------
-CIHLImageViewerExtJpg::~CIHLImageViewerExtJpg()
-    {
-	Cancel();
-	if( iProcessor )
-		{
-		delete iProcessor;
-		}
-	delete iCacheSource;
-    delete iCacheDestination;
-    }
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::Id
-// -----------------------------------------------------------------------------
-TIHLInterfaceType CIHLImageViewerExtJpg::Type() const
-	{
-	return TIHLInterfaceType( KIHLInterfaceIdImageViewer, KIHLImplementationIdImageViewerExtJpg );
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::IsAnimation
-// -----------------------------------------------------------------------------
-TBool CIHLImageViewerExtJpg::IsAnimation() const
-	{
-	return EFalse;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::Play
-// -----------------------------------------------------------------------------
-void CIHLImageViewerExtJpg::Play()
-	{
-
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::Stop
-// -----------------------------------------------------------------------------
-void CIHLImageViewerExtJpg::Stop()
-	{
-
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::IsPlaying
-// -----------------------------------------------------------------------------
-TBool CIHLImageViewerExtJpg::IsPlaying() const
-	{
-	return EFalse;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::AnimationFrameCount
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::AnimationFrameCount() const
-	{
-	return KErrNone;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::AnimationFrame
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::AnimationFrame() const
-	{
-	return KErrNone;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::SetAnimationFrame
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::SetAnimationFrame( TInt /*aFrameIndex*/ )
-	{
-    return KErrNone;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::SetViewerSize
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::SetViewerSize( const TSize& aViewerSize, int aSrcBitmapScaleFactor )
-	{
-    // Public API, negative value check -> panic also on hardware
-	__ASSERT_ALWAYS( aViewerSize.iWidth >= 0 &&
-					 aViewerSize.iHeight >= 0, Panic( KErrArgument ) );
-
-	iSrcBitmapScaleFactor = aSrcBitmapScaleFactor;
-
-	// Save new viewer size
-	iViewerSize = aViewerSize;
-
-	// Recalculate source rect and destination size
-	CalculateSourceRectAndDestinationSize();
-
-	// Recalculate zoom to fit ratio
-	CalculateZoomToFitRatio();
-
-	// Start load
-	return ApplySettings();
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::ViewerSize
-// -----------------------------------------------------------------------------
-TSize CIHLImageViewerExtJpg::ViewerSize() const
-	{
-	return iViewerSize;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::MoveSourceRect
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::MoveSourceRect( TInt aDx, TInt aDy )
-	{
-	TInt dx( aDx );
-	TInt dy( aDy );
-	switch( iRotationAngle )
-		{
-		case ERotationAngle0:
-			{
-			break;
-			}
-		case ERotationAngle90:
-			{
-			dx = aDy;
-			dy = -aDx;
-			break;
-			}
-		case ERotationAngle180:
-			{
-			dx = -aDx;
-			dy = -aDy;
-			break;
-			}
-		case ERotationAngle270:
-			{
-			dx = -aDy;
-			dy = aDx;
-			break;
-			}
-		default:
-			{
-            // Internal state error, debug panic only
-            #ifdef _DEBUG
-			    Panic( KErrGeneral );
-            #endif
-			}
-		}
-	if( iHorizontalMirroring )
-		{
-		dx = -dx;
-		}
-	if( iVerticalMirroring )
-		{
-		dy = -dy;
-		}
-
-	if( iSourceRect.iTl.iX + dx < 0 ||
-		iSourceRect.iBr.iX + dx > iSourceSize.iWidth ||
-		iSourceRect.iTl.iY + dy < 0 ||
-		iSourceRect.iBr.iY + dy > iSourceSize.iHeight )
-		{
-		return KErrArgument;
-		}
-
-	iSourceRect.Move( dx, dy );
-
-	// Start load
-	return ApplySettings();
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::SetSourceRectPosition
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::SetSourceRectPosition( const TPoint& aPosition )
-	{
-	TPoint newPosition( aPosition );
-	TSize sourceRectSize( iSourceRect.Size() );
-	switch( iRotationAngle )
-		{
-		case ERotationAngle0:
-			{
-			break;
-			}
-		case ERotationAngle90:
-			{
-			newPosition.iX = aPosition.iY;
-			newPosition.iY = iSourceSize.iHeight - sourceRectSize.iHeight - aPosition.iX;
-			break;
-			}
-		case ERotationAngle180:
-			{
-			newPosition.iX = iSourceSize.iWidth - sourceRectSize.iWidth - aPosition.iX;
-			newPosition.iY = iSourceSize.iHeight - sourceRectSize.iHeight - aPosition.iY;
-			break;
-			}
-		case ERotationAngle270:
-			{
-			newPosition.iX = iSourceSize.iWidth - sourceRectSize.iWidth - aPosition.iY;
-			newPosition.iY = aPosition.iX;
-			break;
-			}
-		default:
-			{
-            // Internal state error, debug panic only
-            #ifdef _DEBUG
-    			Panic( KErrGeneral );
-            #endif
-			}
-		}
-	if( iHorizontalMirroring )
-		{
-		newPosition.iX = iSourceSize.iWidth - sourceRectSize.iWidth - newPosition.iX;
-		}
-	if( iVerticalMirroring )
-		{
-		newPosition.iY = iSourceSize.iHeight - sourceRectSize.iHeight - newPosition.iY;
-		}
-
-	if( newPosition.iX < 0 ||
-		newPosition.iX > ( iSourceSize.iWidth - sourceRectSize.iWidth ) ||
-		newPosition.iY < 0 ||
-		newPosition.iY > ( iSourceSize.iHeight - sourceRectSize.iHeight ) )
-		{
-		return KErrArgument;
-		}
-
-	iSourceRect = TRect( newPosition, sourceRectSize );
-
-	// Start load
-	return ApplySettings();
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::SourceRect
-// -----------------------------------------------------------------------------
-TRect CIHLImageViewerExtJpg::SourceRect() const
-	{
-	TRect mirroredSourceRect( iSourceRect );
-	if( iHorizontalMirroring )
-		{
-		mirroredSourceRect.iTl.iX  = iSourceSize.iWidth - iSourceRect.iBr.iX;
-		mirroredSourceRect.iBr.iX  = iSourceSize.iWidth - iSourceRect.iTl.iX;
-		}
-	if( iVerticalMirroring )
-		{
-		mirroredSourceRect.iTl.iY  = iSourceSize.iHeight - iSourceRect.iBr.iY;
-		mirroredSourceRect.iBr.iY  = iSourceSize.iHeight - iSourceRect.iTl.iY;
-		}
-
-	TRect rotatedSourceRect( mirroredSourceRect );
-	switch( iRotationAngle )
-		{
-		case ERotationAngle0:
-			{
-			break;
-			}
-		case ERotationAngle90:
-			{
-			rotatedSourceRect.iTl.iX = iSourceSize.iHeight - mirroredSourceRect.iBr.iY;
-			rotatedSourceRect.iTl.iY = mirroredSourceRect.iTl.iX;
-			rotatedSourceRect.iBr.iX = iSourceSize.iHeight - mirroredSourceRect.iTl.iY;
-			rotatedSourceRect.iBr.iY = mirroredSourceRect.iBr.iX;
-			break;
-			}
-		case ERotationAngle180:
-			{
-			rotatedSourceRect.iTl.iX = iSourceSize.iWidth - mirroredSourceRect.iBr.iX;
-			rotatedSourceRect.iTl.iY = iSourceSize.iHeight - mirroredSourceRect.iBr.iY;
-			rotatedSourceRect.iBr.iX = iSourceSize.iWidth - mirroredSourceRect.iTl.iX;
-			rotatedSourceRect.iBr.iY = iSourceSize.iHeight - mirroredSourceRect.iTl.iY;
-			break;
-			}
-		case ERotationAngle270:
-			{
-			rotatedSourceRect.iTl.iX = mirroredSourceRect.iTl.iY;
-			rotatedSourceRect.iTl.iY = iSourceSize.iWidth - mirroredSourceRect.iBr.iX;
-			rotatedSourceRect.iBr.iX = mirroredSourceRect.iBr.iY;
-			rotatedSourceRect.iBr.iY = iSourceSize.iWidth - mirroredSourceRect.iTl.iX;
-			break;
-			}
-		default:
-			{
-            // Internal state error, debug panic only
-            #ifdef _DEBUG
-    			Panic( KErrGeneral );
-            #endif
-			}
-		}
-
-	return rotatedSourceRect;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::SourceSize
-// -----------------------------------------------------------------------------
-TSize CIHLImageViewerExtJpg::SourceSize() const
-	{
-	if( iRotationAngle == ERotationAngle90 ||
-		iRotationAngle == ERotationAngle270 )
-		{
-		return TSize( iSourceSize.iHeight, iSourceSize.iWidth );
-		}
-	else
-		{
-		return iSourceSize;
-		}
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::SetZoomRatio
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::SetZoomRatio( TReal aZoomRatio )
-	{
-	if( aZoomRatio <= 0 )
-		{
-		return KErrArgument;
-		}
-
-	iZoomRatio = aZoomRatio;
-
-	// Recalculate source rect and destination size
-	CalculateSourceRectAndDestinationSize();
-
-	// Start load
-	return ApplySettings();
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::ZoomRatio
-// -----------------------------------------------------------------------------
-TReal CIHLImageViewerExtJpg::ZoomRatio() const
-	{
-	return iZoomRatio;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::ZoomToFitRatio
-// -----------------------------------------------------------------------------
-TReal CIHLImageViewerExtJpg::ZoomToFitRatio() const
-	{
-	return iZoomToFitRatio;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::RotateClockwise
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::RotateClockwise()
-	{
-	TInt rotationAngle( iRotationAngle + ERotationAngle90 );
-	if( rotationAngle > ERotationAngle270 )
-		{
-		rotationAngle = ERotationAngle0;
-		}
-
-	return SetRotationAngle( rotationAngle );
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::RotateCounterClockwise
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::RotateCounterClockwise()
-	{
-	TInt rotationAngle( iRotationAngle - ERotationAngle90 );
-	if( rotationAngle < ERotationAngle0 )
-		{
-		rotationAngle = ERotationAngle270;
-		}
-
-	return SetRotationAngle( rotationAngle );
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::SetRotationAngle
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::SetRotationAngle( TInt aRotationAngle )
-	{
-	if( aRotationAngle != ERotationAngle0 &&
-		aRotationAngle != ERotationAngle90 &&
-		aRotationAngle != ERotationAngle180 &&
-		aRotationAngle != ERotationAngle270 )
-		{
-		return KErrArgument;
-		}
-
-	iRotationAngle = aRotationAngle;
-
-	// Recalculate source rect and destination size
-	CalculateSourceRectAndDestinationSize();
-
-	// Recalculate zoom to fit ratio
-	CalculateZoomToFitRatio();
-
-	// Start load
-	return ApplySettings();
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::RotationAngle
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::RotationAngle() const
-	{
-	return iRotationAngle;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::SetVerticalMirroring
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::SetVerticalMirroring( TBool aValue )
-	{
-	if( iVerticalMirroring != aValue )
-		{
-		iVerticalMirroring = aValue;
-
-		// Start load
-		return ApplySettings();
-		}
-	return KErrNone;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::VerticalMirroring
-// -----------------------------------------------------------------------------
-TBool CIHLImageViewerExtJpg::VerticalMirroring() const
-	{
-	return iVerticalMirroring;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::SetHorizontalMirroring
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::SetHorizontalMirroring( TBool aValue )
-	{
-	if( iHorizontalMirroring != aValue )
-		{
-		iHorizontalMirroring = aValue;
-		return ApplySettings();
-		}
-	return KErrNone;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::HorizontalMirroring
-// -----------------------------------------------------------------------------
-TBool CIHLImageViewerExtJpg::HorizontalMirroring() const
-	{
-	return iHorizontalMirroring;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::SetFilter
-// -----------------------------------------------------------------------------
-void CIHLImageViewerExtJpg::SetFilter( MIHLFilter* /*aFilter*/ )
-	{
-	// Not in use
-	}
-
-
-
-// Private methods
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::DoCancel
-// -----------------------------------------------------------------------------
-void CIHLImageViewerExtJpg::DoCancel()
-	{
-	CTimer::DoCancel();
-	// Set state to inactive
-	switch( iViewerState )
-		{
-		case ELoad:
-			{
-			// Cancel asynchronous source loading
-			iSource.CancelLoad();
-			iCacheSource->Reset();
-			break;
-			}
-		case EProcess:
-			{
-			// Cancel asynchronous processing
-			iProcessor->CancelProcess();
-			iCacheDestination->Reset();
-			break;
-			}
-		default:
-			{
-			break;
-			}
-		}
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::RunL
-// -----------------------------------------------------------------------------
-void CIHLImageViewerExtJpg::RunL()
-	{
-	User::LeaveIfError( iStatus.Int() );
-
-	// Save previous state and set current state immediately
-	// to inactive to keep state up-to-date
-	TViewerState prevState( iViewerState );
-	iViewerState = EInactive;
-
-	switch( prevState )
-		{
-		case ELoad:
-			{
-			//Use the internal processor if the codec is lacking some processing capability
-			if( iInternalProcessingNeeded )
-				{
-				const CFbsBitmap& srcBitmap = iCacheSource->Bitmap();
-				User::LeaveIfError( iCacheDestination->Create( iDestinationSize, srcBitmap.DisplayMode() ) );
-				TRect processSourceRect( CalculateProcessSourceRect( iCacheSource->Bitmap().SizeInPixels() ) );
-				TRect destinationRect( CalculateProcessDestinationRect() );
-
-				User::LeaveIfError( iProcessor->Process( iStatus, *iCacheSource, processSourceRect,
-									  *iCacheDestination, destinationRect ) );
-
-				iViewerState = EProcess;
-				SetActive();
-				}
-			else
-				{
-				User::LeaveIfError( Finish() );
-				iObserver.ViewerBitmapChangedL();
-				}
-			break;
-			}
-		case EProcess:
-			{
-			User::LeaveIfError( Finish() );
-			iObserver.ViewerBitmapChangedL();
-			break;
-			}
-		default:
-			{
-            // Internal state error, debug panic only
-			#ifdef _DEBUG
-				Panic( KErrGeneral );
-			#endif
-			}
-		}
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::RunError
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::RunError( TInt aError )
-	{
-	switch( iViewerState )
-		{
-		case ELoad:
-			{
-			// Cleanup cached source if load has been failed
-			iCacheSource->Reset();
-			break;
-			}
-		case EProcess:
-			{
-			// Cleanup cached destination if process has been failed
-			iCacheDestination->Reset();
-			break;
-			}
-		default:
-			{
-			break;
-			}
-		}
-
-	iViewerState = EInactive;
-	iObserver.ViewerError( aError );
-	return KErrNone;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::ApplySettings
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::ApplySettings()
-	{
-	// Assert source rect and destination, debug build only
-#ifdef _DEBUG
-	AssertSourceRectAndDestinationSize();
-#endif
-
-	// Cancel current process if any
-	Cancel();
-
-	// Perform processing if supported by codec
-	if( !iInternalProcessingNeeded )
-		{
-		TRAPD( err, iSource.SetRotationL( iRotationAngle ) );
-		if( !err && iHorizontalMirroring )
-			{
-			TRAP( err, iSource.SetFlippingL() );
-			}
-		if( !err && iVerticalMirroring )
-			{
-			TRAP( err, iSource.SetMirroringL() );
-			}
-		if( err )
-			{
-			return err;
-			}
-		}
-
-	// Start async load/process.
-	TInt err( KErrNone );
-
-	err = AsyncLoad();
-	if( !err )
-		{
-		iViewerState = ELoad;
-		SetActive();
-		}
-
-	return err;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::AsyncLoad
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::AsyncLoad()
-	{
-    // Internal state check, debug panic only
-	__ASSERT_DEBUG( !iCacheDestination->Bitmap().Handle(), Panic( KErrGeneral ) );
-
-	TInt err( KErrNone );
-
-	// Load source bitmap
-
-	iCacheSource->Reset();
-
-	err = iCacheSource->Create( iDestinationSize, iSource.DisplayMode() );
-
-	if( !err )
-		{
-		err = iSource.Load( iSourceRect, iStatus, *iCacheSource );
-		}
-
-	// Error cleanup if needed
-	if( err )
-		{
-		iCacheSource->Reset();
-		}
-	return err;
-	}
-
-
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::Finish
-// -----------------------------------------------------------------------------
-TInt CIHLImageViewerExtJpg::Finish()
-	{
-    // Internal state check, debug panic only
-	__ASSERT_DEBUG( iCacheSource->Bitmap().Handle(), Panic( KErrGeneral ) );
-
-	TInt err( KErrNone );
-
-	// Check if internal processor was used
-	if( iInternalProcessingNeeded )
-		{
-		err = iDestination.Copy( *iCacheDestination, ETrue );
-		iCacheDestination->Reset();
-		}
-	else
-		{
-		err = iDestination.Copy( *iCacheSource, ETrue );
-		iCacheSource->Reset();
-		}
-
-	// Error cleanup if needed
-	if( err )
-		{
-		iDestination.Reset();
-		}
-
-	return err;
-	}
-
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::SelfComplete
-// -----------------------------------------------------------------------------
-void CIHLImageViewerExtJpg::SelfComplete()
-	{
-	SetActive();
-	iStatus = KRequestPending;
-	TRequestStatus* status = &iStatus;
-	User::RequestComplete( status, KErrNone );
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::CalculateProcessSourceRect
-// -----------------------------------------------------------------------------
-TRect CIHLImageViewerExtJpg::CalculateProcessSourceRect( const TSize& aSourceCacheSize )
-	{
-
-	TRect loadRect( aSourceCacheSize );
-
-	switch( iRotationAngle )
-		{
-		case ERotationAngle0:
-			{
-			break;
-			}
-		case ERotationAngle90:
-			{
-			TInt tmp( loadRect.iTl.iY );
-			loadRect.iTl.iY = loadRect.iBr.iY;
-			loadRect.iBr.iY = tmp;
-			break;
-			}
-		case ERotationAngle180:
-			{
-			TPoint tmp( loadRect.iTl );
-			loadRect.iTl = loadRect.iBr;
-			loadRect.iBr = tmp;
-			break;
-			}
-		case ERotationAngle270:
-			{
-			TInt tmp( loadRect.iTl.iX );
-			loadRect.iTl.iX = loadRect.iBr.iX;
-			loadRect.iBr.iX = tmp;
-			break;
-			}
-		default:
-			{
-            // Internal state error, debug panic only
-            #ifdef _DEBUG
-    			Panic( KErrGeneral );
-            #endif
-			}
-		}
-
-	return loadRect;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::CalculateProcessDestinationRect
-// -----------------------------------------------------------------------------
-TRect CIHLImageViewerExtJpg::CalculateProcessDestinationRect()
-	{
-	TRect dstRect( iDestinationSize );
-	switch( iRotationAngle )
-		{
-		case ERotationAngle0:
-		case ERotationAngle180:
-			{
-			if( iHorizontalMirroring )
-				{
-				TInt tmp( dstRect.iTl.iX );
-				dstRect.iTl.iX = dstRect.iBr.iX;
-				dstRect.iBr.iX = tmp;
-				}
-			if( iVerticalMirroring )
-				{
-				TInt tmp( dstRect.iTl.iY );
-				dstRect.iTl.iY = dstRect.iBr.iY;
-				dstRect.iBr.iY = tmp;
-				}
-			break;
-			}
-		case ERotationAngle90:
-		case ERotationAngle270:
-			{
-			if( iHorizontalMirroring )
-				{
-				TInt tmp( dstRect.iTl.iY );
-				dstRect.iTl.iY = dstRect.iBr.iY;
-				dstRect.iBr.iY = tmp;
-				}
-			if( iVerticalMirroring )
-				{
-				TInt tmp( dstRect.iTl.iX );
-				dstRect.iTl.iX = dstRect.iBr.iX;
-				dstRect.iBr.iX = tmp;
-				}
-			break;
-			}
-		default:
-			{
-            // Internal state error, debug panic only
-            #ifdef _DEBUG
-			    Panic( KErrGeneral );
-            #endif
-			}
-		}
-	return dstRect;
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::CalculateZoomToFitRatio
-// -----------------------------------------------------------------------------
-void CIHLImageViewerExtJpg::CalculateZoomToFitRatio()
-	{
-	TSize sourceSize( SourceSize() );
-	TReal widthRatio( TReal( iViewerSize.iWidth ) / TReal( sourceSize.iWidth ) );
-	TReal heightRatio( TReal( iViewerSize.iHeight ) / TReal( sourceSize.iHeight ) );
-
-	if( iOptions & MIHLImageViewer::EOptionIgnoreAspectRatio )
-		{
-		iZoomToFitRatio = ( widthRatio > heightRatio ) ? widthRatio : heightRatio;
-		}
-	else
-		{
-		iZoomToFitRatio = ( widthRatio < heightRatio ) ? widthRatio : heightRatio;
-		}
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::CalculateSourceRectAndDestinationSize
-// -----------------------------------------------------------------------------
-void CIHLImageViewerExtJpg::CalculateSourceRectAndDestinationSize()
-	{
-	// Calculate new source rect
-	TSize oldSourceRectSize( iSourceRect.Size() );
-
-	TReal newSourceRectWidth;
-	TReal newSourceRectHeight;
-	TReal widthZoomRatio( iZoomRatio );
-	TReal heightZoomRatio( iZoomRatio );
-
-	if( iOptions & MIHLImageViewer::EOptionIgnoreAspectRatio )
-		{
-		TReal widthRatio( TReal( iViewerSize.iWidth ) / TReal( iSourceSize.iWidth ) );
-		TReal heightRatio( TReal( iViewerSize.iHeight ) / TReal( iSourceSize.iHeight ) );
-		if( widthRatio < heightRatio )
-			{
-			widthZoomRatio = widthZoomRatio * widthRatio / heightRatio;
-			}
-		else
-			{
-			heightZoomRatio = heightZoomRatio * heightRatio / widthRatio;
-			}
-		}
-
-	if( iRotationAngle == ERotationAngle90 ||
-		iRotationAngle == ERotationAngle270 )
-		{
-		newSourceRectWidth = iSrcBitmapScaleFactor * iViewerSize.iHeight / heightZoomRatio; //widthZoomRatio
-		newSourceRectHeight = iSrcBitmapScaleFactor * iViewerSize.iWidth / widthZoomRatio; //heightZoomRatio
-		}
-	else
-		{
-		newSourceRectWidth = iSrcBitmapScaleFactor * iViewerSize.iWidth / widthZoomRatio;
-		newSourceRectHeight = iSrcBitmapScaleFactor * iViewerSize.iHeight / heightZoomRatio;
-		}
-
-	// Check if source rect is not larger than source area
-	if( newSourceRectWidth > iSourceSize.iWidth )
-		{
-		newSourceRectWidth = iSourceSize.iWidth;
-		}
-	if( newSourceRectHeight > iSourceSize.iHeight )
-		{
-		newSourceRectHeight = iSourceSize.iHeight;
-		}
-	iSourceRect.SetWidth( (TInt)newSourceRectWidth );
-	iSourceRect.SetHeight( (TInt)newSourceRectHeight );
-
-	// Calculate actual destination size (always same or smaller than iViewerSize !)
-	if( iRotationAngle == ERotationAngle90 ||
-		iRotationAngle == ERotationAngle270 )
-		{
-		iDestinationSize.iWidth = (TInt)( newSourceRectHeight * widthZoomRatio ); //heightZoomRatio
-		iDestinationSize.iHeight = (TInt)( newSourceRectWidth * heightZoomRatio  ); //widthZoomRatio
-		}
-	else
-		{
-		iDestinationSize.iWidth = (TInt)( newSourceRectWidth * widthZoomRatio );
-		iDestinationSize.iHeight = (TInt)( newSourceRectHeight * heightZoomRatio );
-		}
-	// Check that destination size is not rounded to zero
-	if( iDestinationSize.iWidth == 0 )
-		{
-		iDestinationSize.iWidth = 1;
-		}
-	if( iDestinationSize.iHeight == 0 )
-		{
-		iDestinationSize.iHeight = 1;
-		}
-
-	// Move source rect keeping center point in same location
-	iSourceRect.Move( ( oldSourceRectSize.iWidth - (TInt)newSourceRectWidth ) / 2,
-					  ( oldSourceRectSize.iHeight - (TInt)newSourceRectHeight ) / 2 );
-
-	// Move rect if partially out of source area
-	TPoint moveOffset( 0, 0 );
-	if( iSourceRect.iTl.iX < 0 )
-		{
-		moveOffset.iX = -iSourceRect.iTl.iX;
-		}
-	else if( iSourceRect.iBr.iX > iSourceSize.iWidth )
-		{
-		moveOffset.iX = iSourceSize.iWidth - iSourceRect.iBr.iX;
-		}
-	if( iSourceRect.iTl.iY < 0 ) //lint !e961
-		{
-		moveOffset.iY = -iSourceRect.iTl.iY;
-		}
-	else if( iSourceRect.iBr.iY > iSourceSize.iHeight )
-		{
-		moveOffset.iY = iSourceSize.iHeight - iSourceRect.iBr.iY;
-		}
-	iSourceRect.Move( moveOffset );  //lint !e961
-
-	// Assert that rectangle is valid, debug build only
-#ifdef _DEBUG
-	AssertSourceRectAndDestinationSize();
-#endif
-	}
-
-// -----------------------------------------------------------------------------
-// CIHLImageViewerExtJpg::AssertSourceRectAndDestinationSize
-// Used in debug build only
-// -----------------------------------------------------------------------------
-#ifdef _DEBUG
-void CIHLImageViewerExtJpg::AssertSourceRectAndDestinationSize()
-	{
-	if( iSourceRect.iTl.iX < 0 ||
-		iSourceRect.iBr.iX > iSourceSize.iWidth ||
-		iSourceRect.iTl.iY < 0 ||
-		iSourceRect.iBr.iY > iSourceSize.iHeight ||
-		iDestinationSize.iWidth <= 0 || iDestinationSize.iHeight <= 0 )
-		{
-		Panic( KErrGeneral );
-		}
-	}
-#endif
-
-//  End of File
-
-