Graphics Library (part 2 of 5)
Dave Lewis
lewis at m2-net.UUCP
Fri Jul 1 14:01:41 AEST 1988
------------------------------ cut here ------------------------------
# To recover, type "sh archive"
echo restoring box.c
sed 's/^X//' > box.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) box.c 4.3 88/06/19";
X#endif
X
X/*
X * Copyright (c) David T. Lewis 1987, 1988
X * All rights reserved.
X *
X * Permission is granted to use this for any personal noncommercial use.
X * You may not distribute source or executable code for profit, nor
X * may you distribute it with a commercial product without the written
X * consent of the author. Please send modifications to the author for
X * inclusion in updates to the program. Thanks.
X */
X
X/* Fri Jul 3 23:43:36 EDT 1987
X * dtlewis
X * Routine to draw a box.
X */
X
Xint box(x1,y1,x2,y2)
X int x1, y1, x2, y2;
X{
X int movepen(), draw();
X if (movepen(x1,y1)) return(1);
X if (draw(x2,y1)) return(1);
X if (draw(x2,y2)) return(1);
X if (draw(x1,y2)) return(1);
X if (draw(x1,y1)) return(1);
X return(0);
X}
XxX--EOF--XxX
echo restoring cellchar.c
sed 's/^X//' > cellchar.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) cellchar.c 4.4 88/06/19";
X#endif
X
X/*
X * Copyright (c) David T. Lewis 1988
X * All rights reserved.
X *
X * Permission is granted to use this for any personal noncommercial use.
X * You may not distribute source or executable code for profit, nor
X * may you distribute it with a commercial product without the written
X * consent of the author. Please send modifications to the author for
X * inclusion in updates to the program. Thanks.
X */
X
X/* Write a graphics character to the screen. */
X/* This routine uses bit mapped character cell fonts. */
X/* The character will be drawn such that the current graphics cursor */
X/* denotes the upper left corner of the character cell. The graphics */
X/* cursor will be incremented in the X direction by an amount corres- */
X/* ponding to one character cell. */
X
X/* x and y are in PIXEL COORDINATES, not normalized coordinates. */
X/* Tue Mar 15 22:46:31 EST 1988 */
X/* system5 dtlewis 2 2.3.0-U AT */
X
X#include "graphics.h"
X#include "cellfont.h"
X
Xextern struct SVAT_graphics graphics;
X
Xint cellchar(asc_char)
Xunsigned char asc_char;
X{
X int x, y, i, j;
X int write_pix();
X
X char *bits;
X
X /* Get the pixel location, and check for Y out of range. */
X x = conv_x_coord(graphics.x_cursor);
X y = conv_y_coord(graphics.y_cursor);
X if ((y<0) || ((y + Y_CELL_BITS) >= 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 <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) cellstr.c 4.3 88/06/19";
X#endif
X
X/*
X * Copyright (c) David T. Lewis 1988
X * All rights reserved.
X *
X * Permission is granted to use this for any personal noncommercial use.
X * You may not distribute source or executable code for profit, nor
X * may you distribute it with a commercial product without the written
X * consent of the author. Please send modifications to the author for
X * inclusion in updates to the program. Thanks.
X */
X
X/* Write string of a graphics characters to the screen. */
X/* Sat Mar 19 23:56:46 EST 1988 */
X/* system5 dtlewis 2 2.3.0-U AT */
X
X/* Routine to display cell mode text string with upper left corner of */
X/* first character located at the current graphics cursor. The cursor */
X/* is incremented as characters are written. */
X
X#include <stdio.h>
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 <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) clear.c 4.4 88/06/19";
X#endif
X
X/*
X * Copyright (c) David T. Lewis 1987, 1988
X * All rights reserved.
X *
X * Permission is granted to use this for any personal noncommercial use.
X * You may not distribute source or executable code for profit, nor
X * may you distribute it with a commercial product without the written
X * consent of the author. Please send modifications to the author for
X * inclusion in updates to the program. Thanks.
X */
X
X/*
X * Routine to clear video memory (or print buffer memory).
X * dtlewis 6-28-87
X * Sun Mar 13 21:13:59 EST 1988
X */
X
X#include "graphics.h"
X
Xint clear()
X{
X extern struct SVAT_graphics graphics;
X int i, j;
X switch (graphics.grafmode) {
X case CGA_COLOR_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 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; i<PRINTLINES; i++) {
X for(j=0; j<PRINTDENSITY; j++) {
X (graphics.printbuf1)->buf[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 <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) cursor.c 4.3 88/06/19";
X#endif
X
X/*
X * Copyright (c) David T. Lewis 1988
X * All rights reserved.
X *
X * Permission is granted to use this for any personal noncommercial use.
X * You may not distribute source or executable code for profit, nor
X * may you distribute it with a commercial product without the written
X * consent of the author. Please send modifications to the author for
X * inclusion in updates to the program. Thanks.
X */
X
X/* Move the graphics cursor as if it were a text cursor. The cursor */
X/* is positioned such that a cell character may be drawn at the */
X/* specified character row and column. */
X/* This routine uses bit mapped character cell fonts. */
X/* The character will be drawn such that the current graphics cursor */
X/* denotes the upper left corner of the character cell. */
X
X/* Columns and rows are numbered 1 through N, not 0 through N !!!! */
X
X#include "graphics.h"
X
Xextern struct SVAT_graphics graphics;
Xextern int movepen();
X
Xint cursor(row, col)
Xint row, col;
X{
X long xval, yval;
X
X /* Check valid range for this screen type. */
X if (col <= 0 || col > 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 <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) draw.c 4.4 88/06/19";
X#endif
X
X/*
X * Copyright (c) David T. Lewis 1987, 1988
X * All rights reserved.
X *
X * Permission is granted to use this for any personal noncommercial use.
X * You may not distribute source or executable code for profit, nor
X * may you distribute it with a commercial product without the written
X * consent of the author. Please send modifications to the author for
X * inclusion in updates to the program. Thanks.
X */
X
X/* Sat Mar 21 22:59:10 EST 1987 */
X/* dtl 2-8-87
X**
X** Write a line on the CGA or Hercules adapter.
X** This routine assumes that the current graphics cursor position is
X** set, and draws a line to the indicated point.
X*/
X
X#include "graphics.h"
X
Xextern struct SVAT_graphics graphics;
X
Xdraw(new_x_cursor,new_y_cursor)
X int new_x_cursor, new_y_cursor;
X{
X
X /* Draw line from current cursor to new position. */
X /* Parameters are in normalized 2-D coordinates. */
X
X int x_dist; /* Pixel coordinates */
X int y_dist; /* Pixel coordinates */
X int x_start; /* Pixel coordinates */
X int y_start; /* Pixel coordinates */
X int x_final; /* Pixel coordinates */
X int y_final; /* Pixel coordinates */
X int x_current; /* Pixel coordinates */
X int y_current; /* Pixel coordinates */
X int x_pixels; /* X distance in pixels */
X int y_pixels; /* Y distance in pixels */
X long int slope;
X int offset;
X long int idx;
X
X int write_pix();
X
X /* Check for out of range. */
X
X if (new_x_cursor < 0 || new_y_cursor < 0) return(1);
X
X /* Find the starting point in pixel coordinates. */
X
X x_current = x_start = conv_x_coord(graphics.x_cursor);
X y_current = y_start = conv_y_coord(graphics.y_cursor);
X
X /* Find the end point in pixel coordinates. */
X
X x_final = conv_x_coord(new_x_cursor);
X y_final = conv_y_coord(new_y_cursor);
X
X /* Find the distances in pixel coordinates. */
X
X x_dist = x_final - x_start;
X y_dist = y_final - y_start;
X
X /* Find the number of pixels to travel in the x any y directions. */
X
X x_pixels = abs(x_dist);
X y_pixels = abs(y_dist);
X
X /* Step across the screen pixel by pixel. Do this in the x */
X /* direction if x_dist is greater than y_dist; else, do it in */
X /* the y direction. */
X
X if (x_pixels > 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 <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) grafchar.c 4.4 88/06/20";
X#endif
X
X/*
X * Copyright (c) David T. Lewis 1987, 1988
X * All rights reserved.
X *
X * Permission is granted to use this for any personal noncommercial use.
X * You may not distribute source or executable code for profit, nor
X * may you distribute it with a commercial product without the written
X * consent of the author. Please send modifications to the author for
X * inclusion in updates to the program. Thanks.
X */
X
X/* Write a graphics character to the screen. */
X/* Sat Dec 12 12:51:27 EST 1987 */
X/* system5 dtlewis 2 2.2-U AT */
X
X#include "font.h"
X
Xint grafchar(asc_char,x,y,vsize,hsize)
Xunsigned char asc_char;
Xint x, y, vsize, hsize;
X{
X int x1, y1, x2, y2, i;
X int linedraw();
X
X union
X {
X struct
X {
X unsigned col2 : 4;
X unsigned row2 : 4;
X unsigned col1 : 4;
X unsigned row1 : 4;
X } part;
X struct
X {
X unsigned word;
X } whole;
X } font;
X
X for (i=0; i<=35; i++) {
X if ((font.whole.word = stroke[asc_char][i]) != 0xFFFF)
X if (linedraw(
X x1 = x+font.part.col1*hsize,
X y1 = y+font.part.row1*vsize,
X x2 = x+font.part.col2*hsize,
X y2 = y+font.part.row2*vsize)
X ) return(1);
X }
X return(0);
X}
X
XxX--EOF--XxX
echo restoring grafstr.c
sed 's/^X//' > grafstr.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) grafstr.c 4.3 88/06/19";
X#endif
X
X/*
X * Copyright (c) David T. Lewis 1987, 1988
X * All rights reserved.
X *
X * Permission is granted to use this for any personal noncommercial use.
X * You may not distribute source or executable code for profit, nor
X * may you distribute it with a commercial product without the written
X * consent of the author. Please send modifications to the author for
X * inclusion in updates to the program. Thanks.
X */
X
X/* Write string of a graphics characters to the screen. */
X/* Sat Dec 12 12:51:27 EST 1987 */
X/* system5 dtlewis 2 2.2-U AT */
X
X#include <stdio.h>
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 <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) init.c 4.4 88/06/19";
X#endif
X
X/*
X * Copyright (c) David T. Lewis 1987, 1988
X * All rights reserved.
X *
X * Permission is granted to use this for any personal noncommercial use.
X * You may not distribute source or executable code for profit, nor
X * may you distribute it with a commercial product without the written
X * consent of the author. Please send modifications to the author for
X * inclusion in updates to the program. Thanks.
X */
X
X/* Sat Nov 28 17:10:53 EST 1987 */
X/* Initialize shared memory for use in graphics I/O. This routine is */
X/* specific to Microport System V/AT, and presumes that shared memory */
X/* segments have been defined (usually at system boot time) such that */
X/* the shared memory keys are "B8000L" for CGA adapter, and so on. */
X
X#include <stdio.h>
X#include <sys/types.h>
X#include <sys/ipc.h>
X#include <math.h>
X#include <malloc.h>
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
More information about the Comp.unix.microport
mailing list