| /*!**************************************************************************** | 
 |  | 
 |  @file       Shell/PVRShell.h | 
 |  @copyright  Copyright (c) Imagination Technologies Limited. | 
 |  @brief      Makes programming for 3D APIs easier by wrapping surface | 
 |              initialization, Texture allocation and other functions for use by a demo. | 
 |  | 
 | ******************************************************************************/ | 
 |  | 
 | #ifndef __PVRSHELL_H_ | 
 | #define __PVRSHELL_H_ | 
 |  | 
 | /*****************************************************************************/ | 
 | /*! @mainpage PVRShell | 
 | ****************************************************************************** | 
 |  | 
 |  @tableofcontents  | 
 |   | 
 |  @section overview Overview | 
 |  ***************************** | 
 |  | 
 |  PVRShell is a C++ class used to make programming for PowerVR platforms easier and more portable. | 
 |  PVRShell takes care of all API and OS initialisation for the user and handles adapters, devices, screen/windows modes, | 
 |  resolution, buffering, depth-buffer, viewport creation & clearing, etc... | 
 |  | 
 |  PVRShell consists of 3 files: PVRShell.cpp, PVRShellOS.cpp and PVRShellAPI.cpp. | 
 |  | 
 |  PVRShellOS.cpp and PVRShellAPI.cpp are supplied per platform and contain all the code to initialise the specific | 
 |  API (OpenGL ES, Direct3D Mobile, etc.) and the OS (Windows, Linux, WinCE, etc.). | 
 |  PVRShell.cpp is where the common code resides and it interacts with the user application through an abstraction layer. | 
 |  | 
 |  A new application must link to these three files and must create a class that will inherit the PVRShell class. | 
 |  This class will provide five virtual functions to interface with the user. | 
 |  | 
 |  The user also needs to register his application class through the NewDemo function: | 
 |  | 
 |  @code | 
 |  class MyApplication: public PVRShell | 
 |  { | 
 |  public: | 
 |      virtual bool InitApplication(); | 
 |      virtual bool InitView(); | 
 |      virtual bool ReleaseView(); | 
 |      virtual bool QuitApplication(); | 
 |      virtual bool RenderScene(); | 
 |  }; | 
 |  | 
 |  PVRShell* NewDemo() | 
 |  { | 
 |      return new MyApplication(); | 
 |  } | 
 |  @endcode | 
 |   | 
 |  | 
 |  @section interface Interface | 
 |  ****************************** | 
 |  | 
 |  There are two functions for initialisation, two functions to release allocated resources and a render function: | 
 |  | 
 |  InitApplication() will be called by PVRShell once per run, before the graphic context is created. | 
 |  It is used to initialise variables that are not dependant on the rendering context (e.g. external modules, loading user data, etc.). | 
 |  QuitApplication() will be called by PVRShell once per run, just before exiting the program. | 
 |  If the graphic context is lost, QuitApplication() will not be called. | 
 |  | 
 |  InitView() will be called by PVRShell upon creation or change in the rendering context. | 
 |  It is used to initialise variables that are dependant on the rendering context (e.g. textures, vertex buffers, etc.). | 
 |  ReleaseView() will be called by PVRShell before changing to a new rendering context or | 
 |  when finalising the application (before calling QuitApplication). | 
 |  | 
 |  RenderScene() is the main rendering loop function of the program. This function must return FALSE when the user wants to terminate the application. | 
 |  PVRShell will call this function every frame and will manage relevant OS events. | 
 |  | 
 |  There are other PVRShell functions which allow the user to set his/her preferences and get data back from the devices: | 
 |  | 
 |  PVRShellSet() and PVRShellGet() are used to pass data to and from PVRShell. PVRShellSet() is recommended to be used | 
 |  in InitApplication() so the user preferences are applied at the API initialisation. | 
 |  There is a definition of these functions per type of data passed or returned. Please check the prefNameBoolEnum, prefNameFloatEnum, | 
 |  prefNameIntEnum, prefNamePtrEnum and prefNameConstPtrEnum enumerations for a full list of the data available. | 
 |  | 
 |  This is an example: | 
 |  | 
 |  @code | 
 |  bool MyApplication::InitApplication() | 
 |  { | 
 |      PVRShellSet (prefFullScreen, true); | 
 |  } | 
 |  | 
 |  bool MyApplication::RenderScene() | 
 |  { | 
 |      int dwCurrentWidth = PVRShellGet (prefHeight); | 
 |      int dwCurrentHeight = PVRShellGet (prefWidth); | 
 |  | 
 |      return true; | 
 |  } | 
 |  @endcode | 
 |  | 
 |   | 
 |  @section helper Helper functions | 
 |  ************************************* | 
 |  | 
 |  The user input is abstracted with the PVRShellIsKeyPressed() function. It will not work in all devices, but we have tried to map the most | 
 |  relevant keys when possible. See PVRShellKeyName enumeration for the list of keys supported. This function will return true or false depending on | 
 |  the specified key being pressed. | 
 |  | 
 |  There are a few other helper functions supplied by PVRShell as well. These functions allow you to read the timer, to output debug information and to | 
 |  save a screen-shot of the current frame: | 
 |  | 
 |  PVRShellGetTime() returns time in milliseconds. | 
 |  | 
 |  PVRShellOutputDebug() will write a debug string (same format as printf) to the platform debug output. | 
 |  | 
 |  PVRShellScreenCaptureBuffer() and  PVRShellWriteBMPFile() will be used to save the current frame as a BMP file. PVRShellScreenCaptureBuffer() | 
 |  receives a pointer to an area of memory containing the screen buffer. The memory should be freed with free() when not needed any longer. | 
 |  | 
 |  Example of screenshot: | 
 |  | 
 |  @code | 
 |  bool MyApplication::RenderScene() | 
 |  { | 
 |      [...] | 
 |  | 
 |      unsigned char *pLines; | 
 |  | 
 |      PVRShellScreenCaptureBuffer(PVRShellGet (prefWidth), PVRShellGet (prefHeight), &pLines); | 
 |  | 
 |      PVRShellScreenSave("myfile", pLines, NULL); | 
 |  | 
 |      free (pLines); | 
 |  | 
 |      return true; | 
 |  } | 
 |  @endcode | 
 |  | 
 |   | 
 |  @section cmd Command-line | 
 |  ************************************* | 
 |  | 
 |  Across all platforms, PVRShell takes a set of command-line arguments which allow things like the position and size of the demo | 
 |  to be controlled. The list below shows these options. | 
 |  | 
 |  \b -width=N   Sets the horizontal viewport width to N. | 
 |  | 
 |  \b -height=N   Sets the vertical viewport height to N. | 
 |  | 
 |  \b -posx=N   Sets the x coordinate of the viewport. | 
 |  | 
 |  \b -posy=N   Sets the y coordinate of the viewport. | 
 |  | 
 |  \b -aasamples=N   Sets the number of samples to use for full screen anti-aliasing. e.g 0, 2, 4, 8 | 
 |  | 
 |  \b -fullscreen=N   Enable/Disable fullscreen mode. N can be: 0=Windowed 1=Fullscreen. | 
 |  | 
 |  \b -qat=N   Quits after N seconds. | 
 |  | 
 |  \b -qaf=N   Quits after N frames. | 
 |  | 
 |  \b -powersaving=N Where available enable/disable power saving. N can be: 0=Disable power saving 1=Enable power saving. | 
 |  | 
 |  \b -vsync=N Where available modify the apps vsync parameters. | 
 |  | 
 |  \b -version Output the SDK version to the debug output. | 
 |  | 
 |  \b -info Output setup information (e.g. window width) to the debug output. | 
 |  | 
 |  \b -rotatekeys=N Sets the orientation of the keyboard input. N can be: 0-3, 0 is no rotation. | 
 |  | 
 |  \b -c=N Save a single screenshot or a range. e.g. -c=1-10, -c=14. | 
 |  | 
 |  \b -priority=N EGL only. Sets the priority of the EGL context. | 
 |  | 
 |  \b -colourbpp=N EGL only. When choosing an EGL config N will be used as the value for EGL_BUFFER_SIZE. | 
 |  | 
 |  \b -depthbpp=N EGL only. When choosing an EGL config N will be used as the value for EGL_DEPTH_SIZE. | 
 |  | 
 |  \b -config=N EGL only. Force the shell to use the EGL config with ID N. | 
 |  | 
 |  \b -forceframetime=N Alter the behaviour of PVRShellGetTime so its returned value is frame based (N denotes how many ms a frame should pretend to last). You can also use the shortened version of -fft and the command can be used without N being defined, e.g. just -forceframetime. This option is provided to aid in debugging time-based applications. | 
 |  | 
 |  Example: | 
 |  @code | 
 |      Demo -width=160 -height=120 -qaf=300 | 
 |  @endcode | 
 |  | 
 |  @section APIsOSs APIs and Operating Systems | 
 |  ***************************** | 
 |  For information specific to each 3D API and Operating System, see the list of supported APIs and OSs on the <a href="modules.html">Modules</a> page. | 
 |   | 
 | ******************************************************************************/ | 
 | // Uncomment to enable the -fps command-line option | 
 | // #define PVRSHELL_FPS_OUTPUT | 
 |  | 
 | /***************************************************************************** | 
 | ** Includes | 
 | *****************************************************************************/ | 
 | #include <stdlib.h> | 
 |  | 
 | #define EXIT_NOERR_CODE 0 | 
 | #define EXIT_ERR_CODE (!EXIT_NOERR_CODE) | 
 |  | 
 | // avoid warning about unused parameter | 
 | #define PVRSHELL_UNREFERENCED_PARAMETER(x) ((void) x) | 
 |  | 
 | // Keyboard mapping. // | 
 |   | 
 | /*!*********************************************************************** | 
 |  @enum PVRShellKeyName | 
 |  @brief Key name. | 
 |  ************************************************************************/  | 
 | enum PVRShellKeyName | 
 | { | 
 |     PVRShellKeyNameNull,        /*!< Null key value */ | 
 |     PVRShellKeyNameQUIT,        /*!< QUIT key value */ | 
 |     PVRShellKeyNameSELECT,      /*!< SELECT key value */ | 
 |     PVRShellKeyNameACTION1,     /*!< ACTION1 key value */ | 
 |     PVRShellKeyNameACTION2,     /*!< ACTION2 key value */ | 
 |     PVRShellKeyNameUP,          /*!< UP key */ | 
 |     PVRShellKeyNameDOWN,        /*!< DOWN key */ | 
 |     PVRShellKeyNameLEFT,        /*!< LEFT key */ | 
 |     PVRShellKeyNameRIGHT,       /*!< RIGHT key */ | 
 |     PVRShellKeyNameScreenshot   /*!< SCREENSHOT key */ | 
 | }; | 
 |  | 
 | /*!*********************************************************************** | 
 |  @enum PVRShellKeyRotate | 
 |  @brief Key rotate. | 
 |  ************************************************************************/  | 
 | enum PVRShellKeyRotate | 
 | { | 
 |     PVRShellKeyRotateNone=0,    /*!< Rotate key none = 0. */  | 
 |     PVRShellKeyRotate90,        /*!< Rotate key 90 */ | 
 |     PVRShellKeyRotate180,       /*!< Rotate key 180 */ | 
 |     PVRShellKeyRotate270        /*!< Rotate key 270 */ | 
 | }; | 
 |  | 
 | //  Pointer button mapping. // | 
 |   | 
 | /*!*********************************************************************** | 
 |  @enum EPVRShellButtonState | 
 |  @brief Pointer button mapping. | 
 |  ************************************************************************/  | 
 | enum EPVRShellButtonState | 
 | { | 
 |     ePVRShellButtonLeft = 0x1,  /*!< Left button */ | 
 |     ePVRShellButtonRight = 0x2, /*!< Right button */ | 
 |     ePVRShellButtonMiddle = 0x4 /*!< Middle button */ | 
 | }; | 
 |  | 
 | /*!*********************************************************************** | 
 |  @enum prefNameBoolEnum | 
 |  @brief Boolean Shell preferences. | 
 |  ************************************************************************/ | 
 | enum prefNameBoolEnum | 
 | { | 
 |     prefFullScreen,             /*!< Set to: 1 for full-screen rendering; 0 for windowed */ | 
 |     prefIsRotated,              /*!< Query this to learn whether screen is rotated */ | 
 |     prefPBufferContext,         /*!< 1 if you need pbuffer support (default is pbuffer not needed) */ | 
 |     prefPixmapContext,          /*!< 1 to use a pixmap as a render-target (default off) */ | 
 |     prefPixmapDisableCopy,      /*!< 1 to disable the copy if pixmaps are used */ | 
 |     prefZbufferContext,         /*!< 1 if you wish to have zbuffer support (default to on) */ | 
 |     prefLockableBackBuffer,     /*!< DX9 only: true to use D3DPRESENTFLAG_LOCKABLE_BACKBUFFER (default: false) */ | 
 |     prefSoftwareRendering,      /*!< 1 to select software rendering (default: off, i.e. use hardware) */ | 
 |     prefStencilBufferContext,   /*!< 1 if you wish to have stencil support (default: off) */ | 
 |     prefAlphaFormatPre,         /*!< EGL only: 1 to create the EGL surface with EGL_ALPHA_FORMAT_PRE (default: 0) */ | 
 |     prefPowerSaving,            /*!< If true then the app will go into powersaving mode (if available) when not in use. */ | 
 | #ifdef PVRSHELL_FPS_OUTPUT | 
 |     prefOutputFPS,              /*!< If true then the FPS are output using PVRShellOutputdebug */ | 
 | #endif | 
 |     prefOutputInfo,             /*!< If true then the app will output helpful information such as colour buffer format via PVRShellOutputDebug. */ | 
 |     prefNoShellSwapBuffer,      /*!< EGL: If true then the shell won't call eglswapbuffers at the end of each frame. */ | 
 |     prefShowCursor,             /*!< Set to: 1 to show the cursor; 0 to hide it. */ | 
 |     prefForceFrameTime,         /*!< If true will alter PVRShellGetTime behaviour to be frame based. This is for debugging purposes. */ | 
 |     prefDiscardColor,           /*!< GLES: Whether or not to discard color data at the end of a render, to save bandwidth. Requires specific functionality. (default: false) */ | 
 |     prefDiscardDepth,           /*!< GLES: Whether or not to discard depth data at the end of a render, to save bandwidth. Requires specific functionality. (default: true) */ | 
 |     prefDiscardStencil          /*!< GLES: Whether or not to discard stencil data at the end of a render, to save bandwidth. Requires specific functionality. (default: true) */ | 
 | }; | 
 |  | 
 | /*!*********************************************************************** | 
 |  @enum prefNameFloatEnum | 
 |  @brief Float Shell preferences. | 
 |  ************************************************************************/ | 
 | enum prefNameFloatEnum | 
 | { | 
 |     prefQuitAfterTime           /*!< Shell will quit after this number of seconds (-1 to disable) */ | 
 | }; | 
 |  | 
 | /*!*********************************************************************** | 
 |  @enum prefNameIntEnum | 
 |  @brief Integer Shell preferences. | 
 |  ************************************************************************/ | 
 | enum prefNameIntEnum | 
 | { | 
 |     prefEGLMajorVersion,    /*!< EGL: returns the major version as returned by eglInitialize() */ | 
 |     prefEGLMinorVersion,    /*!< EGL: returns the minor version as returned by eglInitialize() */ | 
 |     prefWidth,              /*!< Width of render target */ | 
 |     prefHeight,             /*!< Height of render target */ | 
 |     prefPositionX,          /*!< X position of the window */ | 
 |     prefPositionY,          /*!< Y position of the window */ | 
 |     prefQuitAfterFrame,     /*!< Shell will quit after this number of frames (-1 to disable) */ | 
 |     prefSwapInterval,       /*!< 0 to preventing waiting for monitor vertical syncs */ | 
 |     prefInitRepeats,        /*!< Number of times to reinitialise (if >0 when app returns false from RenderScene(), shell will ReleaseView(), InitView() then re-enter RenderScene() loop). Decrements on each initialisation. */ | 
 |     prefAASamples,          /*!< Set to: 0 to disable full-screen anti-aliasing; 2 for 2x; 4 for 4x; 8 for 8x. */ | 
 |     prefCommandLineOptNum,  /*!< Returns the length of the array returned by prefCommandLineOpts */ | 
 |     prefColorBPP,           /*!< Allows you to specify a desired color buffer size e.g. 16, 32. */ | 
 |     prefDepthBPP,           /*!< Allows you to specify a desired depth buffer size e.g. 16, 24. */ | 
 |     prefRotateKeys,         /*!< Allows you to specify and retrieve how the keyboard input is transformed */ | 
 |     prefButtonState,        /*!< pointer button state */ | 
 |     prefCaptureFrameStart,  /*!< The frame to start capturing screenshots from */ | 
 |     prefCaptureFrameStop,   /*!< The frame to stop capturing screenshots at */ | 
 |     prefCaptureFrameScale,  /*!< Pixel-replicate saved screenshots this many times; default 1 for no scale */ | 
 |     prefPriority,           /*!< EGL: If supported will set the egl context priority; 0 for low, 1 for med and 2 for high. */ | 
 |     prefConfig,             /*!< EGL: Get the chosen EGL config. */ | 
 |     prefRequestedConfig,    /*!< EGL: Force the shell to use a particular EGL config. */ | 
 |     prefNativeDisplay,      /*!< EGL: Allows you to specify the native display to use if the device has more that one. */ | 
 |     prefFrameTimeValue      /*!< An integer value to say how long you wish one frame to last for (in ms) when force frame time is enabled. */ | 
 | }; | 
 |  | 
 | /*!*********************************************************************** | 
 |  @enum prefNamePtrEnum | 
 |  @brief Pointers/Handlers Shell preferences. | 
 |  ************************************************************************/ | 
 | enum prefNamePtrEnum | 
 | { | 
 |     prefD3DDevice,          /*!< D3D: returns the device pointer */ | 
 |     prefEGLDisplay,         /*!< EGL: returns the EGLDisplay */ | 
 |     prefEGLSurface,         /*!< EGL: returns the EGLSurface */ | 
 |     prefHINSTANCE,          /*!< Windows: returns the application instance handle */ | 
 |     prefNativeWindowType,   /*!< Returns the window handle */ | 
 |     prefAccelerometer,      /*!< Accelerometer values */ | 
 |     prefPointerLocation,    /*!< Mouse pointer/touch location values */ | 
 |     prefPVR2DContext,       /*!< PVR2D: returns the PVR2D context */ | 
 |     prefLoadFileFunc,       /*!< A pointer to a function that can be used to load external files on platforms that don't allow the use of fopen. | 
 |                                  The ptr returned is of the type PFNLoadFileFunc defined below. */ | 
 |     prefReleaseFileFunc,        /*!< A pointer to a function that is used to release any data allocated by the load file function. | 
 |                                  The ptr returned is of the type PFNReleaseFileFunc defined below. */ | 
 |     prefAndroidNativeActivity /*!< Android: A pointer to the ANativeActivity struct for the application. Your application will need to include android_native_app_glue.h to cast the pointer to ANativeActivity. */ | 
 | }; | 
 |  | 
 | /*!*********************************************************************** | 
 |  @typedef PFNLoadFileFunc | 
 |  @brief The LoadFileFunc function pointer template. | 
 |  ************************************************************************/ | 
 | typedef void* (*PFNLoadFileFunc)(const char*, char** pData, size_t &size); | 
 |  | 
 | /*!*********************************************************************** | 
 |  @typedef PFNReleaseFileFunc | 
 |  @brief The ReleaseFileFunc function pointer template. | 
 |  ************************************************************************/ | 
 | typedef bool (*PFNReleaseFileFunc)(void* handle); | 
 |  | 
 | /*!*********************************************************************** | 
 |  @enum prefNameConstPtrEnum | 
 |  @brief Constant pointers Shell preferences. | 
 |  ************************************************************************/ | 
 | enum prefNameConstPtrEnum | 
 | { | 
 |     prefAppName,            /*!< ptrValue is char* */ | 
 |     prefReadPath,           /*!< ptrValue is char*; will include a trailing slash */ | 
 |     prefWritePath,          /*!< ptrValue is char*; will include a trailing slash */ | 
 |     prefCommandLine,        /*!< used to retrieve the entire application command line */ | 
 |     prefCommandLineOpts,    /*!< ptrValue is SCmdLineOpt*; retrieves an array of arg/value pairs (parsed from the command line) */ | 
 |     prefExitMessage,        /*!< ptrValue is char*; gives the shell a message to show on exit, typically an error */ | 
 |     prefVersion             /*!< ptrValue is char* */ | 
 | }; | 
 |  | 
 | /*!************************************************************************** | 
 |  @struct PVRShellData | 
 |  @brief  PVRShell implementation Prototypes and definitions | 
 | *****************************************************************************/ | 
 | struct PVRShellData; | 
 |  | 
 | /*!*************************************************************************** | 
 |  @class PVRShellInit | 
 |  *****************************************************************************/ | 
 | class PVRShellInit; | 
 |  | 
 | /*!*********************************************************************** | 
 |  @struct SCmdLineOpt | 
 |  @brief  Stores a variable name/value pair for an individual command-line option. | 
 |  ************************************************************************/ | 
 | struct SCmdLineOpt | 
 | { | 
 |     const char *pArg, *pVal; | 
 | }; | 
 |  | 
 | /*!*************************************************************************** | 
 |  @class    PVRShell | 
 |  @brief    Inherited by the application; responsible for abstracting the OS and API. | 
 |  @details  PVRShell is the main Shell class that an application uses. An | 
 |            application should supply a class which inherits PVRShell and supplies | 
 |            implementations of the virtual functions of PVRShell (InitApplication(), | 
 |            QuitApplication(), InitView(), ReleaseView(), RenderScene()). Default stub | 
 |            functions are supplied; this means that an application is not | 
 |            required to supply a particular function if it does not need to do anything | 
 |            in it. | 
 |            The other, non-virtual, functions of PVRShell are utility functions that the | 
 |            application may call. | 
 |  *****************************************************************************/ | 
 | class PVRShell | 
 | { | 
 | private: | 
 |     friend class PVRShellInitOS; | 
 |     friend class PVRShellInit; | 
 |  | 
 |     PVRShellData    *m_pShellData; | 
 |     PVRShellInit    *m_pShellInit; | 
 |  | 
 | public: | 
 |     /*!*********************************************************************** | 
 |     @brief      Constructor | 
 |     *************************************************************************/ | 
 |     PVRShell(); | 
 |  | 
 |     /*!*********************************************************************** | 
 |     @brief      Destructor | 
 |     *************************************************************************/ | 
 |     virtual ~PVRShell(); | 
 |  | 
 |     /* | 
 |         PVRShell functions that the application should implement. | 
 |     */ | 
 |  | 
 |     /*!*********************************************************************** | 
 |     @brief      Initialise the application. | 
 |     @details    This function can be overloaded by the application. It | 
 |                 will be called by PVRShell once, only at the beginning of | 
 |                 the PVRShell WinMain()/main() function. This function | 
 |                 enables the user to perform any initialisation before the | 
 |                 render API is initialised. From this function the user can | 
 |                 call PVRShellSet() to change default values, e.g. | 
 |                 requesting a particular resolution or device setting. | 
 |     @return     true for success, false to exit the application | 
 |     *************************************************************************/ | 
 |     virtual bool InitApplication() { return true; }; | 
 |  | 
 |     /*!*********************************************************************** | 
 |     @brief      Quit the application. | 
 |     @details    This function can be overloaded by the application. It | 
 |                 will be called by PVRShell just before finishing the | 
 |                 program. It enables the application to release any | 
 |                 memory/resources acquired in InitApplication(). | 
 |     @return     true for success, false to exit the application | 
 |     *************************************************************************/ | 
 |     virtual bool QuitApplication() { return true; }; | 
 |  | 
 |     /*!*********************************************************************** | 
 |     @brief      Initialise the view. | 
 |     @details    This function can be overloaded by the application. It | 
 |                 will be called by PVRShell after the OS and rendering API | 
 |                 are initialised, before entering the RenderScene() loop. | 
 |                 It is called any time the rendering API is initialised, | 
 |                 i.e. once at the beginning, and possibly again if the | 
 |                 resolution changes, or a power management even occurs, or | 
 |                 if the app requests a re-initialisation. | 
 |                 The application should check here the configuration of | 
 |                 the rendering API; it is possible that requests made in | 
 |                 InitApplication() were not successful. | 
 |                 Since everything is initialised when this function is | 
 |                 called, you can load textures and perform rendering API functions. | 
 |     @return     true for success, false to exit the application | 
 |     *************************************************************************/ | 
 |     virtual bool InitView() { return true; }; | 
 |  | 
 |     /*!*********************************************************************** | 
 |      @brief     Release the view. | 
 |      @details   This function can be overloaded by the application. It | 
 |                 will be called after the RenderScene() loop, before | 
 |                 shutting down the render API. It enables the application | 
 |                 to release any memory/resources acquired in InitView(). | 
 |      @return    true for success, false to exit the application | 
 |     *************************************************************************/ | 
 |     virtual bool ReleaseView() {  return true; }; | 
 |  | 
 |     /*!*********************************************************************** | 
 |      @brief     Render the scene | 
 |      @details   This function can be overloaded by the application. | 
 |                 It is main application function in which you have to do your own rendering.  Will be | 
 |                 called repeatedly until the application exits. | 
 |      @return    true for success, false to exit the application | 
 |     *************************************************************************/ | 
 |     virtual bool RenderScene() { return true; }; | 
 |  | 
 |     /* | 
 |         PVRShell functions available for the application to use. | 
 |     */ | 
 |  | 
 |     /*!*********************************************************************** | 
 |      @brief     This function is used to pass preferences to the PVRShell. | 
 |                 If used, this function must be called from InitApplication(). | 
 |      @param[in] prefName  Name of preference to set to value | 
 |      @param[in] value     Value | 
 |      @return    true for success | 
 |     *************************************************************************/ | 
 |     bool PVRShellSet(const prefNameBoolEnum prefName, const bool value); | 
 |  | 
 |     /*!*********************************************************************** | 
 |      @brief     This function is used to pass preferences to the PVRShell. | 
 |                 If used, this function must be called from InitApplication(). | 
 |      @param[in] prefName    Name of preference to set to value | 
 |      @param[in] value       Value | 
 |      @return    true for success | 
 |     *************************************************************************/ | 
 |     bool PVRShellSet(const prefNameFloatEnum prefName, const float value); | 
 |  | 
 |     /*!*********************************************************************** | 
 |      @brief     This function is used to pass preferences to the PVRShell. | 
 |                 If used, this function must be called from InitApplication(). | 
 |      @param[in] prefName    Name of preference to set to value | 
 |      @param[in] value       Value | 
 |      @return    true for success | 
 |     *************************************************************************/ | 
 |     bool PVRShellSet(const prefNameIntEnum prefName, const int value); | 
 |  | 
 |     /*!*********************************************************************** | 
 |      @brief     This function is used to pass preferences to the PVRShell. | 
 |                 If used, this funciton must be called from InitApplication(). | 
 |      @param[in] prefName    Name of preference to set to value | 
 |      @param[in] ptrValue    Value | 
 |      @return    true for success | 
 |     *************************************************************************/ | 
 |     bool PVRShellSet(const prefNamePtrEnum prefName, const void * const ptrValue); | 
 |  | 
 |     /*!*********************************************************************** | 
 |      @brief     This function is used to pass preferences to the PVRShell. | 
 |                 If used, this function must be called from InitApplication(). | 
 |      @param[in] prefName    Name of preference to set to value | 
 |      @param[in] ptrValue    Value | 
 |      @return    true for success | 
 |     *************************************************************************/ | 
 |     bool PVRShellSet(const prefNameConstPtrEnum prefName, const void * const ptrValue); | 
 |  | 
 |     /*!*********************************************************************** | 
 |      @brief     This function is used to get parameters from the PVRShell. | 
 |                 It can be called from anywhere in the program. | 
 |      @param[in] prefName    Name of preference to set to value | 
 |      @return    The requested value. | 
 |     *************************************************************************/ | 
 |     bool PVRShellGet(const prefNameBoolEnum prefName) const; | 
 |  | 
 |     /*!*********************************************************************** | 
 |     @brief      This function is used to get parameters from the PVRShell. | 
 |                 It can be called from anywhere in the program. | 
 |     @param[in]  prefName    Name of preference to set to value | 
 |     @return     The requested value. | 
 |     *************************************************************************/ | 
 |     float PVRShellGet(const prefNameFloatEnum prefName) const; | 
 |  | 
 |     /*!*********************************************************************** | 
 |     @brief      This function is used to get parameters from the PVRShell. | 
 |                 It can be called from anywhere in the program. | 
 |     @param[in]  prefName    Name of preference to set to value | 
 |     @return     The requested value. | 
 |     *************************************************************************/ | 
 |     int PVRShellGet(const prefNameIntEnum prefName) const; | 
 |  | 
 |     /*!*********************************************************************** | 
 |     @brief      This function is used to get parameters from the PVRShell. | 
 |                 It can be called from anywhere in the program. | 
 |     @param[in]  prefName    Name of preference to set to value | 
 |     @return     The requested value. | 
 |     *************************************************************************/ | 
 |     void *PVRShellGet(const prefNamePtrEnum prefName) const; | 
 |  | 
 |     /*!*********************************************************************** | 
 |     @brief      This function is used to get parameters from the PVRShell | 
 |                 It can be called from anywhere in the program. | 
 |     @param[in]  prefName    Name of preference to set to value | 
 |     @return     The requested value. | 
 |     *************************************************************************/ | 
 |     const void *PVRShellGet(const prefNameConstPtrEnum prefName) const; | 
 |  | 
 |     /*!*********************************************************************** | 
 |      @brief      It will be stored as 24-bit per pixel, 8-bit per chanel RGB.  | 
 |                  The memory should be freed using the free() function when no longer needed. | 
 |      @param[in]  Width   size of image to capture (relative to 0,0) | 
 |      @param[in]  Height  size of image to capture (relative to 0,0) | 
 |      @param[out] pLines  receives a pointer to an area of memory containing the screen buffer. | 
 |      @return     true for success | 
 |     *************************************************************************/ | 
 |     bool PVRShellScreenCaptureBuffer(const int Width, const int Height, unsigned char **pLines); | 
 |  | 
 |     /*!*********************************************************************** | 
 |     @brief      Writes out the image data to a BMP file with basename fname. | 
 |     @details    The file written will be fname suffixed with a | 
 |                 number to make the file unique. | 
 |                 For example, if fname is "abc", this function will attempt | 
 |                 to save to "abc0000.bmp"; if that file already exists, it | 
 |                 will try "abc0001.bmp", repeating until a new filename is | 
 |                 found. The final filename used is returned in ofname. | 
 |     @param[in]  fname               base of file to save screen to | 
 |     @param[in]  Width               size of image | 
 |     @param[in]  Height              size of image | 
 |     @param[in]  pLines              image data to write out (24bpp, 8-bit per channel RGB) | 
 |     @param[in]  ui32PixelReplicate  expand pixels through replication (1 = no scale) | 
 |     @param[out] ofname              If non-NULL, receives the filename actually used | 
 |     @return     true for success | 
 |     *************************************************************************/ | 
 |     int PVRShellScreenSave( | 
 |         const char          * const fname, | 
 |         const int           Width, | 
 |         const int           Height, | 
 |         const unsigned char * const pLines, | 
 |         const unsigned int  ui32PixelReplicate = 1, | 
 |         char                * const ofname = NULL); | 
 |  | 
 |     /*!*********************************************************************** | 
 |      @brief     Writes out the image data to a BMP file with name fname. | 
 |      @param[in] pszFilename     file to save screen to | 
 |      @param[in] ui32Width       the width of the data | 
 |      @param[in] ui32Height      the height of the data | 
 |      @param[in] pImageData      image data to write out (24bpp, 8-bit per channel RGB) | 
 |      @param[in] ui32PixelReplicate  expand pixels through replication (1 = no scale) | 
 |      @return    0 on success | 
 |     *************************************************************************/ | 
 |     int PVRShellWriteBMPFile( | 
 |         const char          * const pszFilename, | 
 |         const unsigned int  ui32Width, | 
 |         const unsigned int  ui32Height, | 
 |         const void          * const pImageData, | 
 |         const unsigned int  ui32PixelReplicate = 1); | 
 |  | 
 |     /*!*********************************************************************** | 
 |     @brief     Writes the resultant string to the debug output (e.g. using | 
 |                printf(), OutputDebugString(), ...). Check the SDK release notes for | 
 |                details on how the string is output. | 
 |     @param[in] format       printf style format followed by arguments it requires | 
 |     *************************************************************************/ | 
 |     void PVRShellOutputDebug(char const * const format, ...) const; | 
 |  | 
 |     /*!*********************************************************************** | 
 |     @brief      The number itself should be considered meaningless; an | 
 |                 application should use this function to determine how much | 
 |                 time has passed between two points (e.g. between each frame). | 
 |     @return     A value which increments once per millisecond. | 
 |     *************************************************************************/ | 
 |     unsigned long PVRShellGetTime(); | 
 |  | 
 |     /*!*********************************************************************** | 
 |     @brief      Check if a key was pressed.  | 
 |     @details    The keys on various devices | 
 |                 are mapped to the PVRShell-supported keys (listed in @a PVRShellKeyName) in | 
 |                 a platform-dependent manner, since most platforms have different input | 
 |                 devices. Check the <a href="modules.html">Modules page</a> for your OS | 
 |                 for details on how the enum values map to your device's key code input. | 
 |     @param[in]  key     Code of the key to test | 
 |     @return     true if key was pressed | 
 |     *************************************************************************/ | 
 |     bool PVRShellIsKeyPressed(const PVRShellKeyName key); | 
 | }; | 
 |  | 
 | /**************************************************************************** | 
 | ** Declarations for functions that the scene file must supply | 
 | ****************************************************************************/ | 
 |  | 
 | /*!*************************************************************************** | 
 |  @brief     This function must be implemented by the user of the shell. | 
 |  @details   The user should return its PVRShell object defining the | 
 |             behaviour of the application. | 
 |  @return    The demo supplied by the user | 
 | *****************************************************************************/ | 
 | PVRShell* NewDemo(); | 
 |  | 
 | #endif /* __PVRSHELL_H_ */ | 
 |  | 
 | /***************************************************************************** | 
 |  End of file (PVRShell.h) | 
 | *****************************************************************************/ | 
 |  |