Home | History | Annotate | Download | only in Shell
      1 /*!****************************************************************************
      2 
      3  @file       Shell/PVRShell.h
      4  @copyright  Copyright (c) Imagination Technologies Limited.
      5  @brief      Makes programming for 3D APIs easier by wrapping surface
      6              initialization, Texture allocation and other functions for use by a demo.
      7 
      8 ******************************************************************************/
      9 
     10 #ifndef __PVRSHELL_H_
     11 #define __PVRSHELL_H_
     12 
     13 /*****************************************************************************/
     14 /*! @mainpage PVRShell
     15 ******************************************************************************
     16 
     17  @tableofcontents
     18 
     19  @section overview Overview
     20  *****************************
     21 
     22  PVRShell is a C++ class used to make programming for PowerVR platforms easier and more portable.
     23  PVRShell takes care of all API and OS initialisation for the user and handles adapters, devices, screen/windows modes,
     24  resolution, buffering, depth-buffer, viewport creation & clearing, etc...
     25 
     26  PVRShell consists of 3 files: PVRShell.cpp, PVRShellOS.cpp and PVRShellAPI.cpp.
     27 
     28  PVRShellOS.cpp and PVRShellAPI.cpp are supplied per platform and contain all the code to initialise the specific
     29  API (OpenGL ES, Direct3D Mobile, etc.) and the OS (Windows, Linux, WinCE, etc.).
     30  PVRShell.cpp is where the common code resides and it interacts with the user application through an abstraction layer.
     31 
     32  A new application must link to these three files and must create a class that will inherit the PVRShell class.
     33  This class will provide five virtual functions to interface with the user.
     34 
     35  The user also needs to register his application class through the NewDemo function:
     36 
     37  @code
     38  class MyApplication: public PVRShell
     39  {
     40  public:
     41      virtual bool InitApplication();
     42      virtual bool InitView();
     43      virtual bool ReleaseView();
     44      virtual bool QuitApplication();
     45      virtual bool RenderScene();
     46  };
     47 
     48  PVRShell* NewDemo()
     49  {
     50      return new MyApplication();
     51  }
     52  @endcode
     53 
     54 
     55  @section interface Interface
     56  ******************************
     57 
     58  There are two functions for initialisation, two functions to release allocated resources and a render function:
     59 
     60  InitApplication() will be called by PVRShell once per run, before the graphic context is created.
     61  It is used to initialise variables that are not dependant on the rendering context (e.g. external modules, loading user data, etc.).
     62  QuitApplication() will be called by PVRShell once per run, just before exiting the program.
     63  If the graphic context is lost, QuitApplication() will not be called.
     64 
     65  InitView() will be called by PVRShell upon creation or change in the rendering context.
     66  It is used to initialise variables that are dependant on the rendering context (e.g. textures, vertex buffers, etc.).
     67  ReleaseView() will be called by PVRShell before changing to a new rendering context or
     68  when finalising the application (before calling QuitApplication).
     69 
     70  RenderScene() is the main rendering loop function of the program. This function must return FALSE when the user wants to terminate the application.
     71  PVRShell will call this function every frame and will manage relevant OS events.
     72 
     73  There are other PVRShell functions which allow the user to set his/her preferences and get data back from the devices:
     74 
     75  PVRShellSet() and PVRShellGet() are used to pass data to and from PVRShell. PVRShellSet() is recommended to be used
     76  in InitApplication() so the user preferences are applied at the API initialisation.
     77  There is a definition of these functions per type of data passed or returned. Please check the prefNameBoolEnum, prefNameFloatEnum,
     78  prefNameIntEnum, prefNamePtrEnum and prefNameConstPtrEnum enumerations for a full list of the data available.
     79 
     80  This is an example:
     81 
     82  @code
     83  bool MyApplication::InitApplication()
     84  {
     85      PVRShellSet (prefFullScreen, true);
     86  }
     87 
     88  bool MyApplication::RenderScene()
     89  {
     90      int dwCurrentWidth = PVRShellGet (prefHeight);
     91      int dwCurrentHeight = PVRShellGet (prefWidth);
     92 
     93      return true;
     94  }
     95  @endcode
     96 
     97 
     98  @section helper Helper functions
     99  *************************************
    100 
    101  The user input is abstracted with the PVRShellIsKeyPressed() function. It will not work in all devices, but we have tried to map the most
    102  relevant keys when possible. See PVRShellKeyName enumeration for the list of keys supported. This function will return true or false depending on
    103  the specified key being pressed.
    104 
    105  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
    106  save a screen-shot of the current frame:
    107 
    108  PVRShellGetTime() returns time in milliseconds.
    109 
    110  PVRShellOutputDebug() will write a debug string (same format as printf) to the platform debug output.
    111 
    112  PVRShellScreenCaptureBuffer() and  PVRShellWriteBMPFile() will be used to save the current frame as a BMP file. PVRShellScreenCaptureBuffer()
    113  receives a pointer to an area of memory containing the screen buffer. The memory should be freed with free() when not needed any longer.
    114 
    115  Example of screenshot:
    116 
    117  @code
    118  bool MyApplication::RenderScene()
    119  {
    120      [...]
    121 
    122      unsigned char *pLines;
    123 
    124      PVRShellScreenCaptureBuffer(PVRShellGet (prefWidth), PVRShellGet (prefHeight), &pLines);
    125 
    126      PVRShellScreenSave("myfile", pLines, NULL);
    127 
    128      free (pLines);
    129 
    130      return true;
    131  }
    132  @endcode
    133 
    134 
    135  @section cmd Command-line
    136  *************************************
    137 
    138  Across all platforms, PVRShell takes a set of command-line arguments which allow things like the position and size of the demo
    139  to be controlled. The list below shows these options.
    140 
    141  \b -width=N   Sets the horizontal viewport width to N.
    142 
    143  \b -height=N   Sets the vertical viewport height to N.
    144 
    145  \b -posx=N   Sets the x coordinate of the viewport.
    146 
    147  \b -posy=N   Sets the y coordinate of the viewport.
    148 
    149  \b -aasamples=N   Sets the number of samples to use for full screen anti-aliasing. e.g 0, 2, 4, 8
    150 
    151  \b -fullscreen=N   Enable/Disable fullscreen mode. N can be: 0=Windowed 1=Fullscreen.
    152 
    153  \b -qat=N   Quits after N seconds.
    154 
    155  \b -qaf=N   Quits after N frames.
    156 
    157  \b -powersaving=N Where available enable/disable power saving. N can be: 0=Disable power saving 1=Enable power saving.
    158 
    159  \b -vsync=N Where available modify the apps vsync parameters.
    160 
    161  \b -version Output the SDK version to the debug output.
    162 
    163  \b -info Output setup information (e.g. window width) to the debug output.
    164 
    165  \b -rotatekeys=N Sets the orientation of the keyboard input. N can be: 0-3, 0 is no rotation.
    166 
    167  \b -c=N Save a single screenshot or a range. e.g. -c=1-10, -c=14.
    168 
    169  \b -priority=N EGL only. Sets the priority of the EGL context.
    170 
    171  \b -colourbpp=N EGL only. When choosing an EGL config N will be used as the value for EGL_BUFFER_SIZE.
    172 
    173  \b -depthbpp=N EGL only. When choosing an EGL config N will be used as the value for EGL_DEPTH_SIZE.
    174 
    175  \b -config=N EGL only. Force the shell to use the EGL config with ID N.
    176 
    177  \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.
    178 
    179  Example:
    180  @code
    181      Demo -width=160 -height=120 -qaf=300
    182  @endcode
    183 
    184  @section APIsOSs APIs and Operating Systems
    185  *****************************
    186  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.
    187 
    188 ******************************************************************************/
    189 // Uncomment to enable the -fps command-line option
    190 // #define PVRSHELL_FPS_OUTPUT
    191 
    192 /*****************************************************************************
    193 ** Includes
    194 *****************************************************************************/
    195 #include <stdlib.h>
    196 
    197 #define EXIT_NOERR_CODE 0
    198 #define EXIT_ERR_CODE (!EXIT_NOERR_CODE)
    199 
    200 // avoid warning about unused parameter
    201 #define PVRSHELL_UNREFERENCED_PARAMETER(x) ((void) x)
    202 
    203 // Keyboard mapping. //
    204 
    205 /*!***********************************************************************
    206  @enum PVRShellKeyName
    207  @brief Key name.
    208  ************************************************************************/
    209 enum PVRShellKeyName
    210 {
    211     PVRShellKeyNameNull,        /*!< Null key value */
    212     PVRShellKeyNameQUIT,        /*!< QUIT key value */
    213     PVRShellKeyNameSELECT,      /*!< SELECT key value */
    214     PVRShellKeyNameACTION1,     /*!< ACTION1 key value */
    215     PVRShellKeyNameACTION2,     /*!< ACTION2 key value */
    216     PVRShellKeyNameUP,          /*!< UP key */
    217     PVRShellKeyNameDOWN,        /*!< DOWN key */
    218     PVRShellKeyNameLEFT,        /*!< LEFT key */
    219     PVRShellKeyNameRIGHT,       /*!< RIGHT key */
    220     PVRShellKeyNameScreenshot   /*!< SCREENSHOT key */
    221 };
    222 
    223 /*!***********************************************************************
    224  @enum PVRShellKeyRotate
    225  @brief Key rotate.
    226  ************************************************************************/
    227 enum PVRShellKeyRotate
    228 {
    229     PVRShellKeyRotateNone=0,    /*!< Rotate key none = 0. */
    230     PVRShellKeyRotate90,        /*!< Rotate key 90 */
    231     PVRShellKeyRotate180,       /*!< Rotate key 180 */
    232     PVRShellKeyRotate270        /*!< Rotate key 270 */
    233 };
    234 
    235 //  Pointer button mapping. //
    236 
    237 /*!***********************************************************************
    238  @enum EPVRShellButtonState
    239  @brief Pointer button mapping.
    240  ************************************************************************/
    241 enum EPVRShellButtonState
    242 {
    243     ePVRShellButtonLeft = 0x1,  /*!< Left button */
    244     ePVRShellButtonRight = 0x2, /*!< Right button */
    245     ePVRShellButtonMiddle = 0x4 /*!< Middle button */
    246 };
    247 
    248 /*!***********************************************************************
    249  @enum prefNameBoolEnum
    250  @brief Boolean Shell preferences.
    251  ************************************************************************/
    252 enum prefNameBoolEnum
    253 {
    254     prefFullScreen,             /*!< Set to: 1 for full-screen rendering; 0 for windowed */
    255     prefIsRotated,              /*!< Query this to learn whether screen is rotated */
    256     prefPBufferContext,         /*!< 1 if you need pbuffer support (default is pbuffer not needed) */
    257     prefPixmapContext,          /*!< 1 to use a pixmap as a render-target (default off) */
    258     prefPixmapDisableCopy,      /*!< 1 to disable the copy if pixmaps are used */
    259     prefZbufferContext,         /*!< 1 if you wish to have zbuffer support (default to on) */
    260     prefLockableBackBuffer,     /*!< DX9 only: true to use D3DPRESENTFLAG_LOCKABLE_BACKBUFFER (default: false) */
    261     prefSoftwareRendering,      /*!< 1 to select software rendering (default: off, i.e. use hardware) */
    262     prefStencilBufferContext,   /*!< 1 if you wish to have stencil support (default: off) */
    263     prefAlphaFormatPre,         /*!< EGL only: 1 to create the EGL surface with EGL_ALPHA_FORMAT_PRE (default: 0) */
    264     prefPowerSaving,            /*!< If true then the app will go into powersaving mode (if available) when not in use. */
    265 #ifdef PVRSHELL_FPS_OUTPUT
    266     prefOutputFPS,              /*!< If true then the FPS are output using PVRShellOutputdebug */
    267 #endif
    268     prefOutputInfo,             /*!< If true then the app will output helpful information such as colour buffer format via PVRShellOutputDebug. */
    269     prefNoShellSwapBuffer,      /*!< EGL: If true then the shell won't call eglswapbuffers at the end of each frame. */
    270     prefShowCursor,             /*!< Set to: 1 to show the cursor; 0 to hide it. */
    271     prefForceFrameTime,         /*!< If true will alter PVRShellGetTime behaviour to be frame based. This is for debugging purposes. */
    272     prefDiscardColor,           /*!< GLES: Whether or not to discard color data at the end of a render, to save bandwidth. Requires specific functionality. (default: false) */
    273     prefDiscardDepth,           /*!< GLES: Whether or not to discard depth data at the end of a render, to save bandwidth. Requires specific functionality. (default: true) */
    274     prefDiscardStencil          /*!< GLES: Whether or not to discard stencil data at the end of a render, to save bandwidth. Requires specific functionality. (default: true) */
    275 };
    276 
    277 /*!***********************************************************************
    278  @enum prefNameFloatEnum
    279  @brief Float Shell preferences.
    280  ************************************************************************/
    281 enum prefNameFloatEnum
    282 {
    283     prefQuitAfterTime           /*!< Shell will quit after this number of seconds (-1 to disable) */
    284 };
    285 
    286 /*!***********************************************************************
    287  @enum prefNameIntEnum
    288  @brief Integer Shell preferences.
    289  ************************************************************************/
    290 enum prefNameIntEnum
    291 {
    292     prefEGLMajorVersion,    /*!< EGL: returns the major version as returned by eglInitialize() */
    293     prefEGLMinorVersion,    /*!< EGL: returns the minor version as returned by eglInitialize() */
    294     prefWidth,              /*!< Width of render target */
    295     prefHeight,             /*!< Height of render target */
    296     prefPositionX,          /*!< X position of the window */
    297     prefPositionY,          /*!< Y position of the window */
    298     prefQuitAfterFrame,     /*!< Shell will quit after this number of frames (-1 to disable) */
    299     prefSwapInterval,       /*!< 0 to preventing waiting for monitor vertical syncs */
    300     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. */
    301     prefAASamples,          /*!< Set to: 0 to disable full-screen anti-aliasing; 2 for 2x; 4 for 4x; 8 for 8x. */
    302     prefCommandLineOptNum,  /*!< Returns the length of the array returned by prefCommandLineOpts */
    303     prefColorBPP,           /*!< Allows you to specify a desired color buffer size e.g. 16, 32. */
    304     prefDepthBPP,           /*!< Allows you to specify a desired depth buffer size e.g. 16, 24. */
    305     prefRotateKeys,         /*!< Allows you to specify and retrieve how the keyboard input is transformed */
    306     prefButtonState,        /*!< pointer button state */
    307     prefCaptureFrameStart,  /*!< The frame to start capturing screenshots from */
    308     prefCaptureFrameStop,   /*!< The frame to stop capturing screenshots at */
    309     prefCaptureFrameScale,  /*!< Pixel-replicate saved screenshots this many times; default 1 for no scale */
    310     prefPriority,           /*!< EGL: If supported will set the egl context priority; 0 for low, 1 for med and 2 for high. */
    311     prefConfig,             /*!< EGL: Get the chosen EGL config. */
    312     prefRequestedConfig,    /*!< EGL: Force the shell to use a particular EGL config. */
    313     prefNativeDisplay,      /*!< EGL: Allows you to specify the native display to use if the device has more that one. */
    314     prefFrameTimeValue      /*!< An integer value to say how long you wish one frame to last for (in ms) when force frame time is enabled. */
    315 };
    316 
    317 /*!***********************************************************************
    318  @enum prefNamePtrEnum
    319  @brief Pointers/Handlers Shell preferences.
    320  ************************************************************************/
    321 enum prefNamePtrEnum
    322 {
    323     prefD3DDevice,          /*!< D3D: returns the device pointer */
    324     prefEGLDisplay,         /*!< EGL: returns the EGLDisplay */
    325     prefEGLSurface,         /*!< EGL: returns the EGLSurface */
    326     prefHINSTANCE,          /*!< Windows: returns the application instance handle */
    327     prefNativeWindowType,   /*!< Returns the window handle */
    328     prefAccelerometer,      /*!< Accelerometer values */
    329     prefPointerLocation,    /*!< Mouse pointer/touch location values */
    330     prefPVR2DContext,       /*!< PVR2D: returns the PVR2D context */
    331     prefLoadFileFunc,       /*!< A pointer to a function that can be used to load external files on platforms that don't allow the use of fopen.
    332                                  The ptr returned is of the type PFNLoadFileFunc defined below. */
    333     prefReleaseFileFunc,        /*!< A pointer to a function that is used to release any data allocated by the load file function.
    334                                  The ptr returned is of the type PFNReleaseFileFunc defined below. */
    335     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. */
    336 };
    337 
    338 /*!***********************************************************************
    339  @typedef PFNLoadFileFunc
    340  @brief The LoadFileFunc function pointer template.
    341  ************************************************************************/
    342 typedef void* (*PFNLoadFileFunc)(const char*, char** pData, size_t &size);
    343 
    344 /*!***********************************************************************
    345  @typedef PFNReleaseFileFunc
    346  @brief The ReleaseFileFunc function pointer template.
    347  ************************************************************************/
    348 typedef bool (*PFNReleaseFileFunc)(void* handle);
    349 
    350 /*!***********************************************************************
    351  @enum prefNameConstPtrEnum
    352  @brief Constant pointers Shell preferences.
    353  ************************************************************************/
    354 enum prefNameConstPtrEnum
    355 {
    356     prefAppName,            /*!< ptrValue is char* */
    357     prefReadPath,           /*!< ptrValue is char*; will include a trailing slash */
    358     prefWritePath,          /*!< ptrValue is char*; will include a trailing slash */
    359     prefCommandLine,        /*!< used to retrieve the entire application command line */
    360     prefCommandLineOpts,    /*!< ptrValue is SCmdLineOpt*; retrieves an array of arg/value pairs (parsed from the command line) */
    361     prefExitMessage,        /*!< ptrValue is char*; gives the shell a message to show on exit, typically an error */
    362     prefVersion             /*!< ptrValue is char* */
    363 };
    364 
    365 /*!**************************************************************************
    366  @struct PVRShellData
    367  @brief  PVRShell implementation Prototypes and definitions
    368 *****************************************************************************/
    369 struct PVRShellData;
    370 
    371 /*!***************************************************************************
    372  @class PVRShellInit
    373  *****************************************************************************/
    374 class PVRShellInit;
    375 
    376 /*!***********************************************************************
    377  @struct SCmdLineOpt
    378  @brief  Stores a variable name/value pair for an individual command-line option.
    379  ************************************************************************/
    380 struct SCmdLineOpt
    381 {
    382     const char *pArg, *pVal;
    383 };
    384 
    385 /*!***************************************************************************
    386  @class    PVRShell
    387  @brief    Inherited by the application; responsible for abstracting the OS and API.
    388  @details  PVRShell is the main Shell class that an application uses. An
    389            application should supply a class which inherits PVRShell and supplies
    390            implementations of the virtual functions of PVRShell (InitApplication(),
    391            QuitApplication(), InitView(), ReleaseView(), RenderScene()). Default stub
    392            functions are supplied; this means that an application is not
    393            required to supply a particular function if it does not need to do anything
    394            in it.
    395            The other, non-virtual, functions of PVRShell are utility functions that the
    396            application may call.
    397  *****************************************************************************/
    398 class PVRShell
    399 {
    400 private:
    401     friend class PVRShellInitOS;
    402     friend class PVRShellInit;
    403 
    404     PVRShellData    *m_pShellData;
    405     PVRShellInit    *m_pShellInit;
    406 
    407 public:
    408     /*!***********************************************************************
    409     @brief      Constructor
    410     *************************************************************************/
    411     PVRShell();
    412 
    413     /*!***********************************************************************
    414     @brief      Destructor
    415     *************************************************************************/
    416     virtual ~PVRShell();
    417 
    418     /*
    419         PVRShell functions that the application should implement.
    420     */
    421 
    422     /*!***********************************************************************
    423     @brief      Initialise the application.
    424     @details    This function can be overloaded by the application. It
    425                 will be called by PVRShell once, only at the beginning of
    426                 the PVRShell WinMain()/main() function. This function
    427                 enables the user to perform any initialisation before the
    428                 render API is initialised. From this function the user can
    429                 call PVRShellSet() to change default values, e.g.
    430                 requesting a particular resolution or device setting.
    431     @return     true for success, false to exit the application
    432     *************************************************************************/
    433     virtual bool InitApplication() { return true; };
    434 
    435     /*!***********************************************************************
    436     @brief      Quit the application.
    437     @details    This function can be overloaded by the application. It
    438                 will be called by PVRShell just before finishing the
    439                 program. It enables the application to release any
    440                 memory/resources acquired in InitApplication().
    441     @return     true for success, false to exit the application
    442     *************************************************************************/
    443     virtual bool QuitApplication() { return true; };
    444 
    445     /*!***********************************************************************
    446     @brief      Initialise the view.
    447     @details    This function can be overloaded by the application. It
    448                 will be called by PVRShell after the OS and rendering API
    449                 are initialised, before entering the RenderScene() loop.
    450                 It is called any time the rendering API is initialised,
    451                 i.e. once at the beginning, and possibly again if the
    452                 resolution changes, or a power management even occurs, or
    453                 if the app requests a re-initialisation.
    454                 The application should check here the configuration of
    455                 the rendering API; it is possible that requests made in
    456                 InitApplication() were not successful.
    457                 Since everything is initialised when this function is
    458                 called, you can load textures and perform rendering API functions.
    459     @return     true for success, false to exit the application
    460     *************************************************************************/
    461     virtual bool InitView() { return true; };
    462 
    463     /*!***********************************************************************
    464      @brief     Release the view.
    465      @details   This function can be overloaded by the application. It
    466                 will be called after the RenderScene() loop, before
    467                 shutting down the render API. It enables the application
    468                 to release any memory/resources acquired in InitView().
    469      @return    true for success, false to exit the application
    470     *************************************************************************/
    471     virtual bool ReleaseView() {  return true; };
    472 
    473     /*!***********************************************************************
    474      @brief     Render the scene
    475      @details   This function can be overloaded by the application.
    476                 It is main application function in which you have to do your own rendering.  Will be
    477                 called repeatedly until the application exits.
    478      @return    true for success, false to exit the application
    479     *************************************************************************/
    480     virtual bool RenderScene() { return true; };
    481 
    482     /*
    483         PVRShell functions available for the application to use.
    484     */
    485 
    486     /*!***********************************************************************
    487      @brief     This function is used to pass preferences to the PVRShell.
    488                 If used, this function must be called from InitApplication().
    489      @param[in] prefName  Name of preference to set to value
    490      @param[in] value     Value
    491      @return    true for success
    492     *************************************************************************/
    493     bool PVRShellSet(const prefNameBoolEnum prefName, const bool value);
    494 
    495     /*!***********************************************************************
    496      @brief     This function is used to pass preferences to the PVRShell.
    497                 If used, this function must be called from InitApplication().
    498      @param[in] prefName    Name of preference to set to value
    499      @param[in] value       Value
    500      @return    true for success
    501     *************************************************************************/
    502     bool PVRShellSet(const prefNameFloatEnum prefName, const float value);
    503 
    504     /*!***********************************************************************
    505      @brief     This function is used to pass preferences to the PVRShell.
    506                 If used, this function must be called from InitApplication().
    507      @param[in] prefName    Name of preference to set to value
    508      @param[in] value       Value
    509      @return    true for success
    510     *************************************************************************/
    511     bool PVRShellSet(const prefNameIntEnum prefName, const int value);
    512 
    513     /*!***********************************************************************
    514      @brief     This function is used to pass preferences to the PVRShell.
    515                 If used, this funciton must be called from InitApplication().
    516      @param[in] prefName    Name of preference to set to value
    517      @param[in] ptrValue    Value
    518      @return    true for success
    519     *************************************************************************/
    520     bool PVRShellSet(const prefNamePtrEnum prefName, const void * const ptrValue);
    521 
    522     /*!***********************************************************************
    523      @brief     This function is used to pass preferences to the PVRShell.
    524                 If used, this function must be called from InitApplication().
    525      @param[in] prefName    Name of preference to set to value
    526      @param[in] ptrValue    Value
    527      @return    true for success
    528     *************************************************************************/
    529     bool PVRShellSet(const prefNameConstPtrEnum prefName, const void * const ptrValue);
    530 
    531     /*!***********************************************************************
    532      @brief     This function is used to get parameters from the PVRShell.
    533                 It can be called from anywhere in the program.
    534      @param[in] prefName    Name of preference to set to value
    535      @return    The requested value.
    536     *************************************************************************/
    537     bool PVRShellGet(const prefNameBoolEnum prefName) const;
    538 
    539     /*!***********************************************************************
    540     @brief      This function is used to get parameters from the PVRShell.
    541                 It can be called from anywhere in the program.
    542     @param[in]  prefName    Name of preference to set to value
    543     @return     The requested value.
    544     *************************************************************************/
    545     float PVRShellGet(const prefNameFloatEnum prefName) const;
    546 
    547     /*!***********************************************************************
    548     @brief      This function is used to get parameters from the PVRShell.
    549                 It can be called from anywhere in the program.
    550     @param[in]  prefName    Name of preference to set to value
    551     @return     The requested value.
    552     *************************************************************************/
    553     int PVRShellGet(const prefNameIntEnum prefName) const;
    554 
    555     /*!***********************************************************************
    556     @brief      This function is used to get parameters from the PVRShell.
    557                 It can be called from anywhere in the program.
    558     @param[in]  prefName    Name of preference to set to value
    559     @return     The requested value.
    560     *************************************************************************/
    561     void *PVRShellGet(const prefNamePtrEnum prefName) const;
    562 
    563     /*!***********************************************************************
    564     @brief      This function is used to get parameters from the PVRShell
    565                 It can be called from anywhere in the program.
    566     @param[in]  prefName    Name of preference to set to value
    567     @return     The requested value.
    568     *************************************************************************/
    569     const void *PVRShellGet(const prefNameConstPtrEnum prefName) const;
    570 
    571     /*!***********************************************************************
    572      @brief      It will be stored as 24-bit per pixel, 8-bit per chanel RGB.
    573                  The memory should be freed using the free() function when no longer needed.
    574      @param[in]  Width   size of image to capture (relative to 0,0)
    575      @param[in]  Height  size of image to capture (relative to 0,0)
    576      @param[out] pLines  receives a pointer to an area of memory containing the screen buffer.
    577      @return     true for success
    578     *************************************************************************/
    579     bool PVRShellScreenCaptureBuffer(const int Width, const int Height, unsigned char **pLines);
    580 
    581     /*!***********************************************************************
    582     @brief      Writes out the image data to a BMP file with basename fname.
    583     @details    The file written will be fname suffixed with a
    584                 number to make the file unique.
    585                 For example, if fname is "abc", this function will attempt
    586                 to save to "abc0000.bmp"; if that file already exists, it
    587                 will try "abc0001.bmp", repeating until a new filename is
    588                 found. The final filename used is returned in ofname.
    589     @param[in]  fname               base of file to save screen to
    590     @param[in]  Width               size of image
    591     @param[in]  Height              size of image
    592     @param[in]  pLines              image data to write out (24bpp, 8-bit per channel RGB)
    593     @param[in]  ui32PixelReplicate  expand pixels through replication (1 = no scale)
    594     @param[out] ofname              If non-NULL, receives the filename actually used
    595     @return     true for success
    596     *************************************************************************/
    597     int PVRShellScreenSave(
    598         const char          * const fname,
    599         const int           Width,
    600         const int           Height,
    601         const unsigned char * const pLines,
    602         const unsigned int  ui32PixelReplicate = 1,
    603         char                * const ofname = NULL);
    604 
    605     /*!***********************************************************************
    606      @brief     Writes out the image data to a BMP file with name fname.
    607      @param[in] pszFilename     file to save screen to
    608      @param[in] ui32Width       the width of the data
    609      @param[in] ui32Height      the height of the data
    610      @param[in] pImageData      image data to write out (24bpp, 8-bit per channel RGB)
    611      @param[in] ui32PixelReplicate  expand pixels through replication (1 = no scale)
    612      @return    0 on success
    613     *************************************************************************/
    614     int PVRShellWriteBMPFile(
    615         const char          * const pszFilename,
    616         const unsigned int  ui32Width,
    617         const unsigned int  ui32Height,
    618         const void          * const pImageData,
    619         const unsigned int  ui32PixelReplicate = 1);
    620 
    621     /*!***********************************************************************
    622     @brief     Writes the resultant string to the debug output (e.g. using
    623                printf(), OutputDebugString(), ...). Check the SDK release notes for
    624                details on how the string is output.
    625     @param[in] format       printf style format followed by arguments it requires
    626     *************************************************************************/
    627     void PVRShellOutputDebug(char const * const format, ...) const;
    628 
    629     /*!***********************************************************************
    630     @brief      The number itself should be considered meaningless; an
    631                 application should use this function to determine how much
    632                 time has passed between two points (e.g. between each frame).
    633     @return     A value which increments once per millisecond.
    634     *************************************************************************/
    635     unsigned long PVRShellGetTime();
    636 
    637     /*!***********************************************************************
    638     @brief      Check if a key was pressed.
    639     @details    The keys on various devices
    640                 are mapped to the PVRShell-supported keys (listed in @a PVRShellKeyName) in
    641                 a platform-dependent manner, since most platforms have different input
    642                 devices. Check the <a href="modules.html">Modules page</a> for your OS
    643                 for details on how the enum values map to your device's key code input.
    644     @param[in]  key     Code of the key to test
    645     @return     true if key was pressed
    646     *************************************************************************/
    647     bool PVRShellIsKeyPressed(const PVRShellKeyName key);
    648 };
    649 
    650 /****************************************************************************
    651 ** Declarations for functions that the scene file must supply
    652 ****************************************************************************/
    653 
    654 /*!***************************************************************************
    655  @brief     This function must be implemented by the user of the shell.
    656  @details   The user should return its PVRShell object defining the
    657             behaviour of the application.
    658  @return    The demo supplied by the user
    659 *****************************************************************************/
    660 PVRShell* NewDemo();
    661 
    662 #endif /* __PVRSHELL_H_ */
    663 
    664 /*****************************************************************************
    665  End of file (PVRShell.h)
    666 *****************************************************************************/
    667 
    668