home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 June
/
SIMTEL_0692.cdr
/
msdos
/
ddjmag
/
ddj8904.arc
/
PALETT.ASC
< prev
next >
Wrap
Text File
|
1989-03-27
|
10KB
|
316 lines
_GRAPHICS PROGRAMMING COLUMN_
by Kent Porter
[LISTING ONE]
/* COLORS.C: Shows all colors in default palette */
#include "grafix.h"
#include <conio.h>
void main ()
{
int r, c, color;
if (init_video (EGA)) {
for (r = 0; r < 4; r++)
for (c = 0; c < 4; c++) {
color = (r * 4) + c; /* next color */
set_color1 (color);
fill_rect ((c*160), (r*80), 158, 79);
}
getch(); /* wait for keypress */
}
}
[LISTING TWO]
/* Include file for GRAFIX.LIB */
/* EGA/VGA graphics subsystem */
/* K. Porter, DDJ Graphics Programming Column */
/* ------------------------------------------ */
/* Color constants from April, 89 */
#define Black 0 /* standard colors */
#define Blue 1
#define Green 2
#define Cyan 3
#define Red 4
#define Magenta 5
#define Brown 0x14
#define LtGray 7
#define DkGray 0x38
#define LtBlue 0x39
#define LtGreen 0x3A
#define LtCyan 0x3B
#define LtRed 0x3C
#define LtMagenta 0x3D
#define Yellow 0x3E
#define White 0x3F
#define RED0 0x00 /* basic hues for mixing */
#define RED1 0x20
#define RED2 0x04
#define RED3 0x24
#define GRN0 0x00
#define GRN1 0x10
#define GRN2 0x02
#define GRN3 0x12
#define BLU0 0x00
#define BLU1 0x08
#define BLU2 0x01
#define BLU3 0x09
#if !defined byte
#define byte unsigned char
#endif
/* Supported video modes */
#define EGA 0x10 /* EGA 640 x 350, 16/64 colors */
#define VGA16 0x11 /* VGA 640 x 480, 16/64 colors */
/* Function prototypes */
/* From February, '89 */
/* ------------------ */
int far init_video (int mode); /* init display in video mode */
void far pc_textmode (void); /* PC text mode */
void far draw_point (int x, int y); /* write pixel in color1 */
void far set_color1 (int palette_reg); /* set foreground color */
/* From March, '89 */
/* --------------- */
void far draw_line (int x1, int y1, int x2, int y2);
/* Bresenham line drawing algorithm */
void far draw_rect (int left, int top, int width, int height);
/* draw rectangle from top left corner */
void far polyline (int edges, int vertices[]); /* draw polyline */
void far hline (int x, int y, int len); /* horizontal line */
void far fill_rect (int left, int top, int width, int height);
/* draw solid rectangle in color1 starting at top left corner */
/* From April, '89 */
/* --------------- */
byte far ega_palreg (int preg); /* color in EGA palette reg */
void far set_ega_palreg (int reg, int color); /* set palette reg */
byte far ega_blend (byte c1, byte c2, byte c3); /* blend primaries */
void far get_ega_colormix (int preg, int *r, int *g, int *b);
/* get mix of red, green, and blue in EGA pal register preg */
[LISTING THREE]
/* EGAPALET.C: Palette control for EGA/VGA 16-color modes */
/* Compile separately, then add to GRAFIX.LIB */
/* K. Porter, DDJ Graphics Programming Column, April '89 */
/* ----------------------------------------------------------- */
#include "grafix.h"
#include <dos.h>
byte ega_palette [16] = { /* current palette contents */
Black, Blue, Green, Cyan, Red, Magenta, Brown, LtGray,
DkGray, LtBlue, LtGreen, LtCyan, LtRed, LtMagenta, Yellow,
White
};
extern int grafixmode; /* from GRAFIX.C */
/* ----------------------------------------------------------- */
byte far ega_palreg (int preg)
/* return contents of palette register preg */
{
return ega_palette [preg];
} /* --------------------------------------------------------- */
byte far ega_blend (byte c1, byte c2, byte c3)
/* blend three primary colors, return color pattern */
{
return c1 | c2 | c3;
} /* --------------------------------------------------------- */
void far get_ega_colormix (int preg, int *r, int *g, int *b)
/* break color in palette reg preg into its components */
{
*r = ega_palette [preg] & RED3;
*g = ega_palette [preg] & GRN3;
*b = ega_palette [preg] & BLU3;
} /* --------------------------------------------------------- */
void far set_ega_palreg (int preg, int color)
/* change palette register preg to new color */
/* use only for EGA 16-color mode */
{
union REGS r;
if (grafixmode == EGA) {
ega_palette [preg] = color; /* update our copy of palette */
r.h.ah = 0x10; /* use ROM BIOS video services */
r.h.al = 0; /* to update the real palette */
r.h.bh = color;
r.h.bl = preg;
int86 (0x10, &r, &r);
}
} /* --------------------------------------------------------- */
[LISTING FOUR]
/* MIX.C: Utility for mixing colors with EGA */
#include "grafix.h"
#include <conio.h>
#include <stdio.h>
#define ESC 27 /* Esc char */
#define ERASE 0
#define SHOW 15
int col[] = {30, 190, 350, 510}; /* box horiz locations */
int row[] = {30, 110, 190}; /* box vert locations */
int rr = 1, gr = 5, br = 9; /* reg index for color set */
int base_red[] = {RED0, RED1, RED2, RED3};
int base_grn[] = {GRN0, GRN1, GRN2, GRN3};
int base_blu[] = {BLU0, BLU1, BLU2, BLU3};
void main ()
{
int r, g, b;
void setup_palette (void), setup_screen (void),
mix_colors (void);
if (init_video (EGA)) {
setup_palette();
setup_screen();
mix_colors();
pc_textmode();
}
/* Report results */
get_ega_colormix (13, &r, &g, &b);
printf ("\nMixed color has value 0x%02X", ega_palreg (13));
printf ("\nComponent breakdown:");
printf ("\n Red: 0x%02X ", r);
switch (r) {
case RED0: puts ("(RED0)"); break;
case RED1: puts ("(RED1)"); break;
case RED2: puts ("(RED2)"); break;
case RED3: puts ("(RED3)"); break;
}
printf (" Green: 0x%02X ", g);
switch (g) {
case GRN0: puts ("(GRN0)"); break;
case GRN1: puts ("(GRN1)"); break;
case GRN2: puts ("(GRN2)"); break;
case GRN3: puts ("(GRN3)"); break;
}
printf (" Blue: 0x%02X ", b);
switch (b) {
case BLU0: puts ("(BLU0)"); break;
case BLU1: puts ("(BLU1)"); break;
case BLU2: puts ("(BLU2)"); break;
case BLU3: puts ("(BLU3)"); break;
}
} /* ----------------------------------------------------- */
void setup_palette (void) /* put basic colors in palette */
{
set_ega_palreg ( 1, RED0); set_ega_palreg ( 2, RED1);
set_ega_palreg ( 3, RED2); set_ega_palreg ( 4, RED3);
set_ega_palreg ( 5, GRN0); set_ega_palreg ( 6, GRN1);
set_ega_palreg ( 7, GRN2); set_ega_palreg ( 8, GRN3);
set_ega_palreg ( 9, BLU0); set_ega_palreg (10, BLU1);
set_ega_palreg (11, BLU2); set_ega_palreg (12, BLU3);
set_ega_palreg (13, White); /* used for mixed colors */
} /* ----------------------------------------------------- */
void draw_box (int reg, int c, int r) /* box around color */
{
set_color1 (reg);
draw_rect (col[c]-5, row[r]-5, 110, 70);
} /* ----------------------------------------------------- */
void setup_screen (void) /* construct work screen */
{
int r, c, reg = 1;
for (r = 0; r < 3; r++)
for (c = 0; c < 4; c++) {
set_color1 (reg++); /* select color reg */
fill_rect (col[c], row[r], 100, 60); /* fill */
}
set_color1 (13);
fill_rect (col[0], 280, 580, 60); /* mixed color area */
for (r = 0; r < 3; r++) /* rubberband most intense */
draw_box (SHOW, 3, r);
} /* ----------------------------------------------------- */
void mix_colors (void) /* interactive portion */
{
#define RAISE(col) col = (col < 3) ? ++col : 3
#define LOWER(col) col = (col > 0) ? --col : 0
char reply;
int r, rc = 3, gc = 3, bc = 3, mixture;
do {
reply = getch();
switch (reply) {
case ESC : break; /* quit program */
case 'r' : r = 0; /* lower red */
draw_box (ERASE, rc, r);
LOWER (rc);
draw_box (SHOW, rc, r);
break;
case 'R' : r = 0; /* raise red */
draw_box (ERASE, rc, r);
RAISE (rc);
draw_box (SHOW, rc, r);
break;
case 'g' : r = 1; /* lower green */
draw_box (ERASE, gc, r);
LOWER (gc);
draw_box (SHOW, gc, r);
break;
case 'G' : r = 1; /* raise green */
draw_box (ERASE, gc, r);
RAISE (gc);
draw_box (SHOW, gc, r);
break;
case 'b' : r = 2; /* lower blue */
draw_box (ERASE, bc, r);
LOWER (bc);
draw_box (SHOW, bc, r);
break;
case 'B' : r = 2; /* raise blue */
draw_box (ERASE, bc, r);
RAISE (bc);
draw_box (SHOW, bc, r);
break;
}
mixture = ega_blend (base_red[rc], base_grn[gc],
base_blu[bc]);
set_ega_palreg (13, mixture); /* update color mix */
} while (reply != ESC);
}