egl/eglinterface/src/eglwindow.cpp
author hgs
Thu, 09 Sep 2010 10:13:45 +0300
changeset 171 414d4b727fd9
permissions -rw-r--r--
201034
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
171
hgs
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     2
// All rights reserved.
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     7
//
hgs
parents:
diff changeset
     8
// Initial Contributors:
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    10
//
hgs
parents:
diff changeset
    11
// Contributors:
hgs
parents:
diff changeset
    12
//
hgs
parents:
diff changeset
    13
// Description:
hgs
parents:
diff changeset
    14
//
hgs
parents:
diff changeset
    15
hgs
parents:
diff changeset
    16
hgs
parents:
diff changeset
    17
/**
hgs
parents:
diff changeset
    18
 @file
hgs
parents:
diff changeset
    19
 @publishedPartner
hgs
parents:
diff changeset
    20
 @prototype
hgs
parents:
diff changeset
    21
*/
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#include "eglwindow.h"
hgs
parents:
diff changeset
    25
#include <e32base.h>
hgs
parents:
diff changeset
    26
#include <w32std.h>
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
//REglWindowBase-----------------------------------------------------
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
REglWindowBase::REglWindowBase() :
hgs
parents:
diff changeset
    32
	iIsRWindow(0xFFFFFFFF)
hgs
parents:
diff changeset
    33
	{
hgs
parents:
diff changeset
    34
	//Check that BC is not broken between RWindow and REglWindowBase.
hgs
parents:
diff changeset
    35
	__ASSERT_COMPILE(sizeof(MWsClientClass) == sizeof(REglWindowBase));
hgs
parents:
diff changeset
    36
	}
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
TBool REglWindowBase::IsRWindow() const
hgs
parents:
diff changeset
    40
    {
hgs
parents:
diff changeset
    41
    //REglWindowBase works out whether it is really an RWindow or a class
hgs
parents:
diff changeset
    42
    //derived from REglWindowBase by checking the location where iWsBuffer 
hgs
parents:
diff changeset
    43
    //would be in an RWindow (iIsRWindow in this class). If this is 
hgs
parents:
diff changeset
    44
    //0xFFFFFFFF, it is not an RWindow.
hgs
parents:
diff changeset
    45
    return (iIsRWindow != 0xFFFFFFFF);
hgs
parents:
diff changeset
    46
    }
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
//-------------------------------------------------------------------
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
//Static function used to copy one configuration to another.
hgs
parents:
diff changeset
    52
static void CopySurfaceConfiguration(const TSurfaceConfiguration& aSrc, TSurfaceConfiguration& aDest)
hgs
parents:
diff changeset
    53
    {
hgs
parents:
diff changeset
    54
    TRect extent;
hgs
parents:
diff changeset
    55
    TRect viewport;
hgs
parents:
diff changeset
    56
    TSurfaceId surface;
hgs
parents:
diff changeset
    57
    aSrc.GetExtent(extent);
hgs
parents:
diff changeset
    58
    aDest.SetExtent(extent);
hgs
parents:
diff changeset
    59
    aSrc.GetSurfaceId(surface);
hgs
parents:
diff changeset
    60
    aDest.SetSurfaceId(surface);
hgs
parents:
diff changeset
    61
    aSrc.GetViewport(viewport);
hgs
parents:
diff changeset
    62
    aDest.SetViewport(viewport);
hgs
parents:
diff changeset
    63
    aDest.SetFlip(aSrc.Flip());
hgs
parents:
diff changeset
    64
    aDest.SetOrientation(aSrc.Orientation());
hgs
parents:
diff changeset
    65
    }
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
//REglStandAloneWindow-----------------------------------------------
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
//Class used to hold surface window data to prevent the 
hgs
parents:
diff changeset
    71
//possibility of binary break if TSurfaceConfiguration grows.
hgs
parents:
diff changeset
    72
