egl/egltest/src/egltest_vgimagetosurfaces.cpp
changeset 0 5d03bc08d59c
child 26 15986eb6c500
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/src/egltest_vgimagetosurfaces.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,899 @@
+// 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
+*/
+
+#include <test/tefunit.h> // for ASSERT macros
+#ifndef __INIPARSER_H__
+#include <cinidata.h>
+#endif // __INIPARSER_H__
+
+#include "egltest_vgimagetosurfaces.h"
+
+#include <test/egltestcommonsgimageinfo.h>
+#include <test/egltestcommonconversion.h>
+#include <test/egltestcommoninisettings.h>
+
+
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0170
+
+@SYMTestPriority 1
+
+@SYMPREQ 39
+
+@SYMREQ See SGL.GT0386.401 document
+
+@SYMTestCaseDesc
+Check that it is possible to draw a VGImage (created from an RSgImage) to a pBuffer Surface.
+
+@SYMTestActions
+Create a reference Bitmap
+Create and fully construct an RSgImage object having the same content as the reference bitmap 
+•	Set the iUsage bit to ESgUsageBitOpenVgImage
+Create and make current and EGL context bound to OVG APIs and linked to a pBuffer surface.
+Pass the RSgImage object into eglCreateImageKHR() with
+•	The target parameter set to EGL_NATIVE_PIXMAP_KHR
+•	Use the current display and EGL_NO_CONTEXT
+•	Use a NULL attr_list
+Check that eglCreateImageKHR() does NOT return EGL_NO_IMAGE_KHR
+Use vgCreateEGLImageTargetKHR() to construct a VGImage object from the EGLImage.
+•	Check for errors
+Use OpenVG to draw the just created VGImage to the pBuffer surface currently linked to the context.
+Call eglWaitClient() to finish the above drawing instructions synchronously.
+Destroy the original image data
+•	Pass the VGImage into vgDestroyImage()
+•	Pass the EGLImage into eglDestroyImageKHR()
+•	Close the RSgImage 
+Check that the pBuffer surface matches the content from the reference bitmap.
+Destroy the pBuffer surface
+Check for memory and handle leaks
+
+@SYMTestExpectedResults
+pBuffer surface matches the content from the reference bitmap.
+The test will loop through all the possible PixelFormat available for source RSgImages and Destination Surfaces
+•	EUidPixelFormatRGB_565
+•	EUidPixelFormatXRGB_8888
+•	EUidPixelFormatARGB_8888 (source only)
+•	EUidPixelFormatARGB_8888_PRE
+•	EUidPixelFormatA_8  (source only)
+*/
+TVerdict CEglTest_EGL_Image_VgImage_To_pBuffer::doTestStepL()
+	{
+	SetTestStepID(_L("GRAPHICS-EGL-0170"));
+	TBool ret = CheckForExtensionL(KEGL_RSgimage | KEGL_KHR_image_base | KEGL_KHR_image_pixmap | KVG_KHR_EGL_image);
+	if(!ret)
+		{
+		// The extension is not supported
+		RecordTestResultL();
+		CloseTMSGraphicsStep();
+		return TestStepResult();
+		}
+
+	CEglTestCommonIniSettings* iniParser = CEglTestCommonIniSettings::NewL();
+	CleanupStack::PushL(iniParser);
+
+	TInt numPBufferSurfaceFormats = iniParser->GetNumberOfFormats(KSectionPBufferSurfaceFormats);
+	TInt numImageSourceFormats = iniParser->GetNumberOfFormats(KSectionImageSourceFormats);
+	if(!numImageSourceFormats && !numPBufferSurfaceFormats)
+		{
+		ERR_PRINTF1(_L("No formats to iterate through"));
+		User::Leave(KErrArgument);
+		}
+	for(TUint j=0; j < numPBufferSurfaceFormats; j++)
+		{
+		iSurfaceFormat = iniParser->GetVgFormat(KSectionPBufferSurfaceFormats,j);
+		for(TUint i=0; i < numImageSourceFormats; i++)
+			{
+			iSourceFormat = iniParser->GetPixelFormat(KSectionImageSourceFormats,i);
+			if (iSourceFormat == EUidPixelFormatARGB_8888 && (iSurfaceFormat == VG_sARGB_8888_PRE || iSurfaceFormat == VG_sARGB_8888))
+				{
+				// Don't perform the test for this particular format combination
+				//  Causes issues converting pixel values from non-pre to pre
+				continue;
+				}
+#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+			// A_8 related tests are only performed for SgImage-Lite
+			if (iSourceFormat == EUidPixelFormatA_8)
+				continue;
+#endif	
+			doTestPartialStepL();
+			}
+		}
+
+	CleanupStack::PopAndDestroy(iniParser);
+	RecordTestResultL();
+	CloseTMSGraphicsStep();
+	return TestStepResult();
+	}
+
+TVerdict CEglTest_EGL_Image_VgImage_To_pBuffer::doTestPartialStepL()
+	{
+	INFO_PRINTF1(_L("CEglTest_EGL_Image_VgImage_To_pBuffer::doTestPartialStepL"));
+	PrintUsedPixelConfiguration();
+
+	// Create display object
+	GetDisplayL();
+	CreateEglSessionL();
+	iEglSess->InitializeL();
+	iEglSess->OpenSgDriverL();
+
+	// Create a reference bitmap which we use to init the SgImage (we use index=7)
+	TDisplayMode bitmapMode = EglTestConversion::PixelFormatToDisplayMode(iSourceFormat);
+	CFbsBitmap* bitmap = iEglSess->CreateReferenceBitmapL(bitmapMode, KPixmapSize, 7);
+	CleanupStack::PushL(bitmap);
+
+	INFO_PRINTF1(_L("Creating 1 RSgImage"));
+	RSgImage sgImage;
+	CleanupClosePushL(sgImage);
+	TSgImageInfoOpenVgImage imageInfo = TSgImageInfoOpenVgImage(iSourceFormat, KPixmapSize);
+	TInt ret = sgImage.Create(imageInfo, bitmap->DataAddress(), bitmap->DataStride());
+	ASSERT_EQUALS(ret, KErrNone);
+	
+	// If create pbuffer surface fails, don't fail if there's no matching config (but fail in any other situation):
+    //		Support for a window surface is not mandated any pixel format
+    //		We should not enforce it in the tests
+    //		Silently terminate the test without failing.
+	TEglTestConfig pbufferFormat = EglTestConversion::VgFormatToPBufferSurfaceFormat(iSurfaceFormat);
+	EGLConfig currentConfig = 0;
+	TRAPD(res, currentConfig = iEglSess->GetConfigExactMatchL( pbufferFormat ));
+	if(res == KTestNoMatchingConfig)
+	    {
+        INFO_PRINTF1(_L("Creation of pBuffer has failed, the test case for that configuration will be skipped"));
+		CleanupStack::PopAndDestroy(2, bitmap); // bitmap, sgimage
+		CleanAll();
+		RecordTestResultL();
+		CloseTMSGraphicsStep();
+		return TestStepResult();
+	    }
+	User::LeaveIfError(res); // leave here if any other error was raised other than the one above.
+	iEglSess->CreatePbufferSurfaceAndMakeCurrentL(currentConfig, KPixmapSize, EGL_OPENVG_API);
+
+	INFO_PRINTF1(_L("Creating 1 EGLImage from the RSgImage"));
+	EGLImageKHR imageKHR = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &sgImage, KEglImageAttribsPreservedTrue);
+	ASSERT_EGL_TRUE(imageKHR != EGL_NO_IMAGE_KHR);
+
+	INFO_PRINTF1(_L("Creating 1 VGImage from the EGLImage"));
+	VGImage vgImage = iEglSess->vgCreateImageTargetKHR((VGeglImageKHR)imageKHR);
+	ASSERT_VG_TRUE(vgImage != VG_INVALID_HANDLE);
+
+	// At this point we draw the VGImage created from the SgImage to the current surface.
+	//	# if the source is a A_8, the VGImage acts as a mask and the target surface must contain 
+	//		as a result the pen colour set above blended with the mask
+	//	# otherwise, drawing the VGImage is just a simple copy via vgSetPixels (no blending required) 
+	INFO_PRINTF1(_L("Copying the VGImage to the surface"));
+	if (iSourceFormat == EUidPixelFormatA_8)
+		{
+		// clear surface background
+		VGfloat bgColor[] = {0.0, 0.0, 0.0, 1.0}; // opaque black
+		vgSetfv(VG_CLEAR_COLOR, 4, bgColor);
+		vgClear(0, 0, KPixmapSize.iWidth, KPixmapSize.iHeight);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+
+		// fill paint
+		VGPaint fillPaint = vgCreatePaint();
+		vgSetPaint(fillPaint, VG_FILL_PATH);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		vgSetParameteri(fillPaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
+		VGuint fillColor = 0x00ff00ff; // opaque green
+		vgSetColor(fillPaint, fillColor);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		
+		vgSeti(VG_IMAGE_MODE, VG_DRAW_IMAGE_STENCIL);
+		vgSeti(VG_BLEND_MODE, VG_BLEND_SRC_OVER);
+		vgDrawImage(vgImage);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		eglWaitClient();
+	    vgDestroyPaint(fillPaint);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		}
+	else
+		{
+		vgSetPixels(0, 0, vgImage, 0, 0, KPixmapSize.iWidth, KPixmapSize.iHeight);
+		ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
+		eglWaitClient();
+		}
+	
+	// destroy eglimage and vgimage
+	vgDestroyImage(vgImage);
+	ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
+	ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, imageKHR));
+
+	// Check that the surface contains the expected pixels
+	//  # if the source is a A_8, to compare the surface with a reference bitmap, the following is needed:
+	//    a) a reference bitmap needs to be cleared to black (same colour as the surface was cleared to)
+	//    b) a Pen bitmap, that we clear to green (same colour as the fillPaint used to draw to the surface)
+	//    c) a mask bitmap, which is the reference bitmap used to create the SgImage
+	//  # otherwise, the surface must contain the same pixels as the bitmap used to create the SgImage 
+	if (iSourceFormat == EUidPixelFormatA_8)
+		{
+		// we need a reference bitmap with the same pixel format as the target surface
+		TUidPixelFormat format = EglTestConversion::VgFormatToSgPixelFormat(iSurfaceFormat);
+		TDisplayMode refbitmapMode = EglTestConversion::PixelFormatToDisplayMode(format);
+
+		CFbsBitmap* refBitmap = iEglSess->CreateReferenceMaskedBitmapL(refbitmapMode, KRgbGreen, bitmap);
+		CleanupStack::PushL(refBitmap);
+		
+		// compare the obtained reference bitmap with the surface drawn
+		iEglSess->CheckVgDrawingL(iSurfaceFormat, refBitmap);
+		CleanupStack::PopAndDestroy(refBitmap);
+		}
+	else
+		{
+		iEglSess->CheckVgDrawingL(iSurfaceFormat, bitmap);
+		}
+	INFO_PRINTF1(_L("Content is as expected"));
+	
+	//cleanup
+	CleanupStack::PopAndDestroy(2, bitmap); // bitmap, sgImage
+	CleanAll();
+	return TestStepResult();
+	}
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0171
+
+@SYMTestPriority 1
+
+@SYMPREQ 39
+
+@SYMREQ See SGL.GT0386.401 document
+
+@SYMTestCaseDesc
+Check that it is possible to draw a VGImage (created from an RSgImage) to a Window Surface.
+
+@SYMTestActions
+Create a reference Bitmap
+Create an RWindow.
+Create and fully construct an RSgImage object having the same content as the reference bitmap 
+•	Set the iUsage bit to ESgUsageBitOpenVgImage
+Create and make current and EGL context bound to OVG APIs and linked to a Window Surface 
+(linked to the previously created RWindow).
+Pass the RSgImage object into eglCreateImageKHR() with
+•	The target parameter set to EGL_NATIVE_PIXMAP_KHR
+•	Use the current display and EGL_NO_CONTEXT
+•	Use a NULL attr_list
+Check that eglCreateImageKHR() does NOT return EGL_NO_IMAGE_KHR
+Use vgCreateEGLImageTargetKHR() to construct a VGImage object from the EGLImage.
+•	Check for errors
+Use OpenVG to draw the just drawn VGImage to the Window surface currently linked to the context.
+Call eglWaitClient() to finish the above drawing instructions synchronously.
+Destroy the original image data
+•	Pass the VGImage into vgDestroyImage()
+•	Pass the EGLImage into eglDestroyImageKHR()
+•	Close the RSgImage 
+Check that the Window surface matches the content from the reference bitmap.
+Destroy the Window surface
+Check for memory and handle leaks
+
+@SYMTestExpectedResults
+Window surface matches the content from the reference bitmap.
+The test will loop through all the possible PixelFormat available for source 
+RSgImages and Destination Surfaces (accordingly to whether or not the test 
+is being run on hardware where just the 16MU format is supported for window surfaces)
+•	EUidPixelFormatRGB_565
+•	EUidPixelFormatXRGB_8888
+•	EUidPixelFormatARGB_8888 (source only)
+•	EUidPixelFormatARGB_8888_PRE
+•	EUidPixelFormatA_8  (source only)
+No memory or handle leaks.
+*/
+TVerdict CEglTest_EGL_Image_VgImage_To_Window::doTestStepL()
+	{
+	SetTestStepID(_L("GRAPHICS-EGL-0171"));
+	TBool ret = CheckForExtensionL(KEGL_RSgimage | KEGL_KHR_image_base | KEGL_KHR_image_pixmap | KVG_KHR_EGL_image);
+	if(!ret)
+		{
+		// The extension is not supported
+		RecordTestResultL();
+		CloseTMSGraphicsStep();
+		return TestStepResult();
+		}
+
+	CEglTestCommonIniSettings* iniParser = CEglTestCommonIniSettings::NewL();
+	CleanupStack::PushL(iniParser);
+
+	TInt numWindowSurfaceFormats = iniParser->GetNumberOfFormats(KSectionWindowSurfaceFormats);
+	TInt numImageSourceFormats = iniParser->GetNumberOfFormats(KSectionImageSourceFormats);
+	if(!numImageSourceFormats && !numWindowSurfaceFormats)
+		{
+		ERR_PRINTF1(_L("No formats to iterate through"));
+		User::Leave(KErrArgument);
+		}
+	for(TUint j=0; j < numWindowSurfaceFormats; j++)
+		{
+		iSurfaceFormat = iniParser->GetVgFormat(KSectionWindowSurfaceFormats,j);
+		for(TUint i=0; i < numImageSourceFormats; i++)
+			{
+			iSourceFormat = iniParser->GetPixelFormat(KSectionImageSourceFormats,i);
+			if (iSourceFormat == EUidPixelFormatARGB_8888 && (iSurfaceFormat == VG_sARGB_8888_PRE || iSurfaceFormat == VG_sARGB_8888))
+				{
+				// Don't perform the test for this particular format combination
+				//  Causes issues converting pixel values from non-pre to pre
+				continue;
+				}
+#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+			// A_8 related tests are only performed for SgImage-Lite
+			if (iSourceFormat == EUidPixelFormatA_8)
+				continue;
+#endif	
+			doTestPartialStepL();
+			}
+		}
+
+	CleanupStack::PopAndDestroy(iniParser);
+	RecordTestResultL();
+	CloseTMSGraphicsStep();
+	return TestStepResult();
+	}
+
+TVerdict CEglTest_EGL_Image_VgImage_To_Window::doTestPartialStepL()
+	{
+	INFO_PRINTF1(_L("CEglTest_EGL_Image_VgImage_To_Window::doTestPartialStepL"));
+	PrintUsedPixelConfiguration();
+	
+	OpenWsSessionL(KDefaultWindowGroupId);
+	RWindow window;
+	ConstructWindowL(window, KPixmapSize);
+	CleanupClosePushL(window);
+
+	// Create display object
+	GetDisplayL();
+	CreateEglSessionL();
+	iEglSess->InitializeL();
+	iEglSess->OpenSgDriverL();
+
+	// Create a reference bitmap which we use to init the SgImage (we use index=2)
+	TDisplayMode bitmapMode = EglTestConversion::PixelFormatToDisplayMode(iSourceFormat);
+	CFbsBitmap* bitmap = iEglSess->CreateReferenceBitmapL(bitmapMode, KPixmapSize, 2);
+	CleanupStack::PushL(bitmap);
+
+	INFO_PRINTF1(_L("Creating 1 RSgImage"));
+	RSgImage sgImage;
+	CleanupClosePushL(sgImage);
+	TSgImageInfoOpenVgImage imageInfo = TSgImageInfoOpenVgImage(iSourceFormat, KPixmapSize);
+	TInt ret = sgImage.Create(imageInfo, bitmap->DataAddress(), bitmap->DataStride());
+	ASSERT_EQUALS(ret, KErrNone);
+
+	// If create window surface fails, don't fail if there's no matching config (but fail in any other situation):
+    //		Support for a window surface is not mandated any pixel format
+    //		We should not enforce it in the tests
+    //		Silently terminate the test without failing.
+	TEglTestConfig windowFormat = EglTestConversion::VgFormatToWindowSurfaceFormat(iSurfaceFormat);
+	EGLConfig config = 0;
+	TRAPD(res, config = iEglSess->GetConfigExactMatchL( windowFormat ));
+	if(res == KTestNoMatchingConfig)
+		{
+		INFO_PRINTF1(_L("Creation of window surface has failed, the test case for that configuration will be skipped"));
+		CleanupStack::PopAndDestroy(3, &window); // window, bitmap, sgimage
+		CloseWsSession();
+		CleanAll();
+		RecordTestResultL();
+		CloseTMSGraphicsStep();
+		return TestStepResult();
+		}
+    User::LeaveIfError(res); // leave here if any other error was raised other than the one above.
+	iEglSess->CreateWindowSurfaceAndMakeCurrentL(config, window);
+
+	INFO_PRINTF1(_L("Creating 1 EGLImage from the RSgImage"));
+	EGLImageKHR imageKHR = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &sgImage, KEglImageAttribsPreservedTrue);
+	ASSERT_EGL_TRUE(imageKHR != EGL_NO_IMAGE_KHR);
+
+	INFO_PRINTF1(_L("Creating 1 VGImage from the EGLImage"));
+	VGImage vgImage = iEglSess->vgCreateImageTargetKHR((VGeglImageKHR)imageKHR);
+	ASSERT_VG_TRUE(vgImage != VG_INVALID_HANDLE);
+	    
+	// At this point we draw the VGImage created from the SgImage to the current surface.
+	//	# if the source is a A_8, the VGImage acts as a mask and the target surface must contain 
+	//		as a result the pen colour set above blended with the mask
+	//	# otherwise, drawing the VGImage is just a simple copy via vgSetPixels (no blending required) 
+	INFO_PRINTF1(_L("Copying the VGImage to the surface"));
+	if (iSourceFormat == EUidPixelFormatA_8)
+		{
+		// clear surface background
+		VGfloat bgColor[] = {0.0, 0.0, 0.0, 1.0}; // opaque black
+		vgSetfv(VG_CLEAR_COLOR, 4, bgColor);
+		vgClear(0, 0, KPixmapSize.iWidth, KPixmapSize.iHeight);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+
+		// fill paint
+		VGPaint fillPaint = vgCreatePaint();
+		vgSetPaint(fillPaint, VG_FILL_PATH);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		vgSetParameteri(fillPaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
+		VGuint fillColor = 0x00ff00ff; // opaque green
+		vgSetColor(fillPaint, fillColor);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		
+		vgSeti(VG_IMAGE_MODE, VG_DRAW_IMAGE_STENCIL);
+		vgSeti(VG_BLEND_MODE, VG_BLEND_SRC_OVER);
+		vgDrawImage(vgImage);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		eglWaitClient();
+	    vgDestroyPaint(fillPaint);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		}
+	else
+		{
+		vgSetPixels(0, 0, vgImage, 0, 0, KPixmapSize.iWidth, KPixmapSize.iHeight);
+		ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
+		eglWaitClient();
+		}
+	
+	// destroy eglimage and vgimage
+	vgDestroyImage(vgImage);
+	ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
+	ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, imageKHR));
+
+	// Check that the surface contains the expected pixels
+	//  # if the source is a A_8, to compare the surface with a reference bitmap, the following is needed:
+	//    a) a reference bitmap needs to be cleared to black (same colour as the surface was cleared to)
+	//    b) a Pen bitmap, that we clear to green (same colour as the fillPaint used to draw to the surface)
+	//    c) a mask bitmap, which is the reference bitmap used to create the SgImage
+	//  # otherwise, the surface must contain the same pixels as the bitmap used to create the SgImage 
+	if (iSourceFormat == EUidPixelFormatA_8)
+		{
+		// we need a reference bitmap with the same pixel format as the target surface
+		TUidPixelFormat format = EglTestConversion::VgFormatToSgPixelFormat(iSurfaceFormat);
+		TDisplayMode refbitmapMode = EglTestConversion::PixelFormatToDisplayMode(format);
+
+		CFbsBitmap* refBitmap = iEglSess->CreateReferenceMaskedBitmapL(refbitmapMode, KRgbGreen, bitmap);
+		CleanupStack::PushL(refBitmap);
+		
+		// compare the obtained reference bitmap with the surface drawn
+		iEglSess->CheckVgDrawingL(iSurfaceFormat, refBitmap);
+		CleanupStack::PopAndDestroy(refBitmap);
+		}
+	else
+		{
+		iEglSess->CheckVgDrawingL(iSurfaceFormat, bitmap);
+		}
+	INFO_PRINTF1(_L("Content is as expected"));
+    eglSwapBuffers(iDisplay,iEglSess->Surface());
+	
+    // cleanup, destroy the window surface before native window.
+    iEglSess->CleanupSurfaceAndContextL();
+	CleanupStack::PopAndDestroy(3, &window); // window, bitmap, sgimage
+	CloseWsSession();
+	CleanAll();
+	return TestStepResult();
+	}
+
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0172
+
+@SYMTestPriority 1
+
+@SYMPREQ 39
+
+@SYMREQ See SGL.GT0386.401 document
+
+@SYMTestCaseDesc
+Check that it is possible to draw a VGImage (created from an RSgImage) to a pixmap surface created from an RSGImage
+
+@SYMTestActions
+Create a reference Bitmap
+Create and fully construct an RSgImage object having the same content as the reference bitmap 
+•	Set the iUsage bit to ESgUsageBitOpenVgImage
+Pass the RSgImage object into eglCreateImageKHR() with
+•	The target parameter set to EGL_NATIVE_PIXMAP_KHR
+•	Use the current display and EGL_NO_CONTEXT
+•	Use a NULL attr_list
+Check that eglCreateImageKHR() does NOT return EGL_NO_IMAGE_KHR
+Create and make current and EGL context bound to OVG APIs and linked to a pixmap surface.
+•	Set the iUsage bit of the underlying RSgImage to ESgUsageBitOpenVgSurface 
+Use vgCreateEGLImageTargetKHR() to construct a VGImage object from the EGLImage.
+•	Check for errors
+Use OpenVG to copy the VGImage to the pixmap surface currently linked to the context.
+Call eglWaitClient() to finish the above drawing instructions synchronously.
+Destroy the original image data
+•	Pass the VGImage into vgDestroyImage()
+•	Pass the EGLImage into eglDestroyImageKHR()
+•	Close the RSgImage 
+Check that the pixmap surface matches the content from the reference bitmap.
+Destroy the pixmap surface
+Destroy the RSgImage
+Check for memory and handle leaks
+
+@SYMTestExpectedResults
+pixmap surface matches the content from the reference bitmap 
+The test will loop through all the possible PixelFormat available for source 
+RSgImages and Destination Surfaces
+•	EUidPixelFormatRGB_565
+•	EUidPixelFormatXRGB_8888
+•	EUidPixelFormatARGB_8888 (source only)
+•	EUidPixelFormatARGB_8888_PRE
+•	EUidPixelFormatA_8  (source only)
+No memory or handle leaks
+*/
+TVerdict CEglTest_EGL_Image_VgImage_To_Pixmap::doTestStepL()
+	{
+	SetTestStepID(_L("GRAPHICS-EGL-0172"));
+	TBool ret = CheckForExtensionL(KEGL_RSgimage | KEGL_KHR_image_base | KEGL_KHR_image_pixmap | KVG_KHR_EGL_image);
+	if(!ret)
+		{
+		// The extension is not supported
+		RecordTestResultL();
+		CloseTMSGraphicsStep();
+		return TestStepResult();
+		}
+
+	CEglTestCommonIniSettings* iniParser = CEglTestCommonIniSettings::NewL();
+	CleanupStack::PushL(iniParser);
+
+	TInt numPixmapSgSurfaceFormats = iniParser->GetNumberOfFormats(KSectionPixmapSgSurfaceFormats);
+	TInt numImageSourceFormats = iniParser->GetNumberOfFormats(KSectionImageSourceFormats);
+	if(!numImageSourceFormats && !numPixmapSgSurfaceFormats)
+		{
+		ERR_PRINTF1(_L("No formats to iterate through"));
+		User::Leave(KErrArgument);
+		}
+	for(TUint j=0; j < numPixmapSgSurfaceFormats; j++)
+		{
+		iSurfaceFormat = iniParser->GetVgFormat(KSectionPixmapSgSurfaceFormats,j);
+		for(TUint i=0; i < numImageSourceFormats; i++)
+			{
+			iSourceFormat = iniParser->GetPixelFormat(KSectionImageSourceFormats,i);
+			if (iSourceFormat == EUidPixelFormatARGB_8888 && (iSurfaceFormat == VG_sARGB_8888_PRE || iSurfaceFormat == VG_sARGB_8888))
+				{
+				// Don't perform the test for this particular format combination
+				//  Causes issues converting pixel values from non-pre to pre
+				continue;
+				}
+#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+			// A_8 related tests are only performed for SgImage-Lite
+			if (iSourceFormat == EUidPixelFormatA_8)
+				continue;
+#endif	
+			doTestPartialStepL();
+			}
+		}
+
+	CleanupStack::PopAndDestroy(iniParser);
+	RecordTestResultL();
+	CloseTMSGraphicsStep();
+	return TestStepResult();
+	}
+
+TVerdict CEglTest_EGL_Image_VgImage_To_Pixmap::doTestPartialStepL()
+	{
+	INFO_PRINTF1(_L("CEglTest_EGL_Image_VgImage_To_Pixmap::doTestPartialStepL"));
+	PrintUsedPixelConfiguration();
+
+	// Create display object
+	GetDisplayL();
+	CreateEglSessionL();
+	iEglSess->InitializeL();
+	iEglSess->OpenSgDriverL();
+
+	// Create a reference bitmap which we use to init the SgImage (we use index=7)
+	TDisplayMode bitmapMode = EglTestConversion::PixelFormatToDisplayMode(iSourceFormat);
+	CFbsBitmap* bitmap = iEglSess->CreateReferenceBitmapL(bitmapMode, KPixmapSize, 7);
+	CleanupStack::PushL(bitmap);
+
+	INFO_PRINTF1(_L("Creating 1 RSgImage"));
+	RSgImage sgImage;
+	CleanupClosePushL(sgImage);
+	TSgImageInfoOpenVgImage imageInfo = TSgImageInfoOpenVgImage(iSourceFormat, KPixmapSize);
+	TInt ret = sgImage.Create(imageInfo, bitmap->DataAddress(), bitmap->DataStride());
+	ASSERT_EQUALS(ret, KErrNone);
+	
+	INFO_PRINTF1(_L("Creating 1 EGLImage from it"));
+	EGLImageKHR imageKHR = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &sgImage, KEglImageAttribsPreservedTrue);
+	ASSERT_EGL_TRUE(imageKHR != EGL_NO_IMAGE_KHR);
+
+	TUidPixelFormat pixelFormat = EglTestConversion::VgFormatToSgPixelFormat(iSurfaceFormat);
+	TSgImageInfoOpenVgTarget imageInfo2 = TSgImageInfoOpenVgTarget(pixelFormat, KPixmapSize);
+	// Create a pixmap surface matching the native image pixel format
+	iEglSess->CreatePixmapSurfaceAndMakeCurrentAndMatchL(imageInfo2, CTestEglSession::EResourceCloseSgImageEarly);
+ 
+	INFO_PRINTF1(_L("Creating 1 VGImage from the EGLImage"));
+	VGImage vgImage = iEglSess->vgCreateImageTargetKHR((VGeglImageKHR)imageKHR);
+	ASSERT_VG_TRUE(vgImage != VG_INVALID_HANDLE);
+
+	// At this point we draw the VGImage created from the SgImage to the current surface.
+	//	# if the source is a A_8, the VGImage acts as a mask and the target surface must contain 
+	//		as a result the pen colour set above blended with the mask
+	//	# otherwise, drawing the VGImage is just a simple copy via vgSetPixels (no blending required) 
+	INFO_PRINTF1(_L("Copying the VGImage to the surface"));
+	if (iSourceFormat == EUidPixelFormatA_8)
+		{
+		// clear surface background
+		VGfloat bgColor[] = {0.0, 0.0, 0.0, 1.0}; // opaque black
+		vgSetfv(VG_CLEAR_COLOR, 4, bgColor);
+		vgClear(0, 0, KPixmapSize.iWidth, KPixmapSize.iHeight);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+
+		// fill paint
+		VGPaint fillPaint = vgCreatePaint();
+		vgSetPaint(fillPaint, VG_FILL_PATH);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		vgSetParameteri(fillPaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
+		VGuint fillColor = 0x00ff00ff; // opaque green
+		vgSetColor(fillPaint, fillColor);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		
+		vgSeti(VG_IMAGE_MODE, VG_DRAW_IMAGE_STENCIL);
+		vgSeti(VG_BLEND_MODE, VG_BLEND_SRC_OVER);
+		vgDrawImage(vgImage);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		eglWaitClient();
+	    vgDestroyPaint(fillPaint);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		}
+	else
+		{
+		vgSetPixels(0, 0, vgImage, 0, 0, KPixmapSize.iWidth, KPixmapSize.iHeight);
+		ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
+		eglWaitClient();
+		}
+	
+	// destroy eglimage and vgimage
+	vgDestroyImage(vgImage);
+	ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
+	ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, imageKHR));
+
+	// Check that the surface contains the expected pixels
+	//  # if the source is a A_8, to compare the surface with a reference bitmap, the following is needed:
+	//    a) a reference bitmap needs to be cleared to black (same colour as the surface was cleared to)
+	//    b) a Pen bitmap, that we clear to green (same colour as the fillPaint used to draw to the surface)
+	//    c) a mask bitmap, which is the reference bitmap used to create the SgImage
+	//  # otherwise, the surface must contain the same pixels as the bitmap used to create the SgImage 
+	if (iSourceFormat == EUidPixelFormatA_8)
+		{
+		// we need a reference bitmap with the same pixel format as the target surface
+		TUidPixelFormat format = EglTestConversion::VgFormatToSgPixelFormat(iSurfaceFormat);
+		TDisplayMode refbitmapMode = EglTestConversion::PixelFormatToDisplayMode(format);
+
+		CFbsBitmap* refBitmap = iEglSess->CreateReferenceMaskedBitmapL(refbitmapMode, KRgbGreen, bitmap);
+		CleanupStack::PushL(refBitmap);
+		
+		// compare the obtained reference bitmap with the surface drawn
+		iEglSess->CheckVgDrawingL(iSurfaceFormat, refBitmap);
+		CleanupStack::PopAndDestroy(refBitmap);
+		}
+	else
+		{
+		iEglSess->CheckVgDrawingL(iSurfaceFormat, bitmap);
+		}
+	INFO_PRINTF1(_L("Content is as expected"));
+	
+	//cleanup
+	CleanupStack::PopAndDestroy(2, bitmap); // bitmap, sgImage
+	CleanAll();
+	return TestStepResult();
+	}
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0173
+
+@SYMTestPriority 1
+
+@SYMPREQ 39
+
+@SYMREQ See SGL.GT0386.401 document
+
+@SYMTestCaseDesc
+Check that it is possible to draw a VGImage (created from an RSgImage) to a pixmap surface based upon a CFbsBitmap, created from a CFbsBitmap Surface,.
+
+@SYMTestActions
+Create a reference Bitmap
+Create and fully construct an RSgImage object having the same content as the reference bitmap 
+•	Set the iUsage bit to ESgUsageBitOpenVgImage
+Create and make current and EGL context bound to OVG APIs and linked to a pixmap surface based upon a CFbsBitmap.
+Pass the RSgImage object into eglCreateImageKHR() with
+•	The target parameter set to EGL_NATIVE_PIXMAP_KHR
+•	Use the current display and EGL_NO_CONTEXT
+•	Use a NULL attr_list
+Check that eglCreateImageKHR() does NOT return EGL_NO_IMAGE_KHR
+Use vgCreateEGLImageTargetKHR() to construct a VGImage object from the EGLImage.
+•	Check for errors
+Use OpenVG to copy the VGImage to the pixmap surface currently linked to the context.
+Call eglWaitClient() to finish the above drawing instructions synchronously.
+Destroy the original image data
+•	Pass the VGImage into vgDestroyImage()
+•	Pass the EGLImage into eglDestroyImageKHR()
+•	Close the RSgImage 
+Check that the pixmap surface matches the content from the reference bitmap.
+Destroy the pixmap surface
+Destroy the CFbsBitmap
+Check for memory and handle leaks
+
+@SYMTestExpectedResults
+pixmap surface matches the content from the reference bitmap
+The test will loop through all the possible PixelFormat available for source RSgImages and Destination Surfaces
+•	EUidPixelFormatRGB_565
+•	EUidPixelFormatXRGB_8888
+•	EUidPixelFormatARGB_8888 (source only)
+•	EUidPixelFormatARGB_8888_PRE
+•	EUidPixelFormatA_8  (source only)
+No memory or handle leaks
+*/
+TVerdict CEglTest_EGL_Image_VGImage_To_Pixmap_CFbs::doTestStepL()
+	{
+	SetTestStepID(_L("GRAPHICS-EGL-0173"));
+	TBool ret = CheckForExtensionL(KEGL_RSgimage | KEGL_KHR_image_base | KEGL_KHR_image_pixmap | KVG_KHR_EGL_image);
+	if(!ret)
+		{
+		// The extension is not supported
+		RecordTestResultL();
+		CloseTMSGraphicsStep();
+		return TestStepResult();
+		}
+
+	CEglTestCommonIniSettings* iniParser = CEglTestCommonIniSettings::NewL();
+	CleanupStack::PushL(iniParser);
+
+	TInt numPixmapFbsSurfaceFormats = iniParser->GetNumberOfFormats(KSectionPixmapFbsSurfaceFormats);
+	TInt numImageSourceFormats = iniParser->GetNumberOfFormats(KSectionImageSourceFormats);
+	if(!numImageSourceFormats && !numPixmapFbsSurfaceFormats)
+		{
+		ERR_PRINTF1(_L("No formats to iterate through"));
+		User::Leave(KErrArgument);
+		}
+	for(TUint j=0; j < numPixmapFbsSurfaceFormats; j++)
+		{
+		iSurfaceFormat = iniParser->GetVgFormat(KSectionPixmapSgSurfaceFormats,j);
+		for(TUint i=0; i < numImageSourceFormats; i++)
+			{
+			iSourceFormat = iniParser->GetPixelFormat(KSectionImageSourceFormats,i);
+			if (iSourceFormat == EUidPixelFormatARGB_8888 && (iSurfaceFormat == VG_sARGB_8888_PRE || iSurfaceFormat == VG_sARGB_8888))
+				{
+				// Don't perform the test for this particular format combination
+				//  Causes issues converting pixel values from non-pre to pre
+				continue;
+				}
+#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+			// A_8 related tests are only performed for SgImage-Lite
+			if (iSourceFormat == EUidPixelFormatA_8)
+				continue;
+#endif	
+			doTestPartialStepL();
+			}
+		}
+
+	CleanupStack::PopAndDestroy(iniParser);
+	RecordTestResultL();
+	CloseTMSGraphicsStep();
+	return TestStepResult();
+	}
+
+TVerdict CEglTest_EGL_Image_VGImage_To_Pixmap_CFbs::doTestPartialStepL()
+	{
+	INFO_PRINTF1(_L("CEglTest_EGL_Image_VGImage_To_Pixmap_CFBS::doTestPartialStepL"));
+	PrintUsedPixelConfiguration();
+
+	// Create display object
+	GetDisplayL();
+	CreateEglSessionL();
+	iEglSess->InitializeL();
+	iEglSess->OpenSgDriverL();
+
+
+	// Create a reference bitmap which we use to init the SgImage (we use index=7)
+	TDisplayMode bitmapMode = EglTestConversion::PixelFormatToDisplayMode(iSourceFormat);
+	CFbsBitmap* bitmap = iEglSess->CreateReferenceBitmapL(bitmapMode, KPixmapSize, 7);
+	CleanupStack::PushL(bitmap);
+
+	INFO_PRINTF1(_L("Creating 1 RSgImage"));
+	RSgImage sgImage;
+	CleanupClosePushL(sgImage);
+	TSgImageInfoOpenVgImage imageInfo = TSgImageInfoOpenVgImage(iSourceFormat, KPixmapSize);
+	TInt ret = sgImage.Create(imageInfo, bitmap->DataAddress(), bitmap->DataStride());
+	ASSERT_EQUALS(ret, KErrNone);
+	
+	// If create pixmap fails, don't fail if there's no matching config (but fail in any other situation):
+    //		Support for a pixmap surface from CFbsBitmap is not mandatory
+    //		We should not enforce it in the tests
+    //		Silently terminate the test without failing.
+	TDisplayMode surfaceBitmapMode = EglTestConversion::VgFormatToDisplayMode(iSurfaceFormat);
+	TRAPD(res, iEglSess->CreatePixmapSurfaceAndMakeCurrentAndMatchL(KPixmapSize, surfaceBitmapMode, EGL_OPENVG_API));
+    if(res == KTestNoMatchingConfig)
+		{
+	    WARN_PRINTF2(_L("Can't create pixmap surface based on bitmap in mode %d, the test will be skipped"), surfaceBitmapMode);
+		CleanupStack::PopAndDestroy(bitmap); 
+		CleanAll();
+		RecordTestResultL();
+		CloseTMSGraphicsStep();
+		return TestStepResult();
+		}
+    User::LeaveIfError(res); // leave here if any other error was raised other than the one above.
+
+	INFO_PRINTF1(_L("Creating 1 EGLImage from the RSgImage"));
+	// Create an EGLImage from the RSgImage
+	EGLImageKHR imageKHR = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &sgImage, KEglImageAttribsPreservedTrue);
+	ASSERT_EGL_TRUE(imageKHR != EGL_NO_IMAGE_KHR);
+
+	INFO_PRINTF1(_L("Creating 1 VGImage from the EGLImage"));
+	VGImage vgImage = iEglSess->vgCreateImageTargetKHR((VGeglImageKHR)imageKHR);
+	ASSERT_VG_TRUE(vgImage != VG_INVALID_HANDLE);
+
+	// At this point we draw the VGImage created from the SgImage to the current surface.
+	//	# if the source is a A_8, the VGImage acts as a mask and the target surface must contain 
+	//		as a result the pen colour set above blended with the mask
+	//	# otherwise, drawing the VGImage is just a simple copy via vgSetPixels (no blending required) 
+	INFO_PRINTF1(_L("Copying the VGImage to the surface"));
+	if (iSourceFormat == EUidPixelFormatA_8)
+		{
+		// clear surface background
+		VGfloat bgColor[] = {0.0, 0.0, 0.0, 1.0}; // opaque black
+		vgSetfv(VG_CLEAR_COLOR, 4, bgColor);
+		vgClear(0, 0, KPixmapSize.iWidth, KPixmapSize.iHeight);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+
+		// fill paint
+		VGPaint fillPaint = vgCreatePaint();
+		vgSetPaint(fillPaint, VG_FILL_PATH);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		vgSetParameteri(fillPaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
+		VGuint fillColor = 0x00ff00ff; // opaque green
+		vgSetColor(fillPaint, fillColor);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		
+		vgSeti(VG_IMAGE_MODE, VG_DRAW_IMAGE_STENCIL);
+		vgSeti(VG_BLEND_MODE, VG_BLEND_SRC_OVER);
+		vgDrawImage(vgImage);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		eglWaitClient();
+	    vgDestroyPaint(fillPaint);
+		ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
+		}
+	else
+		{
+		vgSetPixels(0, 0, vgImage, 0, 0, KPixmapSize.iWidth, KPixmapSize.iHeight);
+		ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
+		eglWaitClient();
+		}
+	
+	// destroy eglimage and vgimage
+	vgDestroyImage(vgImage);
+	ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
+	ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, imageKHR));
+
+	// Check that the surface contains the expected pixels
+	//  # if the source is a A_8, to compare the surface with a reference bitmap, the following is needed:
+	//    a) a reference bitmap needs to be cleared to black (same colour as the surface was cleared to)
+	//    b) a Pen bitmap, that we clear to green (same colour as the fillPaint used to draw to the surface)
+	//    c) a mask bitmap, which is the original reference bitmap used to create the SgImage
+	//  # otherwise, the surface must contain the same pixels as the bitmap used to create the SgImage 
+	if (iSourceFormat == EUidPixelFormatA_8)
+		{
+		// we need a reference bitmap with the same pixel format as the target surface
+		TUidPixelFormat format = EglTestConversion::VgFormatToSgPixelFormat(iSurfaceFormat);
+		TDisplayMode refbitmapMode = EglTestConversion::PixelFormatToDisplayMode(format);
+
+		CFbsBitmap* refBitmap = iEglSess->CreateReferenceMaskedBitmapL(refbitmapMode, KRgbGreen, bitmap);
+		CleanupStack::PushL(refBitmap);
+		
+		// compare the obtained reference bitmap with the surface drawn
+		iEglSess->CheckVgDrawingL(iSurfaceFormat, refBitmap);
+		CleanupStack::PopAndDestroy(refBitmap);
+		}
+	else
+		{
+		iEglSess->CheckVgDrawingL(iSurfaceFormat, bitmap);
+		}
+	INFO_PRINTF1(_L("Content is as expected"));
+	
+	//cleanup
+	CleanupStack::PopAndDestroy(2, bitmap); //bitmap, sgImage 
+	CleanAll();
+	return TestStepResult();
+	}