Annotation of OpenXM_contrib/gnuplot/term/hp26.trm, Revision 1.1
1.1 ! maekawa 1: /*
! 2: * $Id: hp26.trm,v 1.14 1998/04/14 00:17:47 drd Exp $
! 3: */
! 4:
! 5: /* GNUPLOT - HP26.trm */
! 6:
! 7: /*[
! 8: * Copyright 1990 - 1993, 1998
! 9: *
! 10: * Permission to use, copy, and distribute this software and its
! 11: * documentation for any purpose with or without fee is hereby granted,
! 12: * provided that the above copyright notice appear in all copies and
! 13: * that both that copyright notice and this permission notice appear
! 14: * in supporting documentation.
! 15: *
! 16: * Permission to modify the software is granted, but not the right to
! 17: * distribute the complete modified source code. Modifications are to
! 18: * be distributed as patches to the released version. Permission to
! 19: * distribute binaries produced by compiling modified sources is granted,
! 20: * provided you
! 21: * 1. distribute the corresponding source modifications from the
! 22: * released version in the form of a patch file along with the binaries,
! 23: * 2. add special version identification to distinguish your version
! 24: * in addition to the base release version number,
! 25: * 3. provide your name and address as the primary contact for the
! 26: * support of your modified version, and
! 27: * 4. retain our contact information in regard to use of the base
! 28: * software.
! 29: * Permission to distribute the released version of the source code along
! 30: * with corresponding source modifications in the form of a patch file is
! 31: * granted with same provisions 2 through 4 for binary distributions.
! 32: *
! 33: * This software is provided "as is" without express or implied warranty
! 34: * to the extent permitted by applicable law.
! 35: ]*/
! 36:
! 37: /*
! 38: * This file is included by ../term.c.
! 39: *
! 40: * This terminal driver supports:
! 41: * HP2623A
! 42: *
! 43: * AUTHORS
! 44: * luecken@udel.edu (Bruce Lueckenhoff)
! 45: * hplvlch!ch (Chuck Heller)
! 46: *
! 47: * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
! 48: *
! 49: */
! 50:
! 51: /*
! 52: * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
! 53: */
! 54:
! 55: #include "driver.h"
! 56:
! 57: #ifdef TERM_REGISTER
! 58: register_term(hp2623a)
! 59: #endif
! 60:
! 61: #ifdef TERM_PROTO
! 62: TERM_PUBLIC void HP26_vector __PROTO((unsigned int x, unsigned int y));
! 63: TERM_PUBLIC void HP26_move __PROTO((unsigned int x, unsigned int y));
! 64: TERM_PUBLIC void HP26_init __PROTO((void));
! 65: TERM_PUBLIC void HP26_graphics __PROTO((void));
! 66: TERM_PUBLIC void HP26_text __PROTO((void));
! 67: TERM_PUBLIC void HP26_reset __PROTO((void));
! 68: TERM_PUBLIC int HP26_text_angle __PROTO((int ang));
! 69: TERM_PUBLIC void HP26_put_text __PROTO((unsigned int x, unsigned int y, char *str));
! 70: TERM_PUBLIC void HP26_linetype __PROTO((int linetype));
! 71: TERM_PUBLIC void HP26_line_and_point __PROTO((unsigned int x, unsigned int y, int number));
! 72:
! 73: #define HP26_XMAX 512
! 74: #define HP26_YMAX 390
! 75:
! 76: /* Use a size 1 character, or a 7 x 10 grid. */
! 77: #define HP26_VCHAR 10
! 78: #define HP26_HCHAR 7
! 79: #define HP26_VTIC 5
! 80: #define HP26_HTIC 5
! 81: #endif /* TERM_PROTO */
! 82:
! 83: #ifndef TERM_PROTO_ONLY
! 84: #ifdef TERM_BODY
! 85: /* include the stream compaction routines */
! 86:
! 87: #define HP26_XLAST (HP26_XMAX - 1)
! 88: #define HP26_YLAST (HP26_XMAX - 1)
! 89:
! 90: void HP26_do_point __PROTO((unsigned int x, unsigned int y, int number));
! 91: int compact_slope __PROTO((int xp[], int yp[], int isa_move[], int *sz, double delta));
! 92: int compact_int __PROTO((int xp[], int yp[], int isa_move[], int *size));
! 93: struct _HP26_Buffer_Node *BN_create __PROTO((int index, int size, int linetype));
! 94: void BN_delete __PROTO((struct _HP26_Buffer_Node * the_node));
! 95: int HP26_flush __PROTO((struct _HP26_Buffer_Node * the_buff));
! 96: void HP26_handle_overflow __PROTO((void));
! 97:
! 98: #include "compact.c"
! 99:
! 100: typedef struct _HP26_Buffer_Node {
! 101: int index;
! 102: int size;
! 103: int next;
! 104: int linetype;
! 105: int *x;
! 106: int *y;
! 107: TBOOLEAN *isa_move;
! 108: } HP26_Buffer_Node;
! 109:
! 110: /* constructor method */
! 111: HP26_Buffer_Node *BN_create(index, size, linetype)
! 112: int index, size, linetype;
! 113: {
! 114: HP26_Buffer_Node *the_node;
! 115: the_node = (HP26_Buffer_Node *) malloc(sizeof(HP26_Buffer_Node));
! 116: the_node->index = index;
! 117: the_node->linetype = linetype;
! 118: the_node->size = size;
! 119: the_node->next = 0;
! 120: the_node->x = (int *) calloc(the_node->size, sizeof(int));
! 121: the_node->y = (int *) calloc(the_node->size, sizeof(int));
! 122: the_node->isa_move = (TBOOLEAN *) calloc(the_node->size, sizeof(TBOOLEAN));
! 123: if (the_node->x == NULL
! 124: || the_node->y == NULL
! 125: || the_node->isa_move == NULL)
! 126: return (NULL);
! 127: else
! 128: return (the_node);
! 129: }
! 130:
! 131: /* destructor method */
! 132: void BN_delete(the_node)
! 133: HP26_Buffer_Node *the_node;
! 134: {
! 135: free(the_node->x);
! 136: free(the_node->y);
! 137: free(the_node->isa_move);
! 138: free(the_node);
! 139: }
! 140:
! 141: /* 2 for border and axes + 9 for plots + 1 for dots */
! 142: #define HP26_gnu_map_size 12
! 143: HP26_Buffer_Node *HP26_gnu_map[HP26_gnu_map_size];
! 144: HP26_Buffer_Node *HP26_buff;
! 145: int HP26_pen_x;
! 146: int HP26_pen_y;
! 147: int HP26_angle;
! 148: int HP26_cursor_x;
! 149: int HP26_cursor_y;
! 150: TBOOLEAN HP26_in_text;
! 151: int HP26_linetype_current;
! 152: int HP26_reduction_int;
! 153: int HP26_reduction_slope;
! 154: int HP26_overflows;
! 155: int HP26_nop_move;
! 156: int HP26_nop_vect;
! 157: int HP26_nop_line;
! 158:
! 159: /* linetype stuff */
! 160: #define SOLID 1
! 161: #define USER 2
! 162: #define LINE3 3
! 163: #define LINE4 4
! 164: #define LINE5 5
! 165: #define LINE6 6
! 166: #define DOTS 7
! 167: #define LINE8 8
! 168: #define LINE9 9
! 169: #define LINE10 10
! 170: #define POINT 11
! 171:
! 172:
! 173:
! 174: #define swap(a, b) a ^= b; b ^= a; a ^= b;
! 175:
! 176: char HP26_bin_short_table[32] =
! 177: {
! 178: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>',
! 179: '?', ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-',
! 180: '.', '/'
! 181: };
! 182: /* encodes an integer (assumed to be in range) into
! 183: binary short incremental format (j)*/
! 184: #define short_encode(n) (HP26_bin_short_table[n+16])
! 185:
! 186: /* tells whether a given delta_x,delta_y pair can be expressed in
! 187: binary short incremental format */
! 188: #define qualified(dx,dy) ((dx>-17)&&(dy>-17)&&(dx<16)&&(dy<16))
! 189:
! 190:
! 191: char HP26_bin_table[32] =
! 192: {
! 193: ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-',
! 194: '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<',
! 195: '=', '>', '?'
! 196: };
! 197: /* returns the high byte of integer n in binary absolute format (i) */
! 198: #define bin_encode_hi(n) (HP26_bin_table[n>>5])
! 199: /* returns the low byte of integer n in binary absolute format (i) */
! 200: #define bin_encode_lo(n) (HP26_bin_table[n & 31])
! 201:
! 202:
! 203:
! 204: /* the guts of the program
! 205: -- first checks if any work need be done and, failing that, returns
! 206: immediately
! 207: -- tries to compress the vector stream
! 208: -- goes through the buffer, using binary short incremental (2 bytes/point)
! 209: as much as possible, even if must output two pairs to express one vector
! 210: (it's no more expensive, and will hopefully damp any excessive switching
! 211: back and forth between the two formats)
! 212: if can't use binary short incremental, use binary
! 213: absolute(4 bytes/point)
! 214: -- finally, resets the HP26_next pointer to zero */
! 215: int HP26_flush(the_buff)
! 216: HP26_Buffer_Node *the_buff;
! 217: {
! 218: int i, delta_x, delta_y, half_dx, half_dy;
! 219: int *buff_x, *buff_y;
! 220: TBOOLEAN *isa_move;
! 221: TBOOLEAN bin_short;
! 222:
! 223: if (the_buff->next == 0)
! 224: return (FALSE);
! 225: /* init pointers for easy access */
! 226: buff_x = the_buff->x;
! 227: buff_y = the_buff->y;
! 228: isa_move = the_buff->isa_move;
! 229: if (HP26_in_text) {
! 230: fputs("\033*dT", gpoutfile);
! 231: HP26_in_text = FALSE;
! 232: }
! 233: if (HP26_linetype_current != the_buff->linetype
! 234: && (the_buff->next > 1 || !isa_move[0])) {
! 235: fprintf(gpoutfile, "\033*m%dB", the_buff->linetype);
! 236: HP26_linetype_current = the_buff->linetype;
! 237: }
! 238: /* try to compress the stream */
! 239: if (the_buff->next > 30 && the_buff->linetype != POINT) {
! 240: /* HP26_reduction_int += compact_int(buff_x,buff_y,isa_move, &(the_buff->next)); */
! 241: HP26_reduction_slope += compact_slope(buff_x, buff_y, isa_move, &(the_buff->next), 0.1);
! 242: }
! 243: /* start escape sequence */
! 244: fputs("\033*p", gpoutfile);
! 245: /* initialize the state: binary short incremental or binary absolute */
! 246: delta_x = buff_x[0] - HP26_pen_x;
! 247: delta_y = buff_y[0] - HP26_pen_y;
! 248: if (qualified(delta_x, delta_y)) {
! 249: fputc('j', gpoutfile);
! 250: bin_short = TRUE;
! 251: } else {
! 252: fputc('i', gpoutfile);
! 253: bin_short = FALSE;
! 254: }
! 255: /* now work through the list */
! 256: for (i = 0; i < the_buff->next; i++) {
! 257: if (i > 0) {
! 258: delta_x = buff_x[i] - buff_x[i - 1];
! 259: delta_y = buff_y[i] - buff_y[i - 1];
! 260: }
! 261: if ((delta_x == 0) && (delta_y == 0)) {
! 262: if (i > 0 && !isa_move[i - 1] && !isa_move[i]) {
! 263: /* allow null vectors only when drawing dots */
! 264: HP26_nop_vect++;
! 265: continue;
! 266: } else if (isa_move[i]) {
! 267: /* a null move */
! 268: HP26_nop_move++;
! 269: continue;
! 270: }
! 271: } else if (i > 0
! 272: && i + 1 < the_buff->next
! 273: && isa_move[i]
! 274: && isa_move[i + 1]) {
! 275: /* consecutive moves are condensed into one */
! 276: HP26_nop_move++;
! 277: continue;
! 278: } else if (!qualified(delta_x, delta_y)
! 279: && i > 0
! 280: && i + 2 < the_buff->next
! 281: && isa_move[i]
! 282: && !isa_move[i + 1]
! 283: && isa_move[i + 2]
! 284: && qualified(buff_x[i + 1] - buff_x[i - 1], buff_y[i + 1] - buff_y[i - 1])) {
! 285: swap(buff_x[i], buff_x[i + 1]);
! 286: swap(buff_y[i], buff_y[i + 1]);
! 287: /* set up new delta_x & delta_y */
! 288: delta_x = buff_x[i] - buff_x[i - 1];
! 289: delta_y = buff_y[i] - buff_y[i - 1];
! 290: }
! 291: if (qualified(delta_x, delta_y)) {
! 292: if (!bin_short) {
! 293: fputc('j', gpoutfile);
! 294: bin_short = TRUE;
! 295: }
! 296: if (isa_move[i])
! 297: fputc('a', gpoutfile);
! 298: fputc(short_encode(delta_x), gpoutfile);
! 299: fputc(short_encode(delta_y), gpoutfile);
! 300: } else {
! 301: half_dx = (delta_x + (delta_x > 0 ? 1 : -1)) / 2;
! 302: half_dy = (delta_y + (delta_y > 0 ? 1 : -1)) / 2;
! 303: if (bin_short && qualified(half_dx, half_dy)) {
! 304: if (isa_move[i])
! 305: fputc('a', gpoutfile);
! 306: fputc(short_encode(half_dx), gpoutfile);
! 307: fputc(short_encode(half_dy), gpoutfile);
! 308: if (isa_move[i])
! 309: fputc('a', gpoutfile);
! 310: fputc(short_encode(delta_x - half_dx), gpoutfile);
! 311: fputc(short_encode(delta_y - half_dy), gpoutfile);
! 312: } else {
! 313: if (bin_short) {
! 314: bin_short = FALSE;
! 315: fputc('i', gpoutfile);
! 316: }
! 317: if (isa_move[i])
! 318: fputc('a', gpoutfile);
! 319: fputc(bin_encode_hi(buff_x[i]), gpoutfile);
! 320: fputc(bin_encode_lo(buff_x[i]), gpoutfile);
! 321: fputc(bin_encode_hi(buff_y[i]), gpoutfile);
! 322: fputc(bin_encode_lo(buff_y[i]), gpoutfile);
! 323: }
! 324: }
! 325: } /* end for.. */
! 326: /* the term doesn't seem to mind leaving this out */
! 327: /* finish the escape sequence */
! 328: fputc('Z', gpoutfile);
! 329: /* set these for next time */
! 330: HP26_pen_x = buff_x[the_buff->next - 1];
! 331: HP26_pen_y = buff_y[the_buff->next - 1];
! 332: the_buff->next = 0;
! 333: return (TRUE);
! 334: }
! 335:
! 336: void HP26_handle_overflow()
! 337: {
! 338: HP26_Buffer_Node *bigger, *old;
! 339: int x, y;
! 340: x = (HP26_buff->x)[HP26_buff->next - 1];
! 341: y = (HP26_buff->y)[HP26_buff->next - 1];
! 342: HP26_flush(HP26_buff);
! 343: bigger = BN_create(HP26_buff->index, HP26_buff->size * 2,
! 344: HP26_buff->linetype);
! 345: if (bigger != NULL) {
! 346: old = HP26_buff;
! 347: HP26_gnu_map[bigger->index] = bigger;
! 348: /* special case since DOTS entry is shared 3 ways */
! 349: if (bigger->index == 0) {
! 350: HP26_gnu_map[1] = bigger;
! 351: HP26_gnu_map[3] = bigger;
! 352: }
! 353: HP26_buff = bigger;
! 354: BN_delete(old);
! 355: }
! 356: (HP26_buff->x)[0] = x;
! 357: (HP26_buff->y)[0] = y;
! 358: (HP26_buff->isa_move)[0] = TRUE;
! 359: HP26_buff->next = 1;
! 360: HP26_overflows++;
! 361: }
! 362:
! 363: /* checks for NOP, overcapacity condition, and then adds vector to the list */
! 364: TERM_PUBLIC void HP26_vector(x, y)
! 365: unsigned int x, y;
! 366: {
! 367: if (HP26_buff->next > 2
! 368: && x == (HP26_buff->x)[HP26_buff->next - 1]
! 369: && y == (HP26_buff->y)[HP26_buff->next - 1]
! 370: && !(HP26_buff->isa_move)[HP26_buff->next - 1]) {
! 371: HP26_nop_vect++;
! 372: return;
! 373: }
! 374: if (HP26_buff->next == HP26_buff->size)
! 375: HP26_handle_overflow();
! 376: /* otherwise add to the list */
! 377: (HP26_buff->x)[HP26_buff->next] = x;
! 378: (HP26_buff->y)[HP26_buff->next] = y;
! 379: (HP26_buff->isa_move)[HP26_buff->next] = FALSE;
! 380: HP26_buff->next++;
! 381: }
! 382:
! 383: /* checks for NOP, checks for overcapacity, puts self on list */
! 384: TERM_PUBLIC void HP26_move(x, y)
! 385: unsigned int x, y;
! 386: {
! 387: if (HP26_buff->next > 0) {
! 388: if (((HP26_buff->x)[HP26_buff->next - 1] == x)
! 389: && ((HP26_buff->y)[HP26_buff->next - 1] == y)) {
! 390: /* null moves are NOP's */
! 391: HP26_nop_move++;
! 392: return;
! 393: } else if ((HP26_buff->isa_move)[HP26_buff->next - 1]) {
! 394: /* consecutive moves are NOP's */
! 395: (HP26_buff->x)[HP26_buff->next - 1] = x;
! 396: (HP26_buff->y)[HP26_buff->next - 1] = y;
! 397: HP26_nop_move++;
! 398: return;
! 399: }
! 400: }
! 401: if (HP26_buff->next == HP26_buff->size)
! 402: HP26_handle_overflow();
! 403: (HP26_buff->x)[HP26_buff->next] = x;
! 404: (HP26_buff->y)[HP26_buff->next] = y;
! 405: (HP26_buff->isa_move)[HP26_buff->next] = TRUE;
! 406: HP26_buff->next++;
! 407: return;
! 408: }
! 409:
! 410: TERM_PUBLIC void HP26_init()
! 411: {
! 412: HP26_gnu_map[-2 + 2] = BN_create(0, 2048, DOTS); /* border */
! 413: HP26_gnu_map[-1 + 2] = HP26_gnu_map[-2 + 2]; /* axes */
! 414: HP26_gnu_map[0 + 2] = BN_create(2, 3072, SOLID); /* plot 0 */
! 415: HP26_gnu_map[1 + 2] = HP26_gnu_map[-2 + 2]; /* plot 1 */
! 416: HP26_gnu_map[2 + 2] = BN_create(4, 1024, LINE5); /* plot 2 */
! 417: HP26_gnu_map[3 + 2] = BN_create(5, 256, LINE6); /* plot 3 */
! 418: HP26_gnu_map[4 + 2] = BN_create(6, 256, LINE8); /* plot 4 */
! 419: HP26_gnu_map[5 + 2] = BN_create(7, 128, LINE9); /* plot 5 */
! 420: HP26_gnu_map[6 + 2] = BN_create(8, 128, LINE10); /* plot 6 */
! 421: HP26_gnu_map[7 + 2] = BN_create(9, 64, LINE6); /* plot 7 */
! 422: HP26_gnu_map[8 + 2] = BN_create(10, 64, LINE4); /* plot 8 */
! 423: HP26_gnu_map[9 + 2] = BN_create(11, 512, POINT); /* point plot */
! 424: HP26_buff = HP26_gnu_map[10]; /* set to an unlikely linetype */
! 425: HP26_linetype_current = 0; /* set to force a linetype change */
! 426: HP26_angle = 1; /* left to right, default */
! 427: fputs("\033*mp1m2a2Q", gpoutfile);
! 428: /* 1 2 3 4
! 429: 1. make text upright
! 430: 2. select text size 1
! 431: 3. make SET the default drawing op
! 432: 4. left justify text */
! 433: fflush(gpoutfile);
! 434: }
! 435:
! 436:
! 437: TERM_PUBLIC void HP26_graphics()
! 438: {
! 439: fputs("\033*daflsC", gpoutfile);
! 440: /* 12345
! 441: 1. clear graphics display
! 442: 2. shut off the alphanumeric display
! 443: 3. graphics cursor off
! 444: 4. into graphics text mode
! 445: 5. enable graphics display */
! 446: /* set the pen & cursor positions to force an initial absolute move */
! 447: HP26_pen_x = HP26_pen_y = -200;
! 448: HP26_cursor_x = HP26_cursor_y = 800;
! 449: HP26_in_text = TRUE;
! 450: /* initialize statistics */
! 451: HP26_reduction_int = 0;
! 452: HP26_reduction_slope = 0;
! 453: HP26_nop_move = 0;
! 454: HP26_nop_vect = 0;
! 455: HP26_nop_line = 0;
! 456: HP26_overflows = 0;
! 457: }
! 458:
! 459:
! 460: TERM_PUBLIC void HP26_text()
! 461: {
! 462: int i, j, curr;
! 463:
! 464: /* always flush the current line first */
! 465: for (i = 0; i < HP26_gnu_map_size; i++)
! 466: if ((HP26_gnu_map[i])->linetype == HP26_linetype_current)
! 467: HP26_flush(HP26_gnu_map[i]);
! 468: /* now flush the rest of the lines */
! 469: for (i = 0; i < HP26_gnu_map_size; i++) {
! 470: HP26_flush(HP26_gnu_map[i]);
! 471: curr = HP26_gnu_map[i]->linetype;
! 472: for (j = 0; j < HP26_gnu_map_size; j++)
! 473: if ((HP26_gnu_map[j])->linetype == curr)
! 474: HP26_flush(HP26_gnu_map[j]);
! 475: }
! 476: fputs("\033*deT", gpoutfile);
! 477: /* 12
! 478: 1. turn on the alphanumeric display
! 479: 2. back to text mode */
! 480: fflush(gpoutfile);
! 481: /* informational: tells how many points compressed, how
! 482: many NOP's of each type, and how many times a buffer
! 483: overflowed during this plot */
! 484: /*
! 485: if(HP26_reduction_int
! 486: + HP26_reduction_slope
! 487: + HP26_nop_move
! 488: + HP26_nop_vect
! 489: + HP26_overflows
! 490: + HP26_nop_line > 0){
! 491: if (HP26_reduction_int>0)
! 492: printf("%d int-compress",HP26_reduction_int);
! 493: if (HP26_reduction_slope>0)
! 494: printf("%d slope-compress",HP26_reduction_slope);
! 495: if (HP26_nop_move>0)
! 496: printf(" %d nop_move",HP26_nop_move);
! 497: if (HP26_nop_vect>0)
! 498: printf(" %d nop_vect",HP26_nop_vect);
! 499: if (HP26_nop_line>0)
! 500: printf(" %d nop_line",HP26_nop_line);
! 501: if (HP26_overflows>0)
! 502: printf(" %d buffer overflows",HP26_overflows);
! 503: printf("\n");
! 504: }
! 505: */
! 506: }
! 507:
! 508: TERM_PUBLIC void HP26_reset()
! 509: {
! 510: int i;
! 511: for (i = 2; i < HP26_gnu_map_size; i++)
! 512: BN_delete(HP26_gnu_map[i]);
! 513: }
! 514:
! 515: TERM_PUBLIC int HP26_text_angle(ang)
! 516: int ang;
! 517: {
! 518: HP26_angle = ang + 1;
! 519: fprintf(gpoutfile, "\033*m%dN", HP26_angle);
! 520: return (TRUE);
! 521: }
! 522:
! 523:
! 524: TERM_PUBLIC void HP26_put_text(x, y, str)
! 525: unsigned int x, y;
! 526: char *str;
! 527: {
! 528: char abs_str[10], rel_str[10];
! 529:
! 530: if (!strlen(str))
! 531: return;
! 532: else {
! 533: fputs("\033*d", gpoutfile);
! 534: if (!HP26_in_text) {
! 535: fputc('s', gpoutfile);
! 536: HP26_in_text = TRUE;
! 537: }
! 538: sprintf(rel_str, "%d,%dP", x - HP26_cursor_x, y - HP26_cursor_y);
! 539: sprintf(abs_str, "%d,%dO", x, y);
! 540: if (strlen(rel_str) < strlen(abs_str))
! 541: fputs(rel_str, gpoutfile);
! 542: else
! 543: fputs(abs_str, gpoutfile);
! 544: fputs(str, gpoutfile);
! 545: HP26_pen_x = HP26_cursor_x = x;
! 546: HP26_pen_y = HP26_cursor_y = y;
! 547: }
! 548: /*
! 549: tmp = &(HP26_all_buffers[HP26_linetype_current]);
! 550: tmp->x[tmp->next] = x;
! 551: tmp->y[tmp->next] = y;
! 552: tmp->isa_move[tmp->next] = TRUE;
! 553: tmp->next++;
! 554: HP26_flush(tmp);
! 555: fprintf(gpoutfile,"\033*l%s\r",str);
! 556: */
! 557: return;
! 558: }
! 559:
! 560:
! 561: /* checks for NOP, sets HP26_buff to point to the right buffer */
! 562: TERM_PUBLIC void HP26_linetype(linetype)
! 563: int linetype;
! 564: {
! 565: if (linetype > 8)
! 566: linetype %= 9;
! 567: linetype += 2;
! 568: if (HP26_gnu_map[linetype] == HP26_buff) {
! 569: HP26_nop_line++;
! 570: return; /* gnuplot just sent us another NOP */
! 571: }
! 572: HP26_buff = HP26_gnu_map[linetype];
! 573: }
! 574:
! 575:
! 576:
! 577: /* switches to a solid linetype and calls do_point, then switches back */
! 578: TERM_PUBLIC void HP26_line_and_point(x, y, number)
! 579: unsigned int x, y;
! 580: int number;
! 581: {
! 582: int line_save, not_solid;
! 583:
! 584: /* shut up warnings with dummy initializer -SB */
! 585: line_save = 0;
! 586: not_solid = (HP26_buff->linetype != SOLID);
! 587: if (not_solid) {
! 588: line_save = HP26_buff->linetype;
! 589: HP26_linetype(0); /*switch to a solid line */
! 590: }
! 591: HP26_do_point(x, y, number);
! 592: if (not_solid)
! 593: HP26_linetype(line_save);
! 594: }
! 595:
! 596:
! 597: /* provides 9 point types so they stay in sync with the linetypes
! 598: puts simpler point types first on the assumption they are more
! 599: frequently used */
! 600: void HP26_do_point(x, y, number)
! 601: unsigned int x, y;
! 602: int number;
! 603: {
! 604: int htic, vtic;
! 605: HP26_Buffer_Node *tmp;
! 606:
! 607: vtic = HP26_VTIC / 2;
! 608: htic = HP26_HTIC / 2;
! 609: if (number < 0) {
! 610: /* do a dot -- special case */
! 611: tmp = HP26_buff;
! 612: HP26_buff = HP26_gnu_map[11]; /* point plot */
! 613: HP26_vector(x, y);
! 614: HP26_buff = tmp;
! 615: }
! 616: switch (number % 9) {
! 617: case 0:
! 618: /* do triangle */
! 619: HP26_move(x - htic, y - vtic);
! 620: HP26_vector(x, y + vtic);
! 621: HP26_vector(x + htic, y - vtic);
! 622: HP26_vector(x - htic, y - vtic);
! 623: break;
! 624: case 1:
! 625: /* do nambla */
! 626: HP26_move(x - htic, y + vtic);
! 627: HP26_vector(x, y - vtic);
! 628: HP26_vector(x + htic, y + vtic);
! 629: HP26_vector(x - htic, y + vtic);
! 630: break;
! 631: case 2:
! 632: /* do left triangle */
! 633: HP26_move(x - htic, y);
! 634: HP26_vector(x + htic, y + vtic);
! 635: HP26_vector(x + htic, y - vtic);
! 636: HP26_vector(x - htic, y);
! 637: break;
! 638: case 3:
! 639: /* do right triangle */
! 640: HP26_move(x + htic, y);
! 641: HP26_vector(x - htic, y + vtic);
! 642: HP26_vector(x - htic, y - vtic);
! 643: HP26_vector(x + htic, y);
! 644: break;
! 645: case 4:
! 646: /* do box */
! 647: HP26_move(x - htic, y - vtic);
! 648: HP26_vector(x - htic, y + vtic);
! 649: HP26_vector(x + htic, y + vtic);
! 650: HP26_vector(x + htic, y - vtic);
! 651: HP26_vector(x - htic, y - vtic);
! 652: break;
! 653: case 5:
! 654: /* do plus */
! 655: HP26_move(x, y + vtic);
! 656: HP26_vector(x, y - vtic);
! 657: HP26_move(x - htic, y);
! 658: HP26_vector(x + htic, y);
! 659: break;
! 660: case 6:
! 661: /* do X */
! 662: HP26_move(x + htic, y + vtic);
! 663: HP26_vector(x - htic, y - vtic);
! 664: HP26_move(x - htic, y + vtic);
! 665: HP26_vector(x + htic, y - vtic);
! 666: break;
! 667: default:
! 668: /* do diamond */
! 669: HP26_move(x, y - vtic);
! 670: HP26_vector(x - htic, y);
! 671: HP26_vector(x, y + vtic);
! 672: HP26_vector(x + htic, y);
! 673: HP26_vector(x, y - vtic);
! 674: break;
! 675: }
! 676: }
! 677:
! 678: #endif /* TERM_BODY */
! 679:
! 680: #ifdef TERM_TABLE
! 681:
! 682: TERM_TABLE_START(hp2623a_driver)
! 683: "hp2623A", "HP2623A and maybe others",
! 684: HP26_XMAX, HP26_YMAX, HP26_VCHAR, HP26_HCHAR,
! 685: HP26_VTIC, HP26_HTIC, options_null, HP26_init, HP26_reset,
! 686: HP26_text, null_scale, HP26_graphics, HP26_move, HP26_vector,
! 687: HP26_linetype, HP26_put_text, HP26_text_angle,
! 688: null_justify_text, HP26_line_and_point, do_arrow, set_font_null
! 689: TERM_TABLE_END(hp2623a_driver)
! 690:
! 691: #undef LAST_TERM
! 692: #define LAST_TERM hp2623a_driver
! 693:
! 694: #endif /* TERM_TABLE */
! 695: #endif /* TERM_PROTO_ONLY */
! 696:
! 697: #ifdef TERM_HELP
! 698: START_HELP(hp2623a)
! 699: "1 hp2623a",
! 700: "?commands set terminal hp2623a",
! 701: "?set terminal hp2623a",
! 702: "?set term hp2623a",
! 703: "?terminal hp2623a",
! 704: "?term hp2623a",
! 705: "?hp2623a",
! 706: " The `hp2623a` terminal driver supports the Hewlett Packard HP2623A. It has",
! 707: " no options."
! 708: END_HELP(hp2623a)
! 709: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>