Annotation of 43BSD/contrib/X/ximpv/impv.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1985 University of Alberta *
        !             3:  *
        !             4:  * 'impv' impress (i.e. canon) previewer for a SUN workstation.
        !             5:  *     impv [-p##] [-s] [job# | -n name]
        !             6:  * where job# is the job number of the troff/dimp processed output suitable
        !             7:  * for the canon imagen printer. This can be found by executing 'ipq'. The 
        !             8:  * -p## argument sets the number of pages the user will be allowed to
        !             9:  * backup.  The -n name option will cause the users most recent job to
        !            10:  * be displayed.The human interface for this proram leaves something to be
        !            11:  * desired ( skip pages, print page number 'n', etc.).
        !            12:  * The algorithm for crunching glyphs could be improved from the straight 
        !            13:  * forward method used.
        !            14: #ifdef COLOR
        !            15:  * The -s option will cause the output to be sent to the color monitor. Troff
        !            16:  * Macros .CC and .BG set the background and current color. This option is
        !            17:  * intended for slide production.
        !            18: #endif COLOR
        !            19:  * 
        !            20:  *     This program requires that a 'file server' (used very loosely)
        !            21:  * exist on the remote host UNIX system. See the code for impvserv. 
        !            22:  *
        !            23:  * history:
        !            24:  *
        !            25:  * The program was written in desparation by:
        !            26:  *             Steven Sutphen
        !            27:  *             University of Alberta
        !            28:  *             Department of Computing Science
        !            29:  *             Edmonton, Alberta T6G 2H1
        !            30:  *             ihnp4!alberta!steve
        !            31:  *             November 20, 1982
        !            32:  *
        !            33:  *             Revised for Sun Work Station:
        !            34:  *                     January 1, 1984 Ted Bentley
        !            35:  *             Revised for Color SUN displays:
        !            36:  *                     January 1985 Martin Dubetz
        !            37:  */
        !            38: #ifndef lint
        !            39: static char *rcsid_impv_c = "$Header: impv.c,v 10.5 86/01/04 16:19:58 jg Exp $";
        !            40: #endif
        !            41: 
        !            42: #ifdef XWIND
        !            43: #include <X/Xlib.h>
        !            44: #include <X/Xkeyboard.h>
        !            45: #include <sys/types.h>
        !            46: #include <strings.h>
        !            47: #define min(a,b) ((a) < (b) ? (a) : (b))
        !            48: #define CHUNKSIZE 2048
        !            49: #else XWIND
        !            50: #include <pixrect/pixrect_hs.h>
        !            51: /* pixrect_hs.h includes sys/types.h */
        !            52: #include <sys/socket.h>
        !            53: #endif XWIND
        !            54: #include <sys/stat.h>
        !            55: #include <sys/file.h>
        !            56: #include <stdio.h>
        !            57: #include <signal.h>
        !            58: #include <netdb.h>
        !            59: #include <netinet/in.h>
        !            60: #include <sgtty.h>
        !            61: 
        !            62: #include       "site.h"
        !            63: #include       "imPdefs.h"
        !            64: #include       "imPcodes.h"
        !            65: #include       "impv.h"
        !            66: 
        !            67: 
        !            68: char map8_4[256] = {   /* map 8 bits to 4bits for pixel compression */
        !            69:        00, 01, 01, 01, 02, 03, 03, 03, 02, 03, 03, 03, 02, 03, 03, 03,
        !            70:        04, 05, 05, 05, 06, 07, 07, 07, 06, 07, 07, 07, 06, 07, 07, 07,
        !            71:        04, 05, 05, 05, 06, 07, 07, 07, 06, 07, 07, 07, 06, 07, 07, 07,
        !            72:        04, 05, 05, 05, 06, 07, 07, 07, 06, 07, 07, 07, 06, 07, 07, 07,
        !            73:        010, 011, 011, 011, 012, 013, 013, 013, 012, 013, 013, 013, 012, 013, 013, 013,
        !            74:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            75:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            76:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            77:        010, 011, 011, 011, 012, 013, 013, 013, 012, 013, 013, 013, 012, 013, 013, 013,
        !            78:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            79:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            80:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            81:        010, 011, 011, 011, 012, 013, 013, 013, 012, 013, 013, 013, 012, 013, 013, 013,
        !            82:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            83:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            84:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017, 
        !            85: };
        !            86: 
        !            87: #ifdef XWIND
        !            88: int Select_mask, maxplus1;
        !            89: int forepix, backpix;
        !            90: OpaqueFrame win;
        !            91: Window Win;            /* our window */
        !            92: #define impv_width 15
        !            93: #define impv_height 15
        !            94: static short impv_bits[] = {
        !            95:    0x0080, 0x01c0, 0x03e0, 0x06b0,
        !            96:    0x0c98, 0x188c, 0x3086, 0x7fff,
        !            97:    0x3086, 0x188c, 0x0c98, 0x06b0,
        !            98:    0x03e0, 0x01c0, 0x0080};
        !            99: #else XWIND
        !           100: struct pixrect *picon, *ptube, *side;
        !           101: #endif XWIND
        !           102: 
        !           103: int diameter = 1;
        !           104: short pages = SAVE_PAGES;
        !           105: char screen_file[32];
        !           106: unsigned char in_buf[512], *in_bufp;
        !           107: int ptubew, ptubeh;    /* screen window dimensions */
        !           108: struct sgttyb cbreak;  /* tty mode bits */
        !           109: int s = 0;                     /* socket or input file descriptor */
        !           110: int tty;               /* tty file descriptor */
        !           111: int screens;           /* screen store file descriptor */
        !           112: 
        !           113: main(argc, argv)
        !           114: char **argv;
        !           115: {
        !           116:        struct sockaddr_in sin;
        !           117: #ifdef XWIND
        !           118:        char *display = NULL;
        !           119:        char *option;
        !           120:        int reverse = 0;
        !           121:        int bwidth = 2;
        !           122:        char *fore_color;
        !           123:        char *back_color;
        !           124:        char *brdr_color;
        !           125:        char *mous_color;
        !           126:        char *geometry = NULL, def[32];
        !           127:        int backmap, bdrmap, mouspix;
        !           128:        Color cdef;
        !           129: #else XWIND
        !           130: #ifdef COLOR
        !           131:        unsigned char r[216],b[216],g[216],tmp[6];
        !           132:        register short i,j,k;
        !           133:        int l;
        !           134:        register unsigned char *z;
        !           135:        unsigned char setcolor();
        !           136: #endif COLOR
        !           137:        extern struct pixrect *pr_open();
        !           138: #endif XWIND
        !           139:        int pipes[2], id_num = 0, rq;
        !           140:        char string[100], buf[28];
        !           141:        struct hostent *hp;
        !           142:        struct servent *sp;
        !           143:        struct stat stat1;
        !           144: 
        !           145:        extern get_out();
        !           146: 
        !           147: #ifdef XWIND
        !           148:        if ((option = XGetDefault(argv[0], "ReverseVideo")) &&
        !           149:            strcmp(option, "on") == 0)
        !           150:                reverse = 1;
        !           151:        if (option = XGetDefault(argv[0], "BorderWidth"))
        !           152:                bwidth = atoi(option);
        !           153:        fore_color = XGetDefault(argv[0], "ForeGround");
        !           154:        back_color = XGetDefault(argv[0], "BackGround");
        !           155:        brdr_color = XGetDefault(argv[0], "Border");
        !           156:        mous_color = XGetDefault(argv[0], "Mouse");
        !           157: #else XWIND
        !           158:        /* set up the keyboard input */
        !           159:        (void)gtty(0, &cbreak);
        !           160:        cbreak.sg_flags &= ~ECHO;
        !           161:        cbreak.sg_flags |= CBREAK;
        !           162:        (void)stty(0, &cbreak);
        !           163:        cbreak.sg_flags &= ~CBREAK;
        !           164:        cbreak.sg_flags |= ECHO;
        !           165: #endif XWIND
        !           166:        signal(SIGINT, get_out);
        !           167:        signal(SIGQUIT, get_out);
        !           168:        signal(SIGHUP, get_out);
        !           169:        signal(SIGIOT, get_out);
        !           170: 
        !           171:        scr_x = MAXx / 2;               /* number of dots on a screen page */
        !           172:        wide =  (7 + MAXx/2) / 8;       /* rounded up to byte for pixrect */
        !           173:        scr_y = MAXy / 2;
        !           174:        scr_d = 1;
        !           175:        /* calculate the screen size in bytes 2::1 compression */
        !           176:        scr_size = (((scr_x + 7) / 8) * scr_y);
        !           177: 
        !           178:        for (argv++; --argc; argv++) {
        !           179:                if (**argv == '-'){
        !           180:                        switch (argv[0][1]){
        !           181: #ifndef NOSPOOL
        !           182:                        case 'n': 
        !           183:                                if (pipe(pipes)) {
        !           184:                                        fprintf(stderr, "pipe mistake\n");
        !           185:                                        get_out();
        !           186:                                }
        !           187:                                if (fork() == 0){
        !           188:                                        /*child*/
        !           189:                                        (void)close(1);
        !           190:                                        (void)dup(pipes[1]);
        !           191:                                        (void)sprintf(string, "echo `ipq | grep %s | awk ' {print $3}'| sort -rn | head -1 `", *++argv);
        !           192:                                        (void)system(string);
        !           193:                                        exit(0);
        !           194:                                }
        !           195:                                /* parent */
        !           196:                                while (read(pipes[0], buf, 20) <= 0);
        !           197:                                id_num = atoi(buf);
        !           198:                                argv++; 
        !           199:                                argc--;
        !           200:                                break;
        !           201:                        case 'r': 
        !           202:                                rq = 1;
        !           203:                                break;
        !           204: #endif NOSPOOL
        !           205:                        case 'p': 
        !           206:                                pages = atoi( &argv[0][2] );
        !           207:                                if (pages < 0) pages = 0;
        !           208:                                break;
        !           209: #ifdef COLOR
        !           210:                        case 's':
        !           211:                                slide = 1;
        !           212:                                scr_x = MAXx / 3;
        !           213:                                scr_y = MAXy / 3;
        !           214:                                scr_d = 8;
        !           215:                                scr_size = scr_x * scr_y;
        !           216:                                bc.red = 0;
        !           217:                                bc.blue = 255;
        !           218:                                bc.green = 0;
        !           219:                                cc.red = 255;
        !           220:                                cc.blue = 255;
        !           221:                                cc.green = 255;
        !           222:                                break;
        !           223: #endif COLOR
        !           224:                        default:
        !           225: #ifdef XWIND
        !           226:                                if (strcmp(*argv, "-rv") == 0) {
        !           227:                                        reverse = 1;
        !           228:                                        break;
        !           229:                                } else if (strcmp(*argv, "-fg") == 0 && argc) {
        !           230:                                        argv++;
        !           231:                                        argc--;
        !           232:                                        fore_color = *argv;
        !           233:                                        break;
        !           234:                                } else if (strcmp(*argv, "-bg") == 0 && argc) {
        !           235:                                        argv++;
        !           236:                                        argc--;
        !           237:                                        back_color = *argv;
        !           238:                                        break;
        !           239:                                } else if (strcmp(*argv, "-bd") == 0 && argc) {
        !           240:                                        argv++;
        !           241:                                        argc--;
        !           242:                                        brdr_color = *argv;
        !           243:                                        break;
        !           244:                                } else if (strcmp(*argv, "-ms") == 0 && argc) {
        !           245:                                        argv++;
        !           246:                                        argc--;
        !           247:                                        mous_color = *argv;
        !           248:                                        break;
        !           249:                                } 
        !           250: #endif XWIND
        !           251:                                (void)usage();
        !           252:                                get_out();
        !           253:                        }
        !           254:                } 
        !           255:                else {
        !           256: #ifdef XWIND
        !           257:                        if (index(*argv, ':') != NULL)
        !           258:                                display = *argv;
        !           259:                        else if (argv[0][0] == '=') {
        !           260:                                        geometry = argv[0];
        !           261:                        }
        !           262: 
        !           263:                        else
        !           264: #endif XWIND
        !           265: #ifdef NOSPOOL
        !           266:                                if((s = open(*argv, O_RDONLY)) <= 0){
        !           267:                                        fprintf(stderr,"can't open file\n");
        !           268:                                        exit(0);
        !           269:                                }
        !           270: #else NOSPOOL
        !           271:                                id_num = atoi(*argv);
        !           272: #endif NOSPOOL
        !           273:                }
        !           274:        }
        !           275: #ifdef NOSPOOL
        !           276:        /* set up tty for piped input situation*/
        !           277:        if(s == 0) {
        !           278:                s = dup(0);
        !           279:                close(0);
        !           280:                tty = open("/dev/tty",O_RDONLY);
        !           281:                fstat(s, &stat1);
        !           282:                if( (stat1.st_mode>>12) == 02 )
        !           283:                        (void)usage();
        !           284:        }
        !           285: #else NOSPOOL
        !           286:        if(id_num == 0) (void)usage();
        !           287: #endif NOSPOOL
        !           288: 
        !           289:        /* get the file for screen pages */
        !           290:        if (pages) {
        !           291:                strcpy(screen_file, SCREEN_FILE);
        !           292:                mktemp(screen_file);
        !           293:                if ((screens = creat(screen_file, 0666)) <= 0){
        !           294:                        fprintf(stderr, "couldn't create: %s\n", screen_file);
        !           295:                        get_out();
        !           296:                }
        !           297:                (void)close(screens);
        !           298:                if ((screens = open(screen_file, 2)) <= 0){
        !           299:                        fprintf(stderr, "couldn't reopen: %s\n", screen_file);
        !           300:                        get_out();
        !           301:                }
        !           302:        }
        !           303: 
        !           304: #ifndef NOSPOOL
        !           305:        /*open up the network to get file from remote host */
        !           306:        sp = getservbyname(P_SERV, "tcp");
        !           307:        hp = gethostbyname(REMOTE_HOST);
        !           308:        if (hp == NULL) {
        !           309:                fprintf(stderr, "impv: nohost - %s\n", REMOTE_HOST);
        !           310:                get_out();
        !           311:        }
        !           312:        bzero((char *)&sin, sizeof (sin));
        !           313:        bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length);
        !           314:        sin.sin_family = hp->h_addrtype;
        !           315:        sin.sin_port = sp->s_port;
        !           316:        s = socket(AF_INET, SOCK_STREAM, 0);
        !           317:        if (s < 0) {
        !           318:                perror("impv: socket");
        !           319:                get_out();
        !           320:        }
        !           321:        (void)setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, 0, 0);
        !           322:        if (connect(s, (char *)&sin, sizeof (sin)) < 0) {
        !           323:                perror("impv: connect");
        !           324:                get_out();
        !           325:        }
        !           326:        /* write the ipd file name to remote_host */
        !           327:        (void)sprintf(string, "P%c%03d", rq ? 'r' : 'n', id_num);
        !           328:        (void)write(s, string, strlen(string));
        !           329: #endif NOSPOOL
        !           330: 
        !           331:        in_bufp = in_buf;
        !           332:        family[0] = font0;
        !           333:        inicodes();
        !           334: 
        !           335: #ifdef XWIND
        !           336:        if (!XOpenDisplay(display)) {
        !           337:                fprintf(stderr, "Can't open display %s!\n", display);
        !           338:                exit(1);
        !           339:        }
        !           340:        if (reverse) {
        !           341:                forepix = WhitePixel;
        !           342:                backpix = BlackPixel;
        !           343:                backmap = BlackPixmap;
        !           344:                bdrmap = WhitePixmap;
        !           345:                mouspix = WhitePixel;
        !           346:        } else {
        !           347:                forepix = BlackPixel;
        !           348:                backpix = WhitePixel;
        !           349:                backmap = WhitePixmap;
        !           350:                bdrmap = BlackPixmap;
        !           351:                mouspix = BlackPixel;
        !           352:        }
        !           353:        if (DisplayCells() > 2) {
        !           354:                if (fore_color && XParseColor(fore_color, &cdef) &&
        !           355:                        XGetHardwareColor(&cdef))
        !           356:                        forepix = cdef.pixel;
        !           357:                if (back_color && XParseColor(back_color, &cdef) &&
        !           358:                        XGetHardwareColor(&cdef)) {
        !           359:                        backpix = cdef.pixel;
        !           360:                        backmap = XMakeTile(backpix);
        !           361:                }
        !           362:                if (brdr_color && XParseColor(brdr_color, &cdef) &&
        !           363:                        XGetHardwareColor(&cdef))
        !           364:                        bdrmap = XMakeTile(cdef.pixel);
        !           365:                if (mous_color && XParseColor(mous_color, &cdef) &&
        !           366:                        XGetHardwareColor(&cdef))
        !           367:                        mouspix = cdef.pixel;
        !           368:        }
        !           369:        win.bdrwidth = bwidth;
        !           370:        win.border = bdrmap;
        !           371:        win.background = backmap;
        !           372: 
        !           373:        sprintf(def, "=%dx%d+0+0", DisplayWidth() - (bwidth << 1),
        !           374:                DisplayHeight() - (bwidth << 1));
        !           375:        Win = XCreate (
        !           376:                "Imagen Previewer", argv[0], geometry, def, &win, 200, 200);
        !           377:        XSetResizeHint(Win, 100, 100, 1, 1);
        !           378:        XMapWindow (Win);
        !           379:        ptubew = win.width;
        !           380:        /* crock around crock */
        !           381:        if ((DisplayType() == XDEV_QDSS) && (bwidth < 4))
        !           382:                ptubew &= ~7;
        !           383:        if (ptubew > scr_x)
        !           384:                ptubew = scr_x;
        !           385:        ptubeh = win.height;
        !           386:        if (ptubeh > scr_y)
        !           387:                ptubeh = scr_y;
        !           388: 
        !           389:        XSelectInput (Win, KeyPressed|ButtonPressed|ExposeRegion|ExposeCopy);
        !           390:        XDefineCursor(Win,
        !           391:                XCreateCursor(impv_width, impv_height, impv_bits, impv_bits,
        !           392:                                7, 7, mouspix, backpix, GXcopy));
        !           393:        XSync(0);
        !           394:        Select_mask = 1 << dpyno();
        !           395:        maxplus1 = 1 + dpyno();
        !           396: #else XWIND
        !           397:        /* set up the raster pixrect functions */
        !           398:        if( slide ) {
        !           399: #ifdef COLOR
        !           400:                ptube = pr_open("/dev/cgone0");
        !           401:                tmp[0] = 0;
        !           402:                tmp[1] = 130;
        !           403:                tmp[2] = 180;
        !           404:                tmp[3] = 210;
        !           405:                tmp[4] = 235;
        !           406:                tmp[5] = 255;
        !           407:                l = 0;
        !           408:                for( i = 0; i < 6; i++ )
        !           409:                        for( j = 0; j < 6; j++ )
        !           410:                                for( k = 0; k < 6; k++ ) {
        !           411:                                        r[l] = tmp[i];
        !           412:                                        g[l] = tmp[j];
        !           413:                                        b[l++] = tmp[k];
        !           414:                                }
        !           415: 
        !           416:                pr_putcolormap(ptube,0,216,r,g,b);
        !           417: #endif COLOR
        !           418:        } 
        !           419:        else
        !           420:                ptube = pr_open("/dev/fb");
        !           421:        pscreen = mem_create(scr_x, scr_y, scr_d);
        !           422: #ifdef COLOR
        !           423:        if( slide ) {
        !           424:                backcolor = setcolor(0);
        !           425:                z = (unsigned char *)(mpr_d(pscreen)->md_image);
        !           426:                for (l = scr_size; l--; ) *z++ = backcolor;
        !           427:        } 
        !           428: #endif COLOR
        !           429:        picon = mem_create(46, 53, scr_d);
        !           430:        side = mem_create(ptubew-scr_x, ptubeh, scr_d);
        !           431:        ptubew = ptube->pr_size.x;
        !           432:        ptubeh = ptube->pr_size.y;
        !           433: #endif XWIND
        !           434: 
        !           435:        dofile();
        !           436:        (void)write(s, string, strlen(string));
        !           437:        get_out();
        !           438: }
        !           439: 
        !           440: #ifdef XWIND
        !           441: unsigned char rot8[] = {
        !           442:        0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 
        !           443:        0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, 
        !           444:        0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 
        !           445:        0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 
        !           446:        0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 
        !           447:        0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, 
        !           448:        0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 
        !           449:        0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, 
        !           450:        0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 
        !           451:        0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 
        !           452:        0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 
        !           453:        0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, 
        !           454:        0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 
        !           455:        0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, 
        !           456:        0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 
        !           457:        0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 
        !           458:        0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 
        !           459:        0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, 
        !           460:        0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 
        !           461:        0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, 
        !           462:        0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 
        !           463:        0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 
        !           464:        0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 
        !           465:        0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, 
        !           466:        0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 
        !           467:        0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, 
        !           468:        0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 
        !           469:        0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 
        !           470:        0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 
        !           471:        0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, 
        !           472:        0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 
        !           473:        0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
        !           474: };
        !           475: 
        !           476: static short current_page = -1;
        !           477: static short current_x = -1;
        !           478: #endif XWIND
        !           479: 
        !           480: ppause()
        !           481: {
        !           482:        short  y = 0;
        !           483:        short  x;
        !           484:        register int c, i;
        !           485:        register unsigned char *z, *scptr;
        !           486: #ifdef COLOR
        !           487:        unsigned char setcolor();
        !           488: #endif COLOR
        !           489: 
        !           490: #ifdef XWIND
        !           491:        short current_y = 0;
        !           492:        int select_mask;
        !           493:        XEvent event;
        !           494:        scptr = pscreen;
        !           495:        for (i = sizeof pscreen; i--; scptr++) *scptr = rot8[*scptr];
        !           496:        winker();
        !           497:        scptr = pscreen;
        !           498:        winker();
        !           499: #else XWIND
        !           500:        scptr = (unsigned char *)(mpr_d(pscreen)->md_image);
        !           501: #endif XWIND
        !           502:        if (current_x < 0)
        !           503:                if((current_x = (scr_x - ptubew)/2) < 0) current_x = 0;
        !           504:        x = current_x;
        !           505:        /*write the screen */
        !           506:        while(1) {
        !           507: #ifdef XWIND
        !           508:                if (page == current_page && x == current_x &&
        !           509:                    y < current_y && y + ptubeh > current_y) {
        !           510:                        int delta = current_y - y;
        !           511:                        XMoveArea(Win, 0, 0, 0, delta, ptubew, ptubeh - delta);
        !           512:                        BitsPut(x, y, 0, 0, ptubew, delta);
        !           513:                } else if (page == current_page && x == current_x &&
        !           514:                           y > current_y && current_y + ptubeh > y) {
        !           515:                        int delta = y - current_y;
        !           516:                        XMoveArea(Win, 0, delta, 0, 0, ptubew, ptubeh - delta);
        !           517:                        BitsPut(x, y + ptubeh - delta, 0, ptubeh - delta,
        !           518:                                ptubew, delta);
        !           519:                } else if (page == current_page && y == current_y &&
        !           520:                    x < current_x && x + ptubew > current_x) {
        !           521:                        int delta = current_x - x;
        !           522:                        XMoveArea(Win, 0, 0, delta, 0, ptubew - delta, ptubeh);
        !           523:                        BitsPut(x, y, 0, 0, delta, ptubeh);
        !           524:                } else if (page == current_page && y == current_y &&
        !           525:                           x > current_x && current_x + ptubew > x) {
        !           526:                        int delta = x - current_x;
        !           527:                        XMoveArea(Win, delta, 0, 0, 0, ptubew - delta, ptubeh);
        !           528:                        BitsPut(x + ptubew - delta, y, ptubew - delta, 0,
        !           529:                                delta, ptubeh);
        !           530:                } else if (y != current_y || x != current_x ||
        !           531:                           page != current_page)
        !           532:                        BitsPut(x, y, 0, 0, min(scr_x - x, ptubew),
        !           533:                                min(scr_y - y, ptubeh));
        !           534:                current_y = y;
        !           535:                current_x = x;
        !           536:                current_page = page;
        !           537:                XFlush();
        !           538:                select_mask = Select_mask;
        !           539:                if (select(maxplus1, &select_mask, NULL, NULL, 0) < 0) exit(1);
        !           540:                if (!(select_mask & Select_mask)) continue;
        !           541:                XPending();
        !           542:                do {
        !           543:                        XNextEvent (&event);
        !           544:                        switch (event.type) {
        !           545:                        case ExposeWindow:
        !           546:                                ptubeh = ((XExposeEvent *)(&event))->height;
        !           547:                                ptubew = ((XExposeEvent *)(&event))->width;
        !           548:                        case ExposeRegion: {
        !           549:                                short ex = ((XExposeEvent *)(&event))->x;
        !           550:                                short ew = ((XExposeEvent *)(&event))->width;
        !           551:                                short ey = ((XExposeEvent *)(&event))->y;
        !           552:                                short eh = ((XExposeEvent *)(&event))->height;
        !           553:                                BitsPut(x + ex, y + ey, ex, ey,
        !           554:                                        min(scr_x - (x + ex), ew),
        !           555:                                        min(scr_y - (y + ey), eh));
        !           556:                                continue;
        !           557:                        }
        !           558:                        case ExposeCopy:
        !           559:                                continue;
        !           560:                        case ButtonPressed:
        !           561:                        {
        !           562:                        short detail = ((XButtonPressedEvent *) (&event))->detail;
        !           563:                        switch (detail & ValueMask) {
        !           564:                        case LeftButton: if (detail & ShiftMask)
        !           565:                                                c = 'l';
        !           566:                                         else
        !           567:                                                c = 'u';
        !           568:                                         break;
        !           569:                        case MiddleButton: if (detail & ShiftMask) {
        !           570:                                           if (x < scr_x - (x + ptubew))
        !           571:                                                c = '6';
        !           572:                                           else
        !           573:                                                c = '4';
        !           574:                                           } else {
        !           575:                                           if (y < scr_y - (y + ptubeh))
        !           576:                                                c = '3';
        !           577:                                           else
        !           578:                                                c = '9';
        !           579:                                           }
        !           580:                                           break;
        !           581:                        case RightButton: if (detail & ShiftMask)
        !           582:                                                c = 'r';
        !           583:                                          else
        !           584:                                                c = 'd';
        !           585:                                          break;
        !           586:                        }
        !           587:                                break;
        !           588:                        }
        !           589:                        case KeyPressed:
        !           590:                        switch ((((XKeyPressedEvent *) (&event))->detail) & ValueMask) {
        !           591:                        case KC_E5: c = '-'; break; /* prev screen */
        !           592:                        case KC_E6: c = '+'; break; /* next screen */
        !           593:                        case KC_CURSOR_UP: c = 'u'; break; /* prev screen */
        !           594:                        case KC_CURSOR_DOWN: c = 'd'; break; /* next screen */
        !           595:                        case KC_CURSOR_LEFT: c = '<'; break; /* left screen */
        !           596:                        case KC_CURSOR_RIGHT: c = '>'; break; /* right screen */
        !           597:                        case KC_KEYPAD_0: c = '0'; break; /* R0 */
        !           598:                        case KC_KEYPAD_PERIOD: c = '.'; break; /* R. */
        !           599:                        case KC_KEYPAD_COMMA: c = ','; break; /* R, */
        !           600:                        case KC_KEYPAD_1: c = '1'; break; /* R1 */
        !           601:                        case KC_KEYPAD_2: c = '2'; break; /* R2 */
        !           602:                        case KC_KEYPAD_3: c = '3'; break; /* R3 */
        !           603:                        case KC_KEYPAD_4: c = '4'; break; /* R4 */
        !           604:                        case KC_KEYPAD_5: c = '5'; break; /* R5 */
        !           605:                        case KC_KEYPAD_6: c = '6'; break; /* R6 */
        !           606:                        case KC_KEYPAD_7: c = '7'; break; /* R7 */
        !           607:                        case KC_KEYPAD_8: c = '8'; break; /* R8 */
        !           608:                        case KC_KEYPAD_9: c = '9'; break; /* R9 */
        !           609:                        case KC_KEYPAD_MINUS: c = '-'; break; /* R- */
        !           610: 
        !           611:                        default:
        !           612:                                {
        !           613:                                char *string;
        !           614:                                int nbytes;
        !           615:                                string = XLookupMapping (&event, &nbytes);
        !           616:                                if (nbytes == 1)
        !           617:                                        c = *string;
        !           618:                                else
        !           619:                                        continue;
        !           620:                                }
        !           621:                        }
        !           622:                        }
        !           623: #else XWIND
        !           624:                /* adjust place of page on screen so it is centered */
        !           625:                /* will clip the edges of imagen300 pages  */
        !           626:                pr_rop(ptube, 0, 0, ptubew, ptubeh, PIX_SRC, pscreen, x, y);
        !           627:                if( !slide ) {
        !           628:                        pr_rop(ptube, scr_x, 0, 4, ptubeh, PIX_NOT(PIX_SRC),
        !           629:                                side, 0, 0);
        !           630:                        page_icon(y);
        !           631:                }
        !           632:                /* have a look */
        !           633:                c = getchar();
        !           634:                if( c == 033 ){ /* fixup for SUN 120 keypad */
        !           635:                        c = getchar();
        !           636:                        if(c == '[') c = getchar();
        !           637:                        if(c == '2') c = getchar();
        !           638:                        if(c == '2'){
        !           639:                                c = getchar() + 1;
        !           640:                                (void) getchar();
        !           641:                        }
        !           642:                        else if(c == '1'){
        !           643:                                c = getchar() + 3;
        !           644:                                (void) getchar();
        !           645:                        }
        !           646:                }
        !           647: #endif XWIND
        !           648:                switch(c){
        !           649:                case 04: 
        !           650:                case 03:
        !           651:                        return(-1);     /* quit on EOF or ^C */
        !           652:                case '1': 
        !           653:                        y++; 
        !           654:                        break;
        !           655:                case '7': 
        !           656:                        y--; 
        !           657:                        break;
        !           658:                case 0102: 
        !           659:                case '2': 
        !           660:                        y += 65; 
        !           661:                        break;
        !           662:                case 0101: 
        !           663:                case '8': 
        !           664:                        y -= 65; 
        !           665:                        break;
        !           666:                case '3': 
        !           667:                        y = scr_y - ptubeh -1; 
        !           668:                        break;
        !           669:                case '9': 
        !           670:                        y = 0; 
        !           671:                        break;
        !           672:                case '4': 
        !           673:                        x = 0;
        !           674:                        break;
        !           675:                case '5': 
        !           676:                        if((x = (scr_x - ptubew)/2) < 0) x = 0;
        !           677:                        break;
        !           678:                case '6': 
        !           679:                        if((x = scr_x - ptubew) < 0) x = 0;
        !           680:                        break;
        !           681:                case '<':
        !           682:                        x -= 65;
        !           683:                        break;
        !           684:                case '>':
        !           685:                        x += 65;
        !           686:                        break;
        !           687:                case 'l':
        !           688:                        x -= ptubew;
        !           689:                        break;
        !           690:                case 'r':
        !           691:                        x += ptubew;
        !           692:                        break;
        !           693:                case 'd':
        !           694:                        if (y < scr_y - 1 - ptubeh) {
        !           695:                                y += ptubeh;
        !           696:                                break;
        !           697:                        }
        !           698:                        /* falls into */
        !           699:                case '.':
        !           700:                        if (pages && page != finish) {
        !           701:                                page = (page +1)%pages;
        !           702:                                (void)lseek(screens, scr_size * page, 0);
        !           703:                                (void)read(screens, scptr, scr_size);
        !           704:                                y = 0;
        !           705:                                break;
        !           706:                        }
        !           707:                        /* falls into */
        !           708:                case '+':
        !           709:                case ',':
        !           710:                        if (pages && page == finish) {
        !           711:                                (void)lseek(screens, scr_size * page, 0);
        !           712:                                (void)write(screens, scptr, scr_size);
        !           713:                        }
        !           714:                        if (pages){
        !           715:                                page = finish = (finish +1)%pages;
        !           716:                                if(start == finish) start = (start + 1)%pages;
        !           717:                        }
        !           718:                        /*blank the memory where screen image is built*/
        !           719:                        z=scptr;
        !           720:                        for (i=scr_size;i--;) *z++ = backcolor;
        !           721:                        return(0);
        !           722:                case 'u':
        !           723:                        if (y > 0) {
        !           724:                                y -= ptubeh;
        !           725:                                break;
        !           726:                        }
        !           727:                        /* falls into */
        !           728:                case '-':
        !           729:                        if (pages == 0 || page == start) {
        !           730: #ifndef XWIND
        !           731:                            if (y == 0)
        !           732:                            fprintf(stderr, "can not back up more\n");
        !           733: #endif XWIND
        !           734:                            y = 0;
        !           735:                        }else{
        !           736:                                if(page == finish) {
        !           737:                                        (void)lseek(screens, scr_size * page, 0);
        !           738:                                        (void)write(screens, scptr, scr_size);
        !           739:                                }
        !           740:                                page = (page==0? (pages-1):(page -1))%pages;
        !           741:                                (void)lseek(screens, scr_size * page, 0);
        !           742:                                (void)read(screens, scptr, scr_size);
        !           743:                                if (c == '-')
        !           744:                                        y = 0;
        !           745:                                else
        !           746:                                        y = scr_y - 1 - ptubeh;
        !           747:                        }
        !           748:                        break;
        !           749:                default: 
        !           750:                        break;
        !           751:                }
        !           752:                if (x < 0) x = 0;
        !           753:                else if (x >= scr_x - ptubew) x = scr_x - 1 - ptubew;
        !           754:                if (y < 0) y = 0;
        !           755:                else if (y >= scr_y - ptubeh) y = scr_y - 1 - ptubeh;
        !           756: #ifdef XWIND
        !           757:                } while (QLength() > 0);
        !           758: #endif
        !           759:        }
        !           760: }
        !           761: 
        !           762: /* get a character from the input file */
        !           763: gc()
        !           764: {
        !           765:        static int len = 0;
        !           766: 
        !           767:        if(macro_on == TRUE) {
        !           768:                /* macro in effect read from its code*/
        !           769:                if(macro_length == macro_count+1) macro_on = FALSE;
        !           770:                return(mp[macro_count++]);
        !           771:        }
        !           772:        else {
        !           773:                /*read from the input file */
        !           774:                if(in_bufp <= &in_buf[len-1]) {
        !           775:                        return(*in_bufp++);
        !           776:                }
        !           777:                len = read(s, in_buf, 512);
        !           778:                if(len == 0) {
        !           779:                        fprintf(stderr,"No such job\n");
        !           780:                        (void)fflush(stderr);
        !           781:                        get_out();
        !           782:                }
        !           783:                else if(len < 0) {
        !           784:                        perror("impv: read failed");
        !           785:                        get_out();
        !           786:                }
        !           787: 
        !           788:                in_bufp = in_buf;
        !           789:                winker();
        !           790:                return(*in_bufp++);
        !           791:        }
        !           792: }
        !           793: 
        !           794: get_out()
        !           795: {
        !           796:        /*reset keyboard*/
        !           797: #ifdef XWIND
        !           798:        XDestroyWindow (Win);
        !           799: #else XWIND
        !           800:        (void)stty(0, &cbreak);
        !           801:        if(pscreen != NULL) pr_close(pscreen);
        !           802:        if(ptube != NULL) pr_close(ptube);
        !           803:        printf("\n");
        !           804: #endif XWIND
        !           805:        if(big || little)
        !           806:            printf("%d pixels/glyphs/lines would be off the page\n",
        !           807:        big + little);
        !           808:        if (screens && unlink(screen_file) < 0)
        !           809:            printf("%s not removed\n", screen_file);
        !           810:        exit(0);
        !           811: }
        !           812: 
        !           813: winker()
        !           814: {
        !           815: #ifdef XWIND
        !           816:        XPixFill(Win, ptubew / 2 - 8, ptubeh - 50, 16, 16, 0, NULL, GXinvert, 1);
        !           817:        XFlush();
        !           818: #else XWIND
        !           819:        pr_rop(ptube, 450, 780, 16, 16, PIX_NOT(PIX_SRC), NULL, 0, 0);
        !           820: #endif XWIND
        !           821: }
        !           822: 
        !           823: #ifdef XWIND
        !           824: unsigned char outbuf[CHUNKSIZE];
        !           825: 
        !           826: BitsPut (srcx, srcy, dstx, dsty, width, height)
        !           827:        int srcx, srcy, dstx, dsty, width, height;
        !           828: {
        !           829:        register unsigned char *data, *ptr;
        !           830:        register int i, per, delta;
        !           831:        int linesize;
        !           832: 
        !           833:        linesize = (scr_x + 7) >> 3;
        !           834:        dstx -= (srcx & 7);
        !           835:        width += (srcx & 7);
        !           836:        srcx &= ~7;
        !           837:        data = &pscreen[(srcy*linesize) + (srcx>>3)];
        !           838: 
        !           839:        per = BitmapSize(width, 1);
        !           840:        delta = CHUNKSIZE / per;
        !           841: 
        !           842:        while (height) {
        !           843:                if (height < delta)
        !           844:                        delta = height;
        !           845:                for (ptr = outbuf, i = delta;
        !           846:                     --i >= 0;
        !           847:                     data += linesize, ptr += per)
        !           848:                        bcopy(data, ptr, per);
        !           849:                XBitmapBitsPut(Win, dstx, dsty, width, delta, outbuf,
        !           850:                                forepix, backpix, NULL, GXcopy, AllPlanes);
        !           851:                dsty += delta;
        !           852:                height -= delta;
        !           853:        }
        !           854: }
        !           855: #endif XWIND
        !           856: 
        !           857: #ifndef XWIND
        !           858: page_icon(y)
        !           859: int y;
        !           860: {
        !           861:        int h, i;
        !           862: 
        !           863:        i = 43 * ptubeh / scr_y;
        !           864:        pr_rop(picon, 0 , 0, 46, 53, PIX_NOT(PIX_SRC), NULL, 0, 0);
        !           865:        pr_rop(picon, 2 , 2, 42, 49, PIX_CLR, NULL, 0, 0);
        !           866:        pr_rop(picon, 6 , 4, 34, 45, PIX_NOT(PIX_SRC), NULL, 0, 0);
        !           867:        h = 44 * y / scr_y;
        !           868:        pr_rop(picon, 5, 5+h, 36, i, PIX_NOT(PIX_SRC), picon, 5, 5+h);
        !           869:        pr_rop(ptube, ptubew-46, ptubeh/2, 46, 53, PIX_SRC, picon, 0, 0);
        !           870: }
        !           871: #endif
        !           872: 
        !           873: #ifdef COLOR
        !           874: /*
        !           875:        set color
        !           876: */
        !           877: unsigned char
        !           878: setcolor(code)
        !           879: register short int code;
        !           880: {
        !           881:        register unsigned char color;
        !           882:        register float c1,c2;
        !           883:        
        !           884:        c1 = (float)(5 - code) / 255.;
        !           885:        c2 = (float)code / 255.;
        !           886:        color = 36 * ((int)(bc.red * c1 + .5) + (int)(cc.red * c2 + .5))
        !           887:                + 6 * ((int)(bc.green * c1 + .5) + (int)(cc.green * c2 + .5))
        !           888:                + ((int)(bc.blue * c1 + .5) + (int)(cc.blue * c2 + .5));
        !           889:        return(color);
        !           890: }
        !           891: #endif COLOR
        !           892: 
        !           893: usage()
        !           894: {
        !           895: #ifdef NOSPOOL
        !           896: #ifdef COLOR
        !           897:                printf("usage: impv [-p#] [-s] [file]\n");
        !           898: #else COLOR
        !           899: #ifdef XWIND
        !           900:                printf("usage: ximpv [=<geometry>] [-p#] [-rv] [-fg <color>] [-bg <color>] [-bd <color>] [-ms <color>] [host:display] [file]\n");
        !           901: #else XWIND
        !           902:                printf("usage: impv [-p#] [file]\n");
        !           903: #endif XWIND
        !           904: #endif COLOR
        !           905:                (void)fflush(stdout);
        !           906:                exit(0);
        !           907: #else NOSPOOL
        !           908: #ifdef COLOR
        !           909:                printf("usage: impv [-p#] [-s] [-r] [idnumber | -n name]\n");
        !           910: #else COLOR
        !           911:                printf("usage: impv [-p#] [-r] [idnumber | -n name]\n");
        !           912: #endif COLOR
        !           913:                (void)fflush(stdout);
        !           914:                get_out();
        !           915: #endif NOSPOOL
        !           916: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.