diff -r 2bd88482bfe5 -r 6a1564a2f3e6 egl/eglinterface/src/eglwindowinterface.cpp --- /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 +#include +#include + + +EXPORT_C TEglWindowInterface::TEglWindowInterface(EGLNativeWindowType aNativeWindow) : + iEglWindow(reinterpret_cast(aNativeWindow)) + { + } + + +EXPORT_C TBool TEglWindowInterface::IsValid() const + { + if(iEglWindow->IsRWindow()) + { + TInt wsHandle = reinterpret_cast(iEglWindow)->WsHandle(); + return (wsHandle != 0); + } + else + { + return iEglWindow->IsValid(); + } + } + + +EXPORT_C TSize TEglWindowInterface::SizeInPixels() const + { + if(iEglWindow->IsRWindow()) + { + return reinterpret_cast(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(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(iEglWindow)->ScreenNumber(); + } + else + { + return iEglWindow->ScreenNumber(); + } + } + + +EXPORT_C void TEglWindowInterface::SetBackgroundColor(TRgb aColor, TBool aTriggerRedraw) + { + if(iEglWindow->IsRWindow()) + { + RWindow* window = reinterpret_cast(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(iEglWindow)->SetBackgroundSurface(aConfiguration, aTriggerRedraw); + } + else + { + return iEglWindow->SetBackgroundSurface(aConfiguration, aTriggerRedraw); + } + } + + +EXPORT_C void TEglWindowInterface::RemoveBackgroundSurface(TBool aTriggerRedraw) + { + if(iEglWindow->IsRWindow()) + { + RWindow* window = reinterpret_cast(iEglWindow); + RWsSession* winSession = window->Session(); + EGL_WINDOW_ASSERT_DEBUG(winSession, EEglWindowPanicRWindowHasNoSession); + window->RemoveBackgroundSurface(aTriggerRedraw); + } + else + { + iEglWindow->RemoveBackgroundSurface(aTriggerRedraw); + } + }