windows-nt/Source/XPSP1/NT/shell/osshell/ep/tictac/grafix.c

351 lines
6.2 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/************/
/* grafix.c */ /* WARNING: The following code ain't pretty */
/************/
#define _WINDOWS
#include <windows.h>
#include <port1632.h>
#include "main.h"
#include "res.h"
#include "grafix.h"
#include "rtns.h"
#include "pref.h"
#include "sound.h"
HDC hDCTemp;
HDC hDCBall;
HDC hDCBack;
HBITMAP hbmTemp;
HBITMAP hbmBall;
HBITMAP hbmBack;
HPEN hPenLtGray;
HPEN hPenGray;
INT rgXBlk[cBlkMax]; /* Positions of squares on screen */
INT rgYBlk[cBlkMax];
INT rgBallOff[iBallMax]; /* Offsets into the ball bitmap */
/*** External Data ***/
extern HWND hwndMain;
extern HANDLE hInst;
extern INT dyBlkPlane;
extern INT dypPlane;
extern INT dxpPlane;
extern INT dxpGrid;
extern INT dypGrid;
extern INT dxpWindow;
extern INT dypWindow;
extern INT dxpGridOff;
extern INT cBlkRow;
extern INT cBlkPlane;
extern INT cPlane;
extern INT cBlkMac;
extern rgBlk[cBlkMax];
extern rgFlash[cDimMax];
extern INT iPlayer;
extern BOOL f4;
extern PREF Preferences;
/****** F I N I T L O C A L ******/
BOOL FInitLocal(VOID)
{
INT y;
HDC hDCScrn;
hPenLtGray = CreatePen(PS_SOLID, 1, RGB_LTGRAY);
hPenGray = CreatePen(PS_SOLID, 1, RGB_GRAY);
hDCScrn = GetDC(hwndMain);
hDCTemp = CreateCompatibleDC(NULL);
hbmTemp = CreateCompatibleBitmap(hDCScrn, dxpGridMax, dypGridMax);
SelectObject(hDCTemp, hbmTemp);
hDCBack = CreateCompatibleDC(NULL);
hbmBack = CreateCompatibleBitmap(hDCScrn, dxpGridMax, dypGridMax);
SelectObject(hDCBack, hbmBack);
hDCBall = CreateCompatibleDC(NULL);
ReleaseDC(hwndMain, hDCScrn);
GetTheBitmap();
for (y = 0; y < iBallMax; y++)
rgBallOff[y] = y*dyBall;
return ((hDCTemp != NULL) && (hbmTemp != NULL) &&
(hDCBack != NULL) && (hbmBack != NULL) &&
(hDCBall != NULL) && (hbmBall != NULL) );
}
VOID GetTheBitmap(VOID)
{
HBITMAP hbm;
hbmBall = LoadBitmap(hInst, MAKEINTRESOURCE(ID_BMP_BALL+(!Preferences.fColor)));
if (hDCBall != NULL)
{
hbm = SelectObject(hDCBall, hbmBall);
if (hbm)
DeleteObject(hbm);
}
}
/****** C L E A N U P ******/
VOID CleanUp(VOID)
{
EndTunes();
DeleteDC(hDCBall);
DeleteDC(hDCBack);
DeleteDC(hDCTemp);
DeleteObject(hbmBall);
DeleteObject(hbmBack);
DeleteObject(hbmTemp);
DeleteObject(hPenGray);
DeleteObject(hPenLtGray);
}
/****** S E T U P B O A R D ******/
VOID SetupBoard(VOID)
{
INT x,y,z;
INT dx,dy;
INT i = 0;
PatBlt(hDCBack, 0, 0, dxpGridMax, dypGridMax, BLACKNESS);
for (z = 0; z < cPlane; z++)
{
dy = z * (dypPlane + dyLevel);
for (y = 0; y < cBlkRow; y++, dy += dyBlk)
{
dx = ((cBlkRow-1)-y)*dxSlant;
for (x = 0; x < cBlkRow; x++, dx += (dxBlk-1))
{
rgXBlk[i] = dx;
rgYBlk[i] = dy;
i++;
}
}
}
/* Just plot squares back to front *** CHANGE TO DRAW LINES */
for (i = 0; i < cBlkMac; i++)
BitBlt(hDCBack, rgXBlk[i], rgYBlk[i], dxBall, dyBall,
hDCBall, 0, 0, SRCPAINT);
BitBlt(hDCTemp, 0, 0, dxpGridMax, dypGridMax, hDCBack, 0, 0, SRCCOPY);
}
/****** D I S P L A Y B A L L ******/
VOID DisplayBall(BLK blkFix, BALL ballFix)
{
HDC hDC;
INT dx,dy;
INT dyFix;
BLK blk,blkStart, blkEnd;
BALL iBall;
#if DEBUG > 1
CHAR sz[80];
wsprintf(sz,"Disp blk=%d ball=%d\r\n",blkFix,ballFix);
OutputDebugString(sz);
#endif
#ifdef DEBUG
if (blkFix < 0)
{
Oops("DisplayBall: Invalid blk");
return;
}
else if (ballFix >= iBallMax)
{
Oops("DisplayBall: Invalid iBall");
return;
}
#endif
hDC = GetDC(hwndMain);
blkEnd = cBlkPlane + (blkStart = cBlkPlane * (blkFix/cBlkPlane));
dyFix = rgYBlk[blkStart];
BitBlt(hDCTemp, 0, dyFix, dxpPlane, dypPlane,
hDCBack, 0, dyFix, SRCCOPY);
iBall = rgBlk[blkFix];
rgBlk[blkFix] = ballFix;
ballFix = iBall;
for (blk = blkStart; blk < blkEnd; blk++)
{
if ((iBall = rgBlk[blk]) != iBallBlank)
{
BitBlt(hDCTemp, dx = rgXBlk[blk], dy = rgYBlk[blk], dxBall, dyBall,
hDCBall, 0, rgBallOff[iBallMask], SRCAND);
BitBlt(hDCTemp, dx, dy, dxBall, dyBall,
hDCBall, 0, rgBallOff[iBall], SRCPAINT);
}
}
rgBlk[blkFix] = ballFix;
BitBlt(hDC, dxpGridOff, (dyFix + dypGridOff), dxpPlane, dypPlane,
hDCTemp, 0, dyFix, SRCCOPY);
ReleaseDC(hwndMain, hDC);
}
/****** D R A W G R I D ******/
VOID DrawGrid(HDC hDC)
{
BitBlt(hDC, dxpGridOff, dypGridOff, dxpGrid, dypGrid, hDCTemp, 0, 0, SRCCOPY);
}
VOID DisplayGrid(VOID)
{
HDC hDC = GetDC(hwndMain);
DrawGrid(hDC);
ReleaseDC(hwndMain, hDC);
}
/****** R E D O D I S P L A Y ******/
VOID ReDoDisplay()
{
REGISTER INT i;
REGISTER INT iBall;
BitBlt(hDCTemp, 0, 0, dxpGrid, dypGrid, hDCBack, 0, 0, SRCCOPY);
/* Place balls back to front */
for (i = 0; i < cBlkMac; i++)
{
if ((iBall = rgBlk[i]) != iBallBlank)
{
BitBlt(hDCTemp, rgXBlk[i], rgYBlk[i], dxBall, dyBall,
hDCBall, 0, rgBallOff[iBallMask], SRCAND);
BitBlt(hDCTemp, rgXBlk[i], rgYBlk[i], dxBall, dyBall,
hDCBall, 0, rgBallOff[iBall], SRCPAINT);
}
}
}
/****** P L A C E B A L L ******/
VOID PlaceBall(BLK blk, BALL iBall)
{
HDC hDC = GetDC(hwndMain);
#ifdef DEBUG
if (blk < 0 || blk >= cBlkMac)
Oops("PlaceBlk: Blk out of range");
else if (iBall < iBallBlank || iBall >= iBallMax)
Oops("PlaceBall: Ball out of range");
#endif
rgBlk[blk] = iBall;
ReDoDisplay();
DrawGrid(hDC);
ReleaseDC(hwndMain, hDC);
}
VOID DrawRect(HDC hDC, INT x1, INT y1, INT x2, INT y2, HPEN hPen)
{
SelectObject(hDC, hPen);
(VOID)MMoveTo(hDC, x1, y1);
LineTo(hDC, x1, y2);
LineTo(hDC, x2, y2);
LineTo(hDC, x2, y1);
LineTo(hDC, x1, y1);
}
VOID DrawBorder(HDC hDC)
{
REGISTER INT x;
REGISTER INT y;
x = dxpWindow-1;
y = dypWindow-1;
SetROP2(hDC, R2_COPYPEN);
DrawRect(hDC, 0, 0, x, y, hPenGray);
DrawRect(hDC, 1, 1, --x, --y, hPenLtGray);
DrawRect(hDC, 2, 2, --x, --y, hPenLtGray);
DrawRect(hDC, 3, 3, --x, --y, hPenGray);
}
/****** D R A W S C R E E N ******/
VOID DrawScreen(HDC hDC)
{
DrawBorder(hDC);
DrawGrid(hDC);
}
VOID DisplayScreen(VOID)
{
HDC hDC = GetDC(hwndMain);
DrawScreen(hDC);
ReleaseDC(hwndMain, hDC);
}
/****** D O F L A S H ******/
VOID DoFlash(BOOL fOn)
{
REGISTER INT i;
HDC hDC = GetDC(hwndMain);
for (i = 0; i < cBlkRow; i++)
rgBlk[rgFlash[i]] = fOn ? iPlayer :iBallGrey;
ReDoDisplay();
DrawGrid(hDC);
ReleaseDC(hwndMain, hDC);
}