uiacceltk/hitchcock/plugins/openwfcrs/inc/openwfcwrapper.h
author hgs
Wed, 03 Nov 2010 19:29:22 +0200
changeset 64 9f8c0686fb49
permissions -rw-r--r--
201044
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64
hgs
parents:
diff changeset
     1
// Copyright (c) 2008-2009 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
#ifndef OPENWFCWRAPPER_H_
hgs
parents:
diff changeset
    17
#define OPENWFCWRAPPER_H_
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include <babitflags.h>
hgs
parents:
diff changeset
    20
#include <graphics/wsscene.h>
hgs
parents:
diff changeset
    21
#include <babitflags.h>
hgs
parents:
diff changeset
    22
#include <graphics/surface.h>
hgs
parents:
diff changeset
    23
#include "displaypolicy.h"
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
//
hgs
parents:
diff changeset
    26
//OpenWFC stuff
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
#include <e32std.h>
hgs
parents:
diff changeset
    29
#include <e32base.h>
hgs
parents:
diff changeset
    30
#include <e32hashtab.h>     //for RHashMap
hgs
parents:
diff changeset
    31
#include <WF/wfc.h>
hgs
parents:
diff changeset
    32
#include <EGL/egl.h>
hgs
parents:
diff changeset
    33
#include <graphics/surfacemanager.h>
hgs
parents:
diff changeset
    34
#include <graphics/wsdisplaycontrol.h>
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
//
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
class COpenWfcJobManger;
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
class TDisplayConfiguration;
hgs
parents:
diff changeset
    41
