egl/eglinterface/src/eglwindowinterface.cpp
changeset 183 6a1564a2f3e6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/eglinterface/src/eglwindowinterface.cpp	Fri Sep 17 08:36:49 2010 +0300
@@ -0,0 +1,174 @@
+// Copyright (c) 2010 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
+ @publishedPartner
+ @prototype
+*/
+
+
+#include "eglwindowinterface.h"
+#include "eglwindow.h"
+#include <e32base.h>
+#include <w32std.h>
+#include <hal.h>
+
+
+EXPORT_C TEglWindowInterface::TEglWindowInterface(EGLNativeWindowType aNativeWindow) :
+    iEglWindow(reinterpret_cast<REglWindowBase*>(aNativeWindow))
+    {
+    }
+
+
+EXPORT_C TBool TEglWindowInterface::IsValid() const
+    {
+    if(iEglWindow->IsRWindow())
+        {
+        TInt wsHandle = reinterpret_cast<const RWindow*>(iEglWindow)->WsHandle();
+        return (wsHandle != 0);
+        }
+    else
+        {
+        return iEglWindow->IsValid();
+        }
+    }
+
+
+EXPORT_C TSize TEglWindowInterface::SizeInPixels() const
+    {
+    if(iEglWindow->IsRWindow())
+        {
+        return reinterpret_cast<const RWindow*>(iEglWindow)->Size();
+        }
+    else
+        {
+        return iEglWindow->SizeInPixels();
+        }
+    }
+
+
+EXPORT_C TSize TEglWindowInterface::SizeInTwips() const
+    {
+    if(iEglWindow->IsRWindow())
+        {
+        //This is a simple solution to get the twip size of an RWindow.
+        //A temporary CWsScreenDevice is constructed for the screen that
+        //the RWindow exists on and is used to convert the size in pixels
+        //to a size in twips. The temporary CWsScreenDevice is then destructed.
+        //If this is found to be non-performant, we could use a TLS thread 
+        //singleton that lazily creates screen devices and maintains a list
+        //thoughout its lifetime. The singleton could be destroyed though a
+        //static function on TEglWindowInterface as part of eglReleaseThread().
+        //This represents more complexity and should only be considered as an
+        //optimisation if it is found to be neccessary. Note that use of the HAL
+        //interface is not really an option, since we need to find the pixel 
+        //size of the screen and this could be virtualised by the screen.
+    
+        const RWindow* window = reinterpret_cast<const RWindow*>(iEglWindow);
+        RWsSession* winSession = window->Session();
+        EGL_WINDOW_ASSERT_DEBUG(winSession, EEglWindowPanicRWindowHasNoSession);
+        
+        //Do a placement new to avoid the possible KErrNoMemory error.
+        TUint8 screenDevMem[sizeof(CWsScreenDevice)];
+        CWsScreenDevice* screenDev = new (screenDevMem) CWsScreenDevice(*winSession);
+
+        //Nothing we can do about this error.
+        TInt err = screenDev->Construct(window->ScreenNumber());
+        if(err != KErrNone)
+            {
+            screenDev->~CWsScreenDevice();
+            return TSize(0,0);
+            }
+        
+        TSize pixelSize = window->Size();
+        TInt twipWidth = screenDev->HorizontalPixelsToTwips(pixelSize.iWidth);
+        TInt twipHeight = screenDev->VerticalPixelsToTwips(pixelSize.iHeight);
+        TSize twipSize(twipWidth, twipHeight);
+        
+        screenDev->~CWsScreenDevice();
+        return twipSize;
+        }
+    else
+        {
+        return iEglWindow->SizeInTwips();
+        }
+    }
+
+
+EXPORT_C TInt TEglWindowInterface::ScreenNumber() const
+    {
+    if(iEglWindow->IsRWindow())
+        {
+        return reinterpret_cast<const RWindow*>(iEglWindow)->ScreenNumber();
+        }
+    else
+        {
+        return iEglWindow->ScreenNumber();
+        }
+    }
+
+
+EXPORT_C void TEglWindowInterface::SetBackgroundColor(TRgb aColor, TBool aTriggerRedraw)
+    {
+    if(iEglWindow->IsRWindow())
+        {
+        RWindow* window = reinterpret_cast<RWindow*>(iEglWindow);
+        window->SetBackgroundColor(aColor);
+        if(aTriggerRedraw)
+            {
+            window->Invalidate();
+            }
+        }
+    else
+        {
+        iEglWindow->SetBackgroundColor(aColor, aTriggerRedraw);
+        }
+    }
+
+
+EXPORT_C TInt TEglWindowInterface::SetBackgroundSurface(const TSurfaceConfiguration &aConfiguration, TBool aTriggerRedraw)
+    {
+    if(iEglWindow->IsRWindow())
+        {
+#ifdef _DEBUG
+        TSurfaceId surface;
+        aConfiguration.GetSurfaceId(surface);
+        EGL_WINDOW_ASSERT_DEBUG(!surface.IsNull(), EEglWindowPanicInvalidSurface);
+#endif
+        return reinterpret_cast<RWindow*>(iEglWindow)->SetBackgroundSurface(aConfiguration, aTriggerRedraw);
+        }
+    else
+        {
+        return iEglWindow->SetBackgroundSurface(aConfiguration, aTriggerRedraw);
+        }
+    }
+
+
+EXPORT_C void TEglWindowInterface::RemoveBackgroundSurface(TBool aTriggerRedraw)
+    {
+    if(iEglWindow->IsRWindow())
+        {
+        RWindow* window = reinterpret_cast<RWindow*>(iEglWindow);
+        RWsSession* winSession = window->Session();
+        EGL_WINDOW_ASSERT_DEBUG(winSession, EEglWindowPanicRWindowHasNoSession);    
+        window->RemoveBackgroundSurface(aTriggerRedraw);
+        }
+    else
+        {
+        iEglWindow->RemoveBackgroundSurface(aTriggerRedraw);
+        }
+    }