diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiVg10RenderPlugin.h --- /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 + +#include + +#include + +#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__