uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiVg10PBufferSurface.h
changeset 0 15bf7259bb7c
child 3 d8a3531bc6b8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiVg10PBufferSurface.h	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,251 @@
+/*
+* Copyright (c) 2006-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:   Definition of CHuiVg10PBufferSurface class. 
+*                CHuiVg10PBufferSurface is an OpenVG PBuffer surface 
+*                object that implements the MHuiRenderSurface interface.
+*
+*/
+
+
+
+#ifndef __HUIVG10PBUFFERSURFACE_H__
+#define __HUIVG10PBUFFERSURFACE_H__
+
+
+#include "HuiVg10RenderSurface.h"
+
+class CHuiVg10RenderPlugin;
+class CFbsBitmap;
+
+/**
+ * Off-screen rendering surface for OpenGL ES content. A pbuffer (pixel buffer)
+ * surface can be used for instance for rendering temporary graphical content 
+ * onto. This content can then be reused in the current application. Because 
+ * the class has been inherited from MHuiRenderSurface, it can also be used 
+ * for rendering from displays. Doesn't output rendered content on the 
+ * framebuffer.
+ *
+ * @lib hitchcock.lib
+ */
+NONSHARABLE_CLASS(CHuiVg10PBufferSurface) : public CBase, public MHuiRenderSurface
+    {
+public: // Constructors and destructor
+
+    /**
+	 * \todo     
+	 */
+    static CHuiVg10PBufferSurface* NewLC(CHuiVg10RenderPlugin& aRenderer, const TSize& aSize, TInt aAlphaBits, TInt aEglBufferType, TInt aBufferColorMode);
+
+    /**
+     * Constructs a new example CHuiVg10PBufferSurface instance. A static factory method that
+     * leaves the object to the cleanup stack.
+     * @param aRenderer CHuiVg10RenderPlugin object that is used to access the shared context
+     * and determine surface configurations.
+     * @param aSize Size in pixels of the created PBuffer surface object.
+     * @return Newly created instance of CHuiVg10PBufferSurface.
+     */
+    static CHuiVg10PBufferSurface* NewLC(CHuiVg10RenderPlugin& aRenderer, const TSize& aSize, TInt aAlphaBits = 0);
+
+    /**
+     * Constructs a new example CHuiVg10PBufferSurface instance. A static factory method.
+     * @param aSize Size in pixels of the created PBuffer surface object.
+     * @return Newly created instance of CHuiVg10PBufferSurface.
+     */
+    static CHuiVg10PBufferSurface* NewL(const TSize& aSize, TInt aAlphaBits = 0);
+
+    /**
+     * Constructs a new CHuiVg10PBufferSurface class instance and leaves it
+     * on the cleanup stack.
+     * @param aSize Size in pixels of the created PBuffer surface object.
+     * @return Newly created instance of CHuiVg10PBufferSurface.
+     */
+    static CHuiVg10PBufferSurface* NewLC(const TSize& aSize, TInt aAlphaBits = 0);
+
+    /**
+     * Destructor.
+     */
+    virtual ~CHuiVg10PBufferSurface();
+
+public: // From MHuiRenderSurface
+
+    TUint Flags() const;
+    
+    /**
+     * Determines the location of the rendering surface on the screen. But since
+     * this is an off-screen surface, will return EFalse and will not set the
+     * origin.
+     *
+     * @return  If location successfully determined, returns <code>ETrue</code>.
+     *          If the surface is an off-screen surface, returns <code>EFalse</code>.
+     */
+    TBool GetScreenOrigin(TPoint& aOrigin) const;
+
+    /**
+     * Determines the size of the surface.
+     *
+     * @return  Size of the surface in pixels.
+     */
+    TSize Size() const;
+
+    /**
+     * Changes the size of the surface.
+     *
+     * @param aSize  Size of surface in pixels.
+     */
+    void SetSizeL(const TSize& aSize);
+
+    /**
+     * Makes this the current rendering surface for any drawing operations.
+     * Call CHuiStatic::SetCurrentRenderSurface().
+     */
+    void MakeCurrent();
+
+    /**
+     * Swaps the front and back buffers of the surface.
+     * Pbuffers consist of a single buffer only, so swapping has no effect.
+     */
+    void SwapBuffers();
+
+    /**
+     * Binds a texture to the surface to be used during subsequent drawing
+     * operations.
+     */
+    void BindTexture(TInt aTextureUnit,
+                             const MHuiSegmentedTexture& aTexture,
+                             TInt activeTextureSegment);
+
+    /**
+     * Handles change in surface visibility. This method is called if surface is either
+     * hidden or shown.
+     *
+     * @param aIsVisible ETrue if surface becomes visible. EFalse if surface is hidden.
+     */
+    void HandleVisibilityEvent(TBool aIsVisible);
+
+    void Release();
+    
+    void RestoreL();
+    
+    void HandleDisplayUsageChangeL();    
+
+    // These methods are not really used, since opengles renderer doesn't
+    // support dirty region handling or symbian graphics context!
+    virtual void SetDirtyRect(const TRect& aRect);
+    virtual MHuiTargetBitmap* BackBuffer();
+    virtual CFbsBitGc* Gc();
+
+    /**
+     * Provides expandability, helps keeping the binary compatibility. Since virtual
+     * table is now exported and this class is dll derivable and the implementation
+     * is more difficult to change, hence this method, which can provide additional
+     * extension APIs.
+     * 
+     * @param aExtensionUid     UID, which is being used for recognizing the extension
+     * @param aExtensionParams  Return pointer to the extension API, once recognized from the extension uid
+     */
+    virtual void RenderSurfaceExtension(const TUid& aExtensionUid, TAny** aExtensionParams);
+
+public: // New methods
+
+    /**
+     * Returns the associated EGL surface object.
+     */
+    EGLSurface EglSurface();
+    
+	void BindToM3G();
+	
+	void ReleaseFromM3G();
+    
+    /**
+     * \todo
+     */
+    CFbsBitmap* Buffer();
+    
+    /**
+     * \todo
+     */
+    TInt BufferColorMode() const;
+
+
+protected:
+
+    /**
+     * Creates a new PBuffer surface object.
+     */
+    EGLSurface CreateSurface(EGLConfig aConfig);
+
+    /**
+     * Determine config for the owner display.
+     */
+    EGLConfig DetermineConfig();
+
+
+private:
+
+    /* Constructors. */
+
+    /**
+     * Constructs an instance of CHuiClassName.
+     * @param aRenderer    CHuiVg10RenderPlugin object that is used to access 
+     *                     the shared context and determine surface configurations.
+     * @param aSize        Size of the created PBuffer surface.
+     * @note               Protected because this constructor only needs to be 
+     *                     called by derived classes. Use the provided static 
+     *                     factory methods instead.
+     * @see NewL()
+     * @see NewLC()
+     */
+    CHuiVg10PBufferSurface(CHuiVg10RenderPlugin& aRenderer, const TSize& aSize, TInt aAlphaBits, TInt aEglBufferType, TInt aBufferColorMode);
+
+    /**
+     * Second-phase constructor.
+     */
+    void ConstructL();
+
+
+private:
+
+    /** The display. */
+    EGLDisplay iEglDisplay;
+
+    /** The rendering context. */
+    EGLContext iEglContext;
+
+    /** The pbuffer surface where the graphics are drawn. */
+    EGLSurface iEglSurface;
+
+    /** Current surface size. */
+    TSize iSize;
+
+    /** \todo */
+	TInt iEglBufferType;
+	
+    /** \todo */
+	TInt iBufferColorMode;
+	
+    /** Alpha channel bits to allocate. */
+    TInt iAlphaBits;
+    
+    CFbsBitmap* iBuffer;
+    
+    /** OpenGL ES Render plugin that provides the display configurations and the display
+    for this pbuffer surface. */
+    CHuiVg10RenderPlugin& iRenderer;
+
+    TBool iIsHardwareAccelerated;
+    };
+
+
+#endif // __HUIVG10PBUFFERSURFACE_H__
+