--- /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);
+ }
+ }