windowing/windowserver/nonnga/CLIENT/scrdevextension.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nonnga/CLIENT/scrdevextension.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,124 @@
+// Copyright (c) 2000-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 "scrdevextension.h"
+#include "../SERVER/w32cmd.h"
+#include <graphics/displaycontrolbase.h>
+#include "CLIENT.H"
+#include "w32comm.h"
+
+CWsScreenDevice::CScrDevExtension::CScrDevExtension(RWsBuffer *aBuffer,TInt32 aWsHandle):	MWsClientClass(aBuffer)
+	{
+	iWsHandle=aWsHandle;
+	__ASSERT_DEBUG(aBuffer,Panic(EW32PanicBadClientInterface));
+	__ASSERT_DEBUG(aWsHandle,Panic(EW32PanicBadClientInterface));
+	}
+
+CWsScreenDevice::CScrDevExtension::~CScrDevExtension()
+	{
+	//typeface store is not owned by this class, and is created/destroyed in CWsScreenDevice
+	}
+/** Interface Extension capability
+ * 	Use of this interface going forward will allow the published client interface to be dynamically extended.
+ * 	Note that the pointer returned is only good for the lifetime of the called CBase derived object.
+ * 	@pre	caller has already checked that the implementation is initialised using RepeatableConstruct
+ *	@param  aInterfaceId	uniqueid or well known id of interface
+ * 	@return	pointer to interface object matching this ID or NULL if no match.
+ **/
+void* CWsScreenDevice::CScrDevExtension::GetInterface(TUint aInterfaceId)
+	{
+	__ASSERT_DEBUG(this!=NULL,Panic(EW32PanicBadClientInterface));
+	__ASSERT_DEBUG(iBuffer,Panic(EW32PanicBadClientInterface));
+	__ASSERT_DEBUG(iWsHandle!=NULL,Panic(EW32PanicBadClientInterface));
+	
+	switch (aInterfaceId)
+		{
+		case MTestScreenCapture::ETypeId:
+			{
+				return static_cast<MTestScreenCapture*>(this);
+			}
+		default:
+			break;
+		}
+	return NULL;
+}
+//Accessor to typeface store instance
+CFbsTypefaceStore* CWsScreenDevice::CScrDevExtension::TypefaceStore()
+	{
+	return iTypefaceStore;
+	}
+//Accessor to typeface store instance
+void  CWsScreenDevice::CScrDevExtension::SetTypefaceStore(CFbsTypefaceStore* aTypeFaceStore)
+	{
+	iTypefaceStore=aTypeFaceStore;
+	}
+
+
+TInt CWsScreenDevice::CScrDevExtension::TranslateExtent(const TRect& aInitial, TRect& aTarget) const
+	{
+  	// Current screen mode scale
+	TPckgBuf<TSize> pntPkg;
+	TInt err = WriteReplyP(&pntPkg,EWsSdOpGetCurrentScreenModeScale);
+	TSize scale = pntPkg();	
+	
+	// Current screen mode offset
+	TPckgBuf<TPoint> soPkg;
+	err = WriteReplyP(&soPkg,EWsSdOpGetCurrentScreenModeScaledOrigin);
+	TPoint offset = soPkg();
+	
+	// Calculate the top left point taking into account scale and offset
+	TInt startingPointWidth = (scale.iWidth * aInitial.iTl.iX) + offset.iX;
+	TInt startingPointHeight = (scale.iHeight * aInitial.iTl.iY) + offset.iY;	
+	TPoint targetXY(startingPointWidth,startingPointHeight);
+	
+	// Calculate the extent size taking into account scale
+	TInt targetWidth = (scale.iWidth * aInitial.Width());
+	TInt targetHeight = (scale.iHeight * aInitial.Height());
+	TSize targetSize(targetWidth,targetHeight);
+	
+	aTarget.SetRect(targetXY,targetSize);
+	return err;
+	}
+
+
+/** Gets the size of the screen device area in pixels.
+
+This function always causes a flush of the window server buffer.
+
+@return The x and y dimensions of the screen device area, in pixels. 
+@see CGraphicsDevice::SizeInPixels() */
+TInt CWsScreenDevice::CScrDevExtension::GetCompositedSize(TSize& aSize) const
+	{
+	TPckgBuf<TSize> sizePkg;
+  	TInt err = WriteReplyP(&sizePkg,EWsSdOpPixelSize);
+  	aSize = sizePkg();
+	return err;
+	}
+
+
+
+/** Saves the entire screen to a bitmap.
+
+This function always causes a flush of the window server buffer.
+
+@param aBitmap Bitmap to be filled with the screen image. 
+@return KErrNone if successful, otherwise one of the system-wide error codes. */
+TInt CWsScreenDevice::CScrDevExtension::ComposeScreen(const CFbsBitmap& aBitmap) const
+	{
+	TInt bitmapHandle = aBitmap.Handle();
+	AddToBitmapArray(bitmapHandle);
+	TWsSdCmdCopyScreenToBitmap rectCompare(bitmapHandle);
+	return(WriteReply(&rectCompare,sizeof(rectCompare),EWsSdOpCopyScreenToBitmap));
+	}