windowing/windowserver/nga/remotegc/RemoteGc.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nga/remotegc/RemoteGc.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,829 @@
+// 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/remotegc.h>
+#include <graphics/commandbuffer.h>
+#include <graphics/wsdrawresource.h>
+#include <graphics/gdi/gdiconsts.h>
+#include <graphics/gdi/gdistructs.h>
+#include "graphics/windowserverconstants.h"
+
+#define KDefaultShadowColor KRgbGray
+
+class CRemoteGc::CPimpl : public CBase, public MWsDrawResource
+	{
+public:
+	CPimpl(CRemoteGc& aGc) : iGc(aGc) {}
+public: //from MWsDrawResource
+	void DrawResource(const TPoint& aPos, const RWsDrawableSource& aSource, CWindowGc::TGraphicsRotation aRotation=CWindowGc::EGraphicsRotationNone)
+		{
+		iGc.DrawResource(aPos, aSource, aRotation);
+		}
+	void DrawResource(const TRect& aDestRect, const RWsDrawableSource& aSource, CWindowGc::TGraphicsRotation aRotation=CWindowGc::EGraphicsRotationNone)
+		{
+		iGc.DrawResource(aDestRect, aSource, aRotation);
+		}
+	void DrawResource(const TRect& aDestRect, const RWsDrawableSource& aSource, const TRect& aSrcRect, CWindowGc::TGraphicsRotation aRotation=CWindowGc::EGraphicsRotationNone)
+		{
+		iGc.DrawResource(aDestRect, aSource, aSrcRect, aRotation);
+		}
+	void DrawResource(const TRect& aDestRect, const RWsDrawableSource& aSource, const TDesC8& aParam)
+		{
+		iGc.DrawResource(aDestRect, aSource, aParam);
+		}
+private:
+	CRemoteGc& iGc;
+	};
+
+/**
+Creates a new remotegc.
+
+@param aDevice The windowserver screendevice to use.
+@param aCommandBufferObserver Pointer to a commandbufferobserver.
+@return A pointer to a new instance of CRemoteGc.
+*/
+EXPORT_C CRemoteGc* CRemoteGc::NewL(CWsScreenDevice* aDevice)
+	{
+	CRemoteGc* remoteGc = new (ELeave) CRemoteGc(aDevice);
+	CleanupStack::PushL(remoteGc);
+	remoteGc->ConstructL();
+	CleanupStack::Pop(remoteGc);
+	return remoteGc;
+	}
+
+CRemoteGc::CRemoteGc(CWsScreenDevice* aDevice) : CWindowGc(aDevice), iCommandBufferObserver(NULL), iFont(NULL), iShadowColor(KDefaultShadowColor)
+	{	
+	}
+	
+EXPORT_C CRemoteGc::~CRemoteGc()
+	{
+	delete iCommandBuffer;
+	delete iRemoteGcPimpl;
+	}
+	
+void CRemoteGc::ConstructL()
+	{
+	User::LeaveIfError(CWindowGc::Construct());
+	iCommandBuffer = CCommandBuffer::NewL();
+	iRemoteGcPimpl = new(ELeave) CPimpl(*this);
+	}
+	
+EXPORT_C void CRemoteGc::SetCommandBufferObserver(MCommandBufferObserver* aCommandBufferObserver)
+	{
+	iCommandBufferObserver = aCommandBufferObserver;
+	}
+
+/**
+Resets the commandbuffer.
+*/
+EXPORT_C void CRemoteGc::ResetCommandBuffer()
+	{
+	iCommandBuffer->Reset();
+	}
+
+/**
+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.
+*/	
+EXPORT_C void CRemoteGc::ExternalizeL(RWsGraphicMsgBuf& aMsgBuf, TBool aEntireBuffer)
+	{
+	return iCommandBuffer->ExternalizeL(aMsgBuf, aEntireBuffer);
+	}
+
+/**
+Prepares the remotegc to be drawn to.
+
+@param aRect The rect to be drawn.
+*/
+EXPORT_C void CRemoteGc::BeginDraw(const TRect& aRect)
+	{
+	iDrawRect = aRect;
+	iBoundingRect = TRect();
+	iHasBitmapCommand = EFalse;
+	iCommandBuffer->Prepare(aRect);
+	}
+ 
+/**
+Finishes the current redraw.
+This method should be called when drawing to the remotegc is complete.
+*/
+EXPORT_C void CRemoteGc::EndDraw()
+	{
+	iBoundingRect.Intersection(iDrawRect);
+	const TInt err = iCommandBuffer->Finish(iDrawRect, iBoundingRect, iHasBitmapCommand);
+
+	if(iCommandBufferObserver && !err)
+		iCommandBufferObserver->CommandBufferUpdated(iDrawRect, iBoundingRect); 
+ 	}
+
+void CRemoteGc::Activate(RDrawableWindow &aDevice)
+	{
+	BeginDraw(aDevice.GetDrawRect());
+	CWindowGc::Activate(aDevice);
+	}
+	
+void CRemoteGc::Deactivate()
+	{	
+	CWindowGc::Deactivate();
+	iFont = NULL;
+	iShadowColor = KDefaultShadowColor;
+	EndDraw();
+	}
+	
+void CRemoteGc::Clear()
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandClear);
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+	
+void CRemoteGc::Clear(const TRect& aRect)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandClearRect);
+	iCommandBuffer->Write<TRect>(aRect);
+	iBoundingRect.BoundingRect(aRect);
+	}
+	
+void CRemoteGc::CopyRect(const TPoint &anOffset, const TRect &aRect)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandCopyRect);
+	iCommandBuffer->Write<TPoint>(anOffset);
+	iCommandBuffer->Write<TRect>(aRect);
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+
+void CRemoteGc::BitBlt(const TPoint &aPoint, const CFbsBitmap *aBitmap)
+	{
+	__ASSERT_DEBUG(aBitmap, User::Invariant());
+	if(aBitmap)
+		{
+		iCommandBuffer->Write<TDrawCode>(ECommandBitBlt1);
+		iCommandBuffer->Write<TPoint>(aPoint);
+		iCommandBuffer->Write<TInt>(aBitmap->Handle());
+		iBoundingRect.BoundingRect(TRect(aPoint, aBitmap->SizeInPixels()));
+		iHasBitmapCommand = ETrue;
+		}
+	}
+	
+void CRemoteGc::BitBlt(const TPoint &aDestination, const CFbsBitmap *aBitmap, const TRect &aSource)
+	{
+	__ASSERT_DEBUG(aBitmap, User::Invariant());
+	if(aBitmap)
+		{	
+		iCommandBuffer->Write<TDrawCode>(ECommandBitBlt2);
+		iCommandBuffer->Write<TPoint>(aDestination);
+		iCommandBuffer->Write<TInt>(aBitmap->Handle());
+		iCommandBuffer->Write<TRect>(aSource);
+		iBoundingRect.BoundingRect(TRect(aDestination, aSource.Size()));
+		iHasBitmapCommand = ETrue;
+		}
+	}
+	
+void CRemoteGc::BitBltMasked(const TPoint& aPoint, const CFbsBitmap* aBitmap, const TRect& aSourceRect, const CFbsBitmap* aMaskBitmap, TBool aInvertMask)
+	{
+	__ASSERT_DEBUG(aBitmap && aMaskBitmap, User::Invariant());
+	if(aBitmap && aMaskBitmap)
+		{
+		iCommandBuffer->Write<TDrawCode>(ECommandBitBltMasked);
+		iCommandBuffer->Write<TPoint>(aPoint);
+		iCommandBuffer->Write<TInt>(aBitmap->Handle());
+		iCommandBuffer->Write<TRect>(aSourceRect);
+		iCommandBuffer->Write<TInt>(aMaskBitmap->Handle());
+		iCommandBuffer->Write<TBool>(aInvertMask);
+		iBoundingRect.BoundingRect(TRect(aPoint, aSourceRect.Size()));
+		iHasBitmapCommand = ETrue;
+		}
+	}
+
+void CRemoteGc::BitBlt(const TPoint &aPoint, const CWsBitmap *aBitmap)
+	{
+	BitBlt(aPoint, reinterpret_cast<const CFbsBitmap*>(aBitmap));		
+	}
+	
+void CRemoteGc::BitBlt(const TPoint &aDestination, const CWsBitmap *aBitmap, const TRect &aSource)
+	{
+	BitBlt(aDestination, reinterpret_cast<const CFbsBitmap*>(aBitmap), aSource);
+	}
+	
+void CRemoteGc::BitBltMasked(const TPoint& aPoint, const CWsBitmap *aBitmap, const TRect& aSourceRect, const CWsBitmap *aMaskBitmap, TBool aInvertMask)
+	{		
+	BitBltMasked(aPoint, reinterpret_cast<const CFbsBitmap*>(aBitmap), aSourceRect, reinterpret_cast<const CFbsBitmap*>(aMaskBitmap), aInvertMask);
+	}
+
+void CRemoteGc::SetFaded(TBool /*aFaded*/)
+	{
+	// deprecated
+	}
+	
+void CRemoteGc::SetFadingParameters(TUint8 /*aBlackMap*/,TUint8 /*aWhiteMap*/)
+	{
+	// deprecated
+	}
+	
+TInt CRemoteGc::AlphaBlendBitmaps(const TPoint& aDestPt, const CFbsBitmap* aSrcBmp, const TRect& aSrcRect, const CFbsBitmap* aAlphaBmp, const TPoint& aAlphaPt)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandAlphaBlendBitmaps);
+	iCommandBuffer->Write<TPoint>(aDestPt);
+	iCommandBuffer->Write<TInt>(aSrcBmp->Handle());
+	iCommandBuffer->Write<TRect>(aSrcRect);
+	iCommandBuffer->Write<TInt>(aAlphaBmp->Handle());
+	iCommandBuffer->Write<TPoint>(aAlphaPt);
+	iBoundingRect.BoundingRect(iDrawRect);
+	iHasBitmapCommand = ETrue;
+	return KErrNone;
+	}
+	
+TInt CRemoteGc::AlphaBlendBitmaps(const TPoint& aDestPt, const CWsBitmap* aSrcBmp, const TRect& aSrcRect, const CWsBitmap* aAlphaBmp, const TPoint& aAlphaPt)
+	{
+	return AlphaBlendBitmaps(aDestPt, reinterpret_cast<const CFbsBitmap*>(aSrcBmp), aSrcRect, reinterpret_cast<const CFbsBitmap*>(aAlphaBmp), aAlphaPt);
+	}
+
+void CRemoteGc::SetOrigin(const TPoint &aPoint)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandSetOrigin);
+	iCommandBuffer->Write<TPoint>(aPoint);
+	}
+	
+void CRemoteGc::SetDrawMode(TDrawMode aDrawingMode)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandSetDrawMode);
+	iCommandBuffer->Write<TDrawMode>(aDrawingMode);		
+	}
+	
+void CRemoteGc::SetClippingRect(const TRect& aRect)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandSetClippingRect);
+	iCommandBuffer->Write<TRect>(aRect);		
+	}
+	
+void CRemoteGc::CancelClippingRect()
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandCancelClippingRect);		
+	}
+	
+void CRemoteGc::Reset()
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandReset);
+	iFont = NULL;
+	iShadowColor = KDefaultShadowColor;
+	}
+	
+void CRemoteGc::UseFont(const CFont *aFont)
+	{
+	if (iFont!=(CFbsFont *)aFont)
+		{
+		iFont=(CFbsFont *)aFont;
+		iCommandBuffer->Write<TDrawCode>(ECommandUseFont);
+		iCommandBuffer->Write<TInt>(((CFbsFont*)aFont)->Handle());
+		}
+	}
+	
+void CRemoteGc::DiscardFont()
+	{
+	iFont = NULL;
+	iCommandBuffer->Write<TDrawCode>(ECommandDiscardFont);
+	}
+	
+void CRemoteGc::SetUnderlineStyle(TFontUnderline aUnderlineStyle)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandSetUnderlineStyle);
+	iCommandBuffer->Write<TFontUnderline>(aUnderlineStyle);
+	}
+	
+void CRemoteGc::SetStrikethroughStyle(TFontStrikethrough aStrikethroughStyle)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandSetStrikethroughStyle);
+	iCommandBuffer->Write<TFontStrikethrough>(aStrikethroughStyle);
+	}
+	
+void CRemoteGc::SetWordJustification(TInt aExcessWidth, TInt aNumGaps)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandSetWordJustification);
+	iCommandBuffer->Write<TInt>(aExcessWidth);
+	iCommandBuffer->Write<TInt>(aNumGaps);
+	}
+	
+void CRemoteGc::SetCharJustification(TInt aExcessWidth, TInt aNumChars)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandSetCharJustification);
+	iCommandBuffer->Write<TInt>(aExcessWidth);
+	iCommandBuffer->Write<TInt>(aNumChars);	
+	}
+
+void CRemoteGc::SetPenColor(const TRgb &aColor)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandSetPenColor);
+	iCommandBuffer->Write<TRgb>(aColor);		
+	}
+	
+void CRemoteGc::SetPenStyle(TPenStyle aPenStyle)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandSetPenStyle);
+	iCommandBuffer->Write<TPenStyle>(aPenStyle);			
+	}
+	
+void CRemoteGc::SetPenSize(const TSize& aSize)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandSetPenSize);
+	iCommandBuffer->Write<TSize>(aSize);			
+	}
+
+void CRemoteGc::SetBrushColor(const TRgb &aColor)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandSetBrushColor);
+	iCommandBuffer->Write<TRgb>(aColor);
+	}
+
+void CRemoteGc::SetBrushStyle(TBrushStyle aBrushStyle)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandSetBrushStyle);
+	iCommandBuffer->Write<TBrushStyle>(aBrushStyle);		
+	}
+	
+void CRemoteGc::SetBrushOrigin(const TPoint &aOrigin)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandSetBrushOrigin);
+	iCommandBuffer->Write<TPoint>(aOrigin);			
+	}
+	
+void CRemoteGc::UseBrushPattern(const CFbsBitmap *aDevice)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandUseBrushPattern);
+	iCommandBuffer->Write<TInt>(aDevice->Handle());		
+	}
+	
+void CRemoteGc::DiscardBrushPattern()
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDiscardBrushPattern);	
+	}
+
+void CRemoteGc::MoveTo(const TPoint &aPoint)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandMoveTo);
+	iCommandBuffer->Write<TPoint>(aPoint);
+	}
+	
+void CRemoteGc::MoveBy(const TPoint &aPoint)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandMoveBy);
+	iCommandBuffer->Write<TPoint>(aPoint);
+	}
+	
+void CRemoteGc::Plot(const TPoint &aPoint)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandPlot);
+	iCommandBuffer->Write<TPoint>(aPoint);
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+	
+void CRemoteGc::DrawArc(const TRect &aRect,const TPoint &aStart,const TPoint &aEnd)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawArc);
+	iCommandBuffer->Write<TRect>(aRect);
+	iCommandBuffer->Write<TPoint>(aStart);
+	iCommandBuffer->Write<TPoint>(aEnd);
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+	
+void CRemoteGc::DrawLine(const TPoint &aPoint1,const TPoint &aPoint2)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawLine);
+	iCommandBuffer->Write<TPoint>(aPoint1);
+	iCommandBuffer->Write<TPoint>(aPoint2);
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+	
+void CRemoteGc::DrawLineTo(const TPoint &aPoint)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawLineTo);
+	iCommandBuffer->Write<TPoint>(aPoint);
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+	
+void CRemoteGc::DrawLineBy(const TPoint &aPoint)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawLineBy);
+	iCommandBuffer->Write<TPoint>(aPoint);
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+
+void CRemoteGc::DrawPolyLine(const CArrayFix<TPoint> *aPointList)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawPolyLine);
+	iCommandBuffer->Write<TInt>(aPointList->Count()); // Write number of points
+	
+	const TInt count = aPointList->Count();
+	for(TInt i = 0; i < count; i++)	
+		{
+		iCommandBuffer->Write<TPoint>(aPointList->At(i));
+		}
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+
+void CRemoteGc::DrawPolyLine(const TPoint* aPointList, TInt aNumPoints)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawPolyLine);
+	iCommandBuffer->Write<TInt>(aNumPoints); // Write number of points
+	
+	for(TInt i = 0; i < aNumPoints; i++)	
+		{
+		iCommandBuffer->Write<TPoint>(aPointList[i]);
+		}
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+
+void CRemoteGc::DrawPie(const TRect &aRect,const TPoint &aStart,const TPoint &aEnd)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawPie);
+	iCommandBuffer->Write<TRect>(aRect);
+	iCommandBuffer->Write<TPoint>(aStart);
+	iCommandBuffer->Write<TPoint>(aEnd);
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+	
+void CRemoteGc::DrawEllipse(const TRect &aRect)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawEllipse);
+	iCommandBuffer->Write<TRect>(aRect);
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+	
+void CRemoteGc::DrawRect(const TRect &aRect)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawRect);
+	iCommandBuffer->Write<TRect>(aRect);
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+	
+void CRemoteGc::DrawRoundRect(const TRect &aRect,const TSize &aEllipse)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawRoundRect);
+	iCommandBuffer->Write<TRect>(aRect);
+	iCommandBuffer->Write<TSize>(aEllipse);
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+
+TInt CRemoteGc::DrawPolygon(const CArrayFix<TPoint> *aPointList, TFillRule aFillRule)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawPolygon);
+	iCommandBuffer->Write<TInt>(aPointList->Count()); // Write number of points
+	
+	for(TInt i = 0; i < aPointList->Count(); i++)	
+		{
+		iCommandBuffer->Write<TPoint>(aPointList->At(i));
+		}
+		
+	iCommandBuffer->Write<TFillRule>(aFillRule);
+	iBoundingRect.BoundingRect(iDrawRect);
+	return KErrNone;
+	}
+	
+TInt CRemoteGc::DrawPolygon(const TPoint* aPointList, TInt aNumPoints, TFillRule aFillRule)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawPolygon);
+	iCommandBuffer->Write<TInt>(aNumPoints); // Write number of points
+	
+	for(TInt i = 0; i < aNumPoints; i++)	
+		{
+		iCommandBuffer->Write<TPoint>(aPointList[i]);
+		}
+		
+	iCommandBuffer->Write<TFillRule>(aFillRule);
+	iBoundingRect.BoundingRect(iDrawRect);
+	return KErrNone;
+	}
+
+void CRemoteGc::DrawBitmap(const TPoint &aTopLeft, const CFbsBitmap *aDevice)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawBitmap1);
+	iCommandBuffer->Write<TPoint>(aTopLeft);
+	iCommandBuffer->Write<TInt>(aDevice->Handle());
+	iBoundingRect.BoundingRect(TRect(aTopLeft, aDevice->SizeInPixels()));
+	iHasBitmapCommand = ETrue;
+	}
+	
+void CRemoteGc::DrawBitmap(const TRect &aDestRect, const CFbsBitmap *aDevice)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawBitmap2);
+	iCommandBuffer->Write<TRect>(aDestRect);
+	iCommandBuffer->Write<TInt>(aDevice->Handle());
+	iBoundingRect.BoundingRect(aDestRect);
+	iHasBitmapCommand = ETrue;
+	}
+	
+void CRemoteGc::DrawBitmap(const TRect &aDestRect, const CFbsBitmap *aDevice, const TRect &aSourceRect)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawBitmap3);
+	iCommandBuffer->Write<TRect>(aDestRect);
+	iCommandBuffer->Write<TInt>(aDevice->Handle());
+	iCommandBuffer->Write<TRect>(aSourceRect);
+	iBoundingRect.BoundingRect(aDestRect);
+	iHasBitmapCommand = ETrue;
+	}
+	
+void CRemoteGc::DrawBitmapMasked(const TRect& aDestRect, const CFbsBitmap* aBitmap, const TRect& aSourceRect, const CFbsBitmap* aMaskBitmap, TBool aInvertMask)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawBitmapMasked);
+	iCommandBuffer->Write<TRect>(aDestRect);
+	iCommandBuffer->Write<TInt>(aBitmap->Handle());
+	iCommandBuffer->Write<TRect>(aSourceRect);
+	iCommandBuffer->Write<TInt>(aMaskBitmap->Handle());
+	iCommandBuffer->Write<TBool>(aInvertMask);
+	iBoundingRect.BoundingRect(aDestRect);
+	iHasBitmapCommand = ETrue;
+	}
+	
+void CRemoteGc::DrawBitmapMasked(const TRect& aDestRect, const CWsBitmap* aBitmap, const TRect& aSourceRect, const CWsBitmap* aMaskBitmap, TBool aInvertMask)
+	{
+	DrawBitmapMasked(aDestRect, reinterpret_cast<const CFbsBitmap*>(aBitmap), aSourceRect, reinterpret_cast<const CFbsBitmap*>(aMaskBitmap), aInvertMask);
+	}
+
+void CRemoteGc::DrawText(const TDesC &aBuf,const TPoint &aPos)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawText1);
+	iCommandBuffer->WriteText(aBuf);
+	iCommandBuffer->Write<TPoint>(aPos);
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+
+void CRemoteGc::DrawText(const TDesC &aBuf, const TRect &aBox, TInt aBaselineOffset, TTextAlign aHoriz, TInt aLeftMrg)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawText2);
+	iCommandBuffer->WriteText(aBuf);
+	iCommandBuffer->Write<TRect>(aBox);
+	iCommandBuffer->Write<TInt>(aBaselineOffset);
+	iCommandBuffer->Write<TTextAlign>(aHoriz);
+	iCommandBuffer->Write<TInt>(aLeftMrg);
+	iBoundingRect.BoundingRect(aBox);
+	}
+	
+void CRemoteGc::DrawText(const TDesC& aText, const TPoint& aPosition, const TDrawTextParam& aParam)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawText3);
+	iCommandBuffer->WriteText(aText);
+	iCommandBuffer->Write<TPoint>(aPosition);
+	iCommandBuffer->Write<TDrawTextParam>(aParam);
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+
+void CRemoteGc::MapColors(const TRect& /*aRect*/, const TRgb* /*aColors*/, TInt /*aNumPairs*/, TBool /*aMapForwards*/)
+	{
+	//deprecated
+	}
+
+TInt CRemoteGc::SetClippingRegion(const TRegion &aRegion)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandSetClippingRegion);
+	
+	const TInt count = aRegion.Count();
+	iCommandBuffer->Write<TInt>(count);
+	
+	for(TInt i = 0; i < count; i++)	
+		{
+		iCommandBuffer->Write<TRect>(aRegion.RectangleList()[i]);
+		}
+		
+	return KErrNone;
+	}
+	
+void CRemoteGc::CancelClippingRegion()
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandCancelClippingRegion);
+	}
+	
+void CRemoteGc::DrawTextVertical(const TDesC& aText, const TPoint& aPos, TBool aUp)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawTextVertical1);
+	iCommandBuffer->WriteText(aText);
+	iCommandBuffer->Write<TPoint>(aPos);	
+	iCommandBuffer->Write<TBool>(aUp);
+	iBoundingRect.BoundingRect(iDrawRect);
+	}
+	
+void CRemoteGc::DrawTextVertical(const TDesC& aText, const TRect& aBox, TInt aBaselineOffset, TBool aUp, TTextAlign aVert, TInt aMargin)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawTextVertical2);
+	iCommandBuffer->WriteText(aText);
+	iCommandBuffer->Write<TRect>(aBox);
+	iCommandBuffer->Write<TInt>(aBaselineOffset);
+	iCommandBuffer->Write<TBool>(aUp);
+	iCommandBuffer->Write<TTextAlign>(aVert);
+	iCommandBuffer->Write<TInt>(aMargin);
+	iBoundingRect.BoundingRect(aBox);
+	}
+	
+void CRemoteGc::DrawWsGraphic(const TWsGraphicId& aId,const TRect& aDestRect)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawWsGraphic1);
+	iCommandBuffer->Write<TInt>(aId.IsUid()? aId.Uid().iUid: aId.Id());
+	iCommandBuffer->Write<TBool>(aId.IsUid());
+	iCommandBuffer->Write<TRect>(aDestRect);
+	iBoundingRect.BoundingRect(aDestRect);
+	}
+	
+void CRemoteGc::DrawWsGraphic(const TWsGraphicId& aId,const TRect& aDestRect,const TDesC8& aData)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawWsGraphic2);
+	iCommandBuffer->Write<TInt>(aId.IsUid()? aId.Uid().iUid: aId.Id());
+	iCommandBuffer->Write<TBool>(aId.IsUid());
+	iCommandBuffer->Write<TRect>(aDestRect);
+	iCommandBuffer->WriteText(aData);
+	iBoundingRect.BoundingRect(aDestRect);
+	}
+
+void CRemoteGc::SetDitherOrigin(const TPoint& /*aPoint*/) //deprecated
+	{
+	// do nothing, does not apply to CBitmapContext which CCommandBuffer is using
+	}
+
+void CRemoteGc::SetOpaque(TBool /*aDrawOpaque*/)	// deprecated
+	{
+	// overrides to prevent calling CWindowGc::SetOpaque, it's specific to how wserv blends windows content
+	}
+
+TInt CRemoteGc::APIExtension(TUid aUid, TAny*& aOutput, TAny* aInput)
+	{
+	if (aUid == KGetUnderlineMetrics)
+		{		
+		return APIExGetUnderlineMetrics(aOutput);	
+		}
+	else if (aUid == KSetShadowColor)
+		{
+		return APIExSetShadowColor(aInput);
+		}
+	else if (aUid == KDrawTextInContextUid)
+		{
+		TDrawTextInContextInternal* contextParam = (TDrawTextInContextInternal*)aInput;
+		return APIExDrawText(contextParam->iText, &contextParam->iParam, contextParam->iPosition);
+		}
+	else if (aUid == KDrawBoxTextInContextUid)
+		{
+		TDrawTextInContextInternal* contextParam = (TDrawTextInContextInternal*)aInput;
+		return APIExDrawText(contextParam->iText,&contextParam->iParam,contextParam->iBox,contextParam->iBaselineOffset,contextParam->iAlign,contextParam->iMargin);
+		}
+	else if (aUid == KDrawTextInContextVerticalUid)
+		{
+		TDrawTextInContextInternal* contextParam = (TDrawTextInContextInternal*)aInput;
+		return APIExDrawTextVertical(contextParam->iText, &contextParam->iParam, contextParam->iPosition,contextParam->iUp);
+		}
+	else if (aUid == KDrawBoxTextInContextVerticalUid)
+		{
+		TDrawTextInContextInternal* contextParam = (TDrawTextInContextInternal*)aInput;
+		return APIExDrawTextVertical(contextParam->iText,&contextParam->iParam,contextParam->iBox,contextParam->iBaselineOffset,contextParam->iUp,contextParam->iAlign,contextParam->iMargin);
+		}
+	else if (aUid == KApiExtensionInterfaceUid)
+		{
+		return APIExInterface(aOutput, *static_cast<TUid*>(aInput));
+		}
+	/* Future cases may be placed here later.*/
+	else
+		{
+		return CBitmapContext::APIExtension(aUid, aOutput, aInput);
+		}
+	}
+
+TInt CRemoteGc::APIExGetUnderlineMetrics(TAny*& aOutput)
+	{
+	const TInt width = Max(iFont->HeightInPixels() / 10,1);
+	TTwoTInt* ptr = (TTwoTInt*)aOutput;
+	ptr->iTop = 1 + width / 2;
+	ptr->iBottom = (ptr->iTop) + width;
+	return KErrNone;
+	}
+
+TInt CRemoteGc::APIExSetShadowColor(TAny* aShadowColor)
+	{
+	const TRgb shadowColor = *(reinterpret_cast<TRgb*> (aShadowColor));
+	iCommandBuffer->Write<TDrawCode>(ECommandSetShadowColor);
+	iCommandBuffer->Write<TRgb>(shadowColor);
+	iShadowColor = shadowColor;
+	return KErrNone;
+	}
+
+TInt CRemoteGc::APIExGetShadowColor(TAny*& aOutput)
+	{
+	TRgb* ptr = (TRgb*)aOutput;
+	ptr->SetInternal(iShadowColor.Internal());
+	return KErrNone;
+	}
+
+TInt CRemoteGc::APIExDrawText(const TDesC &aBuf,const TTextParameters* aParam,const TPoint &aPos)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawText4);
+	iCommandBuffer->WriteText(aBuf);
+	iCommandBuffer->Write<TTextParameters>(*aParam);
+	iCommandBuffer->Write<TPoint>(aPos);
+	iBoundingRect.BoundingRect(iDrawRect);
+	return KErrNone;
+	}
+
+TInt CRemoteGc::APIExDrawText(const TDesC &aBuf,const TTextParameters* aParam,const TRect &aBox,TInt aBaselineOffset,TTextAlign aHoriz,TInt aLeftMrg)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawText5);
+	iCommandBuffer->WriteText(aBuf);
+	iCommandBuffer->Write<TTextParameters>(*aParam);
+	iCommandBuffer->Write<TRect>(aBox);
+	iCommandBuffer->Write<TInt>(aBaselineOffset);
+	iCommandBuffer->Write<TTextAlign>(aHoriz);
+	iCommandBuffer->Write<TInt>(aLeftMrg);
+	iBoundingRect.BoundingRect(aBox);
+	return KErrNone;
+	}
+
+TInt CRemoteGc::APIExDrawTextVertical(const TDesC& aText,const TTextParameters* aParam,const TPoint& aPos,TBool aUp)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawTextVertical3);
+	iCommandBuffer->WriteText(aText);
+	iCommandBuffer->Write<TTextParameters>(*aParam);
+	iCommandBuffer->Write<TPoint>(aPos);	
+	iCommandBuffer->Write<TBool>(aUp);
+	iBoundingRect.BoundingRect(iDrawRect);
+	return KErrNone;
+	}
+
+TInt CRemoteGc::APIExDrawTextVertical(const TDesC& aText,const TTextParameters* aParam,const TRect& aBox,TInt aBaselineOffset,TBool aUp,TTextAlign aVert,TInt aMargin)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawTextVertical4);
+	iCommandBuffer->WriteText(aText);
+	iCommandBuffer->Write<TTextParameters>(*aParam);
+	iCommandBuffer->Write<TRect>(aBox);
+	iCommandBuffer->Write<TInt>(aBaselineOffset);
+	iCommandBuffer->Write<TBool>(aUp);
+	iCommandBuffer->Write<TTextAlign>(aVert);
+	iCommandBuffer->Write<TInt>(aMargin);
+	iBoundingRect.BoundingRect(aBox);
+	return KErrNone;
+	}
+
+TInt CRemoteGc::APIExInterface(TAny*& aInterface, TUid aInterfaceId)
+	{
+	if(aInterfaceId == KMWsDrawResourceInterfaceUid)
+		{
+		aInterface = static_cast<MWsDrawResource*>(iRemoteGcPimpl);
+		return KErrNone;
+		}
+	return KErrNotSupported;
+	}
+
+void CRemoteGc::DrawResource(const TPoint& aPos, const RWsDrawableSource& aSource, CWindowGc::TGraphicsRotation aRotation)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawResourceToPos);
+	iCommandBuffer->Write<TSgDrawableId>(aSource.DrawableId());
+	iCommandBuffer->Write<TInt>(aSource.ScreenNumber());
+	iCommandBuffer->Write<TPoint>(aPos);
+	iCommandBuffer->Write<CWindowGc::TGraphicsRotation>(aRotation);
+	iBoundingRect.BoundingRect(iDrawRect);
+	iHasBitmapCommand = ETrue;
+	}
+
+void CRemoteGc::DrawResource(const TRect& aDestRect, const RWsDrawableSource& aSource, CWindowGc::TGraphicsRotation aRotation)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawResourceToRect);
+	iCommandBuffer->Write<TSgDrawableId>(aSource.DrawableId());
+	iCommandBuffer->Write<TInt>(aSource.ScreenNumber());
+	iCommandBuffer->Write<TRect>(aDestRect);
+	iCommandBuffer->Write<CWindowGc::TGraphicsRotation>(aRotation);
+	iBoundingRect.BoundingRect(aDestRect);
+	iHasBitmapCommand = ETrue;
+	}
+
+void CRemoteGc::DrawResource(const TRect& aDestRect, const RWsDrawableSource& aSource, const TRect& aSrcRect, CWindowGc::TGraphicsRotation aRotation)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawResourceFromRectToRect);
+	iCommandBuffer->Write<TSgDrawableId>(aSource.DrawableId());
+	iCommandBuffer->Write<TInt>(aSource.ScreenNumber());
+	iCommandBuffer->Write<TRect>(aDestRect);
+	iCommandBuffer->Write<TRect>(aSrcRect);
+	iCommandBuffer->Write<CWindowGc::TGraphicsRotation>(aRotation);
+	iBoundingRect.BoundingRect(aDestRect);
+	iHasBitmapCommand = ETrue;
+	}
+
+void CRemoteGc::DrawResource(const TRect& aDestRect, const RWsDrawableSource& aSource, const TDesC8& aParam)
+	{
+	iCommandBuffer->Write<TDrawCode>(ECommandDrawResourceWithData);
+	iCommandBuffer->Write<TSgDrawableId>(aSource.DrawableId());
+	iCommandBuffer->Write<TInt>(aSource.ScreenNumber());
+	iCommandBuffer->Write<TRect>(aDestRect);
+	iCommandBuffer->WriteText(aParam);
+	iBoundingRect.BoundingRect(aDestRect);
+	iHasBitmapCommand = ETrue;
+	}
+