*** empty log message ***
This commit is contained in:
975
sys/msdos/video.c
Normal file
975
sys/msdos/video.c
Normal file
@@ -0,0 +1,975 @@
|
||||
/* SCCS Id: @(#)video.c 3.3 2001/04/07 */
|
||||
/* Copyright (c) NetHack PC Development Team 1993, 1994, 2001 */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
/* */
|
||||
/*
|
||||
* video.c - Hardware video support front-ends
|
||||
*
|
||||
*Edit History:
|
||||
* Initial Creation M. Allison 1993/04/04
|
||||
* Add djgpp support K. Smolkowski 1993/04/26
|
||||
* Add txt/graphics mode support M. Allison 1993/10/30
|
||||
* Add graphics mode cursor sim. M. Allison 1994/02/19
|
||||
* Add hooks for decals on vga M. Allison 2001/04/07
|
||||
*/
|
||||
|
||||
#include "hack.h"
|
||||
|
||||
#ifndef STUBVIDEO
|
||||
#include "pcvideo.h"
|
||||
#include "pctiles.h"
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# if _MSC_VER >= 700
|
||||
#pragma warning(disable:4018) /* signed/unsigned mismatch */
|
||||
#pragma warning(disable:4127) /* conditional expression is constant */
|
||||
#pragma warning(disable:4131) /* old style declarator */
|
||||
#pragma warning(disable:4305) /* prevents complaints with MK_FP */
|
||||
#pragma warning(disable:4309) /* initializing */
|
||||
#pragma warning(disable:4759) /* prevents complaints with MK_FP */
|
||||
# endif
|
||||
#endif
|
||||
/*=========================================================================
|
||||
* General PC Video routines.
|
||||
*
|
||||
* The following routines are the video interfacing functions.
|
||||
* In general these make calls to more hardware specific
|
||||
* routines in other source files.
|
||||
*
|
||||
* Assumptions (94/04/23):
|
||||
*
|
||||
* - Supported defaults.nh file video options:
|
||||
*
|
||||
* If OPTIONS=video:autodetect is defined in defaults.nh then
|
||||
* check for a VGA video adapter. If one is detected, then
|
||||
* use the VGA code, otherwise resort to using the 'standard'
|
||||
* video BIOS routines.
|
||||
*
|
||||
* If OPTIONS=video:vga is defined in defaults.nh, then use
|
||||
* the VGA code.
|
||||
*
|
||||
* If OPTIONS=video:default is defined in defaults.nh use the
|
||||
* 'standard' video BIOS routines (in the overlaid version),
|
||||
* or DJGPPFAST routines (under djgpp). This is equivalent to
|
||||
* having no OPTIONS=video:xxxx entry at all.
|
||||
*
|
||||
* Notes (94/04/23):
|
||||
*
|
||||
* - The handler for defaults.nh file entry:
|
||||
*
|
||||
* OPTIONS=video:xxxxx
|
||||
*
|
||||
* has now been added. The handler is in video.c and is called
|
||||
* from options.c.
|
||||
*
|
||||
* - Handling of videocolors and videoshades are now done with
|
||||
* OPTIONS= statements. The new syntax separates the colour
|
||||
* values with dashes ('-') rather than spaces (' ').
|
||||
*
|
||||
* To Do (94/04/23):
|
||||
*
|
||||
*
|
||||
*=========================================================================
|
||||
*/
|
||||
|
||||
|
||||
#ifdef OVLB
|
||||
void
|
||||
get_scr_size()
|
||||
{
|
||||
# ifdef SCREEN_VGA
|
||||
if (iflags.usevga) {
|
||||
vga_get_scr_size();
|
||||
} else
|
||||
# endif
|
||||
txt_get_scr_size();
|
||||
}
|
||||
#endif /*OVLB*/
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------
|
||||
* The rest of this file is only compiled if NO_TERMS is defined.
|
||||
* --------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#ifdef NO_TERMS
|
||||
|
||||
#include <ctype.h>
|
||||
#include "wintty.h"
|
||||
|
||||
# ifdef __GO32__
|
||||
#include <pc.h>
|
||||
#include <unistd.h>
|
||||
#if !(__DJGPP__ >= 2)
|
||||
typedef long clock_t;
|
||||
#endif
|
||||
# endif
|
||||
|
||||
# ifdef __BORLANDC__
|
||||
#include <dos.h> /* needed for delay() */
|
||||
# endif
|
||||
|
||||
# ifdef SCREEN_DJGPPFAST /* parts of this block may be unecessary now */
|
||||
#define get_cursor(x,y) ScreenGetCursor(y,x)
|
||||
# endif
|
||||
|
||||
# ifdef SCREEN_BIOS
|
||||
void FDECL(get_cursor, (int *, int *));
|
||||
# endif
|
||||
|
||||
void FDECL(adjust_cursor_flags, (struct WinDesc *));
|
||||
void FDECL(cmov, (int, int));
|
||||
void FDECL(nocmov, (int, int));
|
||||
STATIC_DCL void NDECL(init_ttycolor);
|
||||
|
||||
# ifdef OVLB
|
||||
int savevmode; /* store the original video mode in here */
|
||||
int curcol,currow; /* graphics mode current cursor locations */
|
||||
int g_attribute; /* Current attribute to use */
|
||||
int monoflag; /* 0 = not monochrome, else monochrome */
|
||||
int attrib_text_normal; /* text mode normal attribute */
|
||||
int attrib_gr_normal; /* graphics mode normal attribute */
|
||||
int attrib_text_intense; /* text mode intense attribute */
|
||||
int attrib_gr_intense; /* graphics mode intense attribute */
|
||||
boolean traditional = FALSE; /* traditonal TTY character mode */
|
||||
boolean inmap = FALSE; /* in the map window */
|
||||
# ifdef TEXTCOLOR
|
||||
char ttycolors[CLR_MAX]; /* also used/set in options.c */
|
||||
# endif /* TEXTCOLOR */
|
||||
# else
|
||||
extern int savevmode;
|
||||
extern int curcol,currow;
|
||||
extern int g_attribute;
|
||||
extern int monoflag;
|
||||
extern int attrib_text_normal;
|
||||
extern int attrib_gr_normal;
|
||||
extern int attrib_text_intense;
|
||||
extern int attrib_gr_intense;
|
||||
extern boolean traditonal;
|
||||
extern boolean inmap;
|
||||
# ifdef TEXTCOLOR
|
||||
extern char ttycolors[CLR_MAX]; /* also used/set in options.c */
|
||||
# endif /* TEXTCOLOR */
|
||||
# endif /* OVLB */
|
||||
|
||||
# ifdef OVLB
|
||||
void
|
||||
backsp()
|
||||
{
|
||||
if (!iflags.grmode) {
|
||||
txt_backsp();
|
||||
# ifdef SCREEN_VGA
|
||||
} else if (iflags.usevga) {
|
||||
vga_backsp();
|
||||
# endif
|
||||
}
|
||||
}
|
||||
# endif /* OVLB */
|
||||
|
||||
# ifdef OVL0
|
||||
void
|
||||
clear_screen()
|
||||
{
|
||||
if (!iflags.grmode) {
|
||||
txt_clear_screen();
|
||||
# ifdef SCREEN_VGA
|
||||
} else if (iflags.usevga) {
|
||||
vga_clear_screen(BACKGROUND_VGA_COLOR);
|
||||
# endif
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
cl_end() /* clear to end of line */
|
||||
{
|
||||
int col,row;
|
||||
|
||||
col = (int)ttyDisplay->curx;
|
||||
row = (int)ttyDisplay->cury;
|
||||
if (!iflags.grmode) {
|
||||
txt_cl_end(col,row);
|
||||
# ifdef SCREEN_VGA
|
||||
} else if (iflags.usevga) {
|
||||
vga_cl_end(col,row);
|
||||
# endif
|
||||
}
|
||||
tty_curs(BASE_WINDOW, (int)ttyDisplay->curx+1,
|
||||
(int)ttyDisplay->cury);
|
||||
}
|
||||
|
||||
void
|
||||
cl_eos() /* clear to end of screen */
|
||||
{
|
||||
int cy = (int)ttyDisplay->cury+1;
|
||||
|
||||
if (!iflags.grmode) {
|
||||
txt_cl_eos();
|
||||
# ifdef SCREEN_VGA
|
||||
} else if (iflags.usevga) {
|
||||
vga_cl_eos(cy);
|
||||
# endif
|
||||
}
|
||||
tty_curs(BASE_WINDOW, (int)ttyDisplay->curx+1,
|
||||
(int)ttyDisplay->cury);
|
||||
}
|
||||
|
||||
void
|
||||
cmov(col, row)
|
||||
register int col, row;
|
||||
{
|
||||
ttyDisplay->cury = (uchar)row;
|
||||
ttyDisplay->curx = (uchar)col;
|
||||
if (!iflags.grmode) {
|
||||
txt_gotoxy(col,row);
|
||||
# ifdef SCREEN_VGA
|
||||
} else if (iflags.usevga) {
|
||||
vga_gotoloc(col,row);
|
||||
# endif
|
||||
}
|
||||
}
|
||||
# endif /* OVL0 */
|
||||
|
||||
# ifdef OVLB
|
||||
int
|
||||
has_color(int color)
|
||||
{
|
||||
++color; /* prevents compiler warning (unref. param) */
|
||||
# ifdef TEXTCOLOR
|
||||
return (monoflag) ? 0 : 1;
|
||||
# else
|
||||
return 0;
|
||||
# endif
|
||||
}
|
||||
# endif /* OVLB */
|
||||
|
||||
# ifdef OVL0
|
||||
void
|
||||
home()
|
||||
{
|
||||
tty_curs(BASE_WINDOW, 1, 0);
|
||||
ttyDisplay->curx = ttyDisplay->cury = (uchar)0;
|
||||
if (!iflags.grmode) {
|
||||
txt_gotoxy(0,0);
|
||||
# ifdef SCREEN_VGA
|
||||
} else if (iflags.usevga) {
|
||||
vga_gotoloc(0,0);
|
||||
# endif
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nocmov(col, row)
|
||||
int col,row;
|
||||
{
|
||||
if (!iflags.grmode) {
|
||||
txt_gotoxy(col,row);
|
||||
# ifdef SCREEN_VGA
|
||||
} else if (iflags.usevga) {
|
||||
vga_gotoloc(col,row);
|
||||
# endif
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
standoutbeg()
|
||||
{
|
||||
g_attribute = iflags.grmode ? attrib_gr_intense
|
||||
: attrib_text_intense;
|
||||
}
|
||||
|
||||
void
|
||||
standoutend()
|
||||
{
|
||||
g_attribute = iflags.grmode ? attrib_gr_normal
|
||||
: attrib_text_normal;
|
||||
}
|
||||
# endif /* OVL0 */
|
||||
|
||||
|
||||
# ifdef OVLB
|
||||
void
|
||||
term_end_attr(int attr)
|
||||
{
|
||||
switch(attr) {
|
||||
case ATR_ULINE:
|
||||
case ATR_BOLD:
|
||||
case ATR_BLINK:
|
||||
case ATR_INVERSE:
|
||||
default:
|
||||
g_attribute = iflags.grmode ? attrib_gr_normal
|
||||
: attrib_text_normal;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
term_end_color(void)
|
||||
{
|
||||
g_attribute = iflags.grmode ? attrib_gr_normal
|
||||
: attrib_text_normal;
|
||||
}
|
||||
|
||||
void
|
||||
term_end_raw_bold(void)
|
||||
{
|
||||
standoutend();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
term_start_attr(int attr)
|
||||
{
|
||||
switch(attr){
|
||||
|
||||
case ATR_ULINE:
|
||||
if (monoflag) {
|
||||
g_attribute = ATTRIB_MONO_UNDERLINE;
|
||||
} else {
|
||||
g_attribute = iflags.grmode ? attrib_gr_intense
|
||||
: attrib_text_intense;
|
||||
}
|
||||
break;
|
||||
case ATR_BOLD:
|
||||
g_attribute = iflags.grmode ? attrib_gr_intense
|
||||
: attrib_text_intense;
|
||||
break;
|
||||
case ATR_BLINK:
|
||||
if (monoflag) {
|
||||
g_attribute = ATTRIB_MONO_BLINK;
|
||||
} else {
|
||||
g_attribute = iflags.grmode ? attrib_gr_intense
|
||||
: attrib_text_intense;
|
||||
}
|
||||
break;
|
||||
case ATR_INVERSE:
|
||||
if (monoflag) {
|
||||
g_attribute = ATTRIB_MONO_REVERSE;
|
||||
} else {
|
||||
g_attribute = iflags.grmode ? attrib_gr_intense
|
||||
: attrib_text_intense;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_attribute = iflags.grmode ? attrib_gr_normal
|
||||
: attrib_text_normal;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
term_start_color(int color)
|
||||
{
|
||||
# ifdef TEXTCOLOR
|
||||
if (monoflag) {
|
||||
g_attribute = attrib_text_normal;
|
||||
} else {
|
||||
if (color >= 0 && color < CLR_MAX) {
|
||||
if (iflags.grmode)
|
||||
g_attribute = color;
|
||||
else
|
||||
g_attribute = ttycolors[color];
|
||||
}
|
||||
}
|
||||
# endif
|
||||
}
|
||||
|
||||
void
|
||||
term_start_raw_bold(void)
|
||||
{
|
||||
standoutbeg();
|
||||
}
|
||||
# endif /* OVLB */
|
||||
|
||||
# ifdef OVL0
|
||||
void
|
||||
tty_delay_output()
|
||||
{
|
||||
#ifdef TIMED_DELAY
|
||||
if (flags.nap) {
|
||||
(void) fflush(stdout);
|
||||
msleep(50); /* sleep for 50 milliseconds */
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
# endif /* OVL0 */
|
||||
|
||||
# ifdef OVLB
|
||||
void
|
||||
tty_end_screen()
|
||||
{
|
||||
|
||||
if (!iflags.grmode) {
|
||||
txt_clear_screen();
|
||||
# ifdef PC9800
|
||||
fputs("\033[>1l", stdout);
|
||||
# endif
|
||||
# ifdef SCREEN_VGA
|
||||
} else if (iflags.usevga) {
|
||||
vga_tty_end_screen();
|
||||
# endif
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
tty_nhbell()
|
||||
{
|
||||
txt_nhbell();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
tty_number_pad(state)
|
||||
int state;
|
||||
{
|
||||
++state; /* prevents compiler warning (unref. param) */
|
||||
}
|
||||
|
||||
void
|
||||
tty_startup(wid, hgt)
|
||||
int *wid, *hgt;
|
||||
{
|
||||
|
||||
/* code to sense display adapter is required here - MJA */
|
||||
|
||||
attrib_text_normal = ATTRIB_NORMAL;
|
||||
attrib_text_intense = ATTRIB_INTENSE;
|
||||
|
||||
/* These are defaults and may get overridden */
|
||||
attrib_gr_normal = attrib_text_normal;
|
||||
attrib_gr_intense = attrib_text_intense;
|
||||
g_attribute = attrib_text_normal; /* Give it a starting value */
|
||||
|
||||
# ifdef SCREEN_VGA
|
||||
if (iflags.usevga) {
|
||||
vga_tty_startup(wid, hgt);
|
||||
} else
|
||||
# endif
|
||||
txt_startup(wid, hgt);
|
||||
|
||||
*wid = CO;
|
||||
*hgt = LI;
|
||||
|
||||
# ifdef CLIPPING
|
||||
if (CO < COLNO || LI < ROWNO+3) setclipped();
|
||||
# endif
|
||||
|
||||
# ifdef TEXTCOLOR
|
||||
init_ttycolor();
|
||||
# endif
|
||||
|
||||
# ifdef MONO_CHECK
|
||||
monoflag = txt_monoadapt_check();
|
||||
# else
|
||||
monoflag = 0;
|
||||
# endif
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
tty_start_screen()
|
||||
{
|
||||
# ifdef PC9800
|
||||
fputs("\033[>1h", stdout);
|
||||
# endif
|
||||
if (iflags.num_pad) tty_number_pad(1); /* make keypad send digits */
|
||||
}
|
||||
|
||||
void
|
||||
gr_init(){
|
||||
if (iflags.usevga) {
|
||||
# ifdef SCREEN_VGA
|
||||
vga_Init();
|
||||
# endif
|
||||
# ifdef SCREEN_VESA
|
||||
} else if (iflags.usevesa) {
|
||||
vesa_Init();
|
||||
|
||||
# endif
|
||||
# ifdef SCREEN_8514
|
||||
} else if (iflags.use8514) {
|
||||
v8514_Init();
|
||||
# endif
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gr_finish()
|
||||
{
|
||||
if (iflags.grmode) {
|
||||
if (iflags.usevga) {
|
||||
# ifdef SCREEN_VGA
|
||||
vga_Finish();
|
||||
# endif
|
||||
# ifdef SCREEN_VESA
|
||||
} else if (iflags.usevesa) {
|
||||
vesa_Finish();
|
||||
# endif
|
||||
# ifdef SCREEN_8514
|
||||
} else if (iflags.use8514) {
|
||||
v8514_Finish();
|
||||
# endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# endif /* OVLB */
|
||||
|
||||
/*
|
||||
* Screen output routines (these are heavily used).
|
||||
*
|
||||
* These are the 3 routines used to place information on the screen
|
||||
* in the NO_TERMS PC tty port of NetHack. These are the routines
|
||||
* that get called by routines in other NetHack source files (such
|
||||
* as those in win/tty).
|
||||
*
|
||||
* xputs - Writes a c null terminated string at the current location.
|
||||
* Depending on compile options, this could just be a series
|
||||
* of repeated calls to xputc() for each character.
|
||||
*
|
||||
* xputc - Writes a single character at the current location. Since
|
||||
* various places in the code assume that control characters
|
||||
* can be used to control, we are forced to interpret some of
|
||||
* the more common ones, in order to keep things looking correct.
|
||||
*
|
||||
* xputg - If using a graphics mode display mechanism (such as VGA, this
|
||||
* routine is used to display a graphical representation of a
|
||||
* NetHack glyph at the current location. For more information on
|
||||
* NetHack glyphs refer to the comments in include/display.h.
|
||||
*
|
||||
* NOTES:
|
||||
* wintty.h uses macros to redefine common output functions
|
||||
* such as puts, putc, putchar, so that they get steered into
|
||||
* either xputs (for strings) or xputc (for single characters).
|
||||
* References to puts, putc, and putchar in other source files
|
||||
* (that include wintty.h) are actually using these routines.
|
||||
*/
|
||||
|
||||
# ifdef OVL0
|
||||
void
|
||||
xputs(s)
|
||||
const char *s;
|
||||
{
|
||||
int col,row;
|
||||
|
||||
col = (int)ttyDisplay->curx;
|
||||
row = (int)ttyDisplay->cury;
|
||||
|
||||
if (!iflags.grmode) {
|
||||
txt_xputs(s,col,row);
|
||||
# ifdef SCREEN_VGA
|
||||
} else if (iflags.usevga) {
|
||||
vga_xputs(s,col,row);
|
||||
# endif
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
xputc(ch) /* write out character (and attribute) */
|
||||
char ch;
|
||||
{
|
||||
int i;
|
||||
char attribute;
|
||||
|
||||
i = iflags.grmode ? attrib_gr_normal
|
||||
: attrib_text_normal;
|
||||
|
||||
attribute = (char)((g_attribute == 0) ? i : g_attribute);
|
||||
if (!iflags.grmode) {
|
||||
txt_xputc(ch,attribute);
|
||||
# ifdef SCREEN_VGA
|
||||
} else if (iflags.usevga) {
|
||||
vga_xputc(ch,attribute);
|
||||
# endif /*SCREEN_VGA*/
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
xputg(glyphnum,ch,special) /* write out a glyph picture at current location */
|
||||
int glyphnum;
|
||||
int ch;
|
||||
unsigned special;
|
||||
{
|
||||
if (!iflags.grmode || !iflags.tile_view) {
|
||||
xputc((char)ch);
|
||||
# ifdef SCREEN_VGA
|
||||
} else {
|
||||
vga_xputg(glyphnum, ch, special);
|
||||
# endif
|
||||
}
|
||||
}
|
||||
|
||||
# ifdef POSITIONBAR
|
||||
void
|
||||
video_update_positionbar(posbar)
|
||||
char *posbar;
|
||||
{
|
||||
if (!iflags.grmode)
|
||||
return;
|
||||
# ifdef SCREEN_VGA
|
||||
else
|
||||
vga_update_positionbar(posbar);
|
||||
# endif
|
||||
}
|
||||
# endif
|
||||
|
||||
void
|
||||
adjust_cursor_flags(cw)
|
||||
struct WinDesc *cw;
|
||||
{
|
||||
# ifdef SIMULATE_CURSOR
|
||||
# if 0
|
||||
if (cw->type == NHW_MAP) cursor_flag = 1;
|
||||
else cursor_flag = 0;
|
||||
# else
|
||||
if (cw->type == NHW_MAP) {
|
||||
inmap = 1;
|
||||
cursor_flag = 1;
|
||||
} else {
|
||||
inmap = 0;
|
||||
cursor_flag = 1;
|
||||
}
|
||||
# endif /* 0 */
|
||||
# endif /* SIMULATE_CURSOR */
|
||||
}
|
||||
|
||||
# ifdef SIMULATE_CURSOR
|
||||
|
||||
/* change the defaults in pcvideo.h, not here */
|
||||
int cursor_type = CURSOR_DEFAULT_STYLE;
|
||||
int cursor_color = CURSOR_DEFAULT_COLOR;
|
||||
int cursor_flag;
|
||||
|
||||
/* The check for iflags.grmode is made BEFORE calling these. */
|
||||
void
|
||||
DrawCursor()
|
||||
{
|
||||
# ifdef SCREEN_VGA
|
||||
vga_DrawCursor();
|
||||
# endif
|
||||
}
|
||||
|
||||
void
|
||||
HideCursor()
|
||||
{
|
||||
# ifdef SCREEN_VGA
|
||||
vga_HideCursor();
|
||||
# endif
|
||||
}
|
||||
|
||||
# endif /* SIMULATE_CURSOR */
|
||||
# endif /* OVL0 */
|
||||
|
||||
# ifdef TEXTCOLOR
|
||||
/*
|
||||
* CLR_BLACK 0
|
||||
* CLR_RED 1
|
||||
* CLR_GREEN 2
|
||||
* CLR_BROWN 3 low-intensity yellow
|
||||
* CLR_BLUE 4
|
||||
* CLR_MAGENTA 5
|
||||
* CLR_CYAN 6
|
||||
* CLR_GRAY 7 low-intensity white
|
||||
* NO_COLOR 8
|
||||
* CLR_ORANGE 9
|
||||
* CLR_BRIGHT_GREEN 10
|
||||
* CLR_YELLOW 11
|
||||
* CLR_BRIGHT_BLUE 12
|
||||
* CLR_BRIGHT_MAGENTA 13
|
||||
* CLR_BRIGHT_CYAN 14
|
||||
* CLR_WHITE 15
|
||||
* CLR_MAX 16
|
||||
* BRIGHT 8
|
||||
*/
|
||||
|
||||
# ifdef VIDEOSHADES
|
||||
/* assign_videoshades() is prototyped in extern.h */
|
||||
/* assign_videocolors() is prototyped in extern.h */
|
||||
/* assign_video() is prototyped in extern.h */
|
||||
|
||||
# ifdef OVLB
|
||||
int shadeflag; /* shades are initialized */
|
||||
int colorflag; /* colors are initialized */
|
||||
char *schoice[3] = {"dark","normal","light"};
|
||||
char *shade[3];
|
||||
# else
|
||||
extern int shadeflag;
|
||||
extern int colorflag;
|
||||
extern char *schoice[3];
|
||||
extern char *shade[3];
|
||||
# endif /* OVLB */
|
||||
|
||||
# endif /* VIDEOSHADES */
|
||||
|
||||
# ifdef OVLB
|
||||
STATIC_OVL void
|
||||
init_ttycolor()
|
||||
{
|
||||
# ifdef VIDEOSHADES
|
||||
if (!shadeflag) {
|
||||
ttycolors[CLR_BLACK] = M_BLACK; /* 8 = dark gray */
|
||||
ttycolors[CLR_WHITE] = M_WHITE; /* 15 = bright white */
|
||||
ttycolors[CLR_GRAY] = M_GRAY; /* 7 = normal white */
|
||||
shade[0] = schoice[0];
|
||||
shade[1] = schoice[1];
|
||||
shade[2] = schoice[2];
|
||||
}
|
||||
# else
|
||||
ttycolors[CLR_BLACK] = M_GRAY; /* mapped to white */
|
||||
ttycolors[CLR_WHITE] = M_GRAY; /* mapped to white */
|
||||
ttycolors[CLR_GRAY] = M_GRAY; /* mapped to white */
|
||||
# endif
|
||||
|
||||
# ifdef VIDEOSHADES
|
||||
if (!colorflag) {
|
||||
# endif
|
||||
ttycolors[CLR_RED] = M_RED;
|
||||
ttycolors[CLR_GREEN] = M_GREEN;
|
||||
ttycolors[CLR_BROWN] = M_BROWN;
|
||||
ttycolors[CLR_BLUE] = M_BLUE;
|
||||
ttycolors[CLR_MAGENTA] = M_MAGENTA;
|
||||
ttycolors[CLR_CYAN] = M_CYAN;
|
||||
ttycolors[BRIGHT] = M_WHITE;
|
||||
ttycolors[CLR_ORANGE] = M_ORANGE;
|
||||
ttycolors[CLR_BRIGHT_GREEN] = M_BRIGHTGREEN;
|
||||
ttycolors[CLR_YELLOW] = M_YELLOW;
|
||||
ttycolors[CLR_BRIGHT_BLUE] = M_BRIGHTBLUE;
|
||||
ttycolors[CLR_BRIGHT_MAGENTA] = M_BRIGHTMAGENTA;
|
||||
ttycolors[CLR_BRIGHT_CYAN] = M_BRIGHTCYAN;
|
||||
# ifdef VIDEOSHADES
|
||||
}
|
||||
# endif
|
||||
}
|
||||
# endif /* OVLB */
|
||||
|
||||
# ifdef OVL1
|
||||
static int FDECL(convert_uchars,(char *, uchar *, int));
|
||||
# ifdef VIDEOSHADES
|
||||
int assign_videoshades(char *choiceptr)
|
||||
{
|
||||
char choices[120];
|
||||
char *cptr, *cvalue[3];
|
||||
int i,icolor = CLR_WHITE;
|
||||
|
||||
strcpy(choices,choiceptr);
|
||||
cvalue[0] = choices;
|
||||
|
||||
/* find the next ' ' or tab */
|
||||
cptr = index(cvalue[0], '-');
|
||||
if (!cptr) cptr = index(cvalue[0], ' ');
|
||||
if (!cptr) cptr = index(cvalue[0], '\t');
|
||||
if (!cptr) return 0;
|
||||
*cptr = '\0';
|
||||
/* skip whitespace between '=' and value */
|
||||
do { ++cptr; } while (isspace(*cptr) || (*cptr == '-'));
|
||||
cvalue[1] = cptr;
|
||||
|
||||
cptr = index(cvalue[1], '-');
|
||||
if (!cptr) cptr = index(cvalue[0], ' ');
|
||||
if (!cptr) cptr = index(cvalue[0], '\t');
|
||||
if (!cptr) return 0;
|
||||
*cptr = '\0';
|
||||
do { ++cptr; } while (isspace(*cptr) || (*cptr == '-'));
|
||||
cvalue[2] = cptr;
|
||||
|
||||
for (i=0; i < 3; ++i) {
|
||||
switch(i) {
|
||||
case 0: icolor = CLR_BLACK;
|
||||
break;
|
||||
case 1: icolor = CLR_GRAY;
|
||||
break;
|
||||
case 2: icolor = CLR_WHITE;
|
||||
break;
|
||||
}
|
||||
|
||||
shadeflag = 1;
|
||||
if ((strncmpi(cvalue[i],"black",5) == 0) ||
|
||||
(strncmpi(cvalue[i],"dark",4) == 0)) {
|
||||
shade[i] = schoice[0];
|
||||
ttycolors[icolor] = M_BLACK; /* dark gray */
|
||||
} else if ((strncmpi(cvalue[i],"gray",4) == 0) ||
|
||||
(strncmpi(cvalue[i],"grey",4) == 0) ||
|
||||
(strncmpi(cvalue[i],"medium",6) == 0) ||
|
||||
(strncmpi(cvalue[i],"normal",6) == 0)) {
|
||||
shade[i] = schoice[1];
|
||||
ttycolors[icolor] = M_GRAY; /* regular gray */
|
||||
} else if ((strncmpi(cvalue[i],"white",5) == 0) ||
|
||||
(strncmpi(cvalue[i],"light",5) == 0)) {
|
||||
shade[i] = schoice[2];
|
||||
ttycolors[icolor] = M_WHITE; /* bright white */
|
||||
} else {
|
||||
shadeflag = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Process defaults.nh OPTIONS=videocolors:xxx
|
||||
* Left to right assignments for:
|
||||
* red green brown blue magenta cyan orange br.green yellow
|
||||
* br.blue br.mag br.cyan
|
||||
*
|
||||
* Default Mapping (BIOS): 4-2-6-1-5-3-12-10-14-9-13-11
|
||||
*/
|
||||
int assign_videocolors(char *colorvals)
|
||||
{
|
||||
int i,icolor;
|
||||
uchar *tmpcolor;
|
||||
|
||||
init_ttycolor(); /* in case defaults.nh entry wasn't complete */
|
||||
i = strlen(colorvals);
|
||||
tmpcolor = (uchar *)alloc(i);
|
||||
(void)convert_uchars(colorvals,tmpcolor,i);
|
||||
icolor = CLR_RED;
|
||||
for( i = 0; tmpcolor[i] != 0; ++i) {
|
||||
if (icolor < (CLR_WHITE)) {
|
||||
ttycolors[icolor++] = tmpcolor[i];
|
||||
if ((icolor > CLR_CYAN) && (icolor < CLR_ORANGE)) {
|
||||
icolor = CLR_ORANGE;
|
||||
}
|
||||
}
|
||||
}
|
||||
colorflag = 1;
|
||||
free((genericptr_t)tmpcolor);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
convert_uchars(bufp,list,size)
|
||||
char *bufp; /* current pointer */
|
||||
uchar *list; /* return list */
|
||||
int size;
|
||||
{
|
||||
unsigned int num = 0;
|
||||
int count = 0;
|
||||
|
||||
while (1) {
|
||||
switch(*bufp) {
|
||||
case ' ': case '\0':
|
||||
case '\t': case '-':
|
||||
case '\n':
|
||||
if (num) {
|
||||
list[count++] = num;
|
||||
num = 0;
|
||||
}
|
||||
if ((count==size) || !*bufp) return count;
|
||||
bufp++;
|
||||
break;
|
||||
|
||||
case '0': case '1': case '2': case '3':
|
||||
case '4': case '5': case '6': case '7':
|
||||
case '8': case '9':
|
||||
num = num*10 + (*bufp-'0');
|
||||
bufp++;
|
||||
break;
|
||||
return count;
|
||||
}
|
||||
}
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
# endif /* VIDEOSHADES */
|
||||
# endif /* OVL1 */
|
||||
# endif /* TEXTCOLOR */
|
||||
|
||||
/*
|
||||
* Process defaults.nh OPTIONS=video:xxxx
|
||||
*
|
||||
* where (current) legitimate values are:
|
||||
*
|
||||
* autodetect (attempt to determine the adapter type)
|
||||
* default (force use of the default video method for environment)
|
||||
* vga (use vga adapter code)
|
||||
*/
|
||||
# ifdef OVL1
|
||||
int
|
||||
assign_video(sopt)
|
||||
char *sopt;
|
||||
{
|
||||
|
||||
/*
|
||||
* debug
|
||||
*
|
||||
* printf("video is %s",sopt);
|
||||
* getch();
|
||||
*/
|
||||
iflags.grmode = 0;
|
||||
iflags.hasvesa = 0;
|
||||
iflags.hasvga = 0;
|
||||
iflags.has8514 = 0;
|
||||
iflags.usevesa = 0;
|
||||
iflags.usevga = 0;
|
||||
iflags.use8514 = 0;
|
||||
|
||||
if (strncmpi(sopt,"def",3) == 0) { /* default */
|
||||
/* do nothing - default */
|
||||
# ifdef SCREEN_VGA
|
||||
} else if (strncmpi(sopt,"vga",3) == 0) { /* vga */
|
||||
iflags.usevga = 1;
|
||||
iflags.hasvga = 1;
|
||||
# endif
|
||||
# ifdef SCREEN_VESA
|
||||
} else if (strncmpi(sopt,"vesa",4) == 0) { /* vesa */
|
||||
iflags.hasvesa = 1;
|
||||
iflags.usevesa = 1;
|
||||
# endif
|
||||
# ifdef SCREEN_8514
|
||||
} else if (strncmpi(sopt,"8514",4) == 0) { /* 8514/A */
|
||||
iflags.use8514 = 1;
|
||||
iflags.has8514 = 1;
|
||||
# endif
|
||||
} else if (strncmpi(sopt,"auto",4) == 0) { /* autodetect */
|
||||
# ifdef SCREEN_VESA
|
||||
if (vesa_detect()) {
|
||||
iflags.hasvesa = 1;
|
||||
}
|
||||
# endif
|
||||
# ifdef SCREEN_8514
|
||||
if (v8514_detect()) {
|
||||
iflags.has8514 = 1;
|
||||
}
|
||||
# endif
|
||||
# ifdef SCREEN_VGA
|
||||
if (vga_detect()) {
|
||||
iflags.hasvga = 1;
|
||||
}
|
||||
# endif
|
||||
/*
|
||||
* Auto-detect Priorities (arbitrary for now):
|
||||
* VESA, 8514, VGA
|
||||
*/
|
||||
if (iflags.hasvesa) iflags.usevesa = 1;
|
||||
else if (iflags.has8514) iflags.use8514 = 1;
|
||||
else if (iflags.hasvga) {
|
||||
iflags.usevga = 1;
|
||||
/* VGA depends on BIOS to enable function keys*/
|
||||
iflags.BIOS = 1;
|
||||
iflags.rawio = 1;
|
||||
}
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
# endif /* OVL1 */
|
||||
# ifdef OVL0
|
||||
|
||||
void tileview(enable)
|
||||
boolean enable;
|
||||
{
|
||||
#ifdef SCREEN_VGA
|
||||
if (iflags.grmode) vga_traditional(enable ? FALSE : TRUE);
|
||||
#endif
|
||||
}
|
||||
# endif /* OVL0 */
|
||||
#endif /* NO_TERMS */
|
||||
#else /* STUBVIDEO */
|
||||
void tileview(enable)
|
||||
boolean enable;
|
||||
{
|
||||
}
|
||||
#endif /* STUBVIDEO */
|
||||
|
||||
Reference in New Issue
Block a user