712 lines
17 KiB
C++
712 lines
17 KiB
C++
/**************************************************************************\
|
|
*
|
|
* Copyright (c) 1999-2000 Microsoft Corporation
|
|
*
|
|
* Module Name:
|
|
*
|
|
* perfdraw.cpp
|
|
*
|
|
* Abstract:
|
|
*
|
|
* Contains all the tests for any routines that 'Draw'.
|
|
*
|
|
\**************************************************************************/
|
|
|
|
#include "perftest.h"
|
|
|
|
// Global array for holding line vertices:
|
|
|
|
Point SweepLines[2000];
|
|
|
|
int Initialize_256_Pixel_Sweep_Lines()
|
|
{
|
|
int c = 0;
|
|
int i;
|
|
|
|
for (i = 0; i < 510; i += 4)
|
|
{
|
|
SweepLines[c].X = 255;
|
|
SweepLines[c].Y = 255;
|
|
c++;
|
|
SweepLines[c].X = i;
|
|
SweepLines[c].Y = 0;
|
|
c++;
|
|
}
|
|
for (i = 0; i < 510; i += 4)
|
|
{
|
|
SweepLines[c].X = 255;
|
|
SweepLines[c].Y = 255;
|
|
c++;
|
|
SweepLines[c].X = 510;
|
|
SweepLines[c].Y = i;
|
|
c++;
|
|
}
|
|
for (i = 0; i < 510; i += 4)
|
|
{
|
|
SweepLines[c].X = 255;
|
|
SweepLines[c].Y = 255;
|
|
c++;
|
|
SweepLines[c].X = 510 - i;
|
|
SweepLines[c].Y = 510;
|
|
c++;
|
|
}
|
|
for (i = 0; i < 510; i += 4)
|
|
{
|
|
SweepLines[c].X = 255;
|
|
SweepLines[c].Y = 255;
|
|
c++;
|
|
SweepLines[c].X = 0;
|
|
SweepLines[c].Y = 510 - i;
|
|
c++;
|
|
}
|
|
|
|
return(c / 2);
|
|
}
|
|
|
|
float Draw_Lines_PerPixel_Nominal_Solid_Opaque_Aliased(Graphics *g, HDC hdc)
|
|
{
|
|
UINT iterations;
|
|
float seconds;
|
|
int i;
|
|
|
|
int lines = Initialize_256_Pixel_Sweep_Lines();
|
|
|
|
if (g)
|
|
{
|
|
Pen pen(Color::Red, 1);
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
for (i = 0; i < lines; i++)
|
|
{
|
|
g->DrawLine(&pen, SweepLines[i*2].X, SweepLines[i*2].Y,
|
|
SweepLines[i*2+1].X, SweepLines[i*2+1].Y);
|
|
}
|
|
|
|
} while (!EndTimer());
|
|
|
|
g->Flush(FlushIntentionSync);
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
}
|
|
else
|
|
{
|
|
POINT points[2000];
|
|
|
|
for (i = 0; i < lines * 2 + 1; i++)
|
|
{
|
|
points[i].x = SweepLines[i].X;
|
|
points[i].y = SweepLines[i].Y;
|
|
}
|
|
|
|
HPEN hpen = CreatePen(PS_SOLID, 1, RGB(0xff, 0, 0));
|
|
HGDIOBJ oldPen = SelectObject(hdc, hpen);
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
for (i = 0; i < lines; i++)
|
|
{
|
|
Polyline(hdc, &points[i*2], 2);
|
|
}
|
|
|
|
} while (!EndTimer());
|
|
|
|
GdiFlush();
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
|
|
SelectObject(hdc, oldPen);
|
|
}
|
|
|
|
UINT pixels = 256 * lines * iterations;
|
|
|
|
return(pixels / seconds / KILO); // Kilo-pixels per second
|
|
}
|
|
|
|
float Draw_Lines_PerPixel_Nominal_Solid_Opaque_Antialiased(Graphics *g, HDC hdc)
|
|
{
|
|
UINT iterations;
|
|
float seconds;
|
|
int i;
|
|
|
|
if (!g) return(0); // There is no GDI equivalent
|
|
|
|
int lines = Initialize_256_Pixel_Sweep_Lines();
|
|
|
|
g->SetSmoothingMode(SmoothingModeAntiAlias);
|
|
|
|
Pen pen(Color::Red, 1);
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
for (i = 0; i < lines; i++)
|
|
{
|
|
g->DrawLine(&pen, SweepLines[i*2].X, SweepLines[i*2].Y,
|
|
SweepLines[i*2+1].X, SweepLines[i*2+1].Y);
|
|
}
|
|
|
|
} while (!EndTimer());
|
|
|
|
g->Flush(FlushIntentionSync);
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
|
|
UINT pixels = 256 * lines * iterations;
|
|
|
|
return(pixels / seconds / KILO); // Kilo-pixels per second
|
|
}
|
|
|
|
float Draw_Lines_PerPixel_Nominal_Solid_Opaque_Antialiased_Quality(Graphics *g, HDC hdc)
|
|
{
|
|
UINT iterations;
|
|
float seconds;
|
|
int i;
|
|
|
|
if (!g) return(0); // There is no GDI equivalent
|
|
|
|
int lines = Initialize_256_Pixel_Sweep_Lines();
|
|
|
|
g->SetSmoothingMode(SmoothingModeAntiAlias);
|
|
g->SetCompositingQuality(CompositingQualityHighQuality);
|
|
|
|
Pen pen(Color::Red, 1);
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
for (i = 0; i < lines; i++)
|
|
{
|
|
g->DrawLine(&pen, SweepLines[i*2].X, SweepLines[i*2].Y,
|
|
SweepLines[i*2+1].X, SweepLines[i*2+1].Y);
|
|
}
|
|
|
|
} while (!EndTimer());
|
|
|
|
g->Flush(FlushIntentionSync);
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
|
|
UINT pixels = 256 * lines * iterations;
|
|
|
|
return(pixels / seconds / KILO); // Kilo-pixels per second
|
|
}
|
|
|
|
float Draw_Lines_PerPixel_Wide_Solid_Opaque_Aliased(Graphics *g, HDC hdc)
|
|
{
|
|
UINT iterations;
|
|
float seconds;
|
|
int i;
|
|
|
|
int lines = Initialize_256_Pixel_Sweep_Lines();
|
|
|
|
if (g)
|
|
{
|
|
Pen pen(Color::Red, 2);
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
for (i = 0; i < lines; i++)
|
|
{
|
|
g->DrawLine(&pen, SweepLines[i*2].X, SweepLines[i*2].Y,
|
|
SweepLines[i*2+1].X, SweepLines[i*2+1].Y);
|
|
}
|
|
|
|
} while (!EndTimer());
|
|
|
|
g->Flush(FlushIntentionSync);
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
}
|
|
else
|
|
{
|
|
POINT points[2000];
|
|
|
|
for (i = 0; i < lines * 2 + 1; i++)
|
|
{
|
|
points[i].x = SweepLines[i].X;
|
|
points[i].y = SweepLines[i].Y;
|
|
}
|
|
|
|
HPEN hpen = CreatePen(PS_SOLID, 2, RGB(0xff, 0, 0));
|
|
HGDIOBJ oldPen = SelectObject(hdc, hpen);
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
for (i = 0; i < lines; i++)
|
|
{
|
|
Polyline(hdc, &points[i*2], 2);
|
|
}
|
|
|
|
} while (!EndTimer());
|
|
|
|
GdiFlush();
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
|
|
SelectObject(hdc, oldPen);
|
|
}
|
|
|
|
UINT pixels = 256 * lines * iterations;
|
|
|
|
return(pixels / seconds / KILO); // Kilo-pixels per second
|
|
}
|
|
|
|
float Draw_Lines_PerPixel_Wide_Solid_Opaque_Antialiased(Graphics *g, HDC hdc)
|
|
{
|
|
UINT iterations;
|
|
float seconds;
|
|
int i;
|
|
|
|
if (!g) return(0); // There is no GDI equivalent
|
|
|
|
g->SetSmoothingMode(SmoothingModeAntiAlias);
|
|
|
|
int lines = Initialize_256_Pixel_Sweep_Lines();
|
|
|
|
Pen pen(Color::Red, 2);
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
for (i = 0; i < lines; i++)
|
|
{
|
|
g->DrawLine(&pen, SweepLines[i*2].X, SweepLines[i*2].Y,
|
|
SweepLines[i*2+1].X, SweepLines[i*2+1].Y);
|
|
}
|
|
|
|
} while (!EndTimer());
|
|
|
|
g->Flush(FlushIntentionSync);
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
|
|
UINT pixels = 256 * lines * iterations;
|
|
|
|
return(pixels / seconds / KILO); // Kilo-pixels per second
|
|
}
|
|
|
|
float Draw_Lines_PerPixel_Wide_Solid_Opaque_Antialiased_Quality(Graphics *g, HDC hdc)
|
|
{
|
|
UINT iterations;
|
|
float seconds;
|
|
int i;
|
|
|
|
if (!g) return(0); // There is no GDI equivalent
|
|
|
|
g->SetSmoothingMode(SmoothingModeAntiAlias);
|
|
g->SetCompositingQuality(CompositingQualityHighQuality);
|
|
|
|
int lines = Initialize_256_Pixel_Sweep_Lines();
|
|
|
|
Pen pen(Color::Red, 2);
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
for (i = 0; i < lines; i++)
|
|
{
|
|
g->DrawLine(&pen, SweepLines[i*2].X, SweepLines[i*2].Y,
|
|
SweepLines[i*2+1].X, SweepLines[i*2+1].Y);
|
|
}
|
|
|
|
} while (!EndTimer());
|
|
|
|
g->Flush(FlushIntentionSync);
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
|
|
UINT pixels = 256 * lines * iterations;
|
|
|
|
return(pixels / seconds / KILO); // Kilo-pixels per second
|
|
}
|
|
|
|
float Draw_Lines_PerLine_Nominal_Solid_Opaque_Aliased(Graphics *g, HDC hdc)
|
|
{
|
|
UINT iterations;
|
|
float seconds;
|
|
|
|
if (g)
|
|
{
|
|
StartTimer();
|
|
|
|
do {
|
|
Pen pen(Color::Red, 1);
|
|
g->DrawLine(&pen, 255, 255, 256, 256); // 2 pixels long
|
|
|
|
} while (!EndTimer());
|
|
|
|
g->Flush(FlushIntentionSync);
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
}
|
|
else
|
|
{
|
|
StartTimer();
|
|
|
|
do {
|
|
POINT points[] = { 255, 255, 256, 256 };
|
|
|
|
HPEN hpen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
|
|
HGDIOBJ oldPen = SelectObject(hdc, hpen);
|
|
|
|
Polyline(hdc, points, 2);
|
|
|
|
SelectObject(hdc, oldPen);
|
|
DeleteObject(hpen);
|
|
|
|
} while (!EndTimer());
|
|
|
|
GdiFlush();
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
}
|
|
|
|
return(iterations / seconds / KILO); // Kilo-lines per second
|
|
}
|
|
|
|
float Draw_Lines_PerLine_Nominal_Solid_Opaque_Antialiased(Graphics *g, HDC hdc)
|
|
{
|
|
UINT iterations;
|
|
float seconds;
|
|
|
|
if (!g) return(0); // There is no GDI equivalent
|
|
|
|
g->SetSmoothingMode(SmoothingModeAntiAlias);
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
Pen pen(Color::Red, 1);
|
|
g->DrawLine(&pen, 255, 255, 256, 256); // 2 pixels long
|
|
|
|
} while (!EndTimer());
|
|
|
|
g->Flush(FlushIntentionSync);
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
|
|
return(iterations / seconds / KILO); // Kilo-lines per second
|
|
}
|
|
|
|
float Draw_Lines_PerLine_Wide_Solid_Opaque_Aliased(Graphics *g, HDC hdc)
|
|
{
|
|
UINT iterations;
|
|
float seconds;
|
|
|
|
if (g)
|
|
{
|
|
StartTimer();
|
|
|
|
do {
|
|
Pen pen(Color::Red, 2);
|
|
g->DrawLine(&pen, 255, 255, 256, 256); // 2 pixels long
|
|
|
|
} while (!EndTimer());
|
|
|
|
g->Flush(FlushIntentionSync);
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
}
|
|
else
|
|
{
|
|
StartTimer();
|
|
|
|
do {
|
|
POINT points[] = { 255, 255, 256, 256 };
|
|
|
|
HPEN hpen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
|
|
HGDIOBJ oldPen = SelectObject(hdc, hpen);
|
|
|
|
Polyline(hdc, points, 2);
|
|
|
|
SelectObject(hdc, oldPen);
|
|
DeleteObject(hpen);
|
|
|
|
} while (!EndTimer());
|
|
|
|
GdiFlush();
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
}
|
|
|
|
return(iterations / seconds / KILO); // Kilo-lines per second
|
|
}
|
|
|
|
float Draw_Lines_PerLine_Wide_Solid_Opaque_Antialiased(Graphics *g, HDC hdc)
|
|
{
|
|
UINT iterations;
|
|
float seconds;
|
|
|
|
if (!g) return(0); // There is no GDI equivalent
|
|
|
|
g->SetSmoothingMode(SmoothingModeAntiAlias);
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
Pen pen(Color::Red, 2);
|
|
g->DrawLine(&pen, 255, 255, 256, 256); // 2 pixels long
|
|
|
|
} while (!EndTimer());
|
|
|
|
g->Flush(FlushIntentionSync);
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
|
|
return(iterations / seconds / KILO); // Kilo-lines per second
|
|
}
|
|
|
|
float Draw_Ellipse_PerCall_Big_Nominal_Aliased(Graphics *g, HDC hdc)
|
|
{
|
|
UINT iterations;
|
|
float seconds;
|
|
|
|
if (g)
|
|
{
|
|
StartTimer();
|
|
|
|
do {
|
|
Pen pen(Color::Red, 0.1f);
|
|
g->DrawEllipse(&pen, 0, 0, 512, 512);
|
|
|
|
} while (!EndTimer());
|
|
|
|
g->Flush(FlushIntentionSync);
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
}
|
|
else
|
|
{
|
|
HGDIOBJ hbrush = GetStockObject(NULL_BRUSH);
|
|
HGDIOBJ oldBrush = SelectObject(hdc, hbrush);
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
HPEN hpen = CreatePen(PS_SOLID, 0, RGB(255, 0, 0));
|
|
HGDIOBJ oldPen = SelectObject(hdc, hpen);
|
|
|
|
Ellipse(hdc, 0, 0, 512, 512);
|
|
|
|
SelectObject(hdc, oldPen);
|
|
DeleteObject(hpen);
|
|
|
|
} while (!EndTimer());
|
|
|
|
GdiFlush();
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
|
|
SelectObject(hdc, oldBrush);
|
|
DeleteObject(hbrush);
|
|
}
|
|
|
|
return(iterations / seconds / KILO); // Kilo-calls per second
|
|
}
|
|
|
|
float Draw_Ellipse_PerCall_Big_WideLine_Aliased(Graphics *g, HDC hdc)
|
|
{
|
|
UINT iterations;
|
|
float seconds;
|
|
|
|
if (g)
|
|
{
|
|
StartTimer();
|
|
|
|
do {
|
|
Pen pen(Color::Red, 5);
|
|
g->DrawEllipse(&pen, 0, 0, 512, 512);
|
|
|
|
} while (!EndTimer());
|
|
|
|
g->Flush(FlushIntentionSync);
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
}
|
|
else
|
|
{
|
|
HGDIOBJ hbrush = GetStockObject(NULL_BRUSH);
|
|
HGDIOBJ oldBrush = SelectObject(hdc, hbrush);
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
HPEN hpen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));
|
|
HGDIOBJ oldPen = SelectObject(hdc, hpen);
|
|
|
|
Ellipse(hdc, 0, 0, 512, 512);
|
|
|
|
SelectObject(hdc, oldPen);
|
|
DeleteObject(hpen);
|
|
|
|
} while (!EndTimer());
|
|
|
|
GdiFlush();
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
|
|
SelectObject(hdc, oldBrush);
|
|
DeleteObject(hbrush);
|
|
}
|
|
|
|
return(iterations / seconds / KILO); // Kilo-calls per second
|
|
}
|
|
|
|
float Draw_Ellipse_PerCall_Small_Nominal_Aliased(Graphics *g, HDC hdc)
|
|
{
|
|
UINT iterations;
|
|
float seconds;
|
|
|
|
if (g)
|
|
{
|
|
HGDIOBJ hbrush = GetStockObject(NULL_BRUSH);
|
|
HGDIOBJ oldBrush = SelectObject(hdc, hbrush);
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
Pen pen(Color::Red, 0.1f);
|
|
g->DrawEllipse(&pen, 64, 64, 64, 64);
|
|
|
|
} while (!EndTimer());
|
|
|
|
g->Flush(FlushIntentionSync);
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
}
|
|
else
|
|
{
|
|
HGDIOBJ hbrush = GetStockObject(NULL_BRUSH);
|
|
HGDIOBJ oldBrush = SelectObject(hdc, hbrush);
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
HPEN hpen = CreatePen(PS_SOLID, 0, RGB(255, 0, 0));
|
|
HGDIOBJ oldPen = SelectObject(hdc, hpen);
|
|
|
|
Ellipse(hdc, 64, 64, 128, 128);
|
|
|
|
SelectObject(hdc, oldPen);
|
|
DeleteObject(hpen);
|
|
|
|
} while (!EndTimer());
|
|
|
|
GdiFlush();
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
|
|
SelectObject(hdc, oldBrush);
|
|
DeleteObject(hbrush);
|
|
}
|
|
|
|
return(iterations / seconds / KILO); // Kilo-calls per second
|
|
}
|
|
|
|
float Draw_Ellipse_PerCall_Small_WideLine_Aliased(Graphics *g, HDC hdc)
|
|
{
|
|
UINT iterations;
|
|
float seconds;
|
|
|
|
if (g)
|
|
{
|
|
StartTimer();
|
|
|
|
do {
|
|
Pen pen(Color::Red, 5);
|
|
g->DrawEllipse(&pen, 64, 64, 64, 64);
|
|
|
|
} while (!EndTimer());
|
|
|
|
g->Flush(FlushIntentionSync);
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
}
|
|
else
|
|
{
|
|
HGDIOBJ hbrush = GetStockObject(NULL_BRUSH);
|
|
HGDIOBJ oldBrush = SelectObject(hdc, hbrush);
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
HPEN hpen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));
|
|
HGDIOBJ oldPen = SelectObject(hdc, hpen);
|
|
|
|
Ellipse(hdc, 64, 64, 128, 128);
|
|
|
|
SelectObject(hdc, oldPen);
|
|
DeleteObject(hpen);
|
|
|
|
} while (!EndTimer());
|
|
|
|
GdiFlush();
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
|
|
SelectObject(hdc, oldBrush);
|
|
DeleteObject(hbrush);
|
|
}
|
|
|
|
return(iterations / seconds / KILO); // Kilo-calls per second
|
|
}
|
|
|
|
float Draw_Pie_PerCall_Nominal(Graphics *g, HDC hdc)
|
|
{
|
|
UINT iterations;
|
|
float seconds;
|
|
|
|
if (!g) return(0); // There is no GDI equivalent
|
|
|
|
StartTimer();
|
|
|
|
do {
|
|
Pen pen(Color::Red, 0.1f);
|
|
g->DrawPie(&pen, 0, 0, 512, 512, 90, 120);
|
|
|
|
} while (!EndTimer());
|
|
|
|
g->Flush(FlushIntentionSync);
|
|
|
|
GetTimer(&seconds, &iterations);
|
|
|
|
return(iterations / seconds / KILO); // Kilo-calls per second
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Add tests for this file here. Always use the 'T' macro for adding entries.
|
|
// The parameter meanings are as follows:
|
|
//
|
|
// Parameter
|
|
// ---------
|
|
// 1 UniqueIdentifier - Must be a unique number assigned to no other test
|
|
// 2 Priority - On a scale of 1 to 5, how important is the test?
|
|
// 3 Function - Function name
|
|
// 4 Comment - Anything to describe the test
|
|
|
|
Test DrawTests[] =
|
|
{
|
|
T(1000, 1, Draw_Lines_PerPixel_Nominal_Solid_Opaque_Aliased , "Kpixels/s"),
|
|
T(1001, 1, Draw_Lines_PerPixel_Nominal_Solid_Opaque_Antialiased , "Kpixels/s"),
|
|
T(1002, 1, Draw_Lines_PerPixel_Wide_Solid_Opaque_Aliased , "Kpixels/s"),
|
|
T(1003, 1, Draw_Lines_PerPixel_Wide_Solid_Opaque_Antialiased , "Kpixels/s"),
|
|
T(1004, 1, Draw_Lines_PerLine_Nominal_Solid_Opaque_Aliased , "Klines/s"),
|
|
T(1005, 1, Draw_Lines_PerLine_Nominal_Solid_Opaque_Antialiased , "Klines/s"),
|
|
T(1006, 1, Draw_Lines_PerLine_Wide_Solid_Opaque_Aliased , "Klines/s"),
|
|
T(1007, 1, Draw_Lines_PerLine_Wide_Solid_Opaque_Antialiased , "Klines/s"),
|
|
T(1008, 1, Draw_Ellipse_PerCall_Big_Nominal_Aliased , "Kcalls/s"),
|
|
T(1009, 1, Draw_Ellipse_PerCall_Big_WideLine_Aliased , "Kcalls/s"),
|
|
T(1010, 1, Draw_Pie_PerCall_Nominal , "Kcalls/s"),
|
|
T(1011, 1, Draw_Ellipse_PerCall_Small_Nominal_Aliased , "Kcalls/s"),
|
|
T(1012, 1, Draw_Ellipse_PerCall_Small_WideLine_Aliased , "Kcalls/s"),
|
|
T(1013, 1, Draw_Lines_PerPixel_Nominal_Solid_Opaque_Antialiased_Quality , "Kpixels/s"),
|
|
T(1014, 1, Draw_Lines_PerPixel_Wide_Solid_Opaque_Antialiased_Quality , "Kpixels/s"),
|
|
};
|
|
|
|
INT DrawTests_Count = sizeof(DrawTests) / sizeof(DrawTests[0]);
|