diff -r 000000000000 -r 5d03bc08d59c graphicsdeviceinterface/screendriver/swins/AccelBitmap.cpp --- /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 +#include +#pragma warning( default : 4201 ) + +#include +#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); + } +