uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiVg10RenderPlugin.h
changeset 0 15bf7259bb7c
child 9 3ac8bf5c5014
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiVg10RenderPlugin.h	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,378 @@
+/*
+* 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 CHuiVg10RenderPlugin. Rendering plugin for OpenVG 1.0.
+*
+*/
+
+
+
+#ifndef __HUIVG10RENDERPLUGIN_H__
+#define __HUIVG10RENDERPLUGIN_H__
+
+
+#include <e32base.h>
+
+#include <EGL/egl.h>
+
+#include <VG/openvg.h>
+
+#include "HuiRenderPlugin.h"
+#include "uiacceltk/HuiPanic.h"
+#include "uiacceltk/HuiMesh.h"
+
+class TEGLState
+    {
+public:
+    EGLContext iContext;
+    EGLSurface iReadSurface;
+    EGLSurface iDrawSurface;
+    EGLDisplay iDisplay;
+    };
+
+/**
+ * OpenVG renderer specific state change flags
+ */
+enum THuiVg10GcStateFlags
+    {
+    EHuiVg10GcStateFlagDirtyMatrixMode      = 1,
+    EHuiVg10GcStateFlagDirtyMatrix          = 2,
+    EHuiVg10GcStateFlagDirtyPaint           = 4,
+    EHuiVg10GcStateFlagDirtyScissor         = 8,
+    EHuiVg10GcStateFlagDirtyScissorRects    = 0x10,
+    EHuiVg10GcStateFlagDirtyBlendMode       = 0x20
+    };
+
+/* Forward declarations. */
+class MHuiRenderSurface;
+class CHuiVg10PBufferSurface;
+#ifdef __NVG
+class CNvgEngine;
+class MVGImageBinder;
+#endif
+
+/** Number of compatible EGL configurations queried. */
+const TInt KVg10ConfigsCount = 2;
+
+/**
+ * Macro for asserting that the renderer's state is OK when entering
+ * a function.
+ */
+#define HUI_VG_INVARIANT() __ASSERT_DEBUG(CHuiVg10RenderPlugin::VgError() == VG_NO_ERROR, THuiPanic::Panic(THuiPanic::EVg10Invariant))
+
+/**
+ * Macro for asserting that the latest OpenVG function call did not
+ * fail. You may put this assert after any OpenVG function call.
+ * Has no effect in release builds.
+ *
+ * @param aPanic  Panic code to use if the assertion fails.
+ *
+ * @see THuiPanic error codes, for at least the ERendererError.
+ */
+#define HUI_VG_ASSERT_SUCCESS(aPanic) __ASSERT_DEBUG(CHuiVg10RenderPlugin::VgError() == VG_NO_ERROR, THuiPanic::Panic(aPanic))
+
+
+/**
+ * Rendering plugin for OpenVG 1.0.
+ *
+ * @todo  GHuiVg10RenderPlugin should be derived from an abstract
+ *        CHuiEglRenderPlugin, which would contain the common EGL-methods.
+ *        OpenVG uses EGL, too.
+ */
+NONSHARABLE_CLASS(CHuiVg10RenderPlugin) : public CHuiRenderPlugin
+    {
+public:
+
+    /* Constructors and destructor. */
+
+    /**
+     * Constructs a new OpenVG 1.0 rendering plugin instance.
+     */
+    static CHuiVg10RenderPlugin* NewL();
+
+    /**
+     * Constructs a new OpenVG 1.0 rendering plugin instance and leaves it
+     * on the cleanup stack.
+     */
+    static CHuiVg10RenderPlugin* NewLC();
+
+
+    /**
+     * Destructor.
+     */
+    virtual ~CHuiVg10RenderPlugin();
+
+
+    /* Methods. */
+
+    TBool Allows(THuiRenderPluginAllow aAllow) const;
+
+    /**
+     * Creates a new rendering surface.
+     *
+     * @param aParams  Parameters for the surface. Ends in EHuiRenderSurfaceNone.
+     */
+    virtual MHuiRenderSurface* CreateRenderSurfaceL(CHuiDisplay& aDisplay);
+
+    /**
+     * Creates a new PBuffer surface for off-screen rendering purposes.
+     *
+     * @param aSize Size of the created PBuffer surface.
+     * @return Pointer to the just created PBuffer surface object.
+     */
+    virtual CHuiVg10PBufferSurface* CreatePBufferSurfaceL(TSize aSize, TInt aEglBufferType = EGL_PBUFFER_BIT, TInt aBufferColorMode = 0);
+
+    /**
+     * Creates a new instance of a HUITK graphics context.
+     */
+    virtual CHuiGc* CreateGcL();
+
+    /**
+     * Creates a new instance of a texture.
+     */
+    virtual CHuiTexture* CreateTextureL(const THuiTextureHandle* aExistingTexture = 0);
+
+    /**
+     * Creates a new instance of a texture manager.
+     */
+    virtual CHuiTextureManager* CreateTextureManagerL(CHuiEnv& aEnv);
+
+    /**
+     * Creates a new instance of an effects engine.
+     */
+    virtual CHuiFxEngine* CreateEffectsEngineL();
+
+
+    /**
+     * Creates a new instance of a mesh. Leaves with KErrNotSupported if this renderer
+     * does not support the given mesh type
+     *
+     * @param aMeshType  CHuiMesh derived concrete mesh type
+     * 
+     * @return  Created concrete mesh implementation.
+     */
+    virtual CHuiMesh* CreateMeshL(THuiMeshType aMeshType);
+
+    /**
+     * Creates a new instance of a text mesh.
+     */
+    virtual CHuiTextMesh* CreateTextMeshL();
+
+    /**
+     * Creates a new instance of a curve path.
+     */
+    virtual CHuiCurvePath* CreateCurvePathL();
+
+    virtual void DeleteNamedTexture(TUint aName);
+
+    /**
+     * Notifies this render plugin of a change in current display count.
+     *
+     * @param aCount The current count of displays existing in the HuiToolkit environment.
+     */
+    virtual void NotifyDisplayCountL(TUint aCount);
+
+    /**
+     * Returns the EGL display currently used by the plugin.
+     */
+    EGLConfig EglDisplay();
+
+    /**
+     * Returns the shared EGL context.
+     *
+     * @param aOtherContext  Context that wants to join the shared context.
+     */
+    EGLContext EglSharedContext() const;
+
+    /**
+     * Sets the shared EGL context.
+     *
+     * @param aContext  Context that is available for sharing with.
+     */
+    void EglSetSharedContext(EGLContext aContext);
+
+    /**
+     * EGL utility method. See eglChooseConfig.
+     *
+     * @return  Number of configurations found.
+     */
+    TInt EglChooseConfig(const TInt* aAttribList);
+
+    /**
+     * EGL utility method. Returns one of the configurations determined by
+     * EglChooseConfig.
+     */
+    TInt EglConfig(TInt aIndex);
+
+    /**
+     * EGL debug method. Prints (using CHuiStatic::Printf) all the attributes of
+     * the specified configuration.
+     */
+    void EglPrintConfig(TInt aIndex);
+
+    /**
+     * Check if the OpenVG context is released. If it is released,
+     * any drawing commands to the context will cause a panic.
+     *
+     * @return ETrue if the OpenVG context has been released.
+     */
+     TBool IsReleased() const;
+
+    /* Static methods. */
+
+    /**
+     * GlErrorMessage returns string description for an OpenVG
+     * error code. Can be used to clarify OpenVG errors when debugging.
+     *
+     * Error codes are from from the OpenVG 1.0 specification, chapter 4.
+     *
+     * @param aErrorCode  OpenVG error code, usually requested by calling
+     *                    vgGetError().
+     * @return  Descriptor with the error message.
+     */
+    static const TDesC& VgErrorMessage(VGErrorCode aErrorCode);
+
+    /**
+     * Returns the latest OpenVG error code. Equivalent to calling vgGetError(),
+     * but also prints the GL error code as a debug message.
+     */
+    static VGErrorCode VgError();
+	
+	/**
+	 * IsHardwareAccelerated returns boolean value if hardware acceleration 
+	 * is available. Also stores value to the iIsHardwareAccelerated variable.
+	 *
+	 * @return  ETrue if hardware accelartion is available
+	 */
+	TBool IsHardwareAccelerated();
+	
+    /**
+     * Creates a new instance of a canvas graphics context.
+     */
+   virtual CHuiCanvasGc* CreateCanvasGcL();
+
+   /**
+    * Used to set flags that describe how the openvg state has changed.
+    */
+   virtual void AddRestoreStateFlags(TInt aFlags);
+   
+   /**
+    * Return the flags, e.g. for vg10gc to reset its state
+    */
+   virtual TInt GetRestoreStateFlags();
+   
+   /**
+    * Clear the stateflags
+    */
+   virtual void ClearRestoreStateFlags();
+   
+#ifdef __NVG
+   /**
+    * Getter for NVGEngine, to be used with NVG drawing inside OpenVG plugin
+    * 
+    * @return   CNvgEngine object
+    */
+   CNvgEngine& NvgEngine() const;
+#endif
+
+	/**
+	*  Getter for texture upload context. This is called by CHuiVg10Texture.
+	*/
+    TEGLState& GetUploadState()
+	    {
+	    return iEGLStateForTextureUpload;
+	    }
+	
+protected:
+
+    /* Constructors. */
+
+    /**
+     * Default constructor.
+     */
+    CHuiVg10RenderPlugin(THuiRenderPluginId aId = EHuiRenderPluginVg10);
+
+    /**
+     * Second-phase constructor. Basicly calls RestoreL().
+     */
+    void ConstructL();
+
+    /**
+     * Release resources associated with EGL and OpenVG.
+     * Also, will destroy the default render surface used
+     * for sharing resources.
+     *
+     * @see RestoreL()
+     */
+    virtual void Release();
+
+    /**
+     * Restores resources needed for EGL/OpenVG rendering.
+     * Finds an EGL display, initializes it for rendering
+     * and restores a default shared render surface that
+     * enables resources to be loaded without an existing
+     * CHuiDisplay.
+     */
+    virtual void RestoreL();
+
+private:
+    
+    void ReadAllowsSwapBufferPreserved();
+    void ReadAllowsVisualPBufferSurfaces();
+        
+private:
+
+    /** The display where the graphics are drawn. */
+    EGLDisplay iEglDisplay;
+
+    /** Describes the format, type and size of the color buffers and
+        ancillary buffers for EGLSurface. */
+    EGLConfig iConfigs[KVg10ConfigsCount];
+
+    /**
+     * EGL Context for shared resources. This will allow us to
+     * for instance preload and create textures before actual
+     * rendering surface exists.
+     */
+    EGLContext iSharedContext;
+
+    /**
+     * Dummy PBuffer surface to be used with default context before any
+     * other rendering surfaces exist.
+     */
+    CHuiVg10PBufferSurface* iDefaultRenderSurface;
+
+    TBool iIsHardwareAccelerated;
+    
+    /**
+     * Member that stores the changed flags
+     */
+	TInt iStateFlags;
+    
+#ifdef __NVG
+    /** NVG decoder for plugin classes to use **/
+    CNvgEngine* iNvgEngine;
+    /** Image binder for NVG-TLV "Group opacity" special case */
+    MVGImageBinder* iMVGImageBinder;
+#endif
+    
+    TBool iAllowsSwapBufferPreserved;
+    TBool iAllowsVisualPBufferSurfaces;
+    
+	// This is initialized by CHuiVg10Texture during first texture upload
+    TEGLState iEGLStateForTextureUpload;
+    
+    };
+
+
+#endif // __HUIVG10RENDERPLUGIN_H__