graphicsdeviceinterface/screendriver/swins/AccelBitmap.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/screendriver/swins/AccelBitmap.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,182 @@
+// Copyright (c) 2001-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 "GraphicsAccelerator.h"
+
+// Windows headers...
+#define UNICODE
+#pragma warning( disable : 4201 )
+#define WIN32_LEAN_AND_MEAN
+#define NOSERVICE
+#include <windows.h>
+#include <windowsx.h>
+#pragma warning( default : 4201 )
+
+#include <bitdraw.h>
+#include "_WININC.H"
+
+/** Fills a structure with data which describes the basic details of this bitmap.
+
+@param aInfo Bitmap information structure to fill with the details of this bitmap.
+@return KErrNone if successful, KErrBadHandle if a value has not been assigned to iHandle. */
+EXPORT_C TInt RHardwareBitmap::GetInfo(TAcceleratedBitmapInfo& aInfo) const
+	{
+	if(!iHandle)
+		return(KErrBadHandle);
+
+	// -1 or less refers to the screen. It is the (screen number + 1) actually with "-" sign.
+	if(iHandle <= -1)
+		{
+        RWindows* window = ::WindowHandler(-iHandle - 1);
+		aInfo.iDisplayMode = window->iDisplayMode;
+		aInfo.iAddress = (TUint8*)(window->EpocBitmapBits());
+		aInfo.iSize = window->iEpocBitmapSize;
+		aInfo.iLinePitch = window->iEpocBitmapLinePitch;
+		aInfo.iPhysicalAddress = 0;
+		switch(aInfo.iDisplayMode)
+			{
+			case ENone:
+				aInfo.iPixelShift = -1;
+				break;
+			case EGray2:
+				aInfo.iPixelShift = 0;
+				break;
+			case EGray4:
+				aInfo.iPixelShift = 1;
+				break;
+			case EGray16:
+			case EColor16:
+				aInfo.iPixelShift = 2;
+				break;
+			case EGray256:
+			case EColor256:
+				aInfo.iPixelShift = 3;
+				break;
+			case EColor4K:
+			case EColor64K:
+				aInfo.iPixelShift = 4;
+				break;
+			case EColor16M:
+			case ERgb:
+			case EColor16MU:
+				aInfo.iPixelShift = 5;
+				break;
+			}
+		}
+	else
+		aInfo = *(TAcceleratedBitmapInfo*)iHandle;	// iHandle is really a pointer to a TAcceleratedBitmapInfo
+
+	return(KErrNone);
+	}
+
+/**
+This method sets the value of iHandle data member.
+When the iHandle's value is positive - the it is the bitmap address in the memory.
+When the iHandle's value is negative - it is a screen number reference:
+ "-1" - screen 0, "-2" - screen 1, "-3" - screen 2, ...
+All that means: negative iHandle values describe the RHardwareBitmap object as a screen
+bitmap, the screen number can be calculated from iHandle's value. 
+Positive iHandle values describe RHardwareBitmap object as an in-memory bitmap.
+By default iHandle is initialized with 0, which means - invalid handle and uninitialized
+RHardwareBitmap object.
+@param aScreenNo Screen number.
+@return KErrNone
+*/
+EXPORT_C TInt RHardwareBitmap::SetAsScreenReference(TInt aScreenNo)
+	{
+	iHandle = aScreenNo;
+	return KErrNone;
+	}
+
+EXPORT_C TInt RHardwareBitmap::Create(TDisplayMode aDisplayMode, TSize aSize, TUid /*aCreatorUid*/)
+	{
+	// Make line pitch different from normal bitmaps, useful for testing purposes.
+	TInt hwWidth = ((aSize.iWidth + 15) / 16) * 16;
+
+	TInt linePitch;
+
+	switch(aDisplayMode)
+		{
+		case EColor256:
+		case EGray256:
+			linePitch = hwWidth;
+			break;
+		case EColor64K:
+		case EColor4K:
+			linePitch = hwWidth * 2;
+			break;
+		case EColor16M:
+			linePitch = (((hwWidth * 3) + 11) / 12) * 12; // Multiples of 12 bytes!
+			break;
+		case ERgb:
+		case EColor16MU:
+			linePitch = hwWidth * 4;
+			break;
+		default:
+			return(KErrNotSupported);
+		}
+
+	TInt memSize = sizeof(TAcceleratedBitmapInfo)+linePitch*aSize.iHeight;
+
+	TAcceleratedBitmapInfo* bitmap = (TAcceleratedBitmapInfo*)GlobalAllocPtr(GMEM_FIXED,memSize);
+
+	if(!bitmap)
+		return(KErrNoMemory);
+
+	bitmap->iDisplayMode = aDisplayMode;
+	bitmap->iAddress = (TUint8*)(bitmap+1);
+	bitmap->iSize = aSize;
+	bitmap->iLinePitch = linePitch;
+	switch(aDisplayMode)
+		{
+		case ENone:
+			bitmap->iPixelShift = -1;
+			break;
+		case EGray2:
+			bitmap->iPixelShift = 0;
+			break;
+		case EGray4:
+			bitmap->iPixelShift = 1;
+			break;
+		case EGray16:
+		case EColor16:
+			bitmap->iPixelShift = 2;
+			break;
+		case EGray256:
+		case EColor256:
+			bitmap->iPixelShift = 3;
+			break;
+		case EColor4K:
+		case EColor64K:
+			bitmap->iPixelShift = 4;
+			break;
+		case EColor16M:
+		case ERgb:
+		case EColor16MU:
+			bitmap->iPixelShift = 5;
+			break;
+		}
+	bitmap->iPhysicalAddress = 0;
+
+	iHandle = (TInt)bitmap;
+
+	return(KErrNone);
+	}
+
+EXPORT_C void RHardwareBitmap::Destroy()
+	{
+	GlobalFreePtr((void*)iHandle);
+	}
+