windowing/windowserver/nga/remotegc/DrawSection.cpp
changeset 0 5d03bc08d59c
child 121 d72fc2aace31
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nga/remotegc/DrawSection.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,198 @@
+// 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"
+
+const TInt KBufferSize = 1000;
+
+/**
+This uid is used to identify a drawsection in the messagebuffer that is used for IPC.
+*/
+const TUid KDrawSection = {0x101F63B2};
+
+/**
+Creates and returns new drawsection.
+
+@return A new instance of CDrawSection.
+*/
+CDrawSection* CDrawSection::NewL()
+	{
+	return new (ELeave) CDrawSection;
+	}
+
+/**
+Creates and returns new drawsection.
+
+@param aDrawRect The drawrect of the drawsection.
+@param aBoundingRect The boundingrect of the drawcommands of this section.
+@param aHasBitmapCommand ETrue if the commandbuffer of this drawsection includes a bitmap command of any sort.
+@return A new instance of CDrawSection.
+*/	
+CDrawSection* CDrawSection::NewL(const TRect& aDrawRect, const TRect& aBoundingRect, TBool aHasBitmapCommand)
+	{
+	return new (ELeave) CDrawSection(aDrawRect, aBoundingRect, aHasBitmapCommand);
+	}
+
+CDrawSection::CDrawSection()
+	{
+	}
+
+CDrawSection::CDrawSection(const TRect& aDrawRect, const TRect& aBoundingRect, TBool aHasBitmapCommand) : iDrawRect(aDrawRect), 
+	iBoundingRect(aBoundingRect), iHasBitmapCommand(aHasBitmapCommand), iHasBeenExternalized(EFalse)
+	{
+	}
+	
+CDrawSection::~CDrawSection()
+	{
+	delete iSectionSegBuf;
+	}
+
+/**
+Sets this drawsection's segmented commandbuffer and takes the ownership of the allocated memory.
+
+@param aSegbuf This section's segmented commandbuffer.
+*/
+void CDrawSection::SetBuffer(CBufBase* aSegBuf)
+	{
+	__ASSERT_DEBUG(aSegBuf, User::Invariant());
+	iSectionSegBuf = aSegBuf;
+	}
+
+/**
+Returns this drawsection's segmented commandbuffer.
+
+@return this drawsection's segmented commandbuffer.
+*/
+CBufBase* CDrawSection::Buffer() const
+	{
+	return iSectionSegBuf;
+	}
+
+/**
+Sets if this drawsection has been externalized anytime. This is used for partial IPC updates.
+
+@param aHasBeenExternalized ETrue if this drawsection has been externalized, otherwise EFalse.
+*/
+void CDrawSection::SetHasBeenExternalized(TBool aHasBeenExternalized)
+	{
+	iHasBeenExternalized = aHasBeenExternalized;
+	}
+
+/**
+Returns ETrue if this drawsection has been externalized, otherwise EFalse.
+
+@return ETrue if this drawsection has been externalized, otherwise EFalse.
+*/	
+TBool CDrawSection::HasBeenExternalized() const
+	{
+	return iHasBeenExternalized;
+	}
+
+/**
+Compares this drawsection to aDrawSection and check if they are identical.
+
+@param aDrawSection The drawsection to compare with.
+@return ETrue if the drawsections are identical, otherwise EFalse.
+*/
+TBool CDrawSection::IsIdentical(const CDrawSection& aDrawSection) const
+	{
+	const TRect drawRect = aDrawSection.DrawRect();
+	CBufBase* segBuf = aDrawSection.Buffer();
+	if(!iHasBitmapCommand && iDrawRect.iTl == drawRect.iTl && iDrawRect.iBr == drawRect.iBr && segBuf->Size() == iSectionSegBuf->Size())
+		{
+		const TInt count = iSectionSegBuf->Size();
+		for(TInt i = 0; i < count; i++)
+			{
+			const TPtr8 comparePtr = segBuf->Ptr(i);
+			if(iSectionSegBuf->Ptr(i).Compare(segBuf->Ptr(i))) //Not identical
+				return EFalse;
+			
+			i += comparePtr.Size();
+			}
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+/**
+Returns the drawrect of this drawsection.
+
+@return The drawrect of this drawsection.
+*/
+TRect CDrawSection::DrawRect() const
+	{
+	return iDrawRect;
+	}
+
+/**
+Externalizes this drawsection to a message buffer to send over IPC.
+
+@param aMsgBuf The message buffer to add this drawsection to.
+*/
+void CDrawSection::ExternalizeL(RWsGraphicMsgBuf& aMsgBuf)
+	{
+	const TInt length = sizeof(TRect)*2 + iSectionSegBuf->Size();
+	TPtr8 msgPtr(NULL, 0);
+	User::LeaveIfError(aMsgBuf.Append(KDrawSection, length, msgPtr));
+	
+	// Add drawRect to aMsgBuf
+	const TPckgBuf<TRect> drawRect(iDrawRect);
+	msgPtr.Append(drawRect);
+	
+	// Add boundingRect to aMsgBuf
+	const TPckgBuf<TRect> boundingRect(iBoundingRect);
+	msgPtr.Append(boundingRect);
+	
+	// Add drawcommands to aMsgBuf
+	TInt count = 0;
+	const TInt sectionSegBufSize = iSectionSegBuf->Size();
+	while(count < sectionSegBufSize)
+		{		
+		TPtr8 ptr = iSectionSegBuf->Ptr(count);
+		msgPtr.Append(ptr);
+		count += ptr.Size();
+		}	
+	}
+
+/**
+Loads a drawsection from externalized data.
+
+@param aData The parser for the externalized data.
+@param aIndex The index of the drawsection in CCommandBuffer::iDrawSections to load from the externalized data.
+*/
+TInt CDrawSection::LoadL(const TWsGraphicMsgBufParser& aData, TInt aIndex)
+	{
+	if(aData.Uid(aIndex).iUid != KDrawSection.iUid)
+		{
+		return KErrArgument;
+		}
+		
+	const TPtrC8 pckg = aData.Data(aIndex);	
+	const TPtrC8 drawRectPtr = pckg.Left(sizeof(TRect));
+	const TPtrC8 boundingRectPtr = pckg.Mid(sizeof(TRect), sizeof(TRect));
+	const TPtrC8 segBufPtr = pckg.Mid(sizeof(TRect)*2);
+	
+	Mem::Copy(&iDrawRect, drawRectPtr.Ptr(), sizeof(TRect));
+	Mem::Copy(&iBoundingRect, boundingRectPtr.Ptr(), sizeof(TRect));
+	
+	if(iSectionSegBuf)
+		delete iSectionSegBuf;
+	
+	iSectionSegBuf = CBufSeg::NewL(KBufferSize);
+	iSectionSegBuf->InsertL(0, segBufPtr);
+	return KErrNone;	
+	}
+