NONSHARABLE_CLASS(REglStandAloneWindow::TEglStandAloneWindowData)
hgs
parents:
diff changeset
    73
    {
hgs
parents:
diff changeset
    74
public:
hgs
parents:
diff changeset
    75
    TEglStandAloneWindowData(const TSize& aSizeInPixels, const TSize& aSizeInTwips, TInt aScreenNumber, MEglStandAloneWindowObserver& aObserver);
hgs
parents:
diff changeset
    76
    MEglStandAloneWindowObserver& iObserver;
hgs
parents:
diff changeset
    77
    TSize iSizeInPixels;
hgs
parents:
diff changeset
    78
    TSize iSizeInTwips;
hgs
parents:
diff changeset
    79
    TInt iScreenNumber;
hgs
parents:
diff changeset
    80
    TRgb iBackgroundColor;
hgs
parents:
diff changeset
    81
    TSurfaceConfiguration iSurfaceConfig;
hgs
parents:
diff changeset
    82
    };
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
REglStandAloneWindow::TEglStandAloneWindowData::TEglStandAloneWindowData(const TSize& aSizeInPixels, const TSize& aSizeInTwips, TInt aScreenNumber, MEglStandAloneWindowObserver& aObserver) :
hgs
parents:
diff changeset
    86
    iObserver(aObserver),
hgs
parents:
diff changeset
    87
    iSizeInPixels(aSizeInPixels),
hgs
parents:
diff changeset
    88
    iSizeInTwips(aSizeInTwips),
hgs
parents:
diff changeset
    89
    iScreenNumber(aScreenNumber),
hgs
parents:
diff changeset
    90
    iBackgroundColor(0,0,0,0) //Transparent Black.
hgs
parents:
diff changeset
    91
    {
hgs
parents:
diff changeset
    92
    CopySurfaceConfiguration(TSurfaceConfiguration(), iSurfaceConfig);
hgs
parents:
diff changeset
    93
    }
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
EXPORT_C REglStandAloneWindow::REglStandAloneWindow() :
hgs
parents:
diff changeset
    97
    iData(NULL)
hgs
parents:
diff changeset
    98
	{
hgs
parents:
diff changeset
    99
	}
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
	
hgs
parents:
diff changeset
   102
EXPORT_C TInt REglStandAloneWindow::Create(const TSize& aSizeInPixels, const TSize& aSizeInTwips, TInt aScreenNumber, MEglStandAloneWindowObserver& aObserver)
hgs
parents:
diff changeset
   103
	{
hgs
parents:
diff changeset
   104
	if(iData)
hgs
parents:
diff changeset
   105
	    {
hgs
parents:
diff changeset
   106
	    return KErrAlreadyExists;
hgs
parents:
diff changeset
   107
	    }
hgs
parents:
diff changeset
   108
	
hgs
parents:
diff changeset
   109
	EGL_WINDOW_ASSERT_DEBUG(aSizeInPixels.iWidth >= 0, EEglWindowPanicSizeInPixelsIsNegative);
hgs
parents:
diff changeset
   110
	EGL_WINDOW_ASSERT_DEBUG(aSizeInPixels.iHeight >= 0, EEglWindowPanicSizeInPixelsIsNegative);
hgs
parents:
diff changeset
   111
	EGL_WINDOW_ASSERT_DEBUG(aSizeInTwips.iWidth >= 0, EEglWindowPanicSizeInTwipsIsNegative);
hgs
parents:
diff changeset
   112
	EGL_WINDOW_ASSERT_DEBUG(aSizeInTwips.iHeight >= 0, EEglWindowPanicSizeInTwipsIsNegative);
hgs
parents:
diff changeset
   113
	EGL_WINDOW_ASSERT_DEBUG(aScreenNumber >= 0 || aScreenNumber == KAllScreens, EEglWindowPanicInvalidScreenNumber);
hgs
parents:
diff changeset
   114
	
hgs
parents:
diff changeset
   115
	//Allocate and initialize data.
hgs
parents:
diff changeset
   116
    iData = new TEglStandAloneWindowData(aSizeInPixels, aSizeInTwips, aScreenNumber, aObserver);
hgs
parents:
diff changeset
   117
    if(!iData)
hgs
parents:
diff changeset
   118
        {
hgs
parents:
diff changeset
   119
        return KErrNoMemory;
hgs
parents:
diff changeset
   120
        }
hgs
parents:
diff changeset
   121
    
hgs
parents:
diff changeset
   122
	return KErrNone;
hgs
parents:
diff changeset
   123
	}
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
EXPORT_C void REglStandAloneWindow::Close()
hgs
parents:
diff changeset
   127
    {
hgs
parents:
diff changeset
   128
    if(!iData)
hgs
parents:
diff changeset
   129
        {
hgs
parents:
diff changeset
   130
        return;
hgs
parents:
diff changeset
   131
        }
hgs
parents:
diff changeset
   132
    
hgs
parents:
diff changeset
   133
    //Remove background surface with a forced redraw so that 
hgs
parents:
diff changeset
   134
    //the contents immediately disappear from the screen.
hgs
parents:
diff changeset
   135
    RemoveBackgroundSurface(ETrue);
hgs
parents:
diff changeset
   136
    delete iData;
hgs
parents:
diff changeset
   137
    iData = NULL;
hgs
parents:
diff changeset
   138
    }
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
EXPORT_C void REglStandAloneWindow::SetSizeInPixels(const TSize& aSize)
hgs
parents:
diff changeset
   142
    {
hgs
parents:
diff changeset
   143
    EGL_WINDOW_ASSERT_ALWAYS(iData, EEglWindowPanicREglStandAloneWindowNotCreated);
hgs
parents:
diff changeset
   144
    EGL_WINDOW_ASSERT_DEBUG(aSize.iWidth >= 0, EEglWindowPanicSizeInPixelsIsNegative);
hgs
parents:
diff changeset
   145
    EGL_WINDOW_ASSERT_DEBUG(aSize.iHeight >= 0, EEglWindowPanicSizeInPixelsIsNegative);
hgs
parents:
diff changeset
   146
    iData->iSizeInPixels = aSize;
hgs
parents:
diff changeset
   147
    }
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
EXPORT_C void REglStandAloneWindow::SetSizeInTwips(const TSize& aSize)
hgs
parents:
diff changeset
   151
    {
hgs
parents:
diff changeset
   152
    EGL_WINDOW_ASSERT_ALWAYS(iData, EEglWindowPanicREglStandAloneWindowNotCreated);
hgs
parents:
diff changeset
   153
    EGL_WINDOW_ASSERT_DEBUG(aSize.iWidth >= 0, EEglWindowPanicSizeInTwipsIsNegative);
hgs
parents:
diff changeset
   154
    EGL_WINDOW_ASSERT_DEBUG(aSize.iHeight >= 0, EEglWindowPanicSizeInTwipsIsNegative);
hgs
parents:
diff changeset
   155
    iData->iSizeInTwips = aSize;
hgs
parents:
diff changeset
   156
    }
