windows-nt/Source/XPSP1/NT/shell/cpls/deskadp/setdrw.cpp
2020-09-26 16:20:57 +08:00

396 lines
12 KiB
C++

/******************************************************************************
Source File: setdrw.c
This file contains the code to draw the test bitmap
Copyright (c) 1997-1998 by Microsoft Corporation
Change History:
Original version - ChrisW
12-01-97 AndreVa - Created It
******************************************************************************/
#include "deskadp.h"
/****************************************************************************
FUNCTION: MakeRect
PURPOSE: Fill in RECT structure given contents.
****************************************************************************/
VOID MakeRect( PRECT pRect, INT xmin, INT ymin, INT xmax, INT ymax )
{
pRect->left= xmin;
pRect->right= xmax;
pRect->bottom= ymin;
pRect->top= ymax;
}
// type constants for DrawArrow
#define AW_TOP 1 // top
#define AW_BOTTOM 2 // bottom
#define AW_LEFT 3 // left
#define AW_RIGHT 4 // right
/****************************************************************************
FUNCTION: DrawArrow
PURPOSE: Draw one arrow in a given color.
****************************************************************************/
static
VOID DrawArrow( HDC hDC, INT type, INT xPos, INT yPos, COLORREF crPenColor )
{
INT shaftlen=30; // length of arrow shaft
INT headlen=15; // height or width of arrow head (not length)
HGDIOBJ hPen, hPrevPen = NULL; // pens
INT x,y;
INT xdir, ydir; // directions of x and y (1,-1)
hPen= CreatePen( PS_SOLID, 1, crPenColor );
if( hPen )
hPrevPen= SelectObject( hDC, hPen );
MoveToEx( hDC, xPos, yPos, NULL );
xdir= ydir= 1; // defaults
switch( type )
{
case AW_BOTTOM:
ydir= -1;
case AW_TOP:
LineTo(hDC, xPos, yPos+ydir*shaftlen);
for( x=0; x<3; x++ )
{
MoveToEx( hDC, xPos, yPos+ydir*x, NULL );
LineTo( hDC, xPos-(headlen-x), yPos+ydir*headlen );
MoveToEx( hDC, xPos, yPos+ydir*x, NULL );
LineTo( hDC, xPos+(headlen-x), yPos+ydir*headlen );
}
break;
case AW_RIGHT:
xdir= -1;
case AW_LEFT:
LineTo( hDC, xPos + xdir*shaftlen, yPos );
for( y=0; y<3; y++ )
{
MoveToEx( hDC, xPos + xdir*y, yPos, NULL );
LineTo( hDC, xPos + xdir*headlen, yPos+(headlen-y));
MoveToEx( hDC, xPos + xdir*y, yPos, NULL );
LineTo( hDC, xPos + xdir*headlen, yPos-(headlen-y));
}
break;
}
if( hPrevPen )
SelectObject( hDC, hPrevPen );
if (hPen)
DeleteObject(hPen);
}
/****************************************************************************
FUNCTION: LabelRect
PURPOSE: Label a rectangle with centered text given resource ID.
****************************************************************************/
static
VOID LabelRect(HDC hDC, PRECT pRect, UINT idString )
{
UINT iStatus;
INT xStart, yStart;
SIZE Size; // for size of string
TCHAR szMsg[256];
if( idString == 0 ) // make it easy to ignore call
return;
SetBkMode( hDC, OPAQUE );
SetBkColor( hDC, RGB(0,0,0) );
SetTextColor( hDC, RGB(255,255,255) );
// center
xStart= (pRect->left+pRect->right) /2;
yStart= (pRect->top+pRect->bottom) /2;
iStatus= LoadString( g_hInst, idString, szMsg, ARRAYSIZE(szMsg) );
if( !iStatus )
{
return; // can't find string - print nothing
}
GetTextExtentPoint32( hDC, szMsg, lstrlen(szMsg), &Size );
TextOut( hDC, xStart-Size.cx/2, yStart-Size.cy/2, szMsg, lstrlen(szMsg) );
}
/****************************************************************************
FUNCTION: PaintRect
PURPOSE: Color in a rectangle and label it.
****************************************************************************/
static
VOID PaintRect(
HDC hDC, // DC to paint
INT lowx, // coordinates describing rectangle to fill
INT lowy, //
INT highx, //
INT highy, //
COLORREF rgb, // color to fill in rectangle with
UINT idString ) // resource ID to use to label or 0 is none
{
RECT rct;
HBRUSH hBrush;
MakeRect( &rct, lowx, lowy, highx, highy );
hBrush = CreateSolidBrush( rgb );
if (hBrush)
{
FillRect( hDC, &rct, hBrush );
DeleteObject( hBrush );
}
LabelRect( hDC, &rct, idString );
}
/****************************************************************************
FUNCTION: DrawArrows
PURPOSE: Draw all the arrows showing edges of resolution.
****************************************************************************/
VOID DrawArrows( HDC hDC, INT xRes, INT yRes )
{
INT dx,dy;
INT x,y;
COLORREF color= RGB(0,0,0); // color of arrow
dx= xRes/8;
dy= yRes/8;
for( x=0; x<xRes; x += dx )
{
DrawArrow( hDC, AW_TOP, dx/2+x, 0, color );
DrawArrow( hDC, AW_BOTTOM, dx/2+x, yRes-1, color );
}
for( y=0; y<yRes; y += dy )
{
DrawArrow( hDC, AW_LEFT, 0, dy/2+y, color );
DrawArrow( hDC, AW_RIGHT, xRes-1, dy/2+y, color );
}
}
/****************************************************************************
FUNCTION: LabelResolution
PURPOSE: Labels the resolution in a form a user may understand.
FEATURE: We could label vertically too.
****************************************************************************/
VOID LabelResolution( HDC hDC, INT xmin, INT ymin, INT xmax, INT ymax )
{
TCHAR szRes[120]; // text for resolution
TCHAR szFmt[256]; // format string
SIZE Size;
INT iStatus;
iStatus= LoadString( g_hInst, IDS_RESOLUTION_FMT, szFmt, ARRAYSIZE(szFmt) );
if( !iStatus || iStatus==ARRAYSIZE(szFmt) )
{
lstrcpy(szFmt,TEXT("%d x %d")); // make sure we get something
}
wsprintf( szRes, szFmt, xmax, ymax );
SetBkMode( hDC, TRANSPARENT );
SetTextColor( hDC, RGB(0,0,0) );
GetTextExtentPoint32( hDC, szRes, lstrlen(szRes), &Size );
// Text near bottom of screen ~10 pixels from bottom
TextOut( hDC, xmax/2 - Size.cx/2, ymax - 10-Size.cy, szRes, lstrlen(szRes) );
}
// table of resolutions that we show off.
// if the resolution is larger, then we show that one too.
typedef struct tagRESTAB {
INT xRes;
INT yRes;
COLORREF crColor; // color to paint this resolution
} RESTAB;
RESTAB ResTab[] ={
{ 1600, 1200, RGB(255,0,0)},
{ 1280, 1024, RGB(0,255,0)},
{ 1152, 900, RGB(0,0,255)},
{ 1024, 768, RGB(255,0,0)},
{ 800, 600, RGB(0,255,0)},
// 640x480 or 640x400 handled specially
{ 0, 0, 0} // end of table
};
/****************************************************************************
FUNCTION: Set1152Mode
PURPOSE: Set the height of the 1152 mode since it varies from card to
card.
****************************************************************************/
VOID Set1152Mode(int height)
{
ResTab[2].yRes = height;
}
/****************************************************************************
FUNCTION: DrawBmp
PURPOSE: Show off a fancy screen so the user has some idea
of what will be seen given this resolution, colour
depth and vertical refresh rate. Note that we do not
try to simulate the font sizes.
****************************************************************************/
VOID DrawBmp(HDC hDC)
{
INT nBpp; // bits per pixel
INT nWidth; // width of screen in pixels
INT nHeight; // height of screen in pixels
INT xUsed,yUsed; // amount of x and y to use for dense bitmap
INT dx,dy; // delta x and y for color bars
RECT rct; // rectangle for passing bounds
// HFONT hFont; // stock font for logfont
// LOGFONT lf; // for creating new font
HGDIOBJ hPrevFont=0; // previous font in DC
HGDIOBJ hNewFont; // new font if possible
HGDIOBJ hPrevPen; // previous pen handle
INT x,y,i;
INT off; // offset in dx units
// try to use bigger better looking font
//hFont= GetStockObject( DEVICE_DEFAULT_FONT );
//GetObject( hFont, sizeof(LOGFONT), &lf );
//lf.lfHeight= 30;
//hNewFont= CreateFontIndirect( &lf );
hNewFont = (HFONT)NULL;
if( hNewFont ) // if no font, use old
hPrevFont= SelectObject( hDC, hNewFont );
// get surface information
nBpp= GetDeviceCaps( hDC, BITSPIXEL ) * GetDeviceCaps( hDC, PLANES );
nWidth= GetDeviceCaps( hDC, HORZRES );
nHeight= GetDeviceCaps( hDC, VERTRES );
// background for everything is yellow.
PaintRect( hDC, 0,0,nWidth, nHeight, RGB(255,255,0),0 );
LabelResolution( hDC, 0,0,nWidth, nHeight );
// Background for various resolutions
// biggest ones first
for( i=0; ResTab[i].xRes !=0; i++ )
{
// Only draw if it will show
if( ( nWidth>=ResTab[i].xRes ) | ( nHeight>=ResTab[i].yRes ) )
{
PaintRect(hDC,0,0,ResTab[i].xRes,ResTab[i].yRes,ResTab[i].crColor,0);
LabelResolution( hDC, 0, 0, ResTab[i].xRes, ResTab[i].yRes);
}
}
// color bars - only in standard vga area
xUsed= min( nWidth, 640 ); // only use vga width
yUsed= min( nHeight, 480 ); // could be 400 on some boards
dx= xUsed/2;
dy= yUsed/6;
PaintRect( hDC, 0, 0, dx, dy*1, RGB(255,0,0), IDS_COLOR_RED );
PaintRect( hDC, 0,dy*1, dx, dy*2, RGB(0,255,0), IDS_COLOR_GREEN );
PaintRect( hDC, 0,dy*2, dx, dy*3, RGB(0,0,255), IDS_COLOR_BLUE );
PaintRect( hDC, 0,dy*3, dx, dy*4, RGB(255,255,0 ),IDS_COLOR_YELLOW );
PaintRect( hDC, 0,dy*4, dx, dy*5, RGB(255,0,255), IDS_COLOR_MAGENTA );
PaintRect( hDC, 0,dy*5, dx, yUsed, RGB(0,255,255), IDS_COLOR_CYAN );
// gradations of colors for true color detection
for( x=dx; x<xUsed; x++ )
{
INT level;
level= 255- ( 256*(x-dx) ) / dx;
PaintRect( hDC, x, dy*0, x+1, dy*1, RGB( level,0,0 ),0 );
PaintRect( hDC, x, dy*1, x+1, dy*2, RGB( 0,level,0 ),0 );
PaintRect( hDC, x, dy*2, x+1, dy*3, RGB( 0,0,level ),0 );
PaintRect( hDC, x, dy*5, x+1, dy*6, RGB( level,level,level), 0 );
}
MakeRect( &rct, dx,0,dx*2,dy*1 );
LabelRect( hDC, &rct, IDS_RED_SHADES );
MakeRect( &rct, dx,dy,dx*2,dy*2);
LabelRect( hDC, &rct, IDS_GREEN_SHADES );
MakeRect( &rct, dx,2*dy,dx*2,dy*3);
LabelRect( hDC, &rct, IDS_BLUE_SHADES );
MakeRect( &rct, dx,5*dy,dx*2,dy*6);
LabelRect( hDC, &rct, IDS_GRAY_SHADES );
// horizontal lines for interlace detection
off= 3;
PaintRect(hDC, dx,dy*off, xUsed, dy*(off+1),RGB(255,255,255),0 );// white
hPrevPen= SelectObject( hDC, GetStockObject(BLACK_PEN) );
for( y=dy*off; y<dy*(off+1); y= y+2 )
{
MoveToEx( hDC, dx, y, NULL );
LineTo( hDC, dx*2, y );
}
SelectObject( hDC, hPrevPen );
MakeRect( &rct, dx, dy*off, dx*2, dy*(off+1) );
LabelRect( hDC, &rct, IDS_PATTERN_HORZ );
// vertical lines for bad dac detection
off= 4;
PaintRect(hDC, dx,dy*off, xUsed,dy*(off+1), RGB(255,255,255),0 ); // white
hPrevPen= SelectObject( hDC, GetStockObject(BLACK_PEN) );
for( x=dx; x<xUsed; x= x+2 )
{
MoveToEx( hDC, x, dy*off, NULL );
LineTo( hDC, x, dy*(off+1) );
}
SelectObject( hDC, hPrevPen );
MakeRect( &rct, dx, dy*off, dx*2, dy*(off+1) );
LabelRect( hDC, &rct, IDS_PATTERN_VERT );
DrawArrows( hDC, nWidth, nHeight );
LabelResolution(hDC, 0,0, xUsed, yUsed );
// delete created font if one was created
if( hPrevFont )
{
hPrevFont= SelectObject( hDC, hPrevFont );
DeleteObject( hPrevFont );
}
}