Xref: utzoo comp.unix.microport:943 comp.unix.xenix:2598 Path: utzoo!attcan!uunet!husc6!mailrus!umix!metavax!oxtrap!b-tech!m2-net!lewis From: lewis@m2-net.UUCP (Dave Lewis) Newsgroups: comp.unix.microport,comp.unix.xenix Subject: Graphics Library (part 2 of 5) Keywords: Graphics EGA CGA Hercules Printers Microport Xenix 286 386 Message-ID: <1882@m2-net.UUCP> Date: 1 Jul 88 04:01:41 GMT References: <1881@m2-net.UUCP> Reply-To: lewis@m-net.UUCP (Dave Lewis) Organization: M-NET, Ann Arbor, MI Lines: 775 ------------------------------ cut here ------------------------------ # To recover, type "sh archive" echo restoring box.c sed 's/^X//' > box.c < cellchar.c <= graphics.y_extent)) return(1); X X /* Increment the graphics cursor, check X range. */ X if ((graphics.x_cursor += (int)(NORM_X_RANGE * X_CELL_BITS X / graphics.x_extent)) < 0) X return(1); X X /* Point at the character bit map to print. */ X bits = (char *) &(charcell[asc_char * Y_CELL_BITS]); X X /* Write the character. */ X for (i=y; i < y + Y_CELL_BITS; i++, bits++) { X j=x; X if (*bits & 0x80) if (write_pix(j,i)) return(1); j++; X if (*bits & 0x40) if (write_pix(j,i)) return(1); j++; X if (*bits & 0x20) if (write_pix(j,i)) return(1); j++; X if (*bits & 0x10) if (write_pix(j,i)) return(1); j++; X if (*bits & 0x08) if (write_pix(j,i)) return(1); j++; X if (*bits & 0x04) if (write_pix(j,i)) return(1); j++; X if (*bits & 0x02) if (write_pix(j,i)) return(1); j++; X if (*bits & 0x01) if (write_pix(j,i)) return(1); j++; X } X X return(0); X} XxX--EOF--XxX echo restoring cellstr.c sed 's/^X//' > cellstr.c < X Xint cellstr(strng) Xchar strng[]; X{ X int i; X int cellchar(); X for(i=0; strng[i] != NULL; i++) { X if (cellchar(strng[i])) return(1); X } X return(0); X} X XxX--EOF--XxX echo restoring clear.c sed 's/^X//' > clear.c <page1[i][j] = 0x0; X (graphics.cgamem)->page2[i][j] = 0x0; X } X } X break; X X case CGA_HI_RES_MODE: X for(i=0; i<100; i++) { X for(j=0; j<80; j++) { X (graphics.cgamem)->page1[i][j] = 0x0; X (graphics.cgamem)->page2[i][j] = 0x0; X } X } X break; X X case EGA_COLOR_MODE: X for (i=0 ; i<350 ; i++) { X for (j=0 ; j<80 ; j++) { X (graphics.egamem)->mem[i][j] = 0x0; X } X } X break; X X case HERC_GRAF_MODE: X for(i=0; i<87; i++) { X for(j=0; j<90; j++) { X (graphics.hercmem)->page1[i][j] = 0x0; X (graphics.hercmem)->page2[i][j] = 0x0; X (graphics.hercmem)->page3[i][j] = 0x0; X (graphics.hercmem)->page4[i][j] = 0x0; X } X } X break; X X case IBM_PRINTER: X for(i=0; ibuf[i][j] = 0x0; X (graphics.printbuf2)->buf[i][j] = 0x0; X (graphics.printbuf3)->buf[i][j] = 0x0; X } X } X break; X X default: X return(1); X X } X return(0); X} XxX--EOF--XxX echo restoring cursor.c sed 's/^X//' > cursor.c < graphics.cellfont.chars_per_line) return(1); X if (row <= 0 || row > graphics.cellfont.lines_per_screen) return(1); X X /* Move the graphics cursor. Add a 1/2 pixel offset so we will */ X /* always round down to the correct pixel value. */ X X xval = (col-1) * graphics.cellfont.xtic; /* The value... */ X xval += NORM_X_RANGE / graphics.x_extent / 2; /* Plus 1/2 pix */ X X yval = (row-1) * graphics.cellfont.ytic; X yval += NORM_Y_RANGE / graphics.y_extent / 2; X X if (movepen((int)xval, (int)yval)) return(1); X X return(0); X} XxX--EOF--XxX echo restoring draw.c sed 's/^X//' > draw.c < y_pixels) { X /* Stepwise in x direction. */ X X /* Calculate the slope to use (rise over run). */ X /* Shift left 16 bits for precision. */ X if (x_dist != 0) slope = (long)y_dist * 0x010000L / X (long)x_dist; X else slope = 0x7FFFFFFFL; /* Infinity */ X X /* Figure a fudge factor to be used in offsetting the */ X /* pixels by 1/2 pixel. */ X if (slope > 0) offset = 1; X else if (slope < 0) offset = -1; X else offset = 0; X X /* Write the line on the screen. */ X X if (x_final - x_start >= 0) { X if (slope==0) { X while (x_current <= x_final) X if (write_pix(x_current++, X y_current)) return(1); X } X else for (idx=0; idx <= x_pixels; idx++, x_current++) { X y_current = y_start + (idx*slope/0x08000L X + offset)/2; X if (write_pix(x_current, y_current)) X return(1); X } X } X else { X if (slope==0) { X while (x_current >= x_final) X if (write_pix(x_current--, X y_current)) return(1); X } X else for (idx=0; idx <= x_pixels; idx++, x_current--) { X y_current = y_start - (idx*slope/0x08000L X + offset)/2; X if (write_pix(x_current, y_current)) X return(1); X } X } X } X else { X /* Stepwise in y direction. */ X X /* Calculate the inverse slope to use (run over rise). */ X /* Shift left 16 bits for precision. */ X if (y_dist != 0) slope = (long)x_dist * 0x010000L / X (long)y_dist; X else slope = 0x7FFFFFFF; /* Infinity */ X X /* Figure a fudge factor to be used in offsetting the */ X /* pixels by 1/2 pixel. */ X if (slope > 0) offset = 1; X else if (slope < 0) offset = -1; X else offset = 0; X X /* Write the line on the screen. */ X X if (y_final - y_start >= 0) { X if (slope==0) { X while (y_current <= y_final) X if (write_pix(x_current, X y_current++)) return(1); X } X else for (idx=0; idx <= y_pixels; idx++, y_current++) { X x_current = x_start + (idx*slope/0x08000L X + offset)/2; X if (write_pix(x_current, y_current)) X return(1); X } X } X else { X if (slope==0) { X while (y_current >= y_final) X if (write_pix(x_current, X y_current--)) return(1); X } X else for (idx=0; idx <= y_pixels; idx++, y_current--) { X x_current = x_start - (idx*slope/0x08000L X + offset)/2; X if (write_pix(x_current, y_current)) X return(1); X } X } X } X /* Advance the cursor to the new position. */ X graphics.x_cursor = new_x_cursor; X graphics.y_cursor = new_y_cursor; X return(0); X} XxX--EOF--XxX echo restoring grafchar.c sed 's/^X//' > grafchar.c < grafstr.c < X Xint grafstr(strng,x,y,vsize,hsize,spacing) Xchar strng[]; Xint x, /* X position of upper left corner of character cell */ X y, /* Y position of character cell */ X vsize, /* Vertical size of character cell */ X hsize, /* Horizontal size of character cell */ X spacing; /* Distance between characters */ X{ X int i; X int grafchar(); X for(i=0; strng[i] != NULL; i++) { X if (grafchar(strng[i],x,y,vsize,hsize)) return(1); X x += spacing; X } X return(0); X} X XxX--EOF--XxX echo restoring init.c sed 's/^X//' > init.c < X#include X#include X#include X#include X#include "graphics.h" X Xstruct SVAT_graphics graphics; X Xint init(mode) Xint mode; X/* Mode is the video mode that will be used when in graphics mode. */ X/* By implication, this gives us the memory location we want to attach */ X/* to, as well as the dimensions of the screen. */ X X{ X char *shmat(); X int shmid; X char *malloc(); X int clear(); X extern int errno; X static char initialized = 'N'; /* Flag to prevent reinitialization */ X X graphics.grafmode = mode; X X /* Attach to the appropriate shared memory segment, and set the */ X /* values of graphics.x_extent and graphics.y_extent, according */ X /* to the video mode requested. */ X X switch (graphics.grafmode) { X case CGA_COLOR_MODE: X graphics.x_extent = 319; X graphics.y_extent = 199; X graphics.x_window_ll = 0; X graphics.y_window_ll = 0; X graphics.x_window_ur = 319; X graphics.y_window_ur = 199; X graphics.aspect_ratio = 0.7; X graphics.cellfont.chars_per_line = 40; X graphics.cellfont.lines_per_screen = 25; X graphics.strokefont.xtic = 800; X graphics.strokefont.ytic = 1500; X graphics.strokefont.xsize = 100; X graphics.strokefont.ysize = 160; X if ((shmid = shmget(0xB8000L, 32768, IPC_CREAT)) < 0) X return(errno); X graphics.cgamem = (CGA_BUF_TYPE *)shmat(shmid, 0L, 0); X break; X case CGA_HI_RES_MODE: X graphics.x_extent = 639; X graphics.y_extent = 199; X graphics.x_window_ll = 0; X graphics.y_window_ll = 0; X graphics.x_window_ur = 639; X graphics.y_window_ur = 199; X graphics.aspect_ratio = 0.7; X graphics.cellfont.chars_per_line = 80; X graphics.cellfont.lines_per_screen = 25; X graphics.strokefont.xtic = 480; X graphics.strokefont.ytic = 1500; X graphics.strokefont.xsize = 60; X graphics.strokefont.ysize = 160; X if ((shmid = shmget(0xB8000L, 32768, IPC_CREAT)) < 0) X return(errno); X graphics.cgamem = (CGA_BUF_TYPE *)shmat(shmid, 0L, 0); X break; X case HERC_GRAF_MODE: X graphics.x_extent = 719; X graphics.y_extent = 347; X graphics.x_window_ll = 0; X graphics.y_window_ll = 0; X graphics.x_window_ur = 719; X graphics.y_window_ur = 347; X graphics.aspect_ratio = 0.7; X graphics.cellfont.chars_per_line = 90; X graphics.cellfont.lines_per_screen = 43; X graphics.strokefont.xtic = 400; X graphics.strokefont.ytic = 1500; X graphics.strokefont.xsize = 50; X graphics.strokefont.ysize = 160; X if ((shmid = shmget(0xB0000L, 32768, IPC_CREAT)) < 0) X return(errno); X graphics.hercmem = (HERC_BUF_TYPE *)shmat(shmid, 0L, 0); X break; X case EGA_COLOR_MODE: X /* (not implemented yet) */ X graphics.x_extent = 639; X graphics.y_extent = 349; X graphics.x_window_ll = 0; X graphics.y_window_ll = 0; X graphics.x_window_ur = 639; X graphics.y_window_ur = 349; X graphics.aspect_ratio = 0.7; X graphics.cellfont.chars_per_line = 80; X graphics.cellfont.lines_per_screen = 43; X graphics.strokefont.xtic = 480; X graphics.strokefont.ytic = 1500; X graphics.strokefont.xsize = 60; X graphics.strokefont.ysize = 160; X if ((shmid = shmget(0xA0000L, 32768, IPC_CREAT)) < 0) X return(errno); X graphics.egamem = (EGA_BUF_TYPE *)shmat(shmid, 0L, 0); X break; X case IBM_PRINTER: X graphics.x_extent = 719; X graphics.y_extent = 959; X graphics.x_window_ll = 0; X graphics.y_window_ll = 0; X graphics.x_window_ur = 719; X graphics.y_window_ur = 959; X graphics.aspect_ratio = 0.7; X graphics.cellfont.chars_per_line = 90; X graphics.cellfont.lines_per_screen = 120; X graphics.strokefont.xtic = 400; X graphics.strokefont.ytic = 1000; X graphics.strokefont.xsize = 50; X graphics.strokefont.ysize = 100; X if ((graphics.printbuf1 = (PR_BUF_TYPE *)malloc X (sizeof(PR_BUF_TYPE))) == NULL) return(1); X if ((graphics.printbuf2 = (PR_BUF_TYPE *)malloc X (sizeof(PR_BUF_TYPE))) == NULL) return(1); X if ((graphics.printbuf3 = (PR_BUF_TYPE *)malloc X (sizeof(PR_BUF_TYPE))) == NULL) return(1); X break; X X default: X /* The programmer is probably confused at this point, */ X /* so we may as well exit. */ X printf ("Unable to initialize in routine init(). Mode %d requested.\n",graphics.grafmode); X exit (1); X } X X /* Set other variables to reasonable values. */ X X graphics.color = 2; X graphics.wrt_mode = OR; X graphics.xlate_x = 0; X graphics.xlate_y = 0; X graphics.xlate_z = 0; X graphics.offset_x = 0; X graphics.offset_y = 0; X graphics.offset_z = 0; X graphics.theta_x = 0; X graphics.theta_y = 0; X graphics.theta_z = 0; X graphics.c_tz_c_ty = 1.0; X graphics.s_tz = 0.0; X graphics.s_ty = 0.0; X graphics.c_tz_c_tx = 1.0; X graphics.s_tx = 0.0; X graphics.scale_factor = 1.0; X graphics.perspect_dist = HUGE; X graphics.x_vport_ll = NORM_X_MIN; X graphics.y_vport_ll = NORM_Y_MAX; X graphics.x_vport_ur = NORM_X_MIN; X graphics.y_vport_ur = NORM_Y_MAX; X X graphics.strokefont.angle = 0; X graphics.strokefont.angle = 0; X X /* Character cell spacing in normalized coordinates. This is */ X /* the distance in normalized coordinates. The calculation */ X /* must account for leftover scan lines on the bottom of the */ X /* screen. */ X graphics.cellfont.xtic = X NORM_X_RANGE X * (graphics.x_extent X - (graphics.x_extent + 1) % X_CELL_BITS) X / graphics.x_extent X / graphics.cellfont.chars_per_line; X /* The (integer) value just got rounded down, but we want to */ X /* round up always, so that we won't lose a pixel. Therefore */ X /* increment the value by 1. */ X graphics.cellfont.xtic++; X X graphics.cellfont.ytic = X NORM_Y_RANGE X * (graphics.y_extent X - (graphics.y_extent + 1) % Y_CELL_BITS) X / graphics.y_extent X / graphics.cellfont.lines_per_screen; X graphics.cellfont.ytic++; X X graphics.cellfont.xmult = 1; /* Cell size multipliers */ X graphics.cellfont.ymult = 1; X X /* Erase graphics memory. */ X if (clear()) return(1); X X return(0); X} XxX--EOF--XxX -- Dave Lewis Ann Arbor, MI ...![ itivax umix ]!m-net!dtlewis!lewis