276 lines
7.5 KiB
C++
276 lines
7.5 KiB
C++
/**************************************************************************\
|
|
*
|
|
* Copyright (c) 1999-2000 Microsoft Corporation
|
|
*
|
|
* Module Name:
|
|
*
|
|
* perftest.h
|
|
*
|
|
* Abstract:
|
|
*
|
|
* This is the common include module for the GDI+ performance tests.
|
|
*
|
|
\**************************************************************************/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdarg.h>
|
|
#include <windows.h>
|
|
#include <math.h> // sin & cos
|
|
#include <tchar.h>
|
|
#include <commctrl.h>
|
|
#include <objbase.h>
|
|
|
|
#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 <gdiplus.h>
|
|
|
|
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);
|