windowing/windowserver/nonnga/remotegc/CommandBuffer.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nonnga/remotegc/CommandBuffer.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,1373 @@
+// Copyright (c) 2006-2009 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:
+//
+
+#include "Graphics/WSGRAPHICMSGBUF.H"
+#include "DrawSection.h"
+#include "CommandBuffer.h"
+#include "BitmapCache.h"
+#include "FontsCache.h"
+
+const TInt KBufferSize = 1024;
+
+EXPORT_C CCommandBuffer* CCommandBuffer::NewL()
+	{
+	CCommandBuffer* buffer = new (ELeave) CCommandBuffer;
+	CleanupStack::PushL(buffer);
+	buffer->ConstructL();
+	CleanupStack::Pop(buffer);
+	return buffer;
+	}
+
+CCommandBuffer::CCommandBuffer()
+	{
+	}
+	
+EXPORT_C CCommandBuffer::~CCommandBuffer()
+	{	
+	iDrawSections.ResetAndDestroy();
+	iDrawSections.Close();
+	iBufReadStream.Close();
+	iClippingRegion.Close();
+	
+	iBufRead = NULL;
+	delete iRecordSegBuf;
+	delete iBitmapCache;
+	delete iFontCache;
+	}
+	
+void CCommandBuffer::ConstructL()
+	{
+	iBitmapCache = new (ELeave)	CBitmapCache;
+	iRecordSegBuf = CBufSeg::NewL(KBufferSize);
+	iFontCache =  new (ELeave) CFontsCache;
+	}
+
+/**
+Resets the entire commandbuffer.
+*/
+void CCommandBuffer::Reset()
+	{
+	if(iRecordSegBuf)
+		iRecordSegBuf->Reset();
+	
+	iError =  KErrNone;	
+	iOrigin = TPoint(0,0);
+	iClippingRegion.Clear();
+	iDrawSections.ResetAndDestroy();	
+	}
+
+/**
+Externalizes commandbuffer sections into a format which makes it possible to send over IPC.
+If ETrue is sent as a parameter to this method, the entire commandbuffer will be externalized,
+otherwise only sections which has not been externalized before will be externalized. Note that if only
+not externalized sections is asked for, the flag will be reset on that section so next call
+to ExternalizeLC will not externalize that section.
+
+@param aMsgBuf A buffer used to externalize the commandbuffer to.
+@param aEntireBuffer If ETrue, the entire commandbuffer will be externalized, otherwise only sections which has not been externalized before.
+*/
+void CCommandBuffer::ExternalizeL(RWsGraphicMsgBuf& aMsgBuf, TBool aEntireBuffer)
+	{
+	// Add drawsections to aMsgBuf
+	const TInt sectionCount = iDrawSections.Count();
+	for(TInt j = 0; j < sectionCount; j++)	
+		{
+		CDrawSection* section = iDrawSections[j];
+		if(aEntireBuffer || !section->HasBeenExternalized())
+			{
+			section->ExternalizeL(aMsgBuf);
+			section->SetHasBeenExternalized(ETrue);
+			}
+		}
+	}
+
+/**
+Internalizes the entire commandbuffer from buffer containing information about all drawsections and drawcommands.
+
+@param aBuf A buffer containing information about all drawsections and drawcommands.
+*/
+EXPORT_C void CCommandBuffer::InternalizeL(const TDesC8& aBuf)
+	{
+	// Reset the commandbuffer
+	iRecordSegBuf->Reset();
+	InternalizeAppendL(aBuf);
+	}
+
+/**
+Internalizes and appends from a buffer containing information about some drawsections and drawcommands.
+
+@param aBuf A buffer containing information about some drawsections and drawcommands.
+*/
+EXPORT_C void CCommandBuffer::InternalizeAppendL(const TDesC8& aBuf)
+	{
+	// Reset the commandbuffer
+	TWsGraphicMsgBufParser parser(aBuf);
+	
+	// Load drawsections
+	const TInt count = parser.Count();
+	for(TInt i = 0; i < count; i++)
+		{
+		CDrawSection* drawSection = CDrawSection::NewL();;
+		CleanupStack::PushL(drawSection);
+		User::LeaveIfError(drawSection->LoadL(parser, i));
+		iDrawSections.AppendL(drawSection);
+		CleanupStack::Pop(drawSection);
+		}
+	
+	// Tidy the iDrawSection array so completely blocked sections will be removed
+	Tidy();
+	}
+
+/**
+@return the current active clipping region of the commandbuffer.
+*/	
+EXPORT_C const TRegion& CCommandBuffer::ClippingRegion() const
+	{
+	return *iActiveMasterClippingRegion;
+	}
+
+/**
+Prepares to record new drawcommands for a drawsection.
+This method is called from CRemoteGc::Activate().
+*/
+void CCommandBuffer::Prepare(const TRect& aDrawRect)
+	{
+	iDrawSectionRect = aDrawRect;
+	iError = KErrNone;
+  	if(iRecordSegBuf)
+  		iRecordSegBuf->Delete(0, iRecordSegBuf->Size()); // Reset record buffer
+  	else
+  		TRAP(iError, iRecordSegBuf = CBufSeg::NewL(KBufferSize));
+	}
+	
+/**
+Finishes the recording of drawcommands for a drawsection. 
+This method is called from CRemoteGc::Deactivate().
+
+@param aDrawRect The drawrect of the recorded drawcommands.
+@param aBoundingRect The boundingrect of the recorded drawcommands.
+*/
+TInt CCommandBuffer::Finish(const TRect& aDrawRect, const TRect& aBoundingRect, TBool aHasBitmapCommand)
+	{
+	// If some error occured during the recording of this section, dont add the section
+	if(!iError)
+		{
+		CDrawSection* drawSection = NULL;
+		TRAP(iError, drawSection = CDrawSection::NewL(aDrawRect, aBoundingRect, aHasBitmapCommand))
+		if(iError)
+			return iError;
+		
+		// If boundingRect is empty clear the drawcommands added
+		if(aBoundingRect.IsEmpty())
+			iRecordSegBuf->Delete(0, iRecordSegBuf->Size());
+		
+		iRecordSegBuf->Compress();
+		drawSection->SetBuffer(iRecordSegBuf); //Takes ownership of the memory allocated by iRecordSegBuf			
+		iRecordSegBuf = NULL;		
+		if(CheckForDuplicate(*drawSection))
+			{
+			delete drawSection;
+			return KErrAlreadyExists;
+			}
+		
+		iError = iDrawSections.Append(drawSection);
+		if(iError)
+			delete drawSection;
+		else
+			{
+			Tidy();
+			if(iDrawSections.Count() == 0 || AllSectionsExternalized())
+				return KErrGeneral;
+			}
+		}
+
+	return iError;
+	}
+
+/**
+Remove drawsections that is completely blocked by another drawsection. 
+*/
+void CCommandBuffer::Tidy()
+	{
+	RRegion region;
+	TInt count = 0;
+	for(TInt i = 0; i < (count = iDrawSections.Count()); i++)
+		{		
+		TRect rect1 = iDrawSections[i]->DrawRect();
+		region.Clear();
+		region.AddRect(rect1);
+		for(TInt j = i + 1; j < count; j++)
+			{
+			TRect rect2 = iDrawSections[j]->DrawRect();
+			region.SubRect(rect2);
+			}
+			
+		if(region.IsEmpty())
+			{
+			delete iDrawSections[i];
+			iDrawSections.Remove(i--);
+			}
+		}
+	region.Close();
+	}
+
+/** 
+@return ETrue if all sections in the commandbuffer have been externalized, otherwise EFalse. 
+*/ 
+TBool CCommandBuffer::AllSectionsExternalized() const 
+	{ 
+	const TInt count = iDrawSections.Count(); 
+	for(TInt i = 0; i < count; i++) 
+		{ 
+		if(!iDrawSections[i]->HasBeenExternalized()) 
+			return EFalse; 
+		} 
+	return ETrue; 
+	} 
+
+/**
+Checks if there exists any duplicate of aDrawSection already in the iDrawSection array.
+
+@param aDrawSection The drawsection to look for a duplicate of.
+@return ETrue if a duplicate was found, otherwise EFalse.
+*/
+TBool CCommandBuffer::CheckForDuplicate(const CDrawSection& aDrawSection) const
+	{
+	const TInt count = iDrawSections.Count();
+	for(TInt i = 0; i < count; i++)
+		{
+		if(!iDrawSections[i]->IsIdentical(aDrawSection))
+			continue;
+		
+		// Check if there is some drawsection that overlaps the section we found identical, 
+		// if that is the case it is not a duplicate
+		for(TInt j = i + 1; j < count; j++)
+			{
+			TRect compareRect = iDrawSections[j]->DrawRect();
+			if(aDrawSection.DrawRect().Intersects(compareRect)) 
+				return EFalse; //Found a drawrect that overlapped, no duplicate exists then
+			}
+			
+		// Found duplicate
+		return ETrue;
+		}
+		
+	return EFalse;
+	}
+	
+/**
+Updates the clippingregion for a specific drawsection.
+
+@param aDrawSectionIndex The index in iDrawSections of the drawsection to update the clippingregion for.
+@param aBitmapContext The bitmapcontext to set the new clippingregion on.
+*/
+void CCommandBuffer::UpdateClippingRegion(TInt aDrawSectionIndex)
+	{
+	__ASSERT_DEBUG(aDrawSectionIndex < iDrawSections.Count(), User::Invariant());
+	
+	iDrawSectionClippingRegion.Clear();
+	if (iMasterClippingRegion)
+		{
+		iDrawSectionClippingRegion.Copy(*iMasterClippingRegion);
+		}
+	else
+		{
+		TRect rect = iMasterClippingRect;
+		rect.Move(iMasterOrigin);
+		iDrawSectionClippingRegion.AddRect(rect);
+		}
+
+	const TInt count = iDrawSections.Count();
+	for(TInt i = aDrawSectionIndex + 1; i < count; ++i)
+		{
+		TRect rect = iDrawSections[i]->DrawRect();
+		rect.Move(iMasterOrigin);
+		iDrawSectionClippingRegion.SubRect(rect);
+		}
+	
+	if (iDrawSectionClippingRegion.CheckError())
+		iActiveMasterClippingRegion = iMasterClippingRegion;
+	else
+		iActiveMasterClippingRegion = &iDrawSectionClippingRegion;
+	}
+
+/**
+Writes data of a specific length to the recordbuffer.
+
+@param aPtr The data to write.
+@param aLength The length of the data to write.
+*/
+void CCommandBuffer::Write(const TUint8* aPtr, TUint aLength)
+	{
+	if(iError)
+		return;
+	
+	TRAP(iError, iRecordSegBuf->InsertL(iRecordSegBuf->Size(), aPtr, aLength))
+	if(iError)
+		return;
+	}
+
+/**
+Writes text to the recordbuffer.
+
+@param aText The text to write to the recordbuffer.
+*/
+void CCommandBuffer::WriteText(const TDesC8 &aText)
+	{
+	if(iError)
+		return;
+	
+	// Append the total size of the text
+	Write<TInt>(aText.Size());
+	if(iError)
+		return;			
+	
+	TRAP(iError, DoWriteTextL(aText));	
+	}
+
+/**
+Writes text to the recordbuffer.
+
+@param aText The text to write to the recordbuffer.
+*/
+void CCommandBuffer::WriteText(const TDesC16 &aText)
+	{
+	if(iError)
+		return;
+	
+	// Append the total size of the text
+	Write<TInt>(aText.Size());
+	if(iError)
+		return;			
+	
+	TPtrC8 textPtr(reinterpret_cast<const TUint8*>(aText.Ptr()),aText.Size());
+	TRAP(iError, DoWriteTextL(textPtr));	
+	}
+
+/**
+Writes text to the recordbuffer.
+
+@param aText The text to write to the recordbuffer.
+*/	
+void CCommandBuffer::DoWriteTextL(const TDesC8 &aText)
+	{
+	iRecordSegBuf->InsertL(iRecordSegBuf->Size(), aText, aText.Size());		
+	}
+
+/**
+Reads data with a specific length from iBufReadStream.
+
+@param aPtr The read data is written to this paramenter.
+@param aLength The length of the data to be read.
+*/
+void CCommandBuffer::ReadL(TUint8* aPtr, TUint aLength)
+	{
+	iBufReadStream.ReadL(aPtr, aLength);
+	}
+
+/**
+Reads text from iBufReadStream.
+
+@param aText The read text is put into this 8-bit buffer.
+*/	
+void CCommandBuffer::ReadTextLC(TPtrC8& aText)
+	{
+	DoReadTextLC(aText,EFalse);
+	}
+
+/**
+Reads text from iBufReadStream.
+
+@param aText The read text is put into this 16-bit buffer.
+*/	
+void CCommandBuffer::ReadTextLC(TPtrC16& aText)
+	{
+	TPtrC8 text8;
+	DoReadTextLC(text8,ETrue);
+	aText.Set(reinterpret_cast<const TUint16*>(text8.Ptr()),text8.Size()/2);
+	}
+	
+/**
+Reads text from iBufReadStream; used by ReadTextLC
+
+@internalComponent
+*/	
+void CCommandBuffer::DoReadTextLC(TPtrC8& aText,TBool a16Bit)
+	{
+	ASSERT(iBufRead);
+	
+	TInt textSize;
+	ReadL<TInt>(textSize); // Read the length of the text
+	if(0 > textSize)
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	// attempt to do it inline
+	const TInt pos = iBufReadStream.Source()->TellL(MStreamBuf::ERead).Offset();
+	if(!a16Bit || !(pos & 1)) // check 16bit-aligned
+		{
+		const TPtrC8 remaining = iBufRead->Ptr(pos);
+		if(remaining.Size() >= textSize) // can do inline!
+			{
+			CleanupStack::PushL((TAny*)NULL); // have to push something
+			iBufReadStream.Source()->SeekL(MStreamBuf::ERead,textSize);
+			aText.Set(remaining.Ptr(),textSize);
+			return;
+			}
+		}
+		
+	// have to copy into a continuous segment
+	HBufC8* buf = HBufC8::NewLC(textSize);
+	TPtr8 textPtr8(buf->Des());
+	iBufReadStream.ReadL(textPtr8,textSize);
+	aText.Set(*buf);
+	}
+
+/**
+Compares the commands in one buffer to those in another
+@param aBuffer The buffer to compare to
+@return ETrue if they are an exact match, EFalse otherwise
+*/
+EXPORT_C TBool CCommandBuffer::IsIdentical(const CCommandBuffer & aBuffer) const
+	{
+	for(TInt i = 0; i < iDrawSections.Count(); ++i)
+		{
+		if (!iDrawSections[i]->IsIdentical(*aBuffer.iDrawSections[i]))
+			return EFalse;
+		}
+	return ETrue;
+	}
+
+/**
+Draws drawcommands that are within a specific rect to a specific position.
+This function is deprecated use the other overload
+
+@param aPosition Draws the drawcommands to this position.
+@param aDrawRect Draws only drawcommands that are within this rect.
+@param aBitmapContext The bitmapcontext to draw to.
+@deprecated
+@publishedPartner
+*/
+EXPORT_C TInt CCommandBuffer::Play(const TPoint& aPosition, const TRect& aDrawRect, const MWsGraphicResolver& aWsGraphicResolver, CBitmapContext& aContext)
+	{
+	iMasterOrigin = aPosition;
+	iOrigin = TPoint(0,0); // Need to save this to be able to make Reset not affect Origin beacuse that is how CWsGc works.
+	aContext.SetOrigin(iMasterOrigin);
+	iMasterClippingRect = aDrawRect;
+	iMasterClippingRegion=0;
+		
+	TRAPD(errMess, DoPlayL(aWsGraphicResolver, aContext));		
+	return errMess;
+	}
+
+/**
+Draws drawcommands that are within a specific rect to a specific position.
+
+@param aMasterOrigin The origin relative to which all draw commands will be drawn
+@param aMasterClippingRegion The region to which all draw commands are clipped
+@param aMasterClippingRect The rectangle to which all draw commands are clipped
+@param aWsGraphicResolver Any DrawWsGraphic commands will use this to draw themselves
+@param aContext The bitmap context to draw to
+@publishedPartner
+*/
+EXPORT_C TInt CCommandBuffer::Play(const TPoint& aMasterOrigin, const TRegion * aMasterClippingRegion, const TRect& aMasterClippingRect, const MWsGraphicResolver& aWsGraphicResolver, CBitmapContext& aContext)
+	{
+	iMasterOrigin = aMasterOrigin;
+	iMasterClippingRegion = aMasterClippingRegion;
+	iMasterClippingRect = aMasterClippingRect;
+	
+	Reset(aContext);
+
+	TRAPD(errMess, DoPlayL(aWsGraphicResolver, aContext));		
+	return errMess;
+	}
+
+/**
+	@internalTechnology
+*/
+EXPORT_C TInt CCommandBuffer::Play(const TPoint& /*aOffset*/, const TRegion* /*aClippingRegion*/, const TRect& /*aSourceRect*/, const MWsGraphicResolver& /*aWsGraphicResolver*/, MWsGraphicsContext& /*aGraphicsContext*/) //Stub implementation to maintain compatibility with NGA Window Server
+	{
+	ASSERT(0);
+	return KErrNotSupported;
+	}
+
+/**
+	@internalTechnology
+*/
+EXPORT_C TInt CCommandBuffer::Play(const TPoint& /*aOffset*/, const TRegion* /*aClippingRegion*/, const TRect& /*aSourceRect*/, RWsSession& /*aWsSession*/, CWindowGc& /*aWindowGc*/) //Stub implementation to maintain compatibility with NGA Window Server
+	{
+	ASSERT(0);
+	return KErrNotSupported;
+	}
+
+/**
+Draws drawcommands that are within a specific rect.
+
+@param aDrawRect Draws only drawcommands that are within this rect.
+@param aBitmapContext The bitmapcontext to draw to.
+*/
+void CCommandBuffer::DoPlayL(const MWsGraphicResolver& aWsGraphicResolver, CBitmapContext& aBitmapContext)
+	{
+	const TInt sections = iDrawSections.Count();
+	if(sections == 0)
+		User::Leave(KErrEof);
+	
+	iBitmapCache->BeginUpdate();
+	iFontCache->BeginUpdate();
+	for(TInt i = 0; i < sections; i++)
+		{
+		UpdateClippingRegion(i);
+		DrawSectionL(*iDrawSections[i], aWsGraphicResolver, aBitmapContext);		
+		}
+	iFontCache->EndUpdate();
+	iBitmapCache->EndUpdate();	
+	}
+
+/**
+Draws a specific drawsection.
+
+@param aDrawSection The drawsection to be drawn.
+@param aBitmapContext The bitmapcontext to draw to.
+*/
+void CCommandBuffer::DrawSectionL(const CDrawSection& aDrawSection, const MWsGraphicResolver& aWsGraphicResolver, CBitmapContext& aBitmapContext)
+	{
+	iDrawSectionRect = aDrawSection.DrawRect();
+	Reset(aBitmapContext);
+
+	iBufRead = aDrawSection.Buffer();
+	iBufReadStream.Open(*iBufRead, 0);
+	
+	TDrawCode drawCode;
+	while(ETrue)
+		{		
+	   	TRAPD(err, ReadL<TDrawCode>(drawCode));
+	   	if(err == KErrEof)
+	   		return;
+	   	else if(err)
+	   		User::Leave(err);
+   	
+		switch(drawCode)
+			{
+			case ECommandClear:
+				Clear(aBitmapContext);
+				break;			
+			case ECommandClearRect:
+				ClearRectL(aBitmapContext);
+				break;
+			case ECommandCopyRect:
+				CopyRectL(aBitmapContext);
+				break;
+			case ECommandBitBlt1:
+				BitBlt1L(aBitmapContext);
+				break;
+			case ECommandBitBlt2:
+				BitBlt2L(aBitmapContext);
+				break;
+			case ECommandBitBltMasked:
+				BitBltMaskedL(aBitmapContext);
+				break;
+			case ECommandSetFaded:
+				SetFadedL(aBitmapContext);
+				break;
+			case ECommandSetFadingParameters:
+				SetFadingParametersL(aBitmapContext);
+				break;
+			case ECommandAlphaBlendBitmaps:
+				AlphaBlendBitmapsL(aBitmapContext);
+				break;		
+			case ECommandSetOrigin:
+				SetOriginL(aBitmapContext);
+				break;
+			case ECommandSetDrawMode:
+				SetDrawModeL(aBitmapContext);
+				break;
+			case ECommandSetClippingRect:
+				SetClippingRectL(aBitmapContext);
+				break;
+			case ECommandCancelClippingRect:
+				CancelClippingRect(aBitmapContext);
+				break;
+			case ECommandReset:
+				Reset(aBitmapContext);
+				break;			
+			case ECommandUseFont:
+				UseFontL(aBitmapContext);
+				break;
+			case ECommandDiscardFont:
+				DiscardFont(aBitmapContext);
+				break;
+			case ECommandSetUnderlineStyle:
+				SetUnderlineStyleL(aBitmapContext);
+				break;
+			case ECommandSetStrikethroughStyle:
+				SetStrikethroughStyleL(aBitmapContext);
+				break;
+			case ECommandSetWordJustification:
+				SetWordJustificationL(aBitmapContext);
+				break;
+			case ECommandSetCharJustification:
+				SetCharJustificationL(aBitmapContext);
+				break;
+			case ECommandSetPenColor:
+				SetPenColorL(aBitmapContext);
+				break;
+			case ECommandSetPenStyle:
+				SetPenStyleL(aBitmapContext);
+				break;
+			case ECommandSetPenSize:
+				SetPenSizeL(aBitmapContext);
+				break;									
+			case ECommandSetBrushColor:
+				SetBrushColorL(aBitmapContext);
+				break;						
+			case ECommandSetBrushStyle:
+				SetBrushStyleL(aBitmapContext);
+				break;
+			case ECommandSetBrushOrigin:
+				SetBrushOriginL(aBitmapContext);
+				break;
+			case ECommandUseBrushPattern:
+				UseBrushPatternL(aBitmapContext);
+				break;
+			case ECommandDiscardBrushPattern:
+				DiscardBrushPattern(aBitmapContext);
+				break;
+			case ECommandMoveTo:
+				MoveToL(aBitmapContext);
+				break;
+			case ECommandMoveBy:
+				MoveByL(aBitmapContext);
+				break;
+			case ECommandPlot:
+				PlotL(aBitmapContext);
+				break;
+			case ECommandDrawArc:
+				DrawArcL(aBitmapContext);
+				break;
+			case ECommandDrawLine:
+				DrawLineL(aBitmapContext);
+				break;
+			case ECommandDrawLineTo:
+				DrawLineToL(aBitmapContext);
+				break;
+			case ECommandDrawLineBy:
+				DrawLineByL(aBitmapContext);
+				break;
+			case ECommandDrawPolyLine:
+				DrawPolyLineL(aBitmapContext);
+				break;
+			case ECommandDrawPie:
+				DrawPieL(aBitmapContext);
+				break;
+			case ECommandDrawEllipse:
+				DrawEllipseL(aBitmapContext);
+				break;	
+			case ECommandDrawRect:
+				DrawRectL(aBitmapContext);
+				break;
+			case ECommandDrawPolygon:
+				DrawPolygonL(aBitmapContext);
+				break;	
+			case ECommandDrawRoundRect:
+				DrawRoundRectL(aBitmapContext);
+				break;										
+			case ECommandDrawBitmap1:
+				DrawBitmap1L(aBitmapContext);
+				break;	
+			case ECommandDrawBitmap2:
+				DrawBitmap2L(aBitmapContext);
+				break;	
+			case ECommandDrawBitmap3:
+				DrawBitmap3L(aBitmapContext);
+				break;	
+			case ECommandDrawBitmapMasked:
+				DrawBitmapMaskedL(aBitmapContext);
+				break;
+			case ECommandDrawText1:
+				DrawText1L(aBitmapContext);
+				break;
+			case ECommandDrawText2:
+				DrawText2L(aBitmapContext);
+				break;
+			case ECommandDrawText3:
+				DrawText3L(aBitmapContext);
+				break;	
+			case ECommandMapColors:
+				MapColorsL(aBitmapContext);
+				break;					
+			case ECommandSetClippingRegion:
+				SetClippingRegionL(aBitmapContext);
+				break;
+			case ECommandCancelClippingRegion:
+				CancelClippingRegion(aBitmapContext);
+				break;
+			case ECommandDrawTextVertical1:
+				DrawTextVertical1L(aBitmapContext);
+				break;
+			case ECommandDrawTextVertical2:
+				DrawTextVertical2L(aBitmapContext);
+				break;						
+			case ECommandDrawWsGraphic1:
+				DrawWsGraphic1L(aWsGraphicResolver);
+				break;						
+			case ECommandDrawWsGraphic2:
+				DrawWsGraphic2L(aWsGraphicResolver);
+				break;						
+			case ECommandSetShadowColor:
+				SetShadowColorL(aBitmapContext);
+				break;
+			default:
+				User::LeaveIfError(KErrNotFound);
+				break;
+			}
+		}
+	}
+
+void CCommandBuffer::Clear(CBitmapContext& aBitmapContext) const
+	{
+	aBitmapContext.Clear();
+	}
+
+void CCommandBuffer::ClearRectL(CBitmapContext& aBitmapContext)
+	{
+	TRect rect;	
+	ReadL<TRect>(rect);
+	
+	aBitmapContext.Clear(rect);
+	}
+	
+void CCommandBuffer::CopyRectL(CBitmapContext& aBitmapContext)
+	{
+	TPoint point;
+	TRect rect;	
+	
+	ReadL<TPoint>(point);
+	ReadL<TRect>(rect);
+	
+	aBitmapContext.CopyRect(point, rect);
+	}
+
+void CCommandBuffer::BitBlt1L(CBitmapContext& aBitmapContext)
+	{	
+	TPoint point;
+	TInt handle;
+	
+	ReadL<TPoint>(point);
+	ReadL<TInt>(handle);
+			
+	if(!iBitmapCache->UseL(handle))
+		aBitmapContext.BitBlt(point, iBitmapCache->Resolve(handle));
+	}
+	
+void CCommandBuffer::BitBlt2L(CBitmapContext& aBitmapContext)
+	{
+	TPoint point;
+	TRect sourceRect;
+	TInt handle;
+	
+	ReadL<TPoint>(point);
+	ReadL<TInt>(handle);
+	ReadL<TRect>(sourceRect);
+	
+	if(!iBitmapCache->UseL(handle))
+		aBitmapContext.BitBlt(point, iBitmapCache->Resolve(handle), sourceRect);
+	}
+	
+void CCommandBuffer::BitBltMaskedL(CBitmapContext& aBitmapContext)
+	{
+	TPoint point;
+	TInt bitmapHandle;
+	TRect sourceRect;	
+	TInt maskHandle;
+	TBool invertedMask;
+	
+	ReadL<TPoint>(point);
+	ReadL<TInt>(bitmapHandle);
+	ReadL<TRect>(sourceRect);
+	ReadL<TInt>(maskHandle);
+	ReadL<TBool>(invertedMask);
+	
+	if(!iBitmapCache->UseL(bitmapHandle) && !iBitmapCache->UseL(maskHandle))
+		aBitmapContext.BitBltMasked(point, iBitmapCache->Resolve(bitmapHandle), sourceRect, iBitmapCache->Resolve(maskHandle), invertedMask);	
+	}
+	
+void CCommandBuffer::SetFadedL(CBitmapContext& aBitmapContext)
+	{
+	TBool faded;	
+	ReadL<TBool>(faded);
+
+	aBitmapContext.SetFaded(faded);
+	}
+	
+void CCommandBuffer::SetFadingParametersL(CBitmapContext& aBitmapContext)
+	{
+	TUint8 blackMap;
+	TUint8 whiteMap;
+	
+	ReadL<TUint8>(blackMap);
+	ReadL<TUint8>(whiteMap);
+	aBitmapContext.SetFadingParameters(blackMap, whiteMap);
+	}
+	
+void CCommandBuffer::AlphaBlendBitmapsL(CBitmapContext& aBitmapContext)
+	{
+	TPoint destPoint;
+	TInt srcHandle;
+	TRect sourceRect;
+	TInt alphaHandle;
+	TPoint alphaPoint;
+	
+	ReadL<TPoint>(destPoint);
+	ReadL<TInt>(srcHandle);
+	ReadL<TRect>(sourceRect);
+	ReadL<TInt>(alphaHandle);
+	ReadL<TPoint>(alphaPoint);
+	
+	if(!iBitmapCache->UseL(srcHandle) && !iBitmapCache->UseL(alphaHandle))
+		aBitmapContext.AlphaBlendBitmaps(destPoint, iBitmapCache->Resolve(srcHandle), sourceRect, iBitmapCache->Resolve(alphaHandle), alphaPoint);	
+	}
+	
+void CCommandBuffer::SetOriginL(CBitmapContext& aBitmapContext)
+	{
+	ReadL<TPoint>(iOrigin);
+	aBitmapContext.SetOrigin(iMasterOrigin + iOrigin);
+	
+	}
+	
+void CCommandBuffer::SetDrawModeL(CBitmapContext& aBitmapContext)
+	{
+	CGraphicsContext::TDrawMode drawMode;
+	ReadL<CGraphicsContext::TDrawMode>(drawMode);
+	aBitmapContext.SetDrawMode(drawMode);
+	}
+	
+void CCommandBuffer::SetClippingRectL(CBitmapContext& aBitmapContext)
+	{
+	TRect rect;
+	ReadL<TRect>(rect);
+	rect.Intersection(iMasterClippingRect);
+	rect.Intersection(iDrawSectionRect);
+	aBitmapContext.SetClippingRect(rect);
+	}
+	
+void CCommandBuffer::CancelClippingRect(CBitmapContext& aBitmapContext)
+	{
+	TRect rect = iMasterClippingRect;
+	rect.Intersection(iDrawSectionRect);
+	aBitmapContext.SetClippingRect(rect);
+	}
+
+	
+void CCommandBuffer::Reset(CBitmapContext& aBitmapContext)
+	{
+	aBitmapContext.Reset();
+
+	const TBool isFbsBitGc= aBitmapContext.IsFbsBitGc();
+	if (isFbsBitGc)
+		{
+		TRgb brushColor = KRgbWhite;
+		brushColor.SetAlpha(0); //make transparent
+		aBitmapContext.SetBrushColor(brushColor);
+		}
+	
+	aBitmapContext.SetOrigin(iMasterOrigin);
+	if(iActiveMasterClippingRegion)
+		aBitmapContext.SetClippingRegion(*iActiveMasterClippingRegion);
+	CancelClippingRect(aBitmapContext);
+	iOrigin = TPoint(0,0);
+	iClippingRegion.Clear();
+	iParsedClippingRegionIsSet = EFalse;
+	}
+
+void CCommandBuffer::UseFontL(CBitmapContext& aBitmapContext)
+	{
+	TInt fontHandle;
+	ReadL<TInt>(fontHandle);
+	if(iFontCache->UseL(fontHandle)) return;
+	aBitmapContext.UseFont(iFontCache->Resolve(fontHandle));
+	}
+	
+void CCommandBuffer::DiscardFont(CBitmapContext& aBitmapContext) const
+	{	
+	aBitmapContext.DiscardFont();
+	}
+	
+void CCommandBuffer::SetUnderlineStyleL(CBitmapContext& aBitmapContext)
+	{
+	TFontUnderline underlineStyle;
+	ReadL<TFontUnderline>(underlineStyle);
+	aBitmapContext.SetUnderlineStyle(underlineStyle);
+	}
+	
+void CCommandBuffer::SetStrikethroughStyleL(CBitmapContext& aBitmapContext)
+	{
+	TFontStrikethrough strikethroughStyle;
+	ReadL<TFontStrikethrough>(strikethroughStyle);
+	aBitmapContext.SetStrikethroughStyle(strikethroughStyle);		
+	}
+	
+void CCommandBuffer::SetWordJustificationL(CBitmapContext& aBitmapContext)
+	{
+	TInt excessWidth;
+	TInt numGaps;
+	
+	ReadL<TInt>(excessWidth);
+	ReadL<TInt>(numGaps);
+	aBitmapContext.SetWordJustification(excessWidth, numGaps);
+	}
+	
+void CCommandBuffer::SetCharJustificationL(CBitmapContext& aBitmapContext)
+	{
+	TInt excessWidth;
+	TInt numChars;
+	
+	ReadL<TInt>(excessWidth);
+	ReadL<TInt>(numChars);
+	aBitmapContext.SetCharJustification(excessWidth, numChars);
+	}
+
+void CCommandBuffer::SetPenColorL(CBitmapContext& aBitmapContext)
+	{
+	TRgb color;
+	ReadL<TRgb>(color);
+	
+	aBitmapContext.SetPenColor(color);
+	}
+
+void CCommandBuffer::SetPenStyleL(CBitmapContext& aBitmapContext)
+	{
+	CGraphicsContext::TPenStyle penStyle;
+	ReadL<CGraphicsContext::TPenStyle>(penStyle);
+	
+	aBitmapContext.SetPenStyle(penStyle);			
+	}
+	
+void CCommandBuffer::SetPenSizeL(CBitmapContext& aBitmapContext)
+	{
+	TSize size;
+	ReadL<TSize>(size);
+	
+	aBitmapContext.SetPenSize(size);			
+	}
+	
+void CCommandBuffer::SetBrushColorL(CBitmapContext& aBitmapContext)
+	{
+	TRgb color;
+	ReadL<TRgb>(color);
+	
+	aBitmapContext.SetBrushColor(color);
+	}
+
+void CCommandBuffer::SetBrushStyleL(CBitmapContext& aBitmapContext)
+	{
+	CGraphicsContext::TBrushStyle brushStyle;
+	ReadL<CGraphicsContext::TBrushStyle>(brushStyle);
+	
+	aBitmapContext.SetBrushStyle(brushStyle);		
+	}
+	
+void CCommandBuffer::SetBrushOriginL(CBitmapContext& aBitmapContext)
+	{
+	TPoint point;
+	ReadL<TPoint>(point);
+	
+	aBitmapContext.SetBrushOrigin(point);			
+	}
+	
+void CCommandBuffer::UseBrushPatternL(CBitmapContext& aBitmapContext)
+	{
+	TInt deviceHandle;
+	ReadL<TInt>(deviceHandle);
+	
+	if(iBitmapCache->UseL(deviceHandle)) return;
+	aBitmapContext.UseBrushPattern(iBitmapCache->Resolve(deviceHandle));
+	}
+	
+void CCommandBuffer::DiscardBrushPattern(CBitmapContext& aBitmapContext) const
+	{
+	aBitmapContext.DiscardBrushPattern();
+	}
+
+void CCommandBuffer::MoveToL(CBitmapContext& aBitmapContext)
+	{
+	TPoint point;
+	ReadL<TPoint>(point);
+	
+	aBitmapContext.MoveTo(point);
+	}
+	
+void CCommandBuffer::MoveByL(CBitmapContext& aBitmapContext)
+	{
+	TPoint point;
+	ReadL<TPoint>(point);
+	
+	aBitmapContext.MoveBy(point);
+	}
+	
+void CCommandBuffer::PlotL(CBitmapContext& aBitmapContext)
+	{
+	TPoint point;
+	ReadL<TPoint>(point);
+	
+	aBitmapContext.Plot(point);	
+	}
+	
+void CCommandBuffer::DrawArcL(CBitmapContext& aBitmapContext)
+	{
+	TRect rect;
+	TPoint start;
+	TPoint end;
+	ReadL<TRect>(rect);
+	ReadL<TPoint>(start);
+	ReadL<TPoint>(end);
+	
+	aBitmapContext.DrawArc(rect, start, end);
+	}
+	
+void CCommandBuffer::DrawLineL(CBitmapContext& aBitmapContext)
+	{
+	TPoint point1;
+	TPoint point2;
+	ReadL<TPoint>(point1);
+	ReadL<TPoint>(point2);
+	
+	aBitmapContext.DrawLine(point1, point2);
+	}
+	
+void CCommandBuffer::DrawLineToL(CBitmapContext& aBitmapContext)
+	{
+	TPoint point;
+	ReadL<TPoint>(point);
+	
+	aBitmapContext.DrawLineTo(point);
+	}
+	
+void CCommandBuffer::DrawLineByL(CBitmapContext& aBitmapContext)
+	{
+	TPoint point;
+	ReadL<TPoint>(point);
+	
+	aBitmapContext.DrawLineBy(point);			
+	}
+	
+void CCommandBuffer::DrawPolyLineL(CBitmapContext& aBitmapContext)
+	{	
+	TInt nrOfPoints;
+	ReadL<TInt>(nrOfPoints);
+	
+	CArrayFix<TPoint>* pointList = new (ELeave) CArrayFixFlat<TPoint>(5);
+	CleanupStack::PushL(pointList);
+	for(TInt i = 0; i < nrOfPoints; i++)
+		{
+		TPoint point;
+		ReadL<TPoint>(point);
+		pointList->AppendL(point);
+		}
+	
+	aBitmapContext.DrawPolyLine(pointList);	
+	CleanupStack::PopAndDestroy(pointList);
+	}
+	
+void CCommandBuffer::DrawPieL(CBitmapContext& aBitmapContext)
+	{
+	TRect rect;
+	TPoint start;
+	TPoint end;
+	ReadL<TRect>(rect);
+	ReadL<TPoint>(start);
+	ReadL<TPoint>(end);
+	
+	aBitmapContext.DrawPie(rect, start, end);
+	}
+	
+void CCommandBuffer::DrawEllipseL(CBitmapContext& aBitmapContext)
+	{
+	TRect rect;
+	ReadL<TRect>(rect);
+	
+	aBitmapContext.DrawEllipse(rect);
+	}
+	
+void CCommandBuffer::DrawRectL(CBitmapContext& aBitmapContext)
+	{
+	TRect rect;
+	ReadL<TRect>(rect);
+	
+	aBitmapContext.DrawRect(rect);
+	}
+	
+void CCommandBuffer::DrawRoundRectL(CBitmapContext& aBitmapContext)
+	{
+	TRect rect;
+	TSize ellipse;
+	ReadL<TRect>(rect);
+	ReadL<TSize>(ellipse);
+	
+	aBitmapContext.DrawRoundRect(rect, ellipse);
+	}
+	
+void CCommandBuffer::DrawPolygonL(CBitmapContext& aBitmapContext)
+	{
+	TInt nrOfPoints;
+	ReadL<TInt>(nrOfPoints);
+	
+	CArrayFix<TPoint>* pointList = new (ELeave) CArrayFixFlat<TPoint>(5);
+	CleanupStack::PushL(pointList);
+	for(TInt i = 0; i < nrOfPoints; i++)
+		{
+		TPoint point;
+		ReadL<TPoint>(point);
+		pointList->AppendL(point);
+		}
+		
+	CGraphicsContext::TFillRule fillRule;
+	ReadL<CGraphicsContext::TFillRule>(fillRule);
+	aBitmapContext.DrawPolygon(pointList, fillRule);	
+	CleanupStack::PopAndDestroy(pointList);
+	}
+	
+void CCommandBuffer::DrawBitmap1L(CBitmapContext& aBitmapContext)
+	{
+	TPoint topLeft;
+	TInt bitmapHandle;
+	
+	ReadL<TPoint>(topLeft);
+	ReadL<TInt>(bitmapHandle);
+	
+	if(!iBitmapCache->UseL(bitmapHandle))
+		aBitmapContext.DrawBitmap(topLeft, iBitmapCache->Resolve(bitmapHandle));
+	}
+	
+void CCommandBuffer::DrawBitmap2L(CBitmapContext& aBitmapContext)
+	{
+	TRect destRect;
+	TInt bitmapHandle;
+	
+	ReadL<TRect>(destRect);
+	ReadL<TInt>(bitmapHandle);
+	
+	if(!iBitmapCache->UseL(bitmapHandle))
+		aBitmapContext.DrawBitmap(destRect, iBitmapCache->Resolve(bitmapHandle));
+	}
+	
+void CCommandBuffer::DrawBitmap3L(CBitmapContext& aBitmapContext)
+	{
+	TRect destRect;
+	TRect sourceRect;
+	TInt bitmapHandle;
+	
+	ReadL<TRect>(destRect);
+	ReadL<TInt>(bitmapHandle);
+	ReadL<TRect>(sourceRect);
+	
+	if(!iBitmapCache->UseL(bitmapHandle))
+		aBitmapContext.DrawBitmap(destRect, iBitmapCache->Resolve(bitmapHandle), sourceRect);
+	}
+	
+void CCommandBuffer::DrawBitmapMaskedL(CBitmapContext& aBitmapContext)
+	{
+	TRect destRect;
+	TRect sourceRect;
+	TInt bitmapHandle;
+	TInt maskHandle;
+	TBool invertedMask;
+	
+	ReadL<TRect>(destRect);
+	ReadL<TInt>(bitmapHandle);
+	ReadL<TRect>(sourceRect);
+	ReadL<TInt>(maskHandle);
+	ReadL<TBool>(invertedMask);
+	
+	if(!iBitmapCache->UseL(bitmapHandle) && !iBitmapCache->UseL(maskHandle))
+		aBitmapContext.DrawBitmapMasked(destRect, iBitmapCache->Resolve(bitmapHandle), sourceRect, iBitmapCache->Resolve(maskHandle), invertedMask);
+	}
+
+void CCommandBuffer::DrawText1L(CBitmapContext& aBitmapContext)
+	{
+	TPoint point;
+
+	TPtrC16 text;
+	ReadTextLC(text);
+
+	ReadL<TPoint>(point);
+	
+	aBitmapContext.DrawText(text, point);
+	CleanupStack::PopAndDestroy(); // ReadTextLC
+	}
+
+void CCommandBuffer::DrawText2L(CBitmapContext& aBitmapContext)
+	{
+	TRect box;
+	TInt baselineOffset;
+	CGraphicsContext::TTextAlign horiz;
+	TInt leftMargin;
+	
+	TPtrC16 text;
+	ReadTextLC(text);
+	
+	ReadL<TRect>(box);
+	ReadL<TInt>(baselineOffset);
+	ReadL<CGraphicsContext::TTextAlign>(horiz);
+	ReadL<TInt>(leftMargin);
+	
+	aBitmapContext.DrawText(text, box, baselineOffset, horiz, leftMargin);	
+	CleanupStack::PopAndDestroy(); // ReadTextLC	
+	}
+	
+void CCommandBuffer::DrawText3L(CBitmapContext& aBitmapContext)
+	{	
+	TPoint point;
+	CGraphicsContext::TDrawTextParam param;
+
+	TPtrC16 text;
+	ReadTextLC(text);
+
+	ReadL<TPoint>(point);
+	ReadL<CGraphicsContext::TDrawTextParam>(param);
+	
+	aBitmapContext.DrawText(text, point, param);	
+	CleanupStack::PopAndDestroy(); //ReadTextLC
+	}
+
+void CCommandBuffer::MapColorsL(CBitmapContext& aBitmapContext)
+	{
+	TRect rect;
+	TInt nrOfPairs;
+	ReadL<TRect>(rect);
+	ReadL<TInt>(nrOfPairs);
+	
+	TRgb* colorList = new (ELeave) TRgb [nrOfPairs*2]; // Every pair has two colors
+	CleanupArrayDeletePushL(colorList);
+	for(TInt i = 0; i < nrOfPairs; i++)
+		{
+		TRgb color;
+		ReadL<TRgb>(color);
+		colorList[i] = color;
+		
+		ReadL<TRgb>(color);
+		colorList[i+1] = color;		
+		}
+		
+	TBool mapForwards;
+	ReadL<TBool>(mapForwards);		
+	
+	aBitmapContext.MapColors(rect, colorList, nrOfPairs, mapForwards);	
+	CleanupStack::PopAndDestroy(colorList);
+	}
+
+void CCommandBuffer::SetClippingRegionL(CBitmapContext& aBitmapContext)
+	{
+	TInt nrOfRects;
+	ReadL<TInt>(nrOfRects);
+	
+	TRect rect;
+	iClippingRegion.Clear();
+	for(TInt i = 0; i < nrOfRects; i++)
+		{		
+		ReadL<TRect>(rect);
+//		rect.Move(iMasterOrigin);
+		iClippingRegion.AddRect(rect);
+		}
+	
+	iParsedClippingRegionIsSet = ETrue;
+	if(iActiveMasterClippingRegion)
+		iClippingRegion.Intersect(*iActiveMasterClippingRegion);
+	
+	aBitmapContext.SetClippingRegion(iClippingRegion);
+	}
+	
+void CCommandBuffer::CancelClippingRegion(CBitmapContext& aBitmapContext)
+	{
+	iClippingRegion.Clear();
+	iParsedClippingRegionIsSet = EFalse;
+	if(iActiveMasterClippingRegion)
+		aBitmapContext.SetClippingRegion(*iActiveMasterClippingRegion);	
+	else
+		aBitmapContext.CancelClippingRegion();
+	}
+
+void CCommandBuffer::DrawTextVertical1L(CBitmapContext& aBitmapContext)
+	{
+	TPoint point;
+	TBool up;
+
+	TPtrC16 text;
+	ReadTextLC(text);
+
+	ReadL<TPoint>(point);
+	ReadL<TBool>(up);
+	
+	aBitmapContext.DrawTextVertical(text, point, up);	
+	CleanupStack::PopAndDestroy(); // ReadTextLC
+	}
+	
+void CCommandBuffer::DrawTextVertical2L(CBitmapContext& aBitmapContext)
+	{
+	TRect box;
+	TInt baselineOffset;
+	TBool up;
+	CGraphicsContext::TTextAlign vertical;
+	TInt margin;
+
+	TPtrC16 text;
+	ReadTextLC(text);
+
+	ReadL<TRect>(box);
+	ReadL<TInt>(baselineOffset);
+	ReadL<TBool>(up);
+	ReadL<CGraphicsContext::TTextAlign>(vertical);
+	ReadL<TInt>(margin);
+	
+	aBitmapContext.DrawTextVertical(text, box, baselineOffset, up, vertical, margin);	
+	CleanupStack::PopAndDestroy(); //ReadTextLC
+	}
+
+void CCommandBuffer::DrawWsGraphic1L(const MWsGraphicResolver& aWsGraphicResolver)
+	{
+	TInt id;
+	TBool isUid;
+	TRect rect;
+	
+	ReadL<TInt>(id);
+	ReadL<TBool>(isUid);
+	ReadL<TRect>(rect);
+	
+	aWsGraphicResolver.DrawWsGraphic(id,isUid,rect,KNullDesC8());
+	}
+	
+void CCommandBuffer::DrawWsGraphic2L(const MWsGraphicResolver& aWsGraphicResolver)
+	{
+	TInt id;
+	TBool isUid;
+	TRect rect;
+	
+	ReadL<TInt>(id);
+	ReadL<TBool>(isUid);
+	ReadL<TRect>(rect);	
+	TPtrC8 text8;
+	ReadTextLC(text8);
+	
+	aWsGraphicResolver.DrawWsGraphic(id,isUid,rect,text8);	
+	CleanupStack::PopAndDestroy(); //ReadTextLC
+	}
+
+void CCommandBuffer::SetShadowColorL(CBitmapContext& aBitmapContext)
+	{
+	TRgb shadowColor;
+	ReadL<TRgb>(shadowColor);
+
+	aBitmapContext.SetShadowColor(shadowColor);
+	}