hgs
parents:
diff changeset
   157
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
EXPORT_C TRgb REglStandAloneWindow::BackgroundColor() const
hgs
parents:
diff changeset
   160
    {
hgs
parents:
diff changeset
   161
    EGL_WINDOW_ASSERT_ALWAYS(iData, EEglWindowPanicREglStandAloneWindowNotCreated);
hgs
parents:
diff changeset
   162
    return iData->iBackgroundColor;
hgs
parents:
diff changeset
   163
    }
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
EXPORT_C TBool REglStandAloneWindow::GetBackgroundSurface(TSurfaceConfiguration& aConfiguration) const
hgs
parents:
diff changeset
   167
    {
hgs
parents:
diff changeset
   168
    EGL_WINDOW_ASSERT_ALWAYS(iData, EEglWindowPanicREglStandAloneWindowNotCreated);
hgs
parents:
diff changeset
   169
    
hgs
parents:
diff changeset
   170
    TSurfaceId surface;
hgs
parents:
diff changeset
   171
    iData->iSurfaceConfig.GetSurfaceId(surface);
hgs
parents:
diff changeset
   172
    if(surface.IsNull())
hgs
parents:
diff changeset
   173
        {
hgs
parents:
diff changeset
   174
        return EFalse;
hgs
parents:
diff changeset
   175
        }
hgs
parents:
diff changeset
   176
    
hgs
parents:
diff changeset
   177
    CopySurfaceConfiguration(iData->iSurfaceConfig, aConfiguration);
hgs
parents:
diff changeset
   178
    return ETrue;
hgs
parents:
diff changeset
   179
    }
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
EXPORT_C TBool REglStandAloneWindow::IsValid() const
hgs
parents:
diff changeset
   183
    {
hgs
parents:
diff changeset
   184
    return iData != NULL;
hgs
parents:
diff changeset
   185
    }
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
EXPORT_C TSize REglStandAloneWindow::SizeInPixels() const
hgs
parents:
diff changeset
   189
    {
hgs
parents:
diff changeset
   190
    EGL_WINDOW_ASSERT_ALWAYS(iData, EEglWindowPanicREglStandAloneWindowNotCreated);
hgs
parents:
diff changeset
   191
    return iData->iSizeInPixels;
hgs
parents:
diff changeset
   192
    }
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
EXPORT_C TSize REglStandAloneWindow::SizeInTwips() const
hgs
parents:
diff changeset
   196
    {
hgs
parents:
diff changeset
   197
    EGL_WINDOW_ASSERT_ALWAYS(iData, EEglWindowPanicREglStandAloneWindowNotCreated);
hgs
parents:
diff changeset
   198
    return iData->iSizeInTwips;
hgs
parents:
diff changeset
   199
    }
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
EXPORT_C TInt REglStandAloneWindow::ScreenNumber() const
hgs
parents:
diff changeset
   203
    {
hgs
parents:
diff changeset
   204
    EGL_WINDOW_ASSERT_ALWAYS(iData, EEglWindowPanicREglStandAloneWindowNotCreated);
hgs
parents:
diff changeset
   205
    return iData->iScreenNumber;
hgs
parents:
diff changeset
   206
    }
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
EXPORT_C void REglStandAloneWindow::SetBackgroundColor(TRgb aColor, TBool aTriggerRedraw)
hgs
parents:
diff changeset
   210
    {
hgs
parents:
diff changeset
   211
    EGL_WINDOW_ASSERT_ALWAYS(iData, EEglWindowPanicREglStandAloneWindowNotCreated);
hgs
parents:
diff changeset
   212
    iData->iBackgroundColor = aColor;
hgs
parents:
diff changeset
   213
    iData->iObserver.ColorWasSetForWindow(*this, aTriggerRedraw);
hgs
parents:
diff changeset
   214
    }
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
EXPORT_C TInt REglStandAloneWindow::SetBackgroundSurface(const TSurfaceConfiguration& aConfiguration, TBool aTriggerRedraw)
hgs
parents:
diff changeset
   218
    {
hgs
parents:
diff changeset
   219
    EGL_WINDOW_ASSERT_ALWAYS(iData, EEglWindowPanicREglStandAloneWindowNotCreated);
hgs
parents:
diff changeset
   220
    
hgs
parents:
diff changeset
   221
#ifdef _DEBUG
hgs
parents:
diff changeset
   222
    //Assert that the surface is not null.
hgs
parents:
diff changeset
   223
    TSurfaceId surface;
hgs
parents:
diff changeset
   224
    aConfiguration.GetSurfaceId(surface);
hgs
parents:
diff changeset
   225
    EGL_WINDOW_ASSERT_DEBUG(!surface.IsNull(), EEglWindowPanicInvalidSurface);
hgs
parents:
diff changeset
   226
#endif
hgs
parents:
diff changeset
   227
    
hgs
parents:
diff changeset
   228
    //Remove the old surface if one exists.
hgs
parents:
diff changeset
   229
    RemoveBackgroundSurface(EFalse);
hgs
parents:
diff changeset
   230
    
hgs
parents:
diff changeset
   231
    //Save the new configuration and alert the observer that a new surface was set.
hgs
parents:
diff changeset
   232
    TInt err = KErrNone;
hgs
parents:
diff changeset
   233
    CopySurfaceConfiguration(aConfiguration, iData->iSurfaceConfig);
hgs
parents:
diff changeset
   234
    err = iData->iObserver.SurfaceWasSetForWindow(*this, aTriggerRedraw);
hgs
parents:
diff changeset
   235
    
hgs
parents:
diff changeset
   236
    return err;
hgs
parents:
diff changeset
   237
    }
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
EXPORT_C void REglStandAloneWindow::RemoveBackgroundSurface(TBool aTriggerRedraw)
hgs
parents:
diff changeset
   241
    {
hgs
parents:
diff changeset
   242
    EGL_WINDOW_ASSERT_ALWAYS(iData, EEglWindowPanicREglStandAloneWindowNotCreated);
hgs
parents:
diff changeset
   243
    
hgs
parents:
diff changeset
   244
    //If there is a valid config, alert the observer that it will be removed.
hgs
parents:
diff changeset
   245
    TSurfaceId surface;
hgs
parents:
diff changeset
   246
    iData->iSurfaceConfig.GetSurfaceId(surface);
hgs
parents:
diff changeset
   247
    if(!surface.IsNull())
hgs
parents:
diff changeset
   248
        {
hgs
parents:
diff changeset
   249
        iData->iObserver.SurfaceWillBeRemovedForWindow(*this, aTriggerRedraw);
hgs
parents:
diff changeset
   250
        }
hgs
parents:
diff changeset
   251
    
hgs
parents:
diff changeset
   252
    //Zero the configuration.
hgs
parents:
diff changeset
   253
    CopySurfaceConfiguration(TSurfaceConfiguration(), iData->iSurfaceConfig);
hgs
parents:
diff changeset
   254
    }
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
//-------------------------------------------------------------------