uiacceltk/hitchcock/ServerCore/Inc/alfsrvtexturemanager.h
changeset 0 15bf7259bb7c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/ServerCore/Inc/alfsrvtexturemanager.h	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,365 @@
+/*
+* Copyright (c) 2008 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:   Server side texture manager
+*
+*/
+
+
+
+#ifndef C_ALFSRVTEXTUREMANAGER_H
+#define C_ALFSRVTEXTUREMANAGER_H
+
+#include <e32base.h>
+#include <uiacceltk/HuiTextureManager.h>
+
+class CHuiEnv;
+class CAlfAppSrvSession;
+class MAlfSrvTextureManagerClient;
+
+/**
+ *  Server side texture manager.
+ *
+ *  This texture manager is responsible for managing texture ids and
+ *  handling auto size textures.
+ *  
+ *  @since S60 v5.0
+ */
+NONSHARABLE_CLASS( CAlfSrvTextureManager ) 
+    : public CBase, 
+      private MHuiTextureAutoSizeObserver
+    {
+public:
+
+    /**
+     * Two-phased constructor.
+     * @return new instance of CAlfSrvTextureManager.
+     */
+    static CAlfSrvTextureManager* NewL();
+   
+    /**
+     * Destructor.
+     */
+    virtual ~CAlfSrvTextureManager();
+
+    /**
+     * This will be called when environment has been created.
+     * @param aEnv reference to environment.
+     */
+    void HandleEnvCreateL( CHuiEnv& aEnv );
+
+    /**
+     * This will be called just before environment is deleted.
+     */
+    void HandleEnvToBeDeleted();
+
+    //
+    // Texture Id management
+    //
+
+    /**
+     * Creates new texture id.
+     * @param aClientOwnerId client owner id.
+     * @param aClientSideId client side id.
+     * @param aClientSideManagerId client side manager id.
+     * @param aReUseAnyDeletedId ETrue if reuse is allowed.
+     * @return texture id.
+     */
+    TInt CreateTextureId(
+        const TProcessId& aClientOwnerId, 
+        TInt aClientSideId, 
+        TInt aClientSideManagerId, 
+        TBool aReUseAnyDeletedId  );
+
+    /**
+     * Finds server side id based in client side id.
+     * @param aClientOwnerId client owner id.
+     * @param aClientSideId client side id.
+     * @param aClientSideManagerId client side manager id.
+     * @param aIgnoreOwnerForSharedTextures ignore owner.
+     * @return texture id.
+     */
+    TInt ExistingTextureId(
+        const TProcessId& aClientOwnerId, 
+        TInt aClientSideId, 
+        TInt aClientSideManagerId, 
+        TBool aIgnoreOwnerForSharedTextures = EFalse );
+
+    /**
+     * Releases texture id.
+     * @param aClientOwnerId client owner id.
+     * @param aClientSideId client side id.
+     * @param aClientSideManagerId client side manager id.
+     * @return reference count.
+     */
+    TInt ReleaseTextureId(
+        const TProcessId& aClientOwnerId,
+        TInt aClientSideId, 
+        TInt aClientSideManagerId );
+
+    /**
+     * Deletes texture id.
+     * @param aClientOwnerId client owner id.
+     * @param aClientSideId client side id.
+     * @param aClientSideManagerId client side manager id.
+     * @return reference count.
+     */
+    TInt DeleteTextureId(
+        const TProcessId& aClientOwnerId,
+        TInt aClientSideId, 
+        TInt aClientSideManagerId );
+
+    /**
+     * Validates skin for texture id.
+     * @param aClientOwnerId client owner id.
+     * @param aClientSideId client side id.
+     * @param aClientSideManagerId client side manager id.
+     * @return 1 if skin change coordinator already set, 0 otherwise.
+     */
+    TInt ValidateSkinForTextureId(
+        const TProcessId& aClientOwnerId,
+        TInt aClientSideId, 
+        TInt aClientSideManagerId );
+    
+    /**
+     * Destroyes deleted texture ids.
+     * @param aClientOwnerId client owner id.
+     * @return 0.
+     */
+    TInt DestroyDeletedTextureIds(const TProcessId& aClientOwnerId); 
+
+    //
+    // Auto size texture
+    //
+
+    /**
+     * Adds client for auto size textures handling.
+     * Note: Clients must remove itself upon destruction using 
+     *       @c RemoveClient method.
+     * @param aClientOwnerId client owner id.
+     * @param aClient reference to client interface.
+     */
+    void AddClientL( 
+        const TProcessId& aClientOwnerId, 
+        MAlfSrvTextureManagerClient& aClient );
+
+    /**
+     * Removes client.
+     * @param aClient client.
+     */    
+    void RemoveClient( MAlfSrvTextureManagerClient& aClient );
+        
+private:
+
+    /**
+     * Constructor.
+     */
+    CAlfSrvTextureManager();
+
+    /**
+     * Finds client side texture id based on server side id.
+     * Note that shared textures are ignored.
+     * 
+     * @param aServerSideId server side id.
+     * @param aClientSideId this is updated to contain client side id.
+     * @param aOwnerUid this is updated to contain owner uid.
+     * @return ETrue if found, EFalse otherwise.
+     */
+    TBool FindByTextureId( 
+        TInt aServerSideId,
+        TInt& aClientSideId,
+        TProcessId& aOwnerId ) const;
+
+    /**
+     * Finds index of client.
+     * @param aClient client to look for.
+     * @return index or KErrNotFound if not found.
+     */
+    TInt FindClient( MAlfSrvTextureManagerClient& aClient ) const;
+    
+    /**
+     * Finds client interface based on owner id. This one also
+     * marks corresponding client so that completion of auto size 
+     * changes is informed.
+     * 
+     * @param aOwnerId owner id.
+     * @return client interface, NULL if not found.
+     */
+    MAlfSrvTextureManagerClient* FindClientAndMark( 
+        const TProcessId& aOwnerId );
+
+    /**
+     * Notifies marked clients of completion of auto size events.
+     * This also clears marks.
+     */
+    void NotifyTextureSizeChangesCompleted();
+
+    /**
+     * Calculates index from value.
+     * @param aValue value from THuiTextureAutoSizeParams.
+     * @return index.
+     */
+    static TInt IndexFromParameter( TInt aValue );
+
+    /**
+     * Checks if resize is needed.
+     * @param aCurrentValue current height/width.
+     * @param aNewValue new height/width.
+     * @param aTexture reference to texture.
+     * @return ETrue if resize is needed, EFalse otherwise.
+     */
+    static TBool CheckIfShouldResize( 
+        TInt aCurrentValue, TInt aNewValue, const CHuiTexture& aTexture );
+
+    /**
+     * Checks if resize is needed.
+     * @param aCurrentSize current size.
+     * @param aNewSize new size.
+     * @param aTexture reference to texture.
+     * @param aDeliveryPriority this will contain delivery priority.
+     * @return ETrue if resize is needed, EFalse otherwise.
+     */
+    static TBool CheckIfResizeNeeded(
+        const TSize& aCurrentSize, const TSize& aNewSize,
+        const CHuiTexture& aTexture, TInt& aDeliveryPriority );
+
+    /**
+     * Rounds real value to integer.
+     * @param aValue value to be rounded.
+     * @return result value.
+     */
+    inline TInt RoundToInteger( const TReal32& aValue ) const;
+    
+    /**
+     * Calculates new size if resize is needed.
+     * @param aTexture reference to texture.
+     * @param aPreferredSize preferred size.
+     * @param aCurrentSize current size.
+     * @param aNewSize this will contain new size.
+     * @param aDeliveryPriority this will contain delivery priority.
+     * @return ETrue upon success, EFalse otherwise.
+     */
+    TBool CalculateNewSizeIfResizeNeeded( 
+        const CHuiTexture& aTexture, 
+        const THuiRealSize& aPreferredSize,
+        const TSize& aCurrentSize,
+        TSize& aNewSize,
+        TInt& aDeliveryPriority ) const;
+
+    /**
+     * This one decides new size for current texture.
+     * @param aClient client interface.
+     * @param aClientSideTextureId client side texture id.
+     * @param aTexture texture.
+     * @param aPreferredSize preferred size.
+     */
+    void HandlePreferredSizeChanged( 
+        MAlfSrvTextureManagerClient& aClient, 
+        TInt aClientSideTextureId, 
+        const CHuiTexture& aTexture, 
+        const THuiRealSize& aPreferredSize );
+
+// from base class MHuiTextureAutoSizeObserver
+
+    /**
+     * Handles preferred texture properties changes.
+     * @param aTexture texture.
+     * @param aServerSideTextureId server side texture id.
+     * @param aPreferredSize preferred size.
+     */
+    virtual TBool PreferredSizeChanged(const CHuiTexture& aTexture, 
+        TInt aServerSideTextureId, 
+        const THuiRealSize& aPreferredSize );
+
+    /**
+     * Handles completion of preferred size changes (for now).
+     */
+    virtual void PreferredSizeReportCompleted();
+
+private: // data
+
+    /**
+     * Pointer to environment.
+     * Not own.
+     */
+    CHuiEnv* iEnv;
+
+    /**
+     * Global value which is used to assign unique texture ids 
+     * in the serverside.
+     */
+    TInt iNextTextureId;
+
+    /**
+     * Structure containing information about a texture.
+     */
+    struct TUsedTexture 
+        {
+        TUsedTexture()
+            :iClientSideId(0), 
+             iClientSideManagerId(0), 
+             iServerSideId(0), 
+             iOwnerId(), 
+             iReleased(EFalse), 
+             iDeleted(EFalse),
+             iSkinChangeCoordinator(EFalse){}
+        
+        /** The client side texture id */
+        TInt   iClientSideId;
+        /** client side texture manager of the texture */
+        TInt32 iClientSideManagerId;                
+        /** The server side texture id */
+        TInt   iServerSideId;
+        /** Owner process of the texture */
+        TProcessId iOwnerId;
+        /** Released */
+        TBool iReleased;
+        /** Deleted */
+        TBool iDeleted;
+        /** Skin change coordinator for shared textures, only one entry with same id has this set to ETrue */
+        TBool iSkinChangeCoordinator;
+        };
+        
+    /** 
+     * Array of used textures. Items are not deleted from this array when 
+     * application exists because hitchcock texture manager does not delete
+     * textures either (only unloads).
+     * This array is used when texture is re-created again.
+     * Own.
+     */
+    RArray<TUsedTexture> iUsedTextures;
+
+    /**
+     * Structure defining mapping from owner id to
+     * client interface used for auto size textures.
+     */
+    struct TClientItem
+        {
+        TProcessId iOwnerId;
+        MAlfSrvTextureManagerClient* iClient;
+        TBool iIsMarked;
+        };
+        
+    /**
+     * Mapping from texture owner id to client interface.
+     * Own.
+     */
+    RArray< TClientItem > iClients;
+
+    /**
+     * Boolean flag indicating if renderer is OpenGL.
+     */
+    TBool iIsRendererHWA;
+    };
+
+#endif // C_CLASSNAME_H