/* @(#)news.c 1.10 90/02/02 * * These are the NeWS dependent graphics routines used by calctool. * * Copyright (c) Rich Burridge. * Sun Microsystems, Australia - All rights reserved. * * Permission is given to distribute these sources, as long as the * copyright messages are not removed, and no monies are exchanged. * * No responsibility is taken for any errors or inaccuracies inherent * either to the comments or the code of this program, but if * reported to me then an attempt will be made to fix them. */ #include #include #include "calctool.h" #include "color.h" #include "extern.h" #include extern FILE *PostScript ; extern FILE *PostScriptInput ; clear_canvas(canvas, color) enum can_type canvas ; int color ; { char cantype ; if (canvas == KEYCANVAS) cantype = 'K' ; else if (canvas == REGCANVAS) cantype = 'R' ; FPRINTF(PostScript,"%d %cC PSClearCanvas\n", color, cantype) ; FFLUSH(PostScript) ; } close_frame() { FPRINTF(PostScript, "PSCloseFrame\n") ; FFLUSH(PostScript) ; } color_area(x, y, width, height, color) int x, y, width, height, color ; { FPRINTF(PostScript, "%d %d %d %d %d PSColorArea\n", color, x, width, height, y) ; FFLUSH(PostScript) ; } create_menu(mtype) /* Create popup menu for right button press. */ enum menu_type mtype ; { int i ; FPRINTF(PostScript, "/Menu%1d [\n", (int) mtype) ; for (i = 0; i < MAXREGS; i++) { switch (mtype) { case M_ACC : /* Accuracies. */ case M_EXCH : /* Register exchange. */ case M_LSHIFT : /* Left shift. */ case M_RCL : /* Register recall. */ case M_RSHIFT : /* Right shift. */ case M_STO : /* Register store. */ FPRINTF(PostScript, "(%s)", num_names[i]) ; break ; case M_CON : /* Constants. */ FPRINTF(PostScript, "(%s)", con_names[i]) ; break ; case M_FUN : /* Functions. */ FPRINTF(PostScript, "(%s)", fun_names[i]) ; break ; } FPRINTF(PostScript, " { %1d typedprint }\n", (int) mtype) ; } FPRINTF(PostScript, "] /new DefaultMenu send def\n") ; FFLUSH(PostScript) ; } destroy_frame() { exit(0) ; } do_menu(mtype) /* Popup appropriate menu and get value. */ enum menu_type mtype ; { int mval ; FPRINTF(PostScript, "{ /ParentMenu Menu%1d def } ClientMenu send\n", (int) mtype) ; FFLUSH(PostScript) ; pscanf(PostScriptInput, "%d", &mval) ; return(mval) ; } drawline(x1, y1, x2, y2) int x1, y1, x2, y2 ; { FPRINTF(PostScript, "%d %d %d %d PSDrawLine\n", x1, x2, y1, y2) ; FFLUSH(PostScript) ; } draw_regs() { FPRINTF(PostScript, "PSDrawRegs\n") ; FFLUSH(PostScript) ; } drawtext(x, y, window, fontno, color, str) enum can_type window ; enum font_type fontno ; int x, y, color ; char *str ; { int i ; char font, fonttype[6], line[MAXLINE] ; if (fontno == SFONT) STRCPY(fonttype, "SFont") ; else if (fontno == NFONT) STRCPY(fonttype, "NFont") ; else if (fontno == BFONT) STRCPY(fonttype, "BFont") ; if (window == KEYCANVAS) font = 'K' ; else if (window == REGCANVAS) font = 'R' ; line[0] = '\0' ; for (i = 0; i < strlen(str); i++) switch (str[i]) { case '\\' : STRCAT(line,"\\\\") ; break ; case '(' : STRCAT(line,"\\(") ; break ; case ')' : STRCAT(line,"\\)") ; break ; default : STRNCAT(line, &str[i], 1) ; } FPRINTF(PostScript, "(%s) %d %cCHeight %d ", line, x, font, y) ; FPRINTF(PostScript, "%s %d %cC PSMakeText\n", fonttype, color, font) ; FFLUSH(PostScript) ; } get_display() /* GET function key was pressed. */ { } get_next_event() { int type ; FFLUSH(PostScript) ; if (pscanf(PostScriptInput, "%d", &type) == EOF) destroy_frame() ; switch (type) { case KEYBOARD : pscanf(PostScriptInput, "%d", &cur_ch) ; case LEFT_DOWN : case MIDDLE_DOWN : case LEFT_UP : case MIDDLE_UP : pscanf(PostScriptInput, "%d%d", &curx, &cury) ; } return(type) ; } handle_selection() /* Handle the GET function key being pressed. */ { } init_fonts() { FPRINTF(PostScript, "PSInitFonts\n") ; FFLUSH(PostScript) ; nfont_width = 9 ; } init_ws_type() { gtype = NEWS ; if (ps_open_PostScript() < 0) return -1 ; if (send_ps_file(NEWSFILE) == -1) { FCLOSE(PostScript) ; return(-1) ; } FFLUSH(PostScript) ; if (ferror(PostScript)) { FCLOSE(PostScript) ; return(-1) ; } FPRINTF(PostScript, "PSIsColor\n") ; FFLUSH(PostScript) ; pscanf(PostScriptInput, "%d", &iscolor) ; FPRINTF(PostScript, "PSInitialise\n") ; FFLUSH(PostScript) ; return(0) ; } load_colors() /* Create and load calctool color map. */ { u_char red[CALC_COLORSIZE], green[CALC_COLORSIZE], blue[CALC_COLORSIZE] ; int i ; calc_colorsetup(red, green, blue) ; FPRINTF(PostScript, "%d PSMakeColorTable\n", CALC_COLORSIZE) ; for (i = 0; i < CALC_COLORSIZE; i++) FPRINTF(PostScript, "%d %d %d %d PSLoadColor\n", i, blue[i], green[i], red[i]) ; FFLUSH(PostScript) ; } /*ARGSUSED*/ make_frames(argc, argv) int argc ; char *argv[] ; { FPRINTF(PostScript, "%d %d %d %d %d %d %d PSMakeFrames\n", wx, wy, TWIDTH, DISPLAY+THEIGHT, ix, iy, iconic) ; FFLUSH(PostScript) ; } make_icon() { int depth, i, j, k, n ; char line[MAXLINE], name[MAXLINE], v[16][5] ; FILE *fin ; if (iscolor) STRCPY(name, "calctool.color.icon") ; else STRCPY(name, "calctool.icon") ; if ((fin = fopen(name, "r")) == NULL) { FPRINTF(stderr, "%s: can't open %s.\n", progname, name) ; exit(1) ; } depth = (iscolor) ? 8 : 1 ; FPRINTF(PostScript, "/calctoolIcon %d %d %1d { } { <\n", ICONWIDTH, ICONHEIGHT, depth) ; FGETS(line, MAXLINE, fin) ; FGETS(line, MAXLINE, fin) ; if (iscolor) { for (i = 0; i < 64; i++) for (j = 0; j < 4; j++) { FGETS(line, MAXLINE, fin) ; for (k = 0; k < 16; k++) { if (!(k % 2)) STRNCPY(v[k], &line[(k/2)*7+3], 2) ; else STRNCPY(v[k], &line[(k/2)*7+5], 2) ; v[k][2] = '\0' ; } if (j == 0 || j == 1) n = 16 ; else if (j == 2) n = 10 ; if (j != 3) { for (k = 0; k < n; k++) FPRINTF(PostScript, "%.2s ", v[k]) ; FPRINTF(PostScript, "\n") ; } } } else { for (i = 0; i < 32; i++) { FGETS(line, MAXLINE, fin) ; for (j = 0; j < 8; j++) { STRNCPY(v[j], &line[j*7+3], 4) ; v[j][4] = '\0' ; } FPRINTF(PostScript, "%.4s %.4s %.4s %.4s %.4s %.4s\n", v[0], v[1], v[2], v[4], v[5], v[6]) ; } } FPRINTF(PostScript, "> } buildimage def\n") ; FFLUSH(PostScript) ; FCLOSE(fin) ; } make_items() /* Null routine. */ {} make_subframes() /* Null routine. */ {} send_ps_file(fname) char *fname ; { FILE *stream ; int c ; if ((stream = fopen(fname,"r")) == NULL) return -1 ; while ((c = getc(stream)) != EOF) PUTC(c, PostScript) ; FCLOSE(stream) ; return 0 ; } set_cursor(type) int type ; { FPRINTF(PostScript, "%d PSSetCursor\n", type) ; FFLUSH(PostScript) ; } start_tool() { while (1) process_event(get_next_event()) ; } toggle_reg_canvas() { rstate = !rstate ; FPRINTF(PostScript, "%d PSToggleRegCanvas\n", rstate) ; FFLUSH(PostScript) ; }