home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume18 / gl_plot / part05 < prev    next >
Text File  |  1989-03-23  |  42KB  |  1,265 lines

  1. Subject:  v18i063:  GL Graphics Library for AT-clone Unix, Part05/07
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rsalz@uunet.UU.NET
  5.  
  6. Submitted-by: umix!m-net!dtlewis!lewis
  7. Posting-number: Volume 18, Issue 63
  8. Archive-name: gl_plot/part05
  9.  
  10. # To recover, type "sh archive"
  11. echo restoring Things_to_do
  12. sed 's/^X//' > Things_to_do <<XxX--EOF--XxX
  13. XThings that need to be added to enhance the graphics routines:
  14. X
  15. X
  16. XVolunteers needed:
  17. X------------------
  18. X
  19. X-Port to 386 UNIX and XENIX.  Some 16 bit integer dependencies have
  20. Xalready been removed (using the INT16 macro in config.h), but this
  21. Xhas not been tested on an actual 386 system.  Also, I have no idea
  22. Xhow to change video modes and get pointers to video memory for any
  23. Xof the flavors of 386 UNIX/XENIX.
  24. X
  25. X-Complete port to Xenix 286.  So far, only an EGA system had been
  26. Xtested, so other device types need verification.  No testing of the
  27. Xprint queue output has been done.  The FAR macro (in graphics.h) has
  28. Xbeen defined for support of mixed memory models, but only the large
  29. Xmemory model is currently working.
  30. X
  31. X-Add additional device support (VGA, Laserjet, enhanced EGA boards).
  32. X
  33. X
  34. XThings I'll probably get around to doing myself:
  35. X------------------------------------------------
  36. X
  37. X-Add XOR and color support to EGA.
  38. X
  39. X-Add line thickness and line style support to pixel and/or line drawing
  40. Xroutines.
  41. X
  42. X-Add polygon fill routines.
  43. X
  44. X-Add windows, viewports, 3-D transforms, etc.
  45. X
  46. X
  47. X            Tue Dec 27 16:01:22 EST 1988 dtl
  48. XxX--EOF--XxX
  49. echo restoring g_init.c
  50. sed 's/^X//' > g_init.c <<XxX--EOF--XxX
  51. X#ifndef lint
  52. Xstatic char sccsid[] = "@(#) g_init.c 5.1 89/02/20";
  53. X#endif
  54. X
  55. X/*
  56. X *    Copyright (c) David T. Lewis 1987, 1988, 1989
  57. X *    All rights reserved.
  58. X *
  59. X *    Permission is granted to use this for any personal noncommercial use.
  60. X *    You may not distribute source or executable code for profit, nor
  61. X *    may you distribute it with a commercial product without the written
  62. X *    consent of the author.  Please send modifications to the author for
  63. X *    inclusion in updates to the program.  Thanks.
  64. X */
  65. X
  66. X/* Sat Nov 28 17:10:53 EST 1987 */
  67. X/* Initialize shared or video memory for use in graphics I/O.  For     */
  68. X/* Microport System V/AT we presume that shared memory segments have    */
  69. X/* been defined (usually at system boot time) such that the shared    */
  70. X/* memory keys are "B8000L" for CGA adapter, and so on (or change    */
  71. X/* the definitions in config.h).  For Xenix, we can directly address    */
  72. X/* video memory via the appropriate segment selector.            */
  73. X
  74. X#define MODULE "g_init()"
  75. X
  76. X#include <stdio.h>
  77. X#include "config.h"
  78. X#if MIX_C
  79. X#else
  80. X#include <sys/types.h>
  81. X#include <math.h>
  82. X#if TCC
  83. X#else
  84. X#include <malloc.h>
  85. X#endif /* TCC */
  86. X#endif /* MIX_C */
  87. X#if MS_DOS
  88. X#include <stdlib.h>
  89. X/* Mode to return to before exiting    */
  90. Xint g_text = -1;
  91. X#else
  92. X#include <sys/ipc.h>
  93. X#endif /* MS_DOS */
  94. X#if XENIX_286
  95. X#include <sys/fcntl.h>
  96. X#include <sys/machdep.h>
  97. X#include <sys/sysmacros.h>
  98. X#endif /* XENIX_286 */
  99. X#if HAS_SIG
  100. X#include <signal.h>
  101. X#endif /* HAS_SIG */
  102. X#include "bitmaps.h"
  103. X#include "gf_types.h"
  104. X#include "graphics.h"
  105. X#include "modes.h"
  106. X
  107. X#ifndef HUGE
  108. X#define HUGE (3.4e+38)
  109. X#endif /* HUGE */
  110. X
  111. Xstruct GL_graphics graphics;
  112. Xextern int (*p_do_pix)();
  113. Xextern int g_clear();
  114. Xextern int g_finish();
  115. Xextern int p_wr_pix();
  116. Xextern char *getenv();
  117. X
  118. X#if TCC
  119. X#else
  120. Xextern char *calloc();
  121. X#endif /* TCC */
  122. X
  123. X#if HAS_SIG
  124. X/* Global variable to save previous interrupt signal handler (usually    */
  125. X/* SIG_DFL, but someone may have their own handler for closing files    */
  126. X/* or other cleanup).  This value is restored when g_finish() is    */
  127. X/* called.                                */
  128. XSIG_TYPE (*gl_last_int_handler)();
  129. X
  130. X/* This is the default interrupt signal handler, which is in effect    */
  131. X/* starting with the call to g_init(), until the call to g_finish().    */
  132. XSIG_TYPE gl_sig_catch() {
  133. X    /* Don't take any more signals while we work.            */
  134. X    signal (SIGINT, SIG_IGN);
  135. X
  136. X    /* Clean up and exit.  Don't bother cleaning up for printers,    */
  137. X    /* since we are only interested in clearing the screen and    */
  138. X    /* detaching from shared memory segments.            */
  139. X    if (graphics.grafmode <= MAXVIDEO)  {
  140. X        g_finish();
  141. X    }
  142. X    exit(1);
  143. X}
  144. X#endif /* HAS_SIG */
  145. X
  146. X/* Warning for System V/AT problems.                    */
  147. Xstatic void bad_key_warning(key)  
  148. Xlong key;
  149. X{
  150. X    system(MODEPROG);
  151. X    fprintf (stderr,"Cannot attach to shared memory key %lx for mode ",key);
  152. X    fprintf (stderr,"%d in routine %s.\n", graphics.grafmode, MODULE);
  153. X    fprintf (stderr,"The problem is most likely caused by ",0);
  154. X    fprintf (stderr,"lack of a shared memory key.\n",0);
  155. X    fprintf (stderr,"You must use a kernel with shared memory ",0);
  156. X    fprintf (stderr,"enabled, and define the keys\n",0);
  157. X    fprintf (stderr,"using the shmcreate(1) utility.\n",0);
  158. X}
  159. X
  160. X/* Warning for Xenix 286 problems.                    */
  161. Xstatic void bad_sel_warning(device_name)  
  162. Xchar device_name[];
  163. X{
  164. X    system(MODEPROG);
  165. X    fprintf (stderr,"Cannot locate selector for the ",0);
  166. X    fprintf (stderr,"requested video adapter %s.\n", device_name);
  167. X    fprintf (stderr,"Graphics mode %d was requested in routine %s.\n",
  168. X        graphics.grafmode, MODULE);
  169. X    fprintf (stderr,"The most likely problem is that your ",0);
  170. X    fprintf (stderr,"physical board does not match the\n",0);
  171. X    fprintf (stderr,"type you tried to attach to (see ",0);
  172. X    fprintf (stderr,"the \"config.h\" file for the gl library).\n",0);
  173. X}
  174. X
  175. Xint not_enuf_mem()  {
  176. X    fprintf(stderr,
  177. X        "%s: Insufficient memory for in-core print buffer.\n",
  178. X        MODULE);
  179. X    return(1);
  180. X}
  181. X
  182. X/* For printers, the following four functions send data required to    */
  183. X/* start the print, end the print, start each line, and end each line.    */
  184. X/* These function pointers will point to routines in g_print.c.        */
  185. X
  186. Xextern int (*pr_head)(), (*pr_tail)(), (*pr_lnst)(), (*pr_lnend)();
  187. X
  188. X/* There will be one set of these functions for each printer type.    */
  189. X
  190. Xextern int IBM_head(), IBM_tail(), IBM_lnst(), IBM_lnend();
  191. Xextern int LJ_head(), LJ_tail(), LJ_lnst(), LJ_lnend();
  192. X
  193. Xint g_init(mode)
  194. Xint mode;
  195. X/* Mode is the video mode that will be used when in graphics mode.    */
  196. X/* By implication, this gives us the memory location we want to attach    */
  197. X/* to, as well as the dimensions of the screen.                */
  198. X
  199. X{
  200. X    char *env_mode;
  201. X    extern int errno;
  202. X    int istat;
  203. X    char command[40], modebuf[10];
  204. X
  205. X#if SVAT
  206. X    long key;
  207. X    char *shmat();
  208. X    int shmid;
  209. X#endif /* SVAT */
  210. X
  211. X#if XENIX_286
  212. X    int fd, selector;
  213. X    char device_name[20];
  214. X    int map_request;
  215. X
  216. X#if GL_EGA
  217. X    map_request = MAPEGA;
  218. X    strcpy(device_name,"/dev/ega");
  219. X#else
  220. X#if GL_HERC
  221. X    map_request = MAPMONO;
  222. X    strcpy(device_name,"/dev/monochrome");
  223. X#else
  224. X#if GL_PGA
  225. X    map_request = MAPPGA;
  226. X    strcpy(device_name,"/dev/pga");
  227. X#else
  228. X#if GL_VGA
  229. X    /* No support for this.  Wait for later Xenix release, I guess.    */
  230. X    map_request = MAPCONS;
  231. X    strcpy(device_name,"/dev/console");
  232. X#else
  233. X#if GL_CGA
  234. X    map_request = MAPCGA;
  235. X    strcpy(device_name,"/dev/color");
  236. X#else
  237. X    /* May as well default to CGA.    */
  238. X    map_request = MAPCGA;
  239. X    strcpy(device_name,"/dev/console");
  240. X#endif /* GL_CGA */
  241. X#endif /* GL_VGA */
  242. X#endif /* GL_PGA */
  243. X#endif /* GL_HERC */
  244. X#endif /* GL_EGA */
  245. X
  246. X#endif /* XENIX_286 */
  247. X
  248. X#if MS_DOS
  249. X    /* Save the mode we started in so we can exit in text mode.    */
  250. X    if (g_text == -1) g_text = g_getmod();
  251. X#endif /* MS_DOS */
  252. X
  253. X    /* If we have already initialized, then call g_finish() before    */
  254. X    /* proceeding.                            */
  255. X
  256. X    if (graphics.initialized == TRUE)  {
  257. X        if ((istat=g_finish()) != 0) return(istat);
  258. X    }
  259. X    else graphics.initialized = FALSE;
  260. X
  261. X    /* Remember what mode we are in.                */
  262. X
  263. X    graphics.grafmode = mode;
  264. X
  265. X    /* If mode is ENV_MODE, then get mode from the         */
  266. X    /* environment.  Get the default video mode if         */
  267. X    /* specified in an  environment variable; otherwise,    */
  268. X    /* use the compiled-in default value.            */
  269. X
  270. X    if (graphics.grafmode==ENV_MODE)  
  271. X#if HAS_ENV
  272. X    {
  273. X        if ((env_mode = getenv(GL_ENV_MODE)) == NULL)  {
  274. X            /* No environment variable; use the default.    */
  275. X            /* Put warning message to standard error, then    */
  276. X            /* continue.                    */
  277. X            fprintf(stderr,
  278. X            "Use environment variable %s to control mode.\n",
  279. X                GL_ENV_MODE);
  280. X            fprintf(stderr,"Continuing with default mode %d.\n",
  281. X                DEFAULT_MODE);
  282. X            graphics.grafmode = DEFAULT_MODE;
  283. X            sleep(2);
  284. X        }
  285. X        else if(sscanf(env_mode,"%d",&(graphics.grafmode)) != 1)  {
  286. X            fprintf (stderr,
  287. X                "WARNING:  Routine %s checking environment ",
  288. X                MODULE);
  289. X            fprintf (stderr,
  290. X                "variable %s.\n",
  291. X                GL_ENV_MODE);
  292. X            fprintf (stderr,
  293. X                "Cannot understand mode \"%s\".  Integer ",
  294. X                env_mode);
  295. X            fprintf (stderr,
  296. X                "value is required.\n",0);
  297. X            return(1);
  298. X        }
  299. X    }
  300. X#else
  301. X    {
  302. X        /* Some systems do not understand getenv()    */
  303. X        graphics.grafmode = DEFAULT_MODE;
  304. X    }
  305. X#endif /* HAS_ENV */
  306. X
  307. X    /* Tell the hardware to go into the appropriate mode, using    */
  308. X    /* the MODEPROG program.                    */
  309. X
  310. X    if (graphics.grafmode <= MAXVIDEO)  {
  311. X#if MS_DOS
  312. X        g_setmod(graphics.grafmode);
  313. X#else
  314. X        strcpy(command, MODEPROG);
  315. X        strcat(command," ");
  316. X        sprintf(modebuf,"%d\0", graphics.grafmode);
  317. X        strcat(command, modebuf);
  318. X        system(command);
  319. X#endif /* MS_DOS */
  320. X    }
  321. X
  322. X    /* Attach to the appropriate shared memory segment, and set the    */
  323. X    /* values of graphics.x_extent and graphics.y_extent, according    */
  324. X    /* to the video mode requested.                    */
  325. X
  326. X    switch (graphics.grafmode)  {
  327. X    case CGA_COLOR_MODE:
  328. X        graphics.x_extent = 319;
  329. X        graphics.y_extent = 199;
  330. X        graphics.x_window_ll = 0;
  331. X        graphics.y_window_ll = 0;
  332. X        graphics.x_window_ur = 319;
  333. X        graphics.y_window_ur = 199;
  334. X        graphics.aspect_ratio = CGA_ASPECT_RATIO;
  335. X        graphics.cellfont.chars_per_line = 40;
  336. X        graphics.cellfont.lines_per_screen = 25;
  337. X#if SVAT
  338. X        key = CGA_KEY;
  339. X        if ((shmid = shmget(key, 32768, IPC_CREAT)) < 0)  {
  340. X            bad_key_warning(key);
  341. X            return(shmid);
  342. X        }
  343. X        graphics.cgamem = (CGA_BUF_TYPE *)shmat(shmid, 0L, 0);
  344. X#else
  345. X#if XENIX_286
  346. X        fd = open(device_name, O_WRONLY);
  347. X        selector = ioctl(fd,map_request,0);
  348. X        if (selector < 0)  {
  349. X            bad_sel_warning(device_name);
  350. X            return(selector);
  351. X        }
  352. X        graphics.cgamem = (CGA_BUF_TYPE *)sotofar(selector,0);
  353. X#else
  354. X#if MS_DOS
  355. X        graphics.cgamem = (CGA_BUF_TYPE *)DOS_CGA;
  356. X#endif /* MS_DOS */
  357. X#endif /* XENIX_286 */
  358. X#endif /* SVAT */
  359. X        break;
  360. X    case CGA_HI_RES_MODE:
  361. X        graphics.x_extent = 639;
  362. X        graphics.y_extent = 199;
  363. X        graphics.x_window_ll = 0;
  364. X        graphics.y_window_ll = 0;
  365. X        graphics.x_window_ur = 639;
  366. X        graphics.y_window_ur = 199;
  367. X        graphics.aspect_ratio = CGA_ASPECT_RATIO;
  368. X        graphics.cellfont.chars_per_line = 80;
  369. X        graphics.cellfont.lines_per_screen = 25;
  370. X#if SVAT
  371. X        key = CGA_KEY;
  372. X        if ((shmid = shmget(key, 32768, IPC_CREAT)) < 0)  {
  373. X            bad_key_warning(key);
  374. X            return(shmid);
  375. X        }
  376. X        graphics.cgamem = (CGA_BUF_TYPE *)shmat(shmid, 0L, 0);
  377. X#else
  378. X#if XENIX_286
  379. X        fd = open(device_name, O_WRONLY);
  380. X        selector = ioctl(fd,map_request,0);
  381. X        if (selector < 0)  {
  382. X            bad_sel_warning(device_name);
  383. X            return(selector);
  384. X        }
  385. X        graphics.cgamem = (CGA_BUF_TYPE *)sotofar(selector,0);
  386. X#else
  387. X#if MS_DOS
  388. X        graphics.cgamem = (CGA_BUF_TYPE *)DOS_CGA;
  389. X#endif /* MS_DOS */
  390. X#endif /* XENIX_286 */
  391. X#endif /* SVAT */
  392. X        break;
  393. X    case HERC_P0_MODE:
  394. X    case HERC_P1_MODE:
  395. X        graphics.x_extent = 719;
  396. X        graphics.y_extent = 347;
  397. X        graphics.x_window_ll = 0;
  398. X        graphics.y_window_ll = 0;
  399. X        graphics.x_window_ur = 719;
  400. X        graphics.y_window_ur = 347;
  401. X        graphics.aspect_ratio = HERC_ASPECT_RATIO;
  402. X        graphics.cellfont.chars_per_line = 90;
  403. X        graphics.cellfont.lines_per_screen = 43;
  404. X#if SVAT
  405. X        if (mode == HERC_P0_MODE) key = HERC_P0KEY;    /* Page 0 */
  406. X        else key = HERC_P1KEY;                /* Page 1 */
  407. X        if ((shmid = shmget(key, 32768, IPC_CREAT)) < 0)  {
  408. X            bad_key_warning(key);
  409. X            return(shmid);
  410. X        }
  411. X        graphics.hercmem = (HERC_BUF_TYPE *)shmat(shmid, 0L, 0);
  412. X#else
  413. X#if XENIX_286
  414. X        /* Note: I don't know how page 0 and 1 will be selected    */
  415. X        /* under Xenix.  Microport can use two different shared    */
  416. X        /* memory keys. dtl 1-8-89                */
  417. X        fd = open(device_name, O_WRONLY);
  418. X        selector = ioctl(fd,map_request,0);
  419. X        if (selector < 0)  {
  420. X            bad_sel_warning(device_name);
  421. X            return(selector);
  422. X        }
  423. X        graphics.hercmem = (HERC_BUF_TYPE *)sotofar(selector,0);
  424. X#else
  425. X#if MS_DOS
  426. X        graphics.hercmem = (HERC_BUF_TYPE *)DOS_H_P0;
  427. X#endif /* MS_DOS */
  428. X#endif /* XENIX_286 */
  429. X#endif /* SVAT */
  430. X        break;
  431. X    case EGA_COLOR_MODE:
  432. X        graphics.x_extent = 639;
  433. X        graphics.y_extent = 349;
  434. X        graphics.x_window_ll = 0;
  435. X        graphics.y_window_ll = 0;
  436. X        graphics.x_window_ur = 639;
  437. X        graphics.y_window_ur = 349;
  438. X        graphics.aspect_ratio = EGA_ASPECT_RATIO;
  439. X        graphics.cellfont.chars_per_line = 80;
  440. X        graphics.cellfont.lines_per_screen = 43;
  441. X#if SVAT
  442. X        key = EGA_KEY;
  443. X        if ((shmid = shmget(key, 32768, IPC_CREAT)) < 0)  {
  444. X            bad_key_warning(key);
  445. X            return(shmid);
  446. X        }
  447. X        graphics.egamem = (EGA_BUF_TYPE *)shmat(shmid, 0L, 0);
  448. X#else
  449. X#if XENIX_286
  450. X        fd = open(device_name, O_WRONLY);
  451. X        selector = ioctl(fd,map_request,0);
  452. X        if (selector < 0)  {
  453. X            bad_sel_warning(device_name);
  454. X            return(selector);
  455. X        }
  456. X        graphics.egamem = (EGA_BUF_TYPE *)sotofar(selector,0);
  457. X#else
  458. X#if MS_DOS
  459. X        graphics.egamem = (EGA_BUF_TYPE *)DOS_EGA;
  460. X#endif /* MS_DOS */
  461. X#endif /* XENIX_286 */
  462. X#endif /* SVAT */
  463. X        break;
  464. X    case IBM_PRINTER:
  465. X        /* Initialize the function pointers for this printer.    */
  466. X        pr_head = IBM_head;
  467. X        pr_tail = IBM_tail;
  468. X        pr_lnst = IBM_lnst;
  469. X        pr_lnend = IBM_lnend;
  470. X        graphics.x_extent = 719;
  471. X        graphics.y_extent = 959;
  472. X        graphics.x_window_ll = 0;
  473. X        graphics.y_window_ll = 0;
  474. X        graphics.x_window_ur = 719;
  475. X        graphics.y_window_ur = 959;
  476. X        graphics.aspect_ratio = IBM_PR_ASPECT_RATIO;
  477. X        graphics.cellfont.chars_per_line = 90;
  478. X        graphics.cellfont.lines_per_screen = 120;
  479. X        /* Memory will be g_cleared by calloc(), no need    */
  480. X        /* to call g_clear() later.            */
  481. X        if ((graphics.printbuf1 = (PR_BUF_TYPE *) calloc
  482. X            (1,sizeof(PR_BUF_TYPE)))==NULL) return(not_enuf_mem());
  483. X        if ((graphics.printbuf2 = (PR_BUF_TYPE *) calloc
  484. X            (1,sizeof(PR_BUF_TYPE)))==NULL) return(not_enuf_mem());
  485. X        if ((graphics.printbuf3 = (PR_BUF_TYPE *) calloc
  486. X            (1,sizeof(PR_BUF_TYPE)))==NULL) return(not_enuf_mem());
  487. X        break;
  488. X    case LJ_PRINTER:
  489. X        /* Initialize the function pointers for this printer.    */
  490. X        pr_head = LJ_head;
  491. X        pr_tail = LJ_tail;
  492. X        pr_lnst = LJ_lnst;
  493. X        pr_lnend = LJ_lnend;
  494. X        graphics.x_extent = 1379;
  495. X        graphics.y_extent = 1119;
  496. X        graphics.x_window_ll = 0;
  497. X        graphics.y_window_ll = 0;
  498. X        graphics.x_window_ur = 1379;
  499. X        graphics.y_window_ur = 1119;
  500. X        graphics.aspect_ratio = LJ_PR_ASPECT_RATIO;
  501. X        graphics.cellfont.chars_per_line = 138;
  502. X        graphics.cellfont.lines_per_screen = 94;
  503. X        /* Memory will be g_cleared by calloc(), no need    */
  504. X        /* to call g_clear() later.            */
  505. X        if ((graphics.lj_buf1 = (LJ_BUF_TYPE *) calloc
  506. X            (1, LJ_BUF_SIZE))==NULL) return(not_enuf_mem());
  507. X        if ((graphics.lj_buf2 = (LJ_BUF_TYPE *) calloc
  508. X            (1, LJ_BUF_SIZE))==NULL) return(not_enuf_mem());
  509. X        if ((graphics.lj_buf3 = (LJ_BUF_TYPE *) calloc
  510. X            (1, LJ_BUF_SIZE))==NULL) return(not_enuf_mem());
  511. X        break;
  512. X    default:
  513. X        /* The programmer is probably confused at this point.    */
  514. X        /* Print a warning and return.                */
  515. X        system(MODEPROG);
  516. X        fprintf (stderr,"Unable to initialize in routine %s.  Mode %d requested.\n",MODULE,graphics.grafmode);
  517. X        return(1);
  518. X    }
  519. X
  520. X    /* Set other variables to reasonable values.            */
  521. X
  522. X    graphics.color = 2;
  523. X    graphics.lineweight = LIGHT;
  524. X    graphics.linestyle = SOLID;
  525. X    graphics.wrt_mode = OR;
  526. X
  527. X    graphics.xlate_x = 0;
  528. X    graphics.xlate_y = 0;
  529. X    graphics.xlate_z = 0;
  530. X    graphics.offset_x = 0;
  531. X    graphics.offset_y = 0;
  532. X    graphics.offset_z = 0;
  533. X    graphics.theta_x = 0;
  534. X    graphics.theta_y = 0;
  535. X    graphics.theta_z = 0;
  536. X    graphics.c_tz_c_ty = 1.0;
  537. X    graphics.s_tz = 0.0;
  538. X    graphics.s_ty = 0.0;
  539. X    graphics.c_tz_c_tx = 1.0;
  540. X    graphics.s_tx = 0.0;
  541. X    graphics.scale_factor = 1.0;
  542. X    graphics.perspect_dist = HUGE;
  543. X    graphics.x_vport_ll = NRM_X_MIN;
  544. X    graphics.y_vport_ll = NRM_Y_MAX;
  545. X    graphics.x_vport_ur = NRM_X_MIN;
  546. X    graphics.y_vport_ur = NRM_Y_MAX;
  547. X
  548. X    /* Character cell spacing in normalized coordinates.  This is    */
  549. X    /* the distance in normalized coordinates.            */
  550. X
  551. X    /* The horizontal size of a line of cell text is the width of    */
  552. X    /* a pixel (NRM_Y_RANGE divided by the number of pixels across    */
  553. X    /* the screen) times the number of pixels in a line of text.    */
  554. X    /* Rearrange this for computational accuracy.            */
  555. X
  556. X    graphics.cellfont.xtic = 
  557. X        NRM_X_RANGE * X_CELL_BITS / graphics.x_extent;
  558. X
  559. X    /* The vertical size of a line of cell text is the size of    */
  560. X    /* a scan line (NRM_Y_RANGE divided by the number of lines    */
  561. X    /* we need) times the number of scan lines for a line of text.    */
  562. X    /* Rearrange this for computational accuracy.            */
  563. X
  564. X    graphics.cellfont.ytic =
  565. X        NRM_Y_RANGE * Y_CELL_BITS / graphics.y_extent;
  566. X
  567. X    graphics.cellfont.xmult = 1;    /* Cell size multipliers    */
  568. X    graphics.cellfont.ymult = 1;
  569. X
  570. X    graphics.default_strokefont.xtic
  571. X         = graphics.strokefont.xtic = graphics.cellfont.xtic;
  572. X    graphics.default_strokefont.ytic
  573. X        = graphics.strokefont.ytic = graphics.cellfont.ytic;
  574. X    graphics.default_strokefont.xsize
  575. X        = graphics.strokefont.xsize = graphics.strokefont.xtic / 8;
  576. X    graphics.default_strokefont.ysize
  577. X        = graphics.strokefont.ysize = graphics.strokefont.ytic /10;
  578. X    graphics.default_strokefont.angle
  579. X        = graphics.strokefont.angle = 0;
  580. X    graphics.default_strokefont.slant
  581. X        = graphics.strokefont.slant = 0;
  582. X    graphics.default_strokefont.angle_flag
  583. X        = graphics.strokefont.angle_flag = FALSE;
  584. X    graphics.default_strokefont.slant_flag
  585. X        = graphics.strokefont.slant_flag = FALSE;
  586. X
  587. X    /* Erase graphics memory and set video mode.  Anything beyond    */
  588. X    /* MAXVIDEO is not a video board.  Assume it is a printer; no    */
  589. X    /* need to clear memory.                    */
  590. X
  591. X    if (graphics.grafmode <= MAXVIDEO)  {
  592. X        if (g_clear() != 0)  {
  593. X            system(MODEPROG);
  594. X            return(1);
  595. X        }
  596. X    }
  597. X
  598. X    /* Initialize the p_do_pix function pointer to point to the    */
  599. X    /* p_wr_pix routine (see the p_do_pix routine in        */
  600. X    /* g_pixctl.c).  This corresponds to the current linestyle    */
  601. X    /* value of SOLID.                        */
  602. X
  603. X    p_do_pix = p_wr_pix;
  604. X
  605. X    graphics.initialized = TRUE;
  606. X
  607. X#if HAS_SIG
  608. X#if DO_CLEANUP
  609. X    /* Catch interrupt signals, and clean up before exiting.     */
  610. X    gl_last_int_handler = signal(SIGINT, gl_sig_catch);
  611. X#endif /* DO_CLEANUP */
  612. X#endif /* HAS_SIG */
  613. X
  614. X    return(0);
  615. X}
  616. X
  617. XxX--EOF--XxX
  618. echo restoring gl.3L
  619. sed 's/^X//' > gl.3L <<XxX--EOF--XxX
  620. X.\" dummy line
  621. X.TH GL 3L "01 Oct 1988"
  622. X.UC 4
  623. X.SH NAME
  624. Xg_init, g_finish, g_clear, p_wr_pix,
  625. Xn_movepen, n_point, n_draw, n_line,
  626. Xn_box, n_ellipse, n_arc,
  627. Xn_grafchar, n_grafstr, g_fontctl,
  628. Xc_cellchar, c_cellstr, c_cursor,
  629. Xg_pix_mode, g_pix_color, g_weight, g_style,
  630. Xplot(3)
  631. X\- graphics primitives for PC UNIX and DOS systems.
  632. X.SH SYNOPSIS
  633. X.nf
  634. X.B
  635. X#include "gl.h"
  636. X.PP
  637. X.B int g_init(mode)
  638. Xint mode;
  639. X.PP
  640. X.B int g_finish()
  641. X.PP
  642. X.B int g_clear()
  643. X.PP
  644. X.B int p_wr_pix(x,y)
  645. Xint x, y;
  646. X.PP
  647. X.B int n_movepen(x,y)
  648. Xint x, y;
  649. X.PP
  650. X.B int n_point(x,y)
  651. Xint x, y;
  652. X.PP
  653. X.B int n_draw(x,y)
  654. Xint x, y;
  655. X.PP
  656. X.B int n_line(x1,y1,x2,y2)
  657. Xint x1, y1, x2, y2;
  658. X.PP
  659. X.B int n_box(x1, y1, x2, y2)
  660. Xint x1, y1, x2, y2;
  661. X.PP
  662. X.B int n_ellipse(x,y,a,b)
  663. Xint x, y, a, b;
  664. X.PP
  665. X.B int n_arc(x,y,a,b,angle1,angle2)
  666. Xint x, y, a, b;
  667. Xfloat angle1, angle2;
  668. X.PP
  669. X.B int n_grafchar(asc_char)
  670. Xunsigned char asc_char;
  671. X.PP
  672. X.B int n_grafstr(strng)  
  673. Xchar strng[];
  674. X.PP
  675. X.B int g_fontctl(size, aspect_ratio, spacing, angle, slant)
  676. Xfloat size, aspect_ratio, spacing, angle, slant;
  677. X.PP
  678. X.B int c_cellchar(asc_char)
  679. Xunsigned char asc_char;
  680. X.PP
  681. X.B int c_cellstr(strng)
  682. Xchar strng[];
  683. X.PP
  684. X.B int c_cursor(row,col)
  685. Xint row, col;
  686. X.PP
  687. X.B int g_pix_mode(mode_val)
  688. Xint mode_val;
  689. X.PP
  690. X.B int g_pix_color(color)
  691. Xint color;
  692. X.PP
  693. X.B int g_weight(lineweight)
  694. Xint lineweight;
  695. X.PP
  696. X.B long g_style(linestyle)
  697. Xlong linestyle;
  698. X.br
  699. X.SH DESCRIPTION
  700. XThe
  701. X.I gl 
  702. Xcollection of routines is designed to provide graphic output
  703. Xto a number of video adapters and printers for PC clone computers
  704. Xrunning UNIX or MS-DOS operating systems.  
  705. X.PP
  706. XVarious output devices are supported, including CGA, EGA, Hercules,
  707. Xand dot matrix and laser printers.  For each type of device, one or more 
  708. Xgraphics "modes" is defined in graphics.h, and the corresponding 
  709. Xbitmaps are defined in bitmaps.h.  These modes roughly correspond 
  710. Xto the BIOS video modes defined for MS-DOS, with additional modes 
  711. Xdefined for Hercules and for printer output.
  712. X.PP
  713. XAlso included is an emulation of the BSD 
  714. X.I plot(3) 
  715. Xgraphics interface library.  See 
  716. X.I plot(3) 
  717. Xfor details.
  718. X.PP
  719. XThe
  720. X.I g_init
  721. Xroutine initializes device (sets video mode), buffers, and variables, 
  722. Xand obtains pointers to video memory, video shared memory segment or 
  723. Xtemporary printer buffers.
  724. X.PP
  725. XThe
  726. X.I g_finish
  727. Xroutine releases resources and detaches memory segments.
  728. X.PP
  729. XThe
  730. X.I g_clear
  731. Xroutine clears the screen (or printer buffer area). 
  732. X.PP
  733. XThe
  734. X.I p_wr_pix
  735. Xroutine activates a pixel.  If the current writing mode is OR, 
  736. Xthe pixel is turned on (set to the currently active color).  If 
  737. Xthe current writing mode is XOR, the pixel value (color) is XORed 
  738. Xwith its current value.
  739. X.PP
  740. XThe
  741. X.I n_movepen
  742. Xroutine moves the logical cursor in normalized 32768 x 32768 
  743. Xaddress space, where (0,0) is the upper left corner of the screen
  744. Xor printed page.
  745. X.PP
  746. XThe
  747. X.I n_point
  748. Xroutine draws a dot on the screen at (x,y) in normalized address space.
  749. X.PP
  750. XThe
  751. X.I n_draw
  752. Xroutine draws a vector from the current address to (x,y) in 
  753. Xnormalized address space.
  754. X.PP
  755. XThe
  756. X.I n_line
  757. Xroutine draws a line from (x1,y1) to (x2,y2) in normalized address 
  758. Xspace.
  759. X.PP
  760. XThe
  761. X.I n_box
  762. Xroutine draws a box with corners at (x1, y1) and (x2, y2) in 
  763. Xnormalized address space.
  764. X.PP
  765. XThe
  766. X.I n_ellipse
  767. Xroutine draws an ellipse in normalized address space with center at (x, y)
  768. Xand semi-axes a and b parallel to the x and y axes, respectively.
  769. X.PP
  770. XThe
  771. X.I n_arc
  772. Xroutine draws an elliptical arc in normalized address space.  The ellipse
  773. Xis centered at (x, y) with semi-axes a and b parallel to the x and
  774. Xy axes, respectively.  The arc begins at angle1 and continues to
  775. Xangle2.  The direction of travel is clockwise as viewed on the screen 
  776. X(counterclockwise in the "inverted" normalized coordinate system).
  777. X.PP
  778. XThe
  779. X.I n_grafchar
  780. Xroutine displays a vectorized (stroke font) text character 
  781. Xasc_char located at the current location.  The cursor is advanced 
  782. Xto the next character position.
  783. X.PP
  784. XThe
  785. X.I n_grafstr
  786. Xroutine displays a character string using a stroke font.
  787. X.PP
  788. XThe
  789. X.I g_fontctl
  790. Xroutine controls size, aspect ratio, spacing, angle and slant of stroke
  791. Xfont.  The size, aspect ratio and spacing control height, relative width
  792. Xand relative spacing of characters, with 1.0 selecting default values.
  793. XChanging size will change the width and spacing appropriately.
  794. XChanging width will change the spacing.
  795. XAngle is the angle of a text string in radians, with positive
  796. Xvalues rotating the text clockwise.  Slant is the character slant
  797. Xin radians (typically a number on the order of 0.2), with positive
  798. Xvalues slanting the text to the "right," as in italics.
  799. X.PP
  800. XThe
  801. X.I c_cellchar
  802. Xroutine displays a bit mapped character at the current location.
  803. XThe cursor is advanced to the next character position.
  804. X.PP
  805. XThe
  806. X.I c_cellstr
  807. Xroutine displays a string at the current location, using bit mapped 
  808. Xcharacters.
  809. X.PP
  810. XThe
  811. X.I c_cursor
  812. Xroutine moves the graphics cursor to a position corresponding to
  813. Xa character row and column.  This is used for easy positioning of text
  814. Xdrawn with the 
  815. X.I c_cellstr 
  816. Xroutine.
  817. X.PP
  818. XThe
  819. X.I g_pix_mode
  820. Xroutine establishes the active OR mode or XOR mode pixel 
  821. Xsetting mode, and returns the previous mode value.
  822. X.PP
  823. XThe
  824. X.I g_pix_color
  825. Xroutine sets the active pixel color, and returns previous color 
  826. Xvalue.
  827. X.PP
  828. XThe
  829. X.I g_weight
  830. Xroutine sets the active line thickness, and returns the previous line
  831. Xthickness value.
  832. X.PP
  833. XThe
  834. X.I g_style
  835. Xroutine sets the active line style (e.g. dot-dash), and returns the 
  836. Xprevious line style value.
  837. X.SH ENVIRONMENT
  838. XThe GLMODE shell variable may be used to specify the default graphics mode
  839. X(such as "16" to specify EGA 640x350 color graphics).  The PLOTDEV shell 
  840. Xvariable may be used to specify the printer device to use (such as "lpt" 
  841. Xto use /dev/lpt).
  842. X.SH SEE ALSO
  843. Xplot(3), lpset(1), shmcreate(1)
  844. X.SH AUTHOR
  845. XDavid T Lewis, Ann Arbor, MI, USA
  846. X.br
  847. X(...!m-net!dtlewis!lewis)
  848. X.SH BUGS
  849. XThe 
  850. X.I g_pix_mode
  851. Xroutine does not set XOR mode for EGA high res graphics.  
  852. X.PP
  853. XThe
  854. X.I g_pix_color 
  855. Xroutine does not do anything for EGA high res graphics.
  856. X.PP
  857. XThe
  858. X.I g_weight
  859. Xroutine does not do anything (not yet implemented).
  860. X.PP
  861. XThe
  862. X.I arc
  863. Xroutine in plot(3) calculates the arc endpoint differently from the BSD 
  864. Xversions.  The BSD version is simpler and less precise, but will give
  865. Xdifferent display output in some cases.
  866. X.PP
  867. XWriting in XOR mode is done at the p_wr_pix routine level.  In XOR
  868. Xmode, therefore, routines such as n_box and n_grafchar will "lose 
  869. Xpixels" at line intersections in XOR mode, due to writing the same
  870. Xpixel twice (that is, turning in on, then off again).
  871. X.PP
  872. XThe
  873. X.I g_init
  874. Xroutine sets a signal handler to clean up the screen before exiting, and
  875. X.I g_finish
  876. Xrestores the handler to its previous value.  This may interfere
  877. Xwith an application's intended signal handling (the DO_CLEANUP macro in
  878. Xconfig.h can eliminate this behavior).
  879. X.PP
  880. XFor MS-DOS versions, graphics printer output must be done with BIOS calls.  
  881. XTherefore, the default system printer device must be used, and the 
  882. XPLOTDEV environment variable has no meaning.
  883. X.SH CAVEATS
  884. XNo checking is done to control ownership of the console output.  The
  885. Xuser of the program is assumed to be at the console.  Any checks for
  886. Xthis must be done by the application program.
  887. X.PP
  888. XThe EGA and VGA adapters control color and writing modes (OR or XOR)
  889. Xwith output to port addresses on the EGA/VGA card.  On System V/AT,
  890. Xthis requires use of the outb() routine with write access to /dev/mem.
  891. XSince this would require the application program to be suid to root,
  892. Xsupport for color and writing modes has not yet been implemented.
  893. X.SH SEE ALSO
  894. Xplot(3), plot(1), plot(5).
  895. X
  896. XxX--EOF--XxX
  897. echo restoring gl.man
  898. sed 's/^X//' > gl.man <<XxX--EOF--XxX
  899. X
  900. X
  901. X
  902. X     GGGGLLLL((((3333LLLL))))               UUUUNNNNIIIIXXXX 5555....0000 ((((00001111 OOOOcccctttt 1111999988888888))))                GGGGLLLL((((3333LLLL))))
  903. X
  904. X
  905. X
  906. X     NNNNAAAAMMMMEEEE
  907. X          g_init, g_finish, g_clear, p_wr_pix, n_movepen, n_point,
  908. X          n_draw, n_line, n_box, n_ellipse, n_arc, n_grafchar,
  909. X          n_grafstr, g_fontctl, c_cellchar, c_cellstr, c_cursor,
  910. X          g_pix_mode, g_pix_color, g_weight, g_style, plot(3) -
  911. X          graphics primitives for PC UNIX and DOS systems.
  912. X
  913. X     SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
  914. X          ####iiiinnnncccclllluuuuddddeeee """"ggggllll....hhhh""""
  915. X
  916. X          iiiinnnntttt gggg____iiiinnnniiiitttt((((mmmmooooddddeeee))))
  917. X          int mode;
  918. X
  919. X          iiiinnnntttt gggg____ffffiiiinnnniiiisssshhhh(((())))
  920. X
  921. X          iiiinnnntttt gggg____cccclllleeeeaaaarrrr(((())))
  922. X
  923. X          iiiinnnntttt pppp____wwwwrrrr____ppppiiiixxxx((((xxxx,,,,yyyy))))
  924. X          int x, y;
  925. X
  926. X          iiiinnnntttt nnnn____mmmmoooovvvveeeeppppeeeennnn((((xxxx,,,,yyyy))))
  927. X          int x, y;
  928. X
  929. X          iiiinnnntttt nnnn____ppppooooiiiinnnntttt((((xxxx,,,,yyyy))))
  930. X          int x, y;
  931. X
  932. X          iiiinnnntttt nnnn____ddddrrrraaaawwww((((xxxx,,,,yyyy))))
  933. X          int x, y;
  934. X
  935. X          iiiinnnntttt nnnn____lllliiiinnnneeee((((xxxx1111,,,,yyyy1111,,,,xxxx2222,,,,yyyy2222))))
  936. X          int x1, y1, x2, y2;
  937. X
  938. X          iiiinnnntttt nnnn____bbbbooooxxxx((((xxxx1111,,,, yyyy1111,,,, xxxx2222,,,, yyyy2222))))
  939. X          int x1, y1, x2, y2;
  940. X
  941. X          iiiinnnntttt nnnn____eeeelllllllliiiippppsssseeee((((xxxx,,,,yyyy,,,,aaaa,,,,bbbb))))
  942. X          int x, y, a, b;
  943. X
  944. X          iiiinnnntttt nnnn____aaaarrrrcccc((((xxxx,,,,yyyy,,,,aaaa,,,,bbbb,,,,aaaannnngggglllleeee1111,,,,aaaannnngggglllleeee2222))))
  945. X          int x, y, a, b;
  946. X          float angle1, angle2;
  947. X
  948. X          iiiinnnntttt nnnn____ggggrrrraaaaffffcccchhhhaaaarrrr((((aaaasssscccc____cccchhhhaaaarrrr))))
  949. X          unsigned char asc_char;
  950. X
  951. X          iiiinnnntttt nnnn____ggggrrrraaaaffffssssttttrrrr((((ssssttttrrrrnnnngggg))))
  952. X          char strng[];
  953. X
  954. X          iiiinnnntttt gggg____ffffoooonnnnttttccccttttllll((((ssssiiiizzzzeeee,,,, aaaassssppppeeeecccctttt____rrrraaaattttiiiioooo,,,, ssssppppaaaacc
  955. cciiiinnnngggg,,,, aaaannnngggglllleeee,,,, ssssllllaaaannnntttt))))
  956. X          float size, aspect_ratio, spacing, angle, slant;
  957. X
  958. X          iiiinnnntttt cccc____cccceeeellllllllcccchhhhaaaarrrr((((aaaasssscccc____cccchhhhaaaarrrr))))
  959. X
  960. X
  961. X
  962. X     Page 1                                          (printed 2/21/89)
  963. X
  964. X
  965. X
  966. X
  967. X
  968. X
  969. X     GGGGLLLL((((3333LLLL))))               UUUUNNNNIIIIXXXX 5555....0000 ((((00001111 OOOOcccctttt 1111999988888888))))                GGGGLLLL((((3333LLLL))))
  970. X
  971. X
  972. X
  973. X          unsigned char asc_char;
  974. X
  975. X          iiiinnnntttt cccc____cccceeeellllllllssssttttrrrr((((ssssttttrrrrnnnngggg))))
  976. X          char strng[];
  977. X
  978. X          iiiinnnntttt cccc____ccccuuuurrrrssssoooorrrr((((rrrroooowwww,,,,ccccoooollll))))
  979. X          int row, col;
  980. X
  981. X          iiiinnnntttt gggg____ppppiiiixxxx____mmmmooooddddeeee((((mmmmooooddddeeee____vvvvaaaallll))))
  982. X          int mode_val;
  983. X
  984. X          iiiinnnntttt gggg____ppppiiiixxxx____ccccoooolllloooorrrr((((ccccoooolllloooorrrr))))
  985. X          int color;
  986. X
  987. X          iiiinnnntttt gggg____wwwweeeeiiiigggghhhhtttt((((lllliiiinnnneeeewwwweeeeiiiigggghhhhtttt))))
  988. X          int lineweight;
  989. X
  990. X          lllloooonnnngggg gggg____ssssttttyyyylllleeee((((lllliiiinnnneeeessssttttyyyylllleeee))))
  991. X          long linestyle;
  992. X
  993. X     DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
  994. X          The _g_l collection of routines is designed to provide graphic
  995. X          output to a number of video adapters and printers for PC
  996. X          clone computers running UNIX or MS-DOS operating systems.
  997. X
  998. X          Various output devices are supported, including CGA, EGA,
  999. X          Hercules, and dot matrix and laser printers.  For each type
  1000. X          of device, one or more graphics "modes" is defined in
  1001. X          graphics.h, and the corresponding bitmaps are defined in
  1002. X          bitmaps.h.  These modes roughly correspond to the BIOS video
  1003. X          modes defined for MS-DOS, with additional modes defined for
  1004. X          Hercules and for printer output.
  1005. X
  1006. X          Also included is an emulation of the BSD _p_l_o_t(_3) graphics
  1007. X          interface library.  See _p_l_o_t(_3) for details.
  1008. X
  1009. X          The _g__i_n_i_t routine initializes device (sets video mode),
  1010. X          buffers, and variables, and obtains pointers to video
  1011. X          memory, video shared memory segment or temporary printer
  1012. X          buffers.
  1013. X
  1014. X          The _g__f_i_n_i_s_h routine releases resources and detaches memory
  1015. X          segments.
  1016. X
  1017. X          The _g__c_l_e_a_r routine clears the screen (or printer buffer
  1018. X          area).
  1019. X
  1020. X          The _p__w_r__p_i_x routine activates a pixel.  If the current
  1021. X          writing mode is OR, the pixel is turned on (set to the
  1022. X          currently active color).  If the current writing mode is
  1023. X          XOR, the pixel value (color) is XORed with its current
  1024. X          value.
  1025. X
  1026. X
  1027. X
  1028. X     Page 2                                          (printed 2/21/89)
  1029. X
  1030. X
  1031. X
  1032. X
  1033. X
  1034. X
  1035. X     GGGGLLLL((((3333LLLL))))               UUUUNNNNIIIIXXXX 5555....0000 ((((00001111 OOOOcccctttt 1111999988888888))))                GGGGLLLL((((3333LLLL))))
  1036. X
  1037. X
  1038. X
  1039. X          The _n__m_o_v_e_p_e_n routine moves the logical cursor in normalized
  1040. X          32768 x 32768 address space, where (0,0) is the upper left
  1041. X          corner of the screen or printed page.
  1042. X
  1043. X          The _n__p_o_i_n_t routine draws a dot on the screen at (x,y) in
  1044. X          normalized address space.
  1045. X
  1046. X          The _n__d_r_a_w routine draws a vector from the current address
  1047. X          to (x,y) in normalized address space.
  1048. X
  1049. X          The _n__l_i_n_e routine draws a line from (x1,y1) to (x2,y2) in
  1050. X          normalized address space.
  1051. X
  1052. X          The _n__b_o_x routine draws a box with corners at (x1, y1) and
  1053. X          (x2, y2) in normalized address space.
  1054. X
  1055. X          The _n__e_l_l_i_p_s_e routine draws an ellipse in normalized address
  1056. X          space with center at (x, y) and semi-axes a and b parallel
  1057. X          to the x and y axes, respectively.
  1058. X
  1059. X          The _n__a_r_c routine draws an elliptical arc in normalized
  1060. X          address space.  The ellipse is centered at (x, y) with
  1061. X          semi-axes a and b parallel to the x and y axes,
  1062. X          respectively.  The arc begins at angle1 and continues to
  1063. X          angle2.  The direction of travel is clockwise as viewed on
  1064. X          the screen (counterclockwise in the "inverted" normalized
  1065. X          coordinate system).
  1066. X
  1067. X          The _n__g_r_a_f_c_h_a_r routine displays a vectorized (stroke font)
  1068. X          text character asc_char located at the current location.
  1069. X          The cursor is advanced to the next character position.
  1070. X
  1071. X          The _n__g_r_a_f_s_t_r routine displays a character string using a
  1072. X          stroke font.
  1073. X
  1074. X          The _g__f_o_n_t_c_t_l routine controls size, aspect ratio, spacing,
  1075. X          angle and slant of stroke font.  The size, aspect ratio and
  1076. X          spacing control height, relative width and relative spacing
  1077. X          of characters, with 1.0 selecting default values.  Changing
  1078. X          size will change the width and spacing appropriately.
  1079. X          Changing width will change the spacing.  Angle is the angle
  1080. X          of a text string in radians, with positive values rotating
  1081. X          the text clockwise.  Slant is the character slant in radians
  1082. X          (typically a number on the order of 0.2), with positive
  1083. X          values slanting the text to the "right," as in italics.
  1084. X
  1085. X          The _c__c_e_l_l_c_h_a_r routine displays a bit mapped character at
  1086. X          the current location.  The cursor is advanced to the next
  1087. X          character position.
  1088. X
  1089. X          The _c__c_e_l_l_s_t_r routine displays a string at the current
  1090. X          location, using bit mapped characters.
  1091. X
  1092. X
  1093. X
  1094. X     Page 3                                          (printed 2/21/89)
  1095. X
  1096. X
  1097. X
  1098. X
  1099. X
  1100. X
  1101. X     GGGGLLLL((((3333LLLL))))               UUUUNNNNIIIIXXXX 5555....0000 ((((00001111 OOOOcccctttt 1111999988888888))))                GGGGLLLL((((3333LLLL))))
  1102. X
  1103. X
  1104. X
  1105. X          The _c__c_u_r_s_o_r routine moves the graphics cursor to a position
  1106. X          corresponding to a character row and column.  This is used
  1107. X          for easy positioning of text drawn with the _c__c_e_l_l_s_t_r
  1108. X          routine.
  1109. X
  1110. X          The _g__p_i_x__m_o_d_e routine establishes the active OR mode or XOR
  1111. X          mode pixel setting mode, and returns the previous mode
  1112. X          value.
  1113. X
  1114. X          The _g__p_i_x__c_o_l_o_r routine sets the active pixel color, and
  1115. X          returns previous color value.
  1116. X
  1117. X          The _g__w_e_i_g_h_t routine sets the active line thickness, and
  1118. X          returns the previous line thickness value.
  1119. X
  1120. X          The _g__s_t_y_l_e routine sets the active line style (e.g. dot-
  1121. X          dash), and returns the previous line style value.
  1122. X
  1123. X     EEEENNNNVVVVIIIIRRRROOOONNNNMMMMEEEENNNNTTTT
  1124. X          The GLMODE shell variable may be used to specify the default
  1125. X          graphics mode (such as "16" to specify EGA 640x350 color
  1126. X          graphics).  The PLOTDEV shell variable may be used to
  1127. X          specify the printer device to use (such as "lpt" to use
  1128. X          /dev/lpt).
  1129. X
  1130. X     SSSSEEEEEEEE AAAALLLLSSSSOOOO
  1131. X          plot(3), lpset(1), shmcreate(1)
  1132. X
  1133. X     AAAAUUUUTTTTHHHHOOOORRRR
  1134. X          David T Lewis, Ann Arbor, MI, USA
  1135. X          (...!m-net!dtlewis!lewis)
  1136. X
  1137. X     BBBBUUUUGGGGSSSS
  1138. X          The _g__p_i_x__m_o_d_e routine does not set XOR mode for EGA high
  1139. X          res graphics.
  1140. X
  1141. X          The _g__p_i_x__c_o_l_o_r routine does not do anything for EGA high
  1142. X          res graphics.
  1143. X
  1144. X          The _g__w_e_i_g_h_t routine does not do anything (not yet
  1145. X          implemented).
  1146. X
  1147. X          The _a_r_c routine in plot(3) calculates the arc endpoint
  1148. X          differently from the BSD versions.  The BSD version is
  1149. X          simpler and less precise, but will give different display
  1150. X          output in some cases.
  1151. X
  1152. X          Writing in XOR mode is done at the p_wr_pix routine level.
  1153. X          In XOR mode, therefore, routines such as n_box and
  1154. X          n_grafchar will "lose pixels" at line intersections in XOR
  1155. X          mode, due to writing the same pixel twice (that is, turning
  1156. X          in on, then off again).
  1157. X
  1158. X
  1159. X
  1160. X     Page 4                                          (printed 2/21/89)
  1161. X
  1162. X
  1163. X
  1164. X
  1165. X
  1166. X
  1167. X     GGGGLLLL((((3333LLLL))))               UUUUNNNNIIIIXXXX 5555....0000 ((((00001111 OOOOcccctttt 1111999988888888))))                GGGGLLLL((((3333LLLL))))
  1168. X
  1169. X
  1170. X
  1171. X          The _g__i_n_i_t routine sets a signal handler to clean up the
  1172. X          screen before exiting, and _g__f_i_n_i_s_h restores the handler to
  1173. X          its previous value.  This may interfere with an
  1174. X          application's intended signal handling (the DO_CLEANUP macro
  1175. X          in config.h can eliminate this behavior).
  1176. X
  1177. X          For MS-DOS versions, graphics printer output must be done
  1178. X          with BIOS calls. Therefore, the default system printer
  1179. X          device must be used, and the PLOTDEV environment variable
  1180. X          has no meaning.
  1181. X
  1182. X     CCCCAAAAVVVVEEEEAAAATTTTSSSS
  1183. X          No checking is done to control ownership of the console
  1184. X          output.  The user of the program is assumed to be at the
  1185. X          console.  Any checks for this must be done by the
  1186. X          application program.
  1187. X
  1188. X          The EGA and VGA adapters control color and writing modes (OR
  1189. X          or XOR) with output to port addresses on the EGA/VGA card.
  1190. X          On System V/AT, this requires use of the outb() routine with
  1191. X          write access to /dev/mem.  Since this would require the
  1192. X          application program to be suid to root, support for color
  1193. X          and writing modes has not yet been implemented.
  1194. X
  1195. X     SSSSEEEEEEEE AAAALLLLSSSSOOOO
  1196. X          plot(3), plot(1), plot(5).
  1197. X
  1198. X
  1199. X
  1200. X
  1201. X
  1202. X
  1203. X
  1204. X
  1205. X
  1206. X
  1207. X
  1208. X
  1209. X
  1210. X
  1211. X
  1212. X
  1213. X
  1214. X
  1215. X
  1216. X
  1217. X
  1218. X
  1219. X
  1220. X
  1221. X
  1222. X
  1223. X
  1224. X
  1225. X
  1226. X     Page 5                                          (printed 2/21/89)
  1227. X
  1228. X
  1229. X
  1230. XxX--EOF--XxX
  1231. echo restoring n_line.c
  1232. sed 's/^X//' > n_line.c <<XxX--EOF--XxX
  1233. X#ifndef lint
  1234. Xstatic char sccsid[] = "@(#) n_line.c 5.1 89/02/20";
  1235. X#endif
  1236. X
  1237. X/*
  1238. X *    Copyright (c) David T. Lewis 1987, 1988
  1239. X *    All rights reserved.
  1240. X *
  1241. X *    Permission is granted to use this for any personal noncommercial use.
  1242. X *    You may not distribute source or executable code for profit, nor
  1243. X *    may you distribute it with a commercial product without the written
  1244. X *    consent of the author.  Please send modifications to the author for
  1245. X *    inclusion in updates to the program.  Thanks.
  1246. X */
  1247. X
  1248. X/* Fri Jul  3 23:43:36 EDT 1987
  1249. X** dtlewis
  1250. X** Routine to draw a line.
  1251. X*/
  1252. X
  1253. Xextern int n_movepen(), n_draw();
  1254. X
  1255. Xint n_line(x1,y1,x2,y2)  
  1256. X    int x1, y1, x2, y2;
  1257. X{
  1258. X    if (n_movepen(x1,y1)) return(1);
  1259. X    if (n_draw(x2,y2)) return(1);
  1260. X    return(0);
  1261. X}
  1262. XxX--EOF--XxX
  1263.  
  1264.  
  1265.