/**************************************************************************\ * * Copyright (c) 1999-2000 Microsoft Corporation * * Module Name: * * perftest.h * * Abstract: * * This is the common include module for the GDI+ performance tests. * \**************************************************************************/ #include #include #include #include #include // sin & cos #include #include #include #if 0 // So that we can continue testing the old drawing functionality for // a while, don't use the new API headers yet: #define RenderingHintAntiAlias RenderingModeAntiAlias #define TextRenderingHintAntiAlias TextAntiAlias #define TextRenderingHintClearType TextClearType #define PixelFormatMax PIXFMT_MAX #define PixelFormat32bppARGB PIXFMT_32BPP_ARGB #define PixelFormat32bppPARGB PIXFMT_32BPP_PARGB #define PixelFormat32bppRGB PIXFMT_32BPP_RGB #define PixelFormat16bppRGB555 PIXFMT_16BPP_RGB555 #define PixelFormat16bppRGB565 PIXFMT_16BPP_RGB565 #define PixelFormat24bppRGB PIXFMT_24BPP_RGB #define LinearGradientBrush LineGradientBrush #define InterpolationModeBicubic InterpolateBicubic #define InterpolationModeBilinear InterpolateBilinear #define UNITPIXEL PageUnitPixel #else #define USE_NEW_APIS 1 #define USE_NEW_APIS2 1 #define UNITPIXEL UnitPixel #endif #include using namespace Gdiplus; #include "resource.h" #include "debug.h" // Handy window handle: extern HWND ghwndMain; // Dimensions of any bitmap destinations: #define TestWidth 800 #define TestHeight 600 //-------------------------------------------------------------------------- // Types // // Enums for test permutations //-------------------------------------------------------------------------- enum DestinationType { Destination_Screen_Current, Destination_Screen_800_600_8bpp_DefaultPalette, Destination_Screen_800_600_8bpp_HalftonePalette, Destination_Screen_800_600_16bpp, Destination_Screen_800_600_24bpp, Destination_Screen_800_600_32bpp, Destination_CompatibleBitmap_8bpp, Destination_DIB_15bpp, Destination_DIB_16bpp, Destination_DIB_24bpp, Destination_DIB_32bpp, Destination_Bitmap_32bpp_ARGB, Destination_Bitmap_32bpp_PARGB, Destination_Count // Must be last entry, used for count }; enum ApiType { Api_GdiPlus, Api_Gdi, Api_Count // Must be last entry, used for count }; enum StateType { State_Default, State_Antialias, State_Count // Must be last entry, used for count }; typedef float (*TESTFUNCTION)(Graphics *, HDC); struct Test { INT UniqueIdentifier; INT Priority; TESTFUNCTION Function; LPCTSTR Description; LPCTSTR Comment; }; struct Config { LPCTSTR Description; BOOL Enabled; }; struct TestConfig { BOOL Enabled; Test* TestEntry; // Points to static entry describing test }; extern TestConfig *TestList; // Sorted test list extern Config ApiList[]; extern Config DestinationList[]; extern Config StateList[]; //-------------------------------------------------------------------------- // Test groupings // //-------------------------------------------------------------------------- #define T(uniqueIdentifier, priority, function, comment) \ { uniqueIdentifier, priority, function, _T(#function), _T(comment) } struct TestGroup { Test* Tests; INT Count; }; extern Test DrawTests[]; extern Test FillTests[]; extern Test ImageTests[]; extern Test TextTests[]; extern Test OtherTests[]; extern INT DrawTests_Count; extern INT FillTests_Count; extern INT ImageTests_Count; extern INT TextTests_Count; extern INT OtherTests_Count; extern INT Test_Count; // Total number of tests //-------------------------------------------------------------------------- // TestResult - // // Structure for maintaining test result information. The data is kept // as a multi-dimensional array, and the following routines are used // for access. //-------------------------------------------------------------------------- struct TestResult { float Score; }; inline INT ResultIndex(INT destinationIndex, INT apiIndex, INT stateIndex, INT testIndex) { return(((testIndex * State_Count + stateIndex) * Api_Count + apiIndex) * Destination_Count + destinationIndex); } inline INT ResultCount() { return(Destination_Count * Api_Count * State_Count * Test_Count); } extern TestResult *ResultsList; // Allocation to track test results //-------------------------------------------------------------------------- // TestSuite - // // Class that abstracts all the state setup for running all the tests. //-------------------------------------------------------------------------- class TestSuite { private: // Save Destination state: BOOL ModeSet; // Was a mode set? HPALETTE HalftonePalette, OldPalette; // Saved State state: GraphicsState SavedState; public: BOOL InitializeDestination(DestinationType, Bitmap**, HBITMAP*); VOID UninitializeDestination(DestinationType, Bitmap *, HBITMAP); BOOL InitializeApi(ApiType, Bitmap *, HBITMAP, HWND, Graphics **, HDC *); VOID UninitializeApi(ApiType, Bitmap *, HBITMAP, HWND, Graphics *, HDC); BOOL InitializeState(ApiType, StateType, Graphics*, HDC); VOID UninitializeState(ApiType, StateType, Graphics*, HDC); TestSuite(); ~TestSuite(); VOID Run(HWND hwnd); }; /////////////////////////////////////////////////////////////////////////// // Test settings: extern BOOL AutoRun; extern BOOL ExcelOut; extern BOOL Icecap; extern BOOL FoundIcecap; extern BOOL TestRender; extern INT CurrentTestIndex; extern CHAR CurrentTestDescription[]; extern LPTSTR processor; extern TCHAR osVer[MAX_PATH]; extern TCHAR deviceName[MAX_PATH]; extern TCHAR machineName[MAX_PATH]; /////////////////////////////////////////////////////////////////////////// // IceCAP API functions #define PROFILE_GLOBALLEVEL 1 #define PROFILE_CURRENTID ((unsigned long)0xFFFFFFFF) typedef int (_stdcall *ICCOMMENTMARKPROFILEFUNC)(long lMarker, const char *szComment); typedef int (_stdcall *ICCONTROLPROFILEFUNC)(int nLevel, unsigned long dwId); extern ICCONTROLPROFILEFUNC ICStartProfile, ICStopProfile; extern ICCOMMENTMARKPROFILEFUNC ICCommentMarkProfile; /////////////////////////////////////////////////////////////////////////// // Worker routines VOID MessageF(LPTSTR fmt, ...); HBITMAP CreateCompatibleDIB2(HDC hdc, int width, int height); VOID CreatePerformanceReport(TestResult *results, BOOL useExcel); VOID GetOutputFileName(TCHAR*); /////////////////////////////////////////////////////////////////////////// // Timer utility functions #define MIN_ITERATIONS 16 // Must be power of two #define MIN_DURATION 200 // Minimum time duration, in milliseconds #define MEGA 1000000 // Handy constant for computing megapixels #define KILO 1000 // Handy constant for computing kilopixels void StartTimer(); BOOL EndTimer(); void GetTimer(float* seconds, UINT* iterations);