graphicstest/uibench/src/tdirectgditestbase.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/uibench/src/tdirectgditestbase.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,255 @@
+// Copyright (c) 2007-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:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code 
+*/
+
+#include "tdirectgditestbase.h"
+
+#include <graphics/directgdidriver.h>
+#include <graphics/directgdiextensioninterfaces.h>
+#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+#include <graphics/sgimage_sw.h>
+#endif
+TSize GetDisplaySizeInPixels();
+
+#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+// Cache size in bytes for DirectGDI Image cache.
+const TInt KDirectGdiImageCacheSize = 0x400000;
+#endif
+
+#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+
+/**
+Implementation of CTestStep base class virtual.
+Used to implement all DirectGDI-specific initialisation for any derived test-cases, and
+reads settings from the configuration file.
+It will leave if there are any failures as DirectGDI must be initialised correctly for
+the tests to be run. The leave will be picked up by the framework.
+
+@leave If initialisation of DirectGDI failed.
+@return EPass if successful, otherwise a TVerdict error code.
+*/
+TVerdict CTDirectGdiTestBase::doTestStepPreambleL()
+	{
+	CTe_graphicsperformanceSuiteStepBase::doTestStepPreambleL();
+	
+	TPtrC targetPixelFormatInput;
+	TEST(GetStringFromConfig(_L("PixelFormats"), _L("TargetPixelFormatEnums"), targetPixelFormatInput));
+	TDisplayModeMapping::ConvertPixelFormats(targetPixelFormatInput, iTargetPixelFormatArray);
+
+	TPtrC sourcePixelFormatInput;
+	TEST(GetStringFromConfig(_L("PixelFormats"), _L("SourcePixelFormatEnums"), sourcePixelFormatInput));
+	TDisplayModeMapping::ConvertPixelFormats(sourcePixelFormatInput, iSourcePixelFormatArray);
+	
+	InitializeDirectGdiL();	
+	return TestStepResult();
+	}
+
+/**
+Implementation of CTestStep base class virtual
+Used for doing all post-test treatment common to derived DirectGDI classes, such as
+shutting down DirectGDI.
+
+@leave If there was a failure shutting down DirectGDI.
+@return EPass if successful, otherwise a TVerdict error code.
+*/
+TVerdict CTDirectGdiTestBase::doTestStepPostambleL()
+	{
+	iTargetPixelFormatArray.Close();
+	iSourcePixelFormatArray.Close();
+	UninitializeDirectGdi();
+	return CTe_graphicsperformanceSuiteStepBase::doTestStepPostambleL();
+	}
+#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+
+ CTDirectGdiTestBase::~CTDirectGdiTestBase()
+	{
+	}
+
+CTDirectGdiTestBase::CTDirectGdiTestBase()
+	{
+	}
+
+/**
+Sets up DirectGDI for use in the test cases.
+
+@leave If any failures occur initialising DirectGDI.
+*/
+void CTDirectGdiTestBase::InitializeDirectGdiL()
+	{
+#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+	SgDriver::Open();
+		
+	TESTNOERRORL(CDirectGdiDriver::Open());
+	iDGdiDriver = CDirectGdiDriver::Static();
+	if (iDGdiDriver == NULL)
+		User::Leave(KErrNoMemory);
+	
+	// If using the DirectGDI OpenVG adapter, set a large image cache size to optimize performance.
+	MDirectGdiDriverCacheSize* cacheInterface = NULL;
+	if (KErrNone == iDGdiDriver->GetInterface(TUid::Uid(KDirectGdiDriverCacheSizeUid), (TAny*&)cacheInterface))
+		{
+		cacheInterface->SetMaxImageCacheSize(KDirectGdiImageCacheSize);
+		}
+	
+	iDGdiImageTarget = new (ELeave) RDirectGdiImageTarget(*iDGdiDriver);
+			
+	// Set up most of RSgImage image info to be used for target
+	iImageInfo.iSizeInPixels = GetPixmapSizeInPixels();
+	iImageInfo.iUsage = ESgUsageDirectGdiTarget;
+	
+	iTs = CFbsTypefaceStore::NewL(NULL);	
+	TESTNOERRORL(iTs->GetNearestFontToDesignHeightInPixels((CFont *&)iFont, TFontSpec(KFontTypeface, KFontSize)));
+	TESTNOERRORL(iTs->GetNearestFontToDesignHeightInPixels((CFont *&)iLargeFont,TFontSpec(KFontTypeface, 40)));	
+#endif
+	}
+
+/**
+Shuts down DirectGDI when test cases have finished.
+*/
+void CTDirectGdiTestBase::UninitializeDirectGdi()
+	{	
+	delete iContext;
+	iContext = NULL;
+	if (iDGdiImageTarget)
+		{
+		iDGdiImageTarget->Close();	
+		delete iDGdiImageTarget;
+		iDGdiImageTarget = NULL;
+		}
+	if (iDGdiDriver)
+		{
+		iDGdiDriver->Close();
+		}
+#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+	iSgImageTarget.Close();
+#endif
+	iTs->ReleaseFont(iFont);
+	iTs->ReleaseFont(iLargeFont);
+	delete iTs;
+	iTs = NULL;
+#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+	SgDriver::Close();
+#endif
+	}
+
+ /**
+Initialises a target and a DirectGDI Gc.
+
+@param aPixelFormat The pixel format to be used for the target.
+@return ETrue if the target supports the display mode, EFalse otherwise.
+*/
+#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+TBool CTDirectGdiTestBase::SetTargetPixelFormatL(TDisplayMode aDisplayMode)
+	{
+	TUidPixelFormat pixelFormat = TDisplayModeMapping::MapDisplayModeToPixelFormat(aDisplayMode);
+	TInt numSupportedFormats = 0;
+	RSgImage::GetPixelFormats(iImageInfo,NULL,numSupportedFormats);
+	TUidPixelFormat* supportedFormats = new (ELeave) TUidPixelFormat[numSupportedFormats];
+	RSgImage::GetPixelFormats(iImageInfo,supportedFormats,numSupportedFormats);
+    TBool supported = EFalse;
+	for (TInt ii = numSupportedFormats-1; ii >=0; --ii)
+		{
+		if(supportedFormats[ii] == pixelFormat)
+			{
+			supported = ETrue;
+			break;
+			}
+		}
+	delete[] supportedFormats;
+
+	if (supported)
+		{
+		INFO_PRINTF2(_L("SetTargetPixelFormat - supported: %S"),&ColorModeName(aDisplayMode));
+		}
+	else
+		{
+		INFO_PRINTF2(_L("SetTargetPixelFormat - not supported: %S"),&ColorModeName(aDisplayMode));
+		return EFalse;
+		}
+
+	delete iContext;
+	iContext = NULL;
+	TESTL(iDGdiImageTarget != NULL);
+	iDGdiImageTarget->Close();
+	iSgImageTarget.Close();
+	
+	iImageInfo.iPixelFormat = pixelFormat;
+	TESTNOERRORL(iSgImageTarget.Create(iImageInfo, NULL,0));
+	iContext = CDirectGdiContext::NewL (*iDGdiDriver);
+	TESTL(iContext != NULL);
+	TESTNOERRORL(iDGdiDriver->GetError());
+	if (KErrNone == iDGdiImageTarget->Create(iSgImageTarget))
+		{
+		// Activate the context on a rendering target.
+		TESTNOERRORL(iDGdiDriver->GetError());
+		iContext->Activate(*iDGdiImageTarget);
+		}
+	TESTNOERRORL(iDGdiDriver->GetError());
+	return supported;
+	}
+#else
+TBool CTDirectGdiTestBase::SetTargetPixelFormatL(TDisplayMode /*aDisplayMode*/)
+    {
+    return EFalse;
+    }
+#endif
+
+/* 
+Creates a new CFbsBitmap representing the RSgImage. It is down to the client to delete it.
+
+@see CTDirectGdiTestBase::GetTargetAsBitmapL()
+@return A pointer to the newly created bitmap.
+@leave If there was a problem copying from the source to the target.
+*/
+CFbsBitmap* CTDirectGdiTestBase::GetTargetAsBitmapL()
+	{
+#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+	iDGdiDriver->Finish();
+
+	CFbsBitmap* bitmap = new (ELeave) CFbsBitmap();
+	CleanupStack::PushL(bitmap);
+	TESTNOERRORL(bitmap->Create(iImageInfo.iSizeInPixels, TDisplayModeMapping::MapPixelFormatToDisplayMode(iImageInfo.iPixelFormat)));
+	
+	const TInt bitmapDataStride = bitmap->DataStride();
+	const TInt numScanlines = iImageInfo.iSizeInPixels.iHeight;	
+	
+	MSgImage_Sw* sgImageDirectAccess;
+	TESTNOERRORL(iSgImageTarget.GetInterface(sgImageDirectAccess));	
+	
+    const TInt sgImageDataStride = sgImageDirectAccess->DataStride();    
+    sgImageDirectAccess->BeginDataAccess(ESgCpuAccessReadOnly);
+    TUint32* sgImageDataAddress = (TUint32*)(sgImageDirectAccess->DataAddress());    
+    bitmap->BeginDataAccess();
+    TUint32* bitmapDataAddress = bitmap->DataAddress();
+    for (TInt scanline = 0; scanline < numScanlines; ++scanline)
+    	{
+    	Mem::Copy((TUint8*)bitmapDataAddress + (scanline*bitmapDataStride), (TUint8*)sgImageDataAddress + (scanline*sgImageDataStride), bitmapDataStride);
+    	}
+    bitmap->EndDataAccess();
+    sgImageDirectAccess->EndDataAccess();
+    
+	CleanupStack::Pop(1, bitmap);
+	return bitmap;
+#else
+	return NULL;
+#endif	
+	}
+	
+