--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/screendriver/smcot/SCCOL.CPP Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,116 @@
+// Copyright (c) 1997-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 <hal.h>
+#include "scdraw.h"
+
+/**
+Constructs the CDrawScreenBitmap object.
+@param aScreenNo Screen number. It will be used in HAL::Get() calls.
+@param aBitmapAddress The screen memory address.
+@param aSize Screen size
+@return System-wide error codes, KErrNone if the construction was successfull.
+*/
+TInt CDrawScreenBitmap::ConstructScreen(TInt aScreenNo, TAny* aBitmapAddress,TSize aSize)
+ {
+ iScreenNo = aScreenNo;
+ TInt ret = SCREEN_LAYOUT_BASE_BITMAP::Construct(aSize);
+ if (ret != KErrNone)
+ return ret;
+
+ //fixup for emulating smaller screen
+ TInt offset = 0;
+ // get the offset in bytes
+ ret = HAL::Get(iScreenNo, HALData::EDisplayOffsetBetweenLines, offset);
+
+ TInt bitsPerPixel = BitsPerPixel(iDispMode);
+ TInt bytesPerPixel = (bitsPerPixel/8 + (bitsPerPixel % 8 ? 1 : 0));
+
+ if (ret == KErrNone )
+ {
+ // Find iLongwidth (in pixels) from the offset (in bytes).
+ if (bitsPerPixel >= 8)
+ {
+ // a pixel fits in 1 or more bytes
+ iLongWidth = offset / bytesPerPixel;
+ }
+ else
+ {
+ // 1 or more pixels per byte
+ TInt pixelsPerByte = 8 / bitsPerPixel;
+ iLongWidth = offset * pixelsPerByte;
+ }
+ iScanLineWords = offset / 4;
+
+ // correct the size of the ScanLineBuffer
+ User::Heap().Free(iScanLineBuffer);
+ iScanLineBuffer = (TUint32*)(User::Heap().Alloc(offset));
+ if(iScanLineBuffer == NULL)
+ return KErrNoMemory;
+ }
+ else
+ {
+ return ret;
+ }
+ //fixup for emulating smaller screen
+
+ offset = 0; // Pass in display mode
+ ret = HAL::Get(iScreenNo, HALData::EDisplayOffsetToFirstPixel,offset);
+ iBits = (TUint32*)aBitmapAddress;
+ iBits += offset / sizeof(TUint32);
+ return ret;
+ }
+
+void CDrawScreenBitmap::SetDisplayMode(CFbsDrawDevice* aDrawDevice)
+ {
+ CopyOldSettings(aDrawDevice);
+ }
+
+void CDrawScreenBitmap::OrientationsAvailable(TBool aOrientation[4])
+ {
+ aOrientation[EOrientationNormal] = ETrue;
+ aOrientation[EOrientationRotated90] = ETrue;
+ aOrientation[EOrientationRotated180] = ETrue;
+ aOrientation[EOrientationRotated270] = ETrue;
+ }
+
+TBool CDrawScreenBitmap::SetOrientation(TOrientation aOrientation)
+ {
+ iOrientation = aOrientation;
+ return ETrue;
+ }
+
+TInt CDrawScreenBitmap::HorzTwipsPerThousandPixels() const
+ {
+ if (iSize.iWidth == 0)
+ return 0;
+
+ TInt twips = 0;
+ HAL::Get(iScreenNo, HALData::EDisplayXTwips,twips);
+
+ return twips * 1000 / iSize.iWidth; // iSize gets iWidth and iHeight swapped by changing the orientation so always use iWidth
+ }
+
+TInt CDrawScreenBitmap::VertTwipsPerThousandPixels() const
+ {
+ if (iSize.iHeight == 0)
+ return 0;
+
+ TInt twips = 0;
+ HAL::Get(iScreenNo, HALData::EDisplayYTwips,twips);
+
+ return twips * 1000 / iSize.iHeight;
+ }
+