--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/bitgdi/sbit/BitmapSpec.cpp Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,213 @@
+// 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 <graphicsaccelerator.h>
+#include <fbs.h>
+
+
+/**
+Constructor with a software or hardware bitmap.
+Its type is initialised to EFbsBitmap or EHardwareBitmap accordingly.
+
+@param aBitmap The bitmap which the object will access.
+*/
+EXPORT_C TAcceleratedBitmapSpec::TAcceleratedBitmapSpec(CFbsBitmap* aBitmap)
+ {
+ RHardwareBitmap hwb(aBitmap->HardwareBitmapHandle());
+ if(hwb.iHandle)
+ {
+ ::new (this) TAcceleratedBitmapSpec(hwb);
+ return;
+ }
+ iType = EFbsBitmap;
+ iHandle = REINTERPRET_CAST(TInt,aBitmap);
+
+ iLockStatus = EBitmapNeedsLocking;
+
+ iSpare1 = 0;
+ iSpare2 = 0;
+ }
+
+/**
+Constructor with a hardware bitmap. Its type is initialised to EHardwareBitmap.
+
+@param aBitmap The bitmap which the object will access.
+*/
+EXPORT_C TAcceleratedBitmapSpec::TAcceleratedBitmapSpec(RHardwareBitmap aBitmap)
+ {
+ iType = EHardwareBitmap;
+ iHandle = aBitmap.iHandle;
+ iLockStatus = EBitmapIsStatic;
+ iSpare1 = 0;
+ iSpare2 = 0;
+ }
+
+/**
+Fills a TAcceleratedBitmapInfo structure with data for the bitmap.
+
+This data is only valid for the duration of any processing between a Lock()/Unlock()
+pair.
+
+For compressed bitmaps the line pitch has no meaning so it is set to the negation
+of the compression type as defined by TBitmapfileCompression.
+
+@param aInfo On return, holds the information needed to directly access the
+bitmap.
+@return KErrNone if sucessful, otherwise one of the system error codes, including
+KErrUnknown if the object's type is ENoBitmap.
+*/
+EXPORT_C TInt TAcceleratedBitmapSpec::GetInfo(TAcceleratedBitmapInfo& aInfo) const
+ {
+ switch(iType)
+ {
+ case EFbsBitmap:
+ {
+ CFbsBitmap* bmp = REINTERPRET_CAST(CFbsBitmap*,iHandle);
+ aInfo.iDisplayMode = bmp->DisplayMode();
+ aInfo.iAddress = REINTERPRET_CAST(TUint8*,bmp->DataAddress());
+ aInfo.iSize = bmp->SizeInPixels();
+ SEpocBitmapHeader header = bmp->Header();
+ if (header.iCompression != ENoBitmapCompression)
+ {
+ aInfo.iLinePitch = -header.iCompression;
+ }
+ else
+ {
+ aInfo.iLinePitch = bmp->ScanLineLength(aInfo.iSize.iWidth,aInfo.iDisplayMode);
+ }
+ TUid extendedType = bmp->ExtendedBitmapType();
+ if (extendedType != KNullUid)
+ {
+ aInfo.iPixelShift = extendedType.iUid;
+ aInfo.iDataSize = bmp->DataSize();
+ }
+ else
+ {
+ aInfo.iPhysicalAddress = NULL;
+ 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:
+ case EColor16MA:
+ case EColor16MAP:
+ aInfo.iPixelShift = 5;
+ break;
+ default:
+ aInfo.iPixelShift = -1;
+ break;
+ }
+ }
+ }
+ return KErrNone;
+
+ case EHardwareBitmap:
+ return RHardwareBitmap(iHandle).GetInfo(aInfo);
+
+ case ENoBitmap:
+ default:
+ Mem::FillZ(&aInfo,sizeof(aInfo));
+ return KErrUnknown;
+ }
+ }
+
+/** Locks the bitmap, if required.
+@param aCount Reference to a bitmap lock count object for nesting
+(only the first instance does the locking). */
+EXPORT_C void TAcceleratedBitmapSpec::DoLock(TBitmapLockCount& aCount)
+ {
+ switch(iType)
+ {
+ case EFbsBitmap:
+ if(aCount.Inc()==0)
+ REINTERPRET_CAST(CFbsBitmap*,iHandle)->BeginDataAccess();
+ break;
+
+ case ENoBitmap:
+ case EHardwareBitmap:
+ default:
+ // Never needs locking
+ return;
+ }
+ }
+
+/** Locks the bitmap, if required, setting the accelerated
+bitmap information address.
+@param aCount Reference to a bitmap lock count object for nesting
+(only the first instance does the locking).
+@param aInfo Information structure to set the address in. */
+EXPORT_C void TAcceleratedBitmapSpec::DoLock(TBitmapLockCount& aCount,TAcceleratedBitmapInfo& aInfo)
+ {
+ switch(iType)
+ {
+ case EFbsBitmap:
+ {
+ if(aCount.Inc()==0)
+ REINTERPRET_CAST(CFbsBitmap*,iHandle)->BeginDataAccess();
+
+ CFbsBitmap* bmp = REINTERPRET_CAST(CFbsBitmap*,iHandle);
+ aInfo.iAddress = REINTERPRET_CAST(TUint8*,bmp->DataAddress());
+ }
+ break;
+
+ case ENoBitmap:
+ case EHardwareBitmap:
+ default:
+ // Never needs locking
+ return;
+ }
+ }
+
+/** Unlocks the bitmap, if required.
+@param aCount Reference to a bitmap lock count object for nesting
+(only the last instance does the unlocking). */
+EXPORT_C void TAcceleratedBitmapSpec::DoUnlock(TBitmapLockCount& aCount)
+ {
+ switch(iType)
+ {
+ case EFbsBitmap:
+ if(aCount.Dec()==0)
+ REINTERPRET_CAST(CFbsBitmap*,iHandle)->EndDataAccess();
+ break;
+
+ case ENoBitmap:
+ case EHardwareBitmap:
+ default:
+ // Never needs unlocking
+ return;
+ }
+ }
+