graphicstest/uibench/s60/src/windows/tsmallwindowopenvg.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/uibench/s60/src/windows/tsmallwindowopenvg.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,189 @@
+// Copyright (c) 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 "tsmallwindowopenvg.h"
+
+
+// todo: is it the right config
+const EGLint KColorRGB565AttribList[] =
+    {
+    EGL_RED_SIZE,			5,
+    EGL_GREEN_SIZE,			6,
+    EGL_BLUE_SIZE,			5,
+    EGL_SURFACE_TYPE,		EGL_WINDOW_BIT,
+    EGL_RENDERABLE_TYPE, 	EGL_OPENVG_BIT,
+    EGL_NONE
+    };
+
+
+CTWindow* CTSmallWindowOpenVG::NewL(RWsSession &aWs, 
+        const RWindowTreeNode &aParent, 
+        const TPoint& aStartingPoint,
+        const TSize& aWindowSize)
+    {
+    CTSmallWindowOpenVG* self = new (ELeave) CTSmallWindowOpenVG(aStartingPoint, aWindowSize);
+    CleanupStack::PushL(self);
+    self->ConstructL(aWs, aParent);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CTSmallWindowOpenVG::CTSmallWindowOpenVG(const TPoint& aStartingPoint, const TSize& aWindowSize):
+        CTWindow(aStartingPoint, aWindowSize)
+	{
+	// empty
+	}
+
+CTSmallWindowOpenVG::~CTSmallWindowOpenVG()
+	{
+	// Make sure that this egl status is active
+	eglMakeCurrent(iDisplay, iSurface, iSurface, iContextVG);
+    vgDestroyPaint(iFillPaint);
+    vgDestroyPaint(iStrokePaint);
+    vgDestroyPath(iPath);
+	if (iContextVG != EGL_NO_CONTEXT)
+		{
+		eglDestroyContext(iDisplay,iContextVG);
+		}
+	if (iSurface != EGL_NO_SURFACE)
+		{
+		eglDestroySurface(iDisplay,iSurface);
+		}	
+	// Call eglMakeCurrent() to ensure the surfaces and contexts are truly destroyed. 
+	eglMakeCurrent(iDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+	//eglTerminate(iDisplay);
+	eglReleaseThread();
+	}
+
+
+
+void CTSmallWindowOpenVG::ConstructL(RWsSession &aWs, const RWindowTreeNode &aParent)
+	{
+	CTWindow::ConstructL(aWs, aParent);
+	
+	iDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+	eglInitialize(iDisplay, NULL, NULL);
+	
+	EGLint numConfigs;
+	EGLConfig chosenConfig = 0;
+
+	// Choose the config to use
+	eglChooseConfig(iDisplay, KColorRGB565AttribList, &chosenConfig, 1, &numConfigs);
+	if (numConfigs == 0)
+		{
+		RDebug::Printf("No matching configs found", eglQueryString(iDisplay, EGL_EXTENSIONS));
+		User::Leave(KErrNotSupported);
+		}
+	
+	// Create window surface to draw direct to.
+	eglBindAPI(EGL_OPENVG_API);
+	iSurface = eglCreateWindowSurface(iDisplay, chosenConfig, &iWindow, NULL);
+
+	// Create context to store surface settings
+	iContextVG = eglCreateContext(iDisplay, chosenConfig, EGL_NO_CONTEXT, NULL);
+	
+	eglMakeCurrent(iDisplay, iSurface, iSurface, iContextVG);	
+	
+    VGfloat strokeColor[4]  = {1.f, 0.f, 0.f, 1.f};
+    VGfloat fillColor[4]    = {0.f, 0.f, 1.f, 1.f};
+
+    VGubyte pathSegments[6] =
+        {
+        VG_LINE_TO | (int)VG_ABSOLUTE,
+        VG_LINE_TO | (int)VG_ABSOLUTE,
+        VG_LINE_TO | (int)VG_ABSOLUTE,
+        VG_LINE_TO | (int)VG_ABSOLUTE,
+        VG_CLOSE_PATH
+        };
+
+    VGfloat pathData[10] =
+        {
+          0.f, 100.f,
+        100.f, 100.f,
+        100.f,   0.f,
+          0.f,   0.f
+        };
+
+    vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
+
+    iCurrentRotation = 0.f;
+    iStrokePaint = vgCreatePaint();
+    iFillPaint   = vgCreatePaint();
+
+    vgSetParameteri(iStrokePaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
+    vgSetParameterfv(iStrokePaint, VG_PAINT_COLOR, 4, strokeColor);
+
+    vgSetParameteri(iFillPaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
+    vgSetParameterfv(iFillPaint, VG_PAINT_COLOR, 4, fillColor);
+
+    iPath = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.0f, 0.0f, 4, 4, (unsigned int)VG_PATH_CAPABILITY_ALL);
+
+    vgAppendPathData(iPath, 4, pathSegments, pathData);
+	}
+
+void CTSmallWindowOpenVG::RenderL()
+	{
+	CTWindow::RenderL();
+
+	// Make sure that this egl status is active
+	eglMakeCurrent(iDisplay, iSurface, iSurface, iContextVG);
+
+    VGfloat clearColor[4] = {0.1f, 0.2f, 0.4f, 1.f};
+    VGfloat scaleFactor = Size().iWidth/200.f;
+    if (Size().iHeight/200.f < scaleFactor)
+        {
+        scaleFactor = Size().iHeight/200.f;
+        }        
+
+    iCurrentRotation = iTime;
+
+    if (iCurrentRotation >= 360.f)
+        {
+        iCurrentRotation -= 360.f;
+        }
+
+    vgSetfv(VG_CLEAR_COLOR, 4, clearColor);
+    vgClear(0, 0, Size().iWidth, Size().iHeight);
+
+    vgLoadIdentity();
+    vgTranslate((float)Size().iHeight / 2, (float)Size().iHeight / 2);
+    vgScale(scaleFactor, scaleFactor);
+    vgRotate(iCurrentRotation);
+    vgTranslate(-50.f, -50.f);
+
+    vgSeti(VG_BLEND_MODE, VG_BLEND_SRC_OVER);
+    vgSeti(VG_FILL_RULE, VG_EVEN_ODD);
+
+    vgSetPaint(iFillPaint, VG_FILL_PATH);
+
+    vgSetf(VG_STROKE_LINE_WIDTH, 10.f);
+    vgSeti(VG_STROKE_CAP_STYLE, VG_CAP_ROUND);
+    vgSeti(VG_STROKE_JOIN_STYLE, VG_JOIN_ROUND);
+    vgSetf(VG_STROKE_MITER_LIMIT, 0.f);
+    vgSetPaint(iStrokePaint, VG_STROKE_PATH);
+
+    vgDrawPath(iPath, VG_FILL_PATH | VG_STROKE_PATH);
+
+	iTime++;
+	eglSwapBuffers(iDisplay, iSurface);
+	}
+