summaryrefslogtreecommitdiff
path: root/3dc/win95/db.c
diff options
context:
space:
mode:
Diffstat (limited to '3dc/win95/db.c')
-rw-r--r--3dc/win95/db.c1039
1 files changed, 0 insertions, 1039 deletions
diff --git a/3dc/win95/db.c b/3dc/win95/db.c
deleted file mode 100644
index 90fd200..0000000
--- a/3dc/win95/db.c
+++ /dev/null
@@ -1,1039 +0,0 @@
-#ifndef NDEBUG
-
-/* ******************************************************************** *
- * *
- * DB.C - Debugging functions. *
- * *
- * By: Garry Lancaster Version: 2.0 *
- * *
- * ******************************************************************** */
-
-/* N O T E S ********************************************************** */
-
-/* A lot of these functions should be called via macros defined in db.h */
-
-/* If you don't want to link this file with Windows OS files set the
- * define DB_NOWINDOWS. This will also stop linking with the Direct Draw
- * stuff, which is, after all, a part of Windows. If you want Windows
- * stuff, but NOT Direct Draw, define DB_NODIRECTDRAW.
- */
-
-/* ******************************************************************** *
- * *
- * I N T E R F A C E - both internal and external. *
- * *
- * ******************************************************************** */
-
-/* I N C L U D E S **************************************************** */
-
-/* Windows includes. Actually internal, but here to allow pre-compilation. */
-#include "advwin32.h"
-#ifndef DB_NOWINDOWS
- #include <windows.h>
- #include "advwin32.h"
-#endif
-#ifndef DB_NODIRECTDRAW
- #include <ddraw.h>
-#endif
-#include "db.h" /* Contains most off the interface. */
-
-/* G L O B A L S ****************************************************** */
-/* Have external linkage. */
-volatile BOOL DZ_NULL;
-
-/* This variable dictates whether macros ending _opt get executed. */
-int db_option = 0; /* Default is off. */
-
-/* ******************************************************************** *
- * *
- * I N T E R N A L *
- * *
- * ******************************************************************** */
-
-/* I N C L U D E S **************************************************** */
-
-/* Defining DB_NOWINDOWS implies DB_NODIRECTDRAW should also be defined. */
-#ifdef DB_NOWINDOWS
- #ifndef DB_NODIRECTDRAW
- #define DB_NODIRECTDRAW
- #endif
-#endif
-
-/* ANSI includes. */
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <conio.h>
-#include <direct.h> /* For getcwd() */
-#include <stdarg.h> /* For variable arguments. */
-
-/* C O N S T A N T S ************************************************** */
-
-/* Possible return value for MessageBox() */
-#define NO_MEMORY 0
-
-/* Possible value for the width field of a font_struct. */
-#define PROP_WIDTH 0
-
-/* Logfile name */
-#define LOGFILE_NAME "LOGFILE.TXT"
-
-/* Set this to 1 if the logfile name is an absolute path. Otherwise the
- * logfile will go in the directory that is current when db_log_init()
- * is called.
- */
-#define ABSOLUTE_PATH 0
-
-/* M A C R O S ******************************************************** */
-
-/* Causes a division by zero exception. */
-#define DB_FORCE_EXCEPTION() ( db_vol_zero = 1 / db_vol_zero )
-
-/* Cause a brakepoint. */
-#define DB_FORCE_BRAKEPOINT() do {__asm int 3} while(0)
-
-/* T Y P E S ********************************************************** */
-
-
-typedef struct font_struct *fontPtr;
-
-struct font_struct {
- void *dummy1;
- unsigned short dummy2, dummy3;
- void *dummy4;
- char filename[16];
- unsigned short width, height;
- unsigned short ascent, avgwidth;
- unsigned char byte_width;
- unsigned char filler1;
- short filler2;
- char facename[28];
- unsigned short *prop_width_dataP;
- unsigned char *bitmapP;
-};
-
-union PtrPackTag
-{
- unsigned char *cP;
- unsigned short *wP;
- unsigned long *lP;
-};
-
-/* G L O B A L ******************************************************** */
-/* Should all be static. */
-static BOOL db_use_brakepoints = FALSE;
-
-/* Name of file to output log messages to. */
-static char LogFileNameP[255];
-
-/* Have we initialized the log file? */
-static int InitialisedLog = 0;
-
-/* Type of display mode we are in. */
-static int db_display_type = DB_DOS;
-
-/* For DirectDraw mode. */
-static struct db_dd_mode_tag dd_mode = {NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0};
-static fontPtr FontP = NULL;
-
-/* Volatile zero. */
-static volatile int db_vol_zero = 0;
-
-/* Text strings for output. */
-static const char* db_assert_textA[ 3 ] =
-{
- "ASSERTION FAILED!",
- "Expression: %s",
- "File: %s Line: %d"
-};
-static const char* db_prompt_std =
- "Quit program/force e(x)ception? [y/n/x]";
-static const char* db_prompt_windows =
- "Quit program? [Yes/No]/force exception? [Cancel]";
-static const char* db_assert_log_begin_text =
- "DB: FAILED ASSERTION BEGINS";
-static const char* db_assert_log_end_text =
- "DB: FAILED ASSERTION ENDS";
-static const char* db_msg_log_begin_text =
- "DB: MSG BEGINS";
-static const char* db_msg_log_end_text =
- "DB: MSG ENDS";
-
-#ifdef DB_NOWINDOWS
-static char db_log_file_name[261] = LOGFILE_NAME;
-#else
-static char db_log_file_name[MAX_PATH+1] = LOGFILE_NAME;
-#endif
-
-
-/* P R O T O S ******************************************************** */
-/* Should all be static. */
-
-static void db_do_std_prompt(unsigned yOffset);
-
-#ifndef DB_NOWINDOWS
-static void db_do_win_prompt(const char* titleStrP, const char* bodyStrP);
-#endif /* ifndef DB_NOWINDOWS */
-
-#ifndef DB_NODIRECTDRAW
-
-/* Load debugging font, return NULL if we fail. */
-static fontPtr guiload_font(char *new_fname);
-
-/* Cleanup function for the above. */
-static fontPtr CleanupFontLoadFail(HANDLE fH, fontPtr fontP);
-
-/* Outputs debugging text. */
-static void out_text(LPDIRECTDRAWSURFACE surfP, int xc, int yc,
- const char *text, short x_limit, fontPtr fP);
-
-/* Debounce all the keys the Direct Draw stuff uses. */
-static void Debounce(void);
-
-/* Wait for any outstanding flip operations to be completed, provided
- * that the user specified DB_FLIP in the bltOrFlip field of the
- * db_dd_mode_tag function. If they specified DB_BLIT this function returns
- * immediately.
- */
-static void DbWaitForHw(void);
-
-/* Flips between the draw and visible surfaces. */
-static void DbFlip(void);
-
-/* Blits the contents of the draw surface to the visible surface. */
-static void DbBlt(void);
-
-#endif /* ifndef DB_NODIRECTDRAW */
-
-/* F U N C T I O N S ************************************************** */
-
-/* ******************************************************************** *
- * *
- * I N T E R F A C E - both internal and external. *
- * *
- * ******************************************************************** */
-
-/* NEW FNS for formatted debug strings. */
-void __cdecl db_logf_fired(const char *fmtStrP, ...)
-{
- char msg[ 1024 ];
- va_list varArgList;
-
- va_start( varArgList, fmtStrP );
- vsprintf( msg, fmtStrP, varArgList );
- va_end( varArgList );
-
- db_log_fired( msg );
-}
-
-void __cdecl db_printf_fired(int x, int y, const char *fmtStrP, ...)
-{
- char msg[ 256 ];
- va_list varArgList;
-
- va_start( varArgList, fmtStrP );
- vsprintf( msg, fmtStrP, varArgList );
- va_end( varArgList );
-
- db_print_fired( x, y, msg );
-}
-
-void __cdecl db_msgf_fired(const char *fmtStrP, ...)
-{
- char msg[ 256 ];
- va_list varArgList;
-
- va_start( varArgList, fmtStrP );
- vsprintf( msg, fmtStrP, varArgList );
- va_end( varArgList );
-
- db_msg_fired( (const char *) msg );
-}
-
-/* Called whenever an assertion fails. */
-void db_assert_fail(const char *exprP, const char *fileP, int line)
-{
- db_log_fired( db_assert_log_begin_text );
- db_log_fired( db_assert_textA[ 0 ] );
- db_logf_fired( db_assert_textA[ 1 ], exprP );
- db_logf_fired( db_assert_textA[ 2 ], fileP, line );
- db_log_fired( db_assert_log_end_text );
-
- switch(db_display_type)
- {
- case DB_DOS:
- printf( db_assert_textA[ 0 ] );
- printf("\n");
- printf( db_assert_textA[ 1 ], exprP );
- printf("\n");
- printf( db_assert_textA[ 2 ], fileP, line );
- printf("\n");
- db_do_std_prompt( 0 );
- break;
-#ifndef DB_NODIRECTDRAW
- case DB_DIRECTDRAW:
- {
- char msg[256];
- unsigned short xLimit = (unsigned short) dd_mode.width;
-
- /* Wait for any hardware to finish flipping. */
- DbWaitForHw();
-
- out_text((LPDIRECTDRAWSURFACE) dd_mode.drawSurfaceP,
- 0, 0, db_assert_textA[ 0 ], xLimit, FontP);
- wsprintf(msg, db_assert_textA[ 1 ], exprP);
- out_text((LPDIRECTDRAWSURFACE) dd_mode.drawSurfaceP,
- 0, 16, msg, xLimit, FontP);
- wsprintf(msg, db_assert_textA[ 2 ], fileP, line);
- out_text((LPDIRECTDRAWSURFACE) dd_mode.drawSurfaceP,
- 0, 32, msg, xLimit, FontP);
- db_do_std_prompt( 48 );
- }
- break;
-#endif
-#ifndef DB_NOWINDOWS
- case DB_WINDOWS:
- {
- char fmtMsg[ 256 ];
- char msg[256];
-
- strcpy( fmtMsg, db_assert_textA[ 1 ] );
- strcat( fmtMsg, db_assert_textA[ 2 ] );
- strcat( fmtMsg, db_prompt_windows );
- sprintf(msg, fmtMsg, exprP, fileP, line);
-
- db_do_win_prompt( db_assert_textA[ 0 ], msg );
- }
- break;
-#endif
- default:
- break;
- }
-}
-
-/* Displays a message and has the program pause until the user responds
- * to it.
- */
-void db_msg_fired(const char *strP)
-{
- db_log_fired( db_msg_log_begin_text );
- db_log_fired( strP );
- db_log_fired( db_msg_log_end_text );
-
- switch(db_display_type)
- {
- case DB_DOS:
- printf("%s\n", strP);
- db_do_std_prompt( 0 );
- break;
-#ifndef DB_NOWINDOWS
- case DB_WINDOWS:
- db_do_win_prompt( "Debugging Message", strP );
- break;
-#endif
-#ifndef DB_NODIRECTDRAW
- case DB_DIRECTDRAW:
- {
- unsigned short xLimit = (unsigned short) dd_mode.width;
-
- /* Wait for any flip hardware to be ready. */
- DbWaitForHw();
-
- out_text((LPDIRECTDRAWSURFACE) dd_mode.drawSurfaceP,
- 0, 0, strP, xLimit, FontP);
- db_do_std_prompt( 16 );
- }
- break;
-#endif
- default:
- break;
- }
-}
-
-/* Displays a message and continues program execution immediately. */
-void db_print_fired(int x, int y, const char *strP)
-{
- switch(db_display_type)
- {
- case DB_DOS:
- printf("%s\n", strP);
- break;
-#ifndef DB_NOWINDOWS
- case DB_WINDOWS:
- break;
-#endif
-#ifndef DB_NODIRECTDRAW
- case DB_DIRECTDRAW:
- {
- unsigned short xLimit = (unsigned short) (dd_mode.width - x);
- out_text((LPDIRECTDRAWSURFACE) dd_mode.drawSurfaceP, x, y,
- strP, xLimit, FontP);
- break;
- }
-#endif
- default:
- break;
- }
-}
-
-/* Writes a message to a log file. */
-/* At least files can be output in the same way under DOS, Windows and
- * Direct Draw!
- */
-void db_log_fired(const char *strP)
-{
- /* Have we intialised the file? */
- if(!InitialisedLog) db_log_init();
- {
- /* Open a file for appending, creating one if it doesn't yet exist. */
- FILE *fP = fopen(LogFileNameP, "a+");
-
- if(!fP) return;
-
- fprintf(fP, "%s\n", strP);
- fclose(fP);
- }
-}
-
-void db_log_init(void)
-{
- #if ABSOLUTE_PATH
- sprintf( LogFileNameP, "%s", db_log_file_name );
- #else
- /* Append the log file name to the current working directory. */
- sprintf( LogFileNameP, "%s\\%s", getcwd( LogFileNameP, 240 ),
- db_log_file_name );
- #endif
-
- /* Delete old log file. */
- remove(LogFileNameP);
-
- /* Flag that we have initialised the log file. */
- InitialisedLog = 1;
-}
-
-extern void db_set_log_file_ex(const char *strP)
-{
- InitialisedLog = 0;
-
- strcpy(db_log_file_name, strP);
-}
-
-void db_set_mode_ex(int mode, void *modeInfoP, void *newFontP)
-{
- db_display_type = mode;
-#ifndef DB_NODIRECTDRAW
- if(dd_mode.visibleSurfaceP)
- {
- IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE) dd_mode.visibleSurfaceP);
- dd_mode.visibleSurfaceP = NULL;
- }
-
- if(dd_mode.drawSurfaceP)
- {
- IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE) dd_mode.drawSurfaceP);
- dd_mode.drawSurfaceP = NULL;
- }
-
- if(mode == DB_DIRECTDRAW)
- {
- dd_mode = *((struct db_dd_mode_tag *) modeInfoP);
-
- if(dd_mode.visibleSurfaceP)
- {
- IDirectDrawSurface_AddRef((LPDIRECTDRAWSURFACE) dd_mode.visibleSurfaceP);
- }
-
- if(dd_mode.drawSurfaceP)
- {
- IDirectDrawSurface_AddRef((LPDIRECTDRAWSURFACE) dd_mode.drawSurfaceP);
- }
-
- if(!FontP)
- {
- if(!newFontP)
- FontP = guiload_font("DIALOG.FNT");
- else
- FontP = (fontPtr) newFontP;
- }
- if(!FontP)
- {
- db_log_fired("DB ERROR: Font load failed. Exiting...");
- exit(0);
- }
- }
-#endif
-}
-
-/* Called to set whether exceptions or brakepoints are called. */
-void DbUseBrakepoints(BOOL use_brakepoints)
-{
- db_use_brakepoints = use_brakepoints;
-}
-
-int db_get_mode(void** modeInfoPP, void **FontPP)
-{
- // blank return areas
- *FontPP = NULL;
- *modeInfoPP = NULL;
-
-#ifndef DB_NODIRECTDRAW
- if(db_display_type == DB_DIRECTDRAW)
- {
- // copy font data
- *FontPP = (void *) FontP;
-
- // copy surface data
- *modeInfoPP = (void *) &dd_mode;
- }
-#endif
- return db_display_type;
-}
-
-void db_uninit(void)
-{
- #ifndef DB_NODIRECTDRAW
- if(FontP)
- {
- if(FontP->bitmapP)
- {
- GlobalFree(FontP->bitmapP);
- }
- if(FontP->prop_width_dataP)
- {
- GlobalFree(FontP->prop_width_dataP);
- }
-
- GlobalFree(FontP);
- FontP = NULL;
- }
-
- if(dd_mode.visibleSurfaceP)
- {
- IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE) dd_mode.visibleSurfaceP);
- }
-
- if(dd_mode.drawSurfaceP)
- {
- IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE) dd_mode.drawSurfaceP);
- }
-
- #endif
-}
-
-/* ******************************************************************** *
- * *
- * I N T E R N A L *
- * *
- * ******************************************************************** */
-
-static void db_do_std_prompt(unsigned yOffset)
-{
- int ch = 0;
-
- switch(db_display_type)
- {
- case DB_DOS:
- printf( db_prompt_std );
- printf("\n");
- do
- {
- ch = toupper(getch());
- }
- while((ch != 'N') && (ch != 'Y') && (ch != 'X'));
- break;
-#ifndef DB_NODIRECTDRAW
- case DB_DIRECTDRAW:
- {
- SHORT response;
- BOOL done = FALSE;
- unsigned short xLimit = (unsigned short) dd_mode.width;
-
- out_text((LPDIRECTDRAWSURFACE) dd_mode.drawSurfaceP,
- 0, yOffset, db_prompt_std, xLimit, FontP);
-
- /* Show the message. */
- if(dd_mode.bltOrFlip == DB_FLIP)
- {
- DbFlip();
- }
- else
- {
- DbBlt();
- }
-
- /* Wait for a valid key press. */
- do
- {
- response = GetAsyncKeyState('Y');
- if(response & 0x8000)
- {
- ch = 'Y';
- done = TRUE;
- }
- response = GetAsyncKeyState('N');
- if(response & 0x8000)
- {
- ch = 'N';
- done = TRUE;
- }
- response = GetAsyncKeyState('X');
- if(response & 0x8000)
- {
- ch = 'X';
- done = TRUE;
- }
- }
- while(!done);
-
- Debounce();
-
- /* Return the flip surfaces to their pre-message state. */
- if(dd_mode.bltOrFlip == DB_FLIP)
- {
- DbFlip();
- }
- break;
- }
-#endif /* ifndef DB_NODIRECTDRAW */
- }/* switch(db_display_type) */
-
- if(ch == 'Y')
- {
- exit(-10);
- }
- else if(ch == 'X')
- {
- if(db_use_brakepoints)
- {
- DB_FORCE_BRAKEPOINT();
- }
- else
- {
- DB_FORCE_EXCEPTION();
- }
- }
-
-}/* db_do_std_prompt() */
-
-#ifndef DB_NOWINDOWS
-static void db_do_win_prompt(const char* titleStrP, const char* bodyStrP)
-{
- int response;
-
- response = MessageBox
- (
- NULL, /* Dialog has no KNOWN parent window. */
- bodyStrP, /* Message to go in box. */
- titleStrP, /* Box title. */
- MB_YESNOCANCEL| /* Put up a 'Yes' and a 'No' button. */
- MB_SETFOREGROUND| /* Shove message box to front of display. */
- MB_ICONEXCLAMATION| /* Use an exclamation mark to decorate box. */
- MB_TASKMODAL /* Suspend current task until box is closed. */
- );
-
- if((response == IDYES) || (response == NO_MEMORY))
- {
- exit( -10 );
- }
- else if(response == IDCANCEL)
- {
- if(db_use_brakepoints)
- {
- DB_FORCE_BRAKEPOINT();
- }
- else
- {
- DB_FORCE_EXCEPTION();
- }
- }
-}/* db_do_win_prompt() */
-#endif /* ifndef DB_NOWINDOWS */
-
-#ifndef DB_NODIRECTDRAW
-
-static fontPtr guiload_font(char *new_fname)
-{
- HANDLE *fH;
- BOOL status;
- unsigned short c, byte, y;
- union PtrPackTag dest;
- unsigned char inByte;
- fontPtr fntSP;
- DWORD bytesRead;
-
- /* Open file for reading */
- fH = CreateFile(new_fname, GENERIC_READ, 0, NULL, OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL);
- if(!fH)
- {
- db_log_fired("DB ERROR: Couldn't open font file.");
- return CleanupFontLoadFail(NULL, NULL);
- }
-
-
- /* Allocate memory for our font structure */
- fntSP = (fontPtr)
- GlobalAlloc(GMEM_FIXED, sizeof(struct font_struct));
- if(!fntSP)
- {
- db_log_fired("DB ERROR: Not enough memory for font structure.");
- return CleanupFontLoadFail(fH, NULL);
- }
-
- /* Nullify pointers inside the font structure. */
- fntSP->bitmapP = NULL;
- fntSP->prop_width_dataP = NULL;
-
- /* Load up font structure */
- status = ReadFile(fH, fntSP, sizeof(struct font_struct), &bytesRead,
- NULL);
- if((!status) || (bytesRead != sizeof(struct font_struct)))
- {
- db_log_fired("DB ERROR: Error reading structure from font file.");
- return CleanupFontLoadFail(fH, fntSP);
- }
-
- /* Allocate memory for font bitmap */
- fntSP->bitmapP = (unsigned char *) GlobalAlloc(GMEM_FIXED,
- fntSP->byte_width * dd_mode.bitsPerPixel * fntSP->height * 128);
- if(!fntSP->bitmapP)
- {
- db_log_fired("DB ERROR: Not enough memory for font bitmap.");
- return CleanupFontLoadFail(fH, fntSP);
- }
-
- /* Work out proportional text widths for this font
- * (if the font is proportional).
- */
- if(fntSP->width == PROP_WIDTH)
- {
- /* Allocate memory for proportional width data */
- fntSP->prop_width_dataP = (unsigned short *)
- GlobalAlloc(GMEM_FIXED, 256);
- if(!fntSP->prop_width_dataP)
- {
- db_log_fired("DB ERROR: Not enough memory for proportional "
- "font data");
- return CleanupFontLoadFail(fH, fntSP);
- }
-
- /* Read proportional width data */
- status = ReadFile(fH, fntSP->prop_width_dataP, 256, &bytesRead,
- NULL);
- if((!status) || (bytesRead != 256))
- {
- db_log_fired("DB ERROR: Error reading proportional font data "
- "from file.");
- return CleanupFontLoadFail(fH, fntSP);
- }
-
- /* Round width of font to nearest long word. */
- {
- int i;
- unsigned short *propP = fntSP->prop_width_dataP;
-
- if(dd_mode.bitsPerPixel == 8)
- {
- for(i = 0; i < 128; i ++)
- {
- /* Round up to 4 pixels. */
- *propP = (unsigned short) ((*propP + 3U) & (~3U));
- }
- propP++;
- }
- else
- {
- for(i = 0; i < 128; i ++)
- {
- /* Round up to 2 pixels. */
- *propP = (unsigned short) ((*propP + 1U) & (~1U));
- }
- propP++;
- }
- }
- }
- else
- {
- /* Round width to nearest long word. */
- if(dd_mode.bitsPerPixel == 8)
- {
- /* Round up to 4 pixels. */
- fntSP->width = (unsigned char) ((fntSP->width + 2) & (~3));
- }
- else
- {
- /* Round up to 2 pixels. */
- fntSP->width = (unsigned char) ((fntSP->width + 1) & (~1));
- }
- }
-
- /* Load up bitmap data */
- dest.cP = fntSP->bitmapP;
- for(c = 0; c < 128; c ++)
- {
- for(y = 0; y < fntSP->height; y ++)
- {
- for(byte = 0; byte < fntSP->byte_width; byte ++)
- {
- unsigned char bitMask = 0x80;
-
- /* Read a byte of data */
- status = ReadFile(fH, &inByte, 1, &bytesRead, NULL);
- if((!status) || (bytesRead != 1))
- {
- db_log_fired("DB ERROR: Error reading font bitmap from "
- "file.");
- return CleanupFontLoadFail(fH, fntSP);
- }
-
- /* Translate 1 bit per pixel data into current Direct Draw
- * screen mode bit depth.
- */
- if(dd_mode.bitsPerPixel == 8)
- {
- do
- {
- if(inByte & bitMask) *(dest.cP) =
- (unsigned char) dd_mode.foreCol;
- else *(dest.cP) = (unsigned char) dd_mode.backCol;
- dest.cP++;
-
- /* Shift bitMask 1 bit to the right */
- bitMask >>= 1;
- }
- while(bitMask);
- }
- else
- {
- do
- {
- if(inByte & bitMask) *(dest.wP) = dd_mode.foreCol;
- else *(dest.wP) = dd_mode.backCol;
- dest.wP++;
-
- /* Shift bitMask 1 bit to the right */
- bitMask >>= 1;
- }
- while(bitMask);
- }
- }
- }
- }
-
- /* Close the font file */
- CloseHandle(fH);
-
- return fntSP;
-}
-
-static fontPtr CleanupFontLoadFail(HANDLE fH, fontPtr fontP)
-{
- /* Close file if necessary */
- if(fH) CloseHandle(fH);
-
- /* Is the font struct allocated? */
- if(fontP)
- {
- /* Yes. Is the bitmap allocated? If so, free it. */
- if(fontP->bitmapP) GlobalFree(fontP->bitmapP);
-
- /* Is the proportional width data allocated. If so, free it. */
- if(fontP->prop_width_dataP) GlobalFree(fontP->prop_width_dataP);
-
- /* Free the font structure. */
- GlobalFree(fontP);
- }
-
- return NULL;
-}
-
-static void out_text(LPDIRECTDRAWSURFACE surfP, int xc, int yc,
- const char *text, short x_limit, fontPtr fP)
-{
- register unsigned long *srcP, *destP;
- register unsigned int x, y;
- unsigned long heightTimesPitch, charOffset;
- unsigned int prop_width;
- int srcIncr, longsPerLine;
- unsigned int bitShift;
- DDSURFACEDESC surfaceDesc;
-
- /* Lock the surface. */
- {
- HRESULT res;
-
- surfaceDesc.dwSize = sizeof surfaceDesc;
- res = IDirectDrawSurface_Lock(surfP, NULL, &surfaceDesc,
- DDLOCK_WAIT, NULL);
- if(res != DD_OK)
- {
- db_log3("Couldn't lock surface.");
- return;
- }
- }
-
- /* Round xc to nearest long word. */
- if(dd_mode.bitsPerPixel == 8)
- {
- xc = (xc + 2) & (~3);
- bitShift = 2;
- }
- else
- {
- xc = (xc + 1) & (~1);
- bitShift = 1;
- }
-
- /* Point to DRAM buffer co-ordinate where the top left of the
- * first character should be written.
- */
- destP = (unsigned long *) surfaceDesc.lpSurface +
- ((yc * surfaceDesc.lPitch) >> 2) + (xc >> bitShift);
- heightTimesPitch = (fP->height * surfaceDesc.lPitch) >> 2;
- longsPerLine = (fP->byte_width * dd_mode.bitsPerPixel) >> 2;
- charOffset = longsPerLine * fP->height;
-
- /* Write our text string */
- while(*text != '\0')
- {
- /* Blit a single character */
- /* Point srcP to first byte of the bitmap for the current
- * character.
- */
- srcP = ((unsigned long *) fP->bitmapP) + (*text) * charOffset;
-
- /* Get width of this character (in pixels). */
- if(fP->width == PROP_WIDTH)
- prop_width = *(fP->prop_width_dataP + (*text));
- else prop_width = fP->width;
-
- /* Check we will not exceed our original x_limit if we blit
- * this character. If we will, we should stop writing.
- */
- x_limit = (short) (x_limit - prop_width);
- if(x_limit < 0) break;
-
- /* Convert prop_width from pixels to longs. */
- prop_width >>= bitShift;
-
- srcIncr = longsPerLine - prop_width;
-
- y = fP->height;
- do
- {
- x = prop_width;
- do
- {
- /* Move 1 long word. */
- *destP++ = *srcP++;
- }
- while(--x != 0);
-
- /* Point to start of next horizontal line of character square
- * in DRAM buffer.
- */
- destP += (surfaceDesc.lPitch >> 2) - prop_width;
- srcP += srcIncr;
- }
- while(--y != 0);
-
- /* Point to start of next character position in DRAM buffer */
- destP -= heightTimesPitch - prop_width;
-
- /* Advance one character in text string */
- text++;
- }
-
- /* Unlock surface. */
- {
- HRESULT res;
-
- res = IDirectDrawSurface_Unlock(surfP,
- (LPVOID) surfaceDesc.lpSurface);
- if(res != DD_OK) db_log_fired("Couldn't unlock surface.");
- }
- return;
-}
-
-static void Debounce(void)
-{
- BOOL bouncing;
-
- /* Debounce all the keys we use - that is Y, N, and RETURN. */
- do
- {
- bouncing = FALSE;
- if(GetAsyncKeyState('Y') & 0x8000) bouncing = TRUE;
- if(GetAsyncKeyState('N') & 0x8000) bouncing = TRUE;
- if(GetAsyncKeyState('X') & 0x8000) bouncing = TRUE;
- if(GetAsyncKeyState(VK_RETURN) & 0x8000) bouncing = TRUE;
- }
- while(bouncing);
-}
-
-static void DbWaitForHw(void)
-{
- /* Wait until the last flip is finished and the last blt done */
- BOOL finished;
-
- /* Stay in this loop until the hardware is free. */
- do
- {
- finished = TRUE;
-
- /* Make sure all flips are done. */
- if(dd_mode.bltOrFlip == DB_FLIP)
- {
- if(IDirectDrawSurface_GetFlipStatus(
- (LPDIRECTDRAWSURFACE) dd_mode.visibleSurfaceP,
- DDGFS_ISFLIPDONE) != DD_OK)
- finished = FALSE;
- }
- }
- while(!finished);
-}
-
-static void DbFlip(void)
-{
- LPDIRECTDRAWSURFACE fromSurfP =
- (LPDIRECTDRAWSURFACE) dd_mode.drawSurfaceP;
- LPDIRECTDRAWSURFACE toSurfP =
- (LPDIRECTDRAWSURFACE) dd_mode.visibleSurfaceP;
- HRESULT res;
-
- /* Try to flip the screen. */
- res = IDirectDrawSurface_Flip(toSurfP, fromSurfP, DDFLIP_WAIT);
-
- if(res != DD_OK)
- db_log_fired("Internal debug flip failed - message lost!");
-}
-
-static void DbBlt(void)
-{
- LPDIRECTDRAWSURFACE fromSurfP =
- (LPDIRECTDRAWSURFACE) dd_mode.drawSurfaceP;
- LPDIRECTDRAWSURFACE toSurfP =
- (LPDIRECTDRAWSURFACE) dd_mode.visibleSurfaceP;
- HRESULT res;
- RECT toRect;
-
- /* Initialise to Rect. */
- toRect.left = dd_mode.bltXOffset;
- toRect.top = dd_mode.bltYOffset;
- toRect.right = toRect.left + dd_mode.width;
- toRect.bottom = toRect.top + dd_mode.height;
-
- /* Try to blit from the draw to the visible surface. */
- res = IDirectDrawSurface_Blt(toSurfP, &toRect, fromSurfP, NULL,
- DDBLT_WAIT, NULL);
-
- if(res != DD_OK)
- db_log_fired("Internal debug blit failed - message lost.");
-}
-
-#endif
-
-#else
- ;
-#endif /* ! NDEBUG */