class CElementWrapper;
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
class COpenWfcWrapper : public CBase, public MWsDisplayControl
hgs
parents:
diff changeset
    44
	{
hgs
parents:
diff changeset
    45
friend class CElementWrapper;
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
public:
hgs
parents:
diff changeset
    48
	static COpenWfcWrapper* NewL(TInt aScreenNo, CDisplayPolicy* aDisplayPolicy);
hgs
parents:
diff changeset
    49
	TInt SetUiSurface(const TSurfaceId& aNewUiSurface);
hgs
parents:
diff changeset
    50
	~COpenWfcWrapper();
hgs
parents:
diff changeset
    51
	
hgs
parents:
diff changeset
    52
	MWsElement* CreateElementL();
hgs
parents:
diff changeset
    53
	void DestroyElement(MWsElement* aElement);
hgs
parents:
diff changeset
    54
	void Compose(const TSurfaceId& aOffScreenTarget, const TPoint& aOrigin,
hgs
parents:
diff changeset
    55
	             MWsElement* aStart, MWsElement* aEnd, TRequestStatus* aCompleted);
hgs
parents:
diff changeset
    56
	TInt AddElement(MWsElement* aElement, MWsElement* aAbove);
hgs
parents:
diff changeset
    57
	void RemoveElement(MWsElement* aElement);
hgs
parents:
diff changeset
    58
	void PauseCompositorIfNeeded();
hgs
parents:
diff changeset
    59
	void ResumeCompositorIfPaused();
hgs
parents:
diff changeset
    60
	void SetScreenRotation(MWsScene::TSceneRotation aRotation);
hgs
parents:
diff changeset
    61
	MWsScene::TSceneRotation ScreenRotation() const;
hgs
parents:
diff changeset
    62
	TSize ScreenSize() const;
hgs
parents:
diff changeset
    63
	void Begin(const TRegion* aRegion);
hgs
parents:
diff changeset
    64
	void End();	
hgs
parents:
diff changeset
    65
	TBool CompositionDue ();
hgs
parents:
diff changeset
    66
	void Compose(TRequestStatus* aCompleted);
hgs
parents:
diff changeset
    67
	TInt FlushedSetConfiguration(const TDisplayConfiguration& aConfig);
hgs
parents:
diff changeset
    68
    TBool WithinBeginEnd() { return iWithinBeginEnd; };
hgs
parents:
diff changeset
    69
	CDisplayPolicy* DisplayPolicy();
hgs
parents:
diff changeset
    70
    void FlushSceneElementChanges ();
hgs
parents:
diff changeset
    71
    void RemoveElementFromSceneList(CElementWrapper* aElement);
hgs
parents:
diff changeset
    72
	
hgs
parents:
diff changeset
    73
    /*-------------------------------------------------------------------*//*
hgs
parents:
diff changeset
    74
     * CBase interface implementation functions
hgs
parents:
diff changeset
    75
     *//*-------------------------------------------------------------------*/
hgs
parents:
diff changeset
    76
    //Standard symbian interface extension mechanism
hgs
parents:
diff changeset
    77
    virtual TInt        Extension_              (TUint aExtensionId, TAny*& a0, TAny* a1);
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
    enum    TInternalExtensionGuids
hgs
parents:
diff changeset
    80
        {   //These debug object interfaces need not be supported at runtime or on all platforms
hgs
parents:
diff changeset
    81
        EExtensionDebugBackendGuid  =   0x1028589A,
hgs
parents:
diff changeset
    82
        EExtensionDebugContextGuid  =   0x1028589B,
hgs
parents:
diff changeset
    83
        EExtensionDebugDeviceGuid   =   0x1028589C,
hgs
parents:
diff changeset
    84
        EExtensionDebugElementGuid  =   0x1028589D,
hgs
parents:
diff changeset
    85
        EExtensionDebugSourceGuid   =   0x1028589E, //F still spare when this was written...
hgs
parents:
diff changeset
    86
        };
hgs
parents:
diff changeset
    87
    
hgs
parents:
diff changeset
    88
    /**    Get Extension Interface.
hgs
parents:
diff changeset
    89
     *  Implemented using the CBase::Extension_() mechanism 
hgs
parents:
diff changeset
    90
     *  @param  aExtensionId    The GUID/ Well-known ID of the interface
hgs
parents:
diff changeset
    91
     *  @return pointer to the interface or NULL if not available
hgs
parents:
diff changeset
    92
     **/
hgs
parents:
diff changeset
    93
    inline TAny* GetInterface(TUint aExtensionId);
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
    /** Get Extension Interface - templated helper.
hgs
parents:
diff changeset
    96
     *  Resolves the ID and returned pointer based on the class name.
hgs
parents:
diff changeset
    97
     *  Class name should support ETypeId intergral value, else use non-template version. 
hgs
parents:
diff changeset
    98
     *  @param  MClass  The class of the interface with embedded GUID / Well known ID 
hgs
parents:
diff changeset
    99
     *  @return pointer to the interface or NULL if not available
hgs
parents:
diff changeset
   100
     **/
hgs
parents:
diff changeset
   101
    template <class MClass> MClass* GetInterface()
hgs
parents:
diff changeset
   102
    {
hgs
parents:
diff changeset
   103
        return static_cast<MClass*>(GetInterface(MClass::ETypeId));
hgs
parents:
diff changeset
   104
    }
hgs
parents:
diff changeset
   105
    
hgs
parents:
diff changeset
   106
    TInt RegisterSurface(const TSurfaceId& aSurface);
hgs
parents:
diff changeset
   107
    TInt UnregisterSurface(const TSurfaceId& aSurface);
hgs
parents:
diff changeset
   108
    void Compose(const TSurfaceId& aOffScreenTarget, TRequestStatus* aCompleted);
hgs
parents:
diff changeset
   109
    virtual TBitFlags32 SupportedScreenRotations() const;
hgs
parents:
diff changeset
   110
    void PauseComposition();
hgs
parents:
diff changeset
   111
    void ResumeComposition ();
hgs
parents:
diff changeset
   112
	/*-------------------------------------------------------------------*//*
hgs
parents:
diff changeset
   113
	* MWsDisplayControl/MDisplayControlBase interface implementation functions
hgs
parents:
diff changeset
   114
	*//*-------------------------------------------------------------------*/
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
    virtual TInt NumberOfResolutions()const ;
hgs
parents:
diff changeset
   117
    virtual TInt GetResolutions(RArray<TResolution>& aResolutions)const ;
hgs
parents:
diff changeset
   118
    virtual void GetConfiguration(TDisplayConfiguration& aConfig)const ;
hgs
parents:
diff changeset
   119
    virtual TInt SetConfiguration(const TDisplayConfiguration& aConfig) ;
hgs
parents:
diff changeset
   120
    virtual TInt PreferredDisplayVersion()const ;
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
    virtual void NotifyOnDisplayChange(TRequestStatus& aStatus);
hgs
parents:
diff changeset
   123
    virtual void NotifyOnDisplayChangeCancel();
hgs
parents:
diff changeset
   124
    virtual void NotifyOnConfigChange(TRequestStatus& aStatus);
hgs
parents:
diff changeset
   125
    virtual void NotifyOnConfigChangeCancel();
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
    //"secret" methods available to element
hgs
parents:
diff changeset
   128
    WFCDevice Device(){return iDevice;}
hgs
parents:
diff changeset
   129
    WFCContext OnScreenContext()   {return iOnScreenContext;}
hgs
parents:
diff changeset
   130
    WFCSource IncEltRefRegSource(const TSurfaceId& aHashKey); //<@return registered source handle or NULL if not registered
hgs
parents:
diff changeset
   131
    TInt DecEltRefRegSource(const TSurfaceId& aHashKey); //<@return 0=destroyed, +ve count left, -ve error
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
    static TInt TranslateOpenWfcError(WFCErrorCode error);
hgs
parents:
diff changeset
   134
    static void DestroyAllContextElements(WFCDevice dev, WFCContext ctx);
hgs
parents:
diff changeset
   135
    RSurfaceManager& SurfaceManager(){return iSurfaceManager;}
hgs
parents:
diff changeset
   136
    EGLDisplay Display(){return iEGLDisplay;}
hgs
parents:
diff changeset
   137
    
hgs
parents:
diff changeset
   138
private:
hgs
parents:
diff changeset
   139
    COpenWfcWrapper(CDisplayPolicy* aDisplayPolicy);
hgs
parents:
diff changeset
   140
	void ConstructL(TInt aScreenId);
hgs
parents:
diff changeset
   141
	TInt AttachSurfaceToUiElement(CElementWrapper* aNewUiElement);
hgs
parents:
diff changeset
   142
	void SetCompositionModified();
hgs
parents:
diff changeset
   143
	
hgs
parents:
diff changeset
   144
    static TUint32 HashFunction(const TSurfaceId& aHashKey);
hgs
parents:
diff changeset
   145
    void  ComposeInternal(const TSurfaceId&  aOffScreenTarget,
hgs
parents:
diff changeset
   146
                                 const TPoint&      aOrigin,
hgs
parents:
diff changeset
   147
                                 MWsElement*      aStart,
hgs
parents:
diff changeset
   148
                                 MWsElement*      aEnd,
hgs
parents:
diff changeset
   149
                                 TRequestStatus*    aCompleted);
hgs
parents:
diff changeset
   150
    TBool IsValidSurface(const TSurfaceId& aSurface);
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
private:
hgs
parents:
diff changeset
   153
	TBool iPaused;
hgs
parents:
diff changeset
   154
	TBool iWithinBeginEnd;
hgs
parents:
diff changeset
   155
	TBool iCompositionModified;
hgs
parents:
diff changeset
   156
	TBool iAllowCompositorPause;
hgs
parents:
diff changeset
   157
	
hgs
parents:
diff changeset
   158
	CElementWrapper* iUiElement1;
hgs
parents:
diff changeset
   159
	CElementWrapper* iUiElement2;
hgs
parents:
diff changeset
   160
	
hgs
parents:
diff changeset
   161
	TSurfaceId iUiSurface;
hgs
parents:
diff changeset
   162
	CDisplayPolicy* iDisplayPolicy;
hgs
parents:
diff changeset
   163
	
hgs
parents:
diff changeset
   164
private:
hgs
parents:
diff changeset
   165
    class OffScreenComposeGuard;
hgs
parents:
diff changeset
   166
    
hgs
parents:
diff changeset
   167
    struct SourceAndRef
hgs
parents:
diff changeset
   168
        {
hgs
parents:
diff changeset
   169
        WFCSource source;
hgs
parents:
diff changeset
   170
        TInt sourceRef;
hgs
parents:
diff changeset
   171
        TInt elementRef;
hgs
parents:
diff changeset
   172
        };
hgs
parents:
diff changeset
   173
    RHashMap<TSurfaceId, SourceAndRef> iSourceMap;
hgs
parents:
diff changeset
   174
    
hgs
parents:
diff changeset
   175
    WFCDevice iDevice;
hgs
parents:
diff changeset
   176
    WFCContext iOnScreenContext;
hgs
parents:
diff changeset
   177
    EGLDisplay iEGLDisplay;
hgs
parents:
diff changeset
   178
    WFCint iScreenNumber;
hgs
parents:
diff changeset
   179
    static const TInt iInitialSourceMapSize = 0x0;
hgs
parents:
diff changeset
   180
    CElementWrapper* iSceneElementList;      //all elements visible in the scene hierarchy
hgs
parents:
diff changeset
   181
    CElementWrapper* iRemoveElementList;     //all elements removed from the scene hierarchy
hgs
parents:
diff changeset
   182
    CElementWrapper* iCleanupElementList;    //all elements currently allocated are destroyed on cleanup
hgs
parents:
diff changeset
   183
    COpenWfcJobManger* iJobManager;
hgs
parents:
diff changeset
   184
    MWsScene::TSceneRotation iRotation;
hgs
parents:
diff changeset
   185
    TBool iAutonomousCompositionInitiated;
hgs
parents:
diff changeset
   186
    MDisplayControlBase* iContextDisplayControl;
hgs
parents:
diff changeset
   187
    RSurfaceManager iSurfaceManager;
hgs
parents:
diff changeset
   188
	};
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
inline TAny* COpenWfcWrapper::GetInterface(TUint aExtensionId)
hgs
parents:
diff changeset
   191
    {
hgs
parents:
diff changeset
   192
    TAny*   retVal=NULL;
hgs
parents:
diff changeset
   193
    //Note that extension is intentionally not overloaded in CCompositionBackend
hgs
parents:
diff changeset
   194
    if (this->Extension_(aExtensionId,retVal,NULL)<KErrNone)
hgs
parents:
diff changeset
   195
        {
hgs
parents:
diff changeset
   196
        return NULL;
hgs
parents:
diff changeset
   197
        }
hgs
parents:
diff changeset
   198
    else
hgs
parents:
diff changeset
   199
        {
hgs
parents:
diff changeset
   200
        return retVal;
hgs
parents:
diff changeset
   201
        }
hgs
parents:
diff changeset
   202
    }
hgs
parents:
diff changeset
   203
hgs
parents:
diff changeset
   204
#endif /*OPENWFCWRAPPER_H_*/