text: // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  // PARTICULAR PURPOSE.
  //
  // Copyright (c) Microsoft Corporation. All rights reserved.
  
  //-----------------------------------------------------------------------------
  // File: DXUtil.h
  //
  // Desc: Helper functions and typing shortcuts for DirectX programming.
  //-----------------------------------------------------------------------------
  #ifndef DXUTIL_H
  #define DXUTIL_H
  
  
  //-----------------------------------------------------------------------------
  // Miscellaneous helper functions
  //-----------------------------------------------------------------------------
  #define SAFE_DELETE(p)       { if(p) { delete (p);     (p)=NULL; } }
  #define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p);   (p)=NULL; } }
  #define SAFE_RELEASE(p)      { if(p) { (p)->Release(); (p)=NULL; } }
  
  
  //-----------------------------------------------------------------------------
  // Name: DXUtil_Read*RegKey() and DXUtil_Write*RegKey()
  // Desc: Helper functions to read/write a string registry key 
  //-----------------------------------------------------------------------------
  HRESULT DXUtil_WriteStringRegKey( HKEY hKey, LPCTSTR strRegName, LPCTSTR strValue );
  HRESULT DXUtil_WriteFloatRegKey( HKEY hKey, LPCTSTR strRegName, FLOAT fValue );
  HRESULT DXUtil_WriteIntRegKey( HKEY hKey, LPCTSTR strRegName, DWORD dwValue );
  HRESULT DXUtil_WriteGuidRegKey( HKEY hKey, LPCTSTR strRegName, GUID guidValue );
  HRESULT DXUtil_WriteBoolRegKey( HKEY hKey, LPCTSTR strRegName, BOOL bValue );
  
  HRESULT DXUtil_ReadStringRegKeyCch( HKEY hKey, LPCTSTR strRegName, TCHAR* strDest, DWORD cchDest, LPCTSTR strDefault );
  HRESULT DXUtil_ReadStringRegKeyCb( HKEY hKey, LPCTSTR strRegName, TCHAR* strDest, DWORD cbDest, LPCTSTR strDefault );
  HRESULT DXUtil_ReadFloatRegKey( HKEY hKey, LPCTSTR strRegName, FLOAT* fDest, FLOAT fDefault );
  HRESULT DXUtil_ReadIntRegKey( HKEY hKey, LPCTSTR strRegName, DWORD* pdwValue, DWORD dwDefault );
  HRESULT DXUtil_ReadGuidRegKey( HKEY hKey, LPCTSTR strRegName, GUID* pGuidValue, GUID& guidDefault );
  HRESULT DXUtil_ReadBoolRegKey( HKEY hKey, LPCTSTR strRegName, BOOL* pbValue, BOOL bDefault );
  
  
  //-----------------------------------------------------------------------------
  // Name: DXUtil_Timer()
  // Desc: Performs timer opertations. Use the following commands:
  //          TIMER_RESET           - to reset the timer
  //          TIMER_START           - to start the timer
  //          TIMER_STOP            - to stop (or pause) the timer
  //          TIMER_ADVANCE         - to advance the timer by 0.1 seconds
  //          TIMER_GETABSOLUTETIME - to get the absolute system time
  //          TIMER_GETAPPTIME      - to get the current time
  //          TIMER_GETELAPSEDTIME  - to get the time that elapsed between 
  //                                  TIMER_GETELAPSEDTIME calls
  //-----------------------------------------------------------------------------
  enum TIMER_COMMAND { TIMER_RESET, TIMER_START, TIMER_STOP, TIMER_ADVANCE,
                       TIMER_GETABSOLUTETIME, TIMER_GETAPPTIME, TIMER_GETELAPSEDTIME };
  FLOAT __stdcall DXUtil_Timer( TIMER_COMMAND command );
  
  
  
  
  //-----------------------------------------------------------------------------
  // Readme functions
  //-----------------------------------------------------------------------------
  VOID DXUtil_LaunchReadme( HWND hWnd, LPCTSTR strLoc = NULL );
  
  
  //-----------------------------------------------------------------------------
  // Debug printing support
  // See dxerr9.h for more debug printing support
  //-----------------------------------------------------------------------------
  VOID    DXUtil_Trace( LPCTSTR strMsg, ... );
  
  #if defined(DEBUG) | defined(_DEBUG)
      #define DXTRACE             DXUtil_Trace
      #define DXTRACE_ERR(str,hr) (DXUtil_Trace(str), hr)
  #else
      #define DXTRACE                 sizeof
      #define DXTRACE_ERR(str,hr)     (hr)
  #endif
  
  
  //-----------------------------------------------------------------------------
  // Name: ArrayListType
  // Desc: Indicates how data should be stored in a CArrayList
  //-----------------------------------------------------------------------------
  enum ArrayListType
  {
      AL_VALUE,       // entry data is copied into the list
      AL_REFERENCE,   // entry pointers are copied into the list
  };
  
  
  //-----------------------------------------------------------------------------
  // Name: CArrayList
  // Desc: A growable array
  //-----------------------------------------------------------------------------
  class CArrayList
  {
  protected:
      ArrayListType m_ArrayListType;
      void* m_pData;
      UINT m_BytesPerEntry;
      UINT m_NumEntries;
      UINT m_NumEntriesAllocated;
  
  public:
      CArrayList( ArrayListType Type, UINT BytesPerEntry = 0 );
      ~CArrayList( void );
      HRESULT Add( void* pEntry );
      void Remove( UINT Entry );
      void* GetPtr( UINT Entry );
      UINT Count( void ) { return m_NumEntries; }
      bool Contains( void* pEntryData );
      void Clear( void ) { m_NumEntries = 0; }
  };
  
  //-----------------------------------------------------------------------------
  // WinCE build support
  //-----------------------------------------------------------------------------
  
  #ifdef UNDER_CE
  
  #define CheckDlgButton(hdialog, id, state) ::SendMessage(::GetDlgItem(hdialog, id), BM_SETCHECK, state, 0)
  #define IsDlgButtonChecked(hdialog, id) ::SendMessage(::GetDlgItem(hdialog, id), BM_GETCHECK, 0L, 0L)
  #define GETTIMESTAMP GetTickCount
  #define _TWINCE(x) _T(x)
  
  __inline int GetScrollPos(HWND hWnd, int nBar)
  {
  	SCROLLINFO si;
  	memset(&si, 0, sizeof(si));
  	si.cbSize = sizeof(si);
  	si.fMask = SIF_POS;
  	if (!GetScrollInfo(hWnd, nBar, &si))
  	{
  		return 0;
  	}
  	else
  	{
  		return si.nPos;
  	}
  }
  
  #else // !UNDER_CE
  
  #define GETTIMESTAMP timeGetTime
  #define _TWINCE(x) x
  
  #endif // UNDER_CE
  
  
  #endif // DXUTIL_H
  