imagehandlinglib/Src/CIHLBitmapProcessor.cpp
changeset 0 2014ca87e772
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagehandlinglib/Src/CIHLBitmapProcessor.cpp	Tue Jan 26 15:18:05 2010 +0200
@@ -0,0 +1,293 @@
+/*
+* Copyright (c) 2004 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 scaling processor
+*              : using MIHLBitmap type bitmaps.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CIHLBitmapProcessor.h"
+
+#include "CIHLScaler.h"
+#include "CIHLBitmap.h"
+#include "IHLImplementationIds.h"
+#include "IHLDebugPrint.h" // Debug print
+
+#include <IHLInterfaceIds.h>
+#include <fbs.h> // CFbsBitmap
+#include <bitdev.h> // CFbsBitmapDevice, CFbsBitGc
+
+// Private namespace for constants and functions
+namespace
+	{
+	// Panic function
+    _LIT( KIHLPanicString, "IHLBitmapProcessor" );
+    void Panic( TInt aPanicCode ) { User::Panic( KIHLPanicString, aPanicCode ); }
+	}
+
+// ============================ MEMBER FUNCTIONS ===============================
+// -----------------------------------------------------------------------------
+//
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+CIHLBitmapProcessor::CIHLBitmapProcessor()
+:CActive( CActive::EPriorityStandard )
+    {
+	CActiveScheduler::Add( this );
+    }
+
+// -----------------------------------------------------------------------------
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+CIHLBitmapProcessor* CIHLBitmapProcessor::NewL( const TUint32 aOptions )
+    {
+    CIHLBitmapProcessor* self = new( ELeave ) CIHLBitmapProcessor();
+    CleanupStack::PushL( self );
+    self->ConstructL( aOptions );
+	CleanupStack::Pop(); // self
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+//
+// Symbian constructor can leave.
+// -----------------------------------------------------------------------------
+void CIHLBitmapProcessor::ConstructL( const TUint32 aOptions )
+	{
+	iScaler = CIHLScaler::NewL( aOptions );
+	}
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+CIHLBitmapProcessor::~CIHLBitmapProcessor()
+    {
+	Cancel();
+	delete iScaler;
+    }
+
+// -----------------------------------------------------------------------------
+// CIHLBitmapProcessor::Type
+// -----------------------------------------------------------------------------
+TIHLInterfaceType CIHLBitmapProcessor::Type() const
+	{
+	return TIHLInterfaceType( KIHLInterfaceIdBitmapProcessor, KIHLImplementationIdBitmapProcessor );
+	}
+
+// -----------------------------------------------------------------------------
+// CIHLBitmapProcessor::Process
+// -----------------------------------------------------------------------------
+TInt CIHLBitmapProcessor::Process( TRequestStatus& aStatus,
+									const MIHLBitmap& aSrcBitmap,
+									const TRect& aSrcRect,
+									MIHLBitmap& aDstBitmap,
+									const TRect& aDstRect )
+	{
+	if( IsBusy() )
+		{
+		return KErrNotReady;
+		}
+
+	// Check bitmaps (no checking of masks is needed)
+	const CFbsBitmap& srcBitmap = aSrcBitmap.Bitmap();
+	const CFbsBitmap& dstBitmap = aDstBitmap.Bitmap();
+	if( !srcBitmap.Handle() ||
+		!iScaler->IsValidRect( srcBitmap.SizeInPixels(), aSrcRect ) ||
+		!dstBitmap.Handle() ||
+		!iScaler->IsValidRect( dstBitmap.SizeInPixels(), aDstRect ) )
+		{
+		return KErrArgument;
+		}
+
+    IHL_DEBUG1( KIHLDebug, "IHL - CIHLBitmapProcessor - Start asynchronous bitmap processing" );
+
+	// Set references to member data
+	iSrcBitmap = &aSrcBitmap;
+	iSrcRect = aSrcRect;
+	iDstBitmap = static_cast<CIHLBitmap*>( &aDstBitmap ); //lint !e826
+	iDstRect = aDstRect;
+
+	// Start processing
+	iProcessorStatus = &aStatus;
+	*iProcessorStatus = KRequestPending;
+
+	iProcessorState = EProcessBitmap;
+	SelfComplete();
+	return KErrNone;
+	}
+
+// -----------------------------------------------------------------------------
+// CIHLBitmapProcessor::IsBusy
+// -----------------------------------------------------------------------------
+TBool CIHLBitmapProcessor::IsBusy() const
+	{
+	return ( iProcessorState != EInactive );
+	}
+
+// -----------------------------------------------------------------------------
+// CIHLBitmapProcessor::CancelProcess
+// -----------------------------------------------------------------------------
+void CIHLBitmapProcessor::CancelProcess()
+	{
+    IHL_DEBUG1( KIHLDebug, "IHL - CIHLBitmapProcessor - Process cancelled" );
+
+	Cancel();
+	}
+
+// -----------------------------------------------------------------------------
+// CIHLBitmapProcessor::SetFilter
+// -----------------------------------------------------------------------------
+void CIHLBitmapProcessor::SetFilter( MIHFilter* /*aFilter*/ )
+	{
+	// Not in use
+	}
+
+// -----------------------------------------------------------------------------
+// CIHLBitmapProcessor::DoCancel
+// -----------------------------------------------------------------------------
+void CIHLBitmapProcessor::DoCancel()
+	{
+	iScaler->CancelProcess();
+	iProcessorState = EInactive;
+	RequestComplete( KErrCancel );
+	}
+
+// -----------------------------------------------------------------------------
+// CIHLBitmapProcessor::RunL
+// -----------------------------------------------------------------------------
+void CIHLBitmapProcessor::RunL()
+	{
+	User::LeaveIfError( iStatus.Int() );
+
+	switch( iProcessorState )
+		{
+		case EProcessBitmap:
+			{
+			ProcessBitmapL();
+			if( iDstBitmap->Mask().Handle() )
+				{
+				iProcessorState = EProcessMask;
+				}
+			else
+				{
+				// Destination has no mask -> finish process
+				iProcessorState = EFinish;
+				}
+			break;
+			}
+		case EProcessMask:
+			{
+			ProcessMaskL();
+			iProcessorState = EFinish;
+			break;
+			}
+		case EFinish:
+			{
+            IHL_DEBUG1( KIHLDebug, "IHL - CIHLBitmapProcessor - Process complete!" );
+
+			iProcessorState = EInactive;
+			RequestComplete( KErrNone );
+			break;
+			}
+		default:
+			{
+			Panic( KErrTotalLossOfPrecision );
+			}
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CIHLBitmapProcessor::RunError
+// -----------------------------------------------------------------------------
+TInt CIHLBitmapProcessor::RunError( TInt aError )
+	{
+    IHL_DEBUG2( KIHLDebug, "IHL - CIHLBitmapProcessor - Processing error: %d", aError );
+
+	iProcessorState = EInactive;
+	RequestComplete( aError );
+	return KErrNone;
+	}
+
+// -----------------------------------------------------------------------------
+// CIHLBitmapProcessor::ProcessBitmapL
+// -----------------------------------------------------------------------------
+void CIHLBitmapProcessor::ProcessBitmapL()
+	{
+	User::LeaveIfError( iScaler->Scale( iStatus,
+										iSrcBitmap->Bitmap(),
+										iSrcRect,
+										iDstBitmap->BitmapModifyable(),
+										iDstRect ) );
+	SetActive();
+	}
+
+// -----------------------------------------------------------------------------
+// CIHLBitmapProcessor::ProcessMaskL
+// -----------------------------------------------------------------------------
+void CIHLBitmapProcessor::ProcessMaskL()
+	{
+	if( iSrcBitmap->Mask().Handle() )
+		{
+		User::LeaveIfError( iScaler->Scale( iStatus,
+											iSrcBitmap->Mask(),
+											iSrcRect,
+											iDstBitmap->MaskModifyable(),
+											iDstRect ) );
+		SetActive();
+		}
+	else
+		{
+		// No source bitmap where mask can be copied
+		// -> clear destination mask at given rectangle
+		CFbsBitGc* bitGc;
+		CFbsBitmapDevice* bitDev = CFbsBitmapDevice::NewL(
+										&(iDstBitmap->BitmapModifyable()) );
+		CleanupStack::PushL( bitDev );
+		User::LeaveIfError( bitDev->CreateContext( bitGc ) );
+		CleanupStack::PushL( bitGc );
+
+		bitGc->SetPenColor( KRgbWhite ); // white is non-transparent
+		bitGc->SetBrushColor( KRgbWhite );
+		bitGc->SetBrushStyle( CGraphicsContext::ESolidBrush );
+		bitGc->DrawRect( iDstRect );
+
+		CleanupStack::PopAndDestroy( 2 ); // bitGc, bitDev
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CIHLBitmapProcessor::SelfComplete
+// -----------------------------------------------------------------------------
+void CIHLBitmapProcessor::SelfComplete()
+	{
+	SetActive();
+	iStatus = KRequestPending;
+	TRequestStatus* status = &iStatus;
+	User::RequestComplete( status, KErrNone );
+	}
+
+// -----------------------------------------------------------------------------
+// CIHLBitmapProcessor::RequestComplete
+// -----------------------------------------------------------------------------
+void CIHLBitmapProcessor::RequestComplete( TInt aReason )
+	{
+	ASSERT( iProcessorStatus );
+	User::RequestComplete( iProcessorStatus, aReason );
+	}
+
+//  End of File