Annotation of researchv10no/cmd/bcp/postlib.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1989, 1990 AT&T --- All Rights Reserved.              */
                      2: /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T.                */
                      3: /* The copyright notice does not imply actual or intended publication. */
                      4: /* AUTHORS:                                            */
                      5: /*     T. Thompson - ATT-BL HO - first versions        */
                      6: /* Routines for generating PostScript from RLE. */
                      7: /* The routines at the bottom of this file, which */
                      8: /* do the actual conversion to postscript, were */
                      9: /* hacked out of 'sun2ps'.  The original header */
                     10: /* giving credit to its authors is there. */
                     11: 
                     12: /* The 'binary' version of the output is collected in a */
                     13: /* temporary file, which is then fed back to the routines */
                     14: /* that generate postscript in a run-length-encoded form. */
                     15: /* Ideally it should just convert the original run-length */
                     16: /* encoding directly, but the REAL bottleneck is the */
                     17: /* PostScript printer, of course.  Printing an 800 by 800 */
                     18: /* pixel image takes 5 minutes. */
                     19: 
                     20: #include <stdio.h>
                     21: #include <math.h>
                     22: #include <string.h>
                     23: #include "CPU.h"
                     24: #include "boole.h"
                     25: #include "limits.h"     /* numeric extreme values */
                     26: #include "Units.h"
                     27: #include "Coord.h"
                     28: #include "pic.h"
                     29: 
                     30: FILE *Fp, *tmpfile();
                     31: int Raswidth;
                     32: int Raslength;
                     33: int Rasbytes;  /* bytes per row */
                     34: int Inv = 0;
                     35: int Aspect = 1;                /* if non-zero, retain original aspect ratio */
                     36: int Land = 0;          /* if non-zero, print in landscape mode */
                     37: char Revbyte[256];
                     38: /*  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 */
                     39: char Revnib[16] = {
                     40:     0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15
                     41:     };
                     42:  
                     43: void
                     44: POST_start(h)
                     45: PIC_hdr *h;
                     46: {
                     47:        int n, v;
                     48: 
                     49:        /* build a table of reversed bytes */
                     50:        for ( n=0; n<256; n++ )
                     51:                Revbyte[n] = Revnib[(n>>4)&0xf] | Revnib[n&0xf]<<4;
                     52: 
                     53:        h->bpl = (h->bpl+7)/8;
                     54:        Rasbytes = h->bpl;
                     55:        Raslength = h->bpl * h->bx.b.y;
                     56:        Raswidth = h->bx.b.x;
                     57:        postmain(1,NULL,Raswidth,h->bx.b.y);
                     58: #if CPU==SUN
                     59:        Fp = tmpfile();
                     60: #else
                     61:        Fp = fopen("tmp.postlib.0","rw");
                     62: #endif
                     63: }
                     64: 
                     65: void
                     66: POST_end()
                     67: {
                     68:        int c;
                     69:        rewind(Fp);
                     70:        (VOID) Encode(Raslength, Inv);
                     71:        PrintPostScriptClosing();
                     72:        fclose(Fp);
                     73: }
                     74: 
                     75: /* write a full line of picture data, returning status:  1 OK, 0 EOF, -1 ERR */
                     76: int POST_wline(h,line)
                     77:     PIC_hdr *h;
                     78:     unsigned char *line;
                     79: {   int stat;
                     80:         if( (stat=fwrite(line,1,h->bpl,Fp)) == h->bpl) {
                     81:                 h->seek += h->bpl;
                     82:                 h->cy++;
                     83:                 return(1);
                     84:                 }
                     85:         else { /* ERR */
                     86:                 err("write to fd%d stat%d",fileno(h->fp),stat);
                     87:                 if((stat>=0)&&(stat<h->bpl)) return(0 /*EOF*/);
                     88:                 else return(-1);
                     89:                 };
                     90:         }
                     91: 
                     92: /******************************************************************************
                     93: *                                                                            *
                     94: *      File:         sun2ps.c                                                *
                     95: *      Author:       Glenn Boysko                                            *
                     96: *      Organization: Case Western Reserve University                         *
                     97: *      EMail:        {decvax, sun}!mandrill!boysko                           *
                     98: *                    [email protected]                                *
                     99: *      Created:      Wed Mar 23 9:25pm                                       *
                    100: *      Contents:     Sun Rasterfile to PostScript image (using a run-length  *
                    101: *                      encoding scheme.)                                     *
                    102: *                                                                            *
                    103: *      (Adapted from "postimage" filter by J. R. Bammi.)                     *
                    104: *                                                                            *
                    105: *      @(#)sun2ps.c    1.8
                    106: ******************************************************************************/
                    107: 
                    108: /*
                    109:  * Usage:
                    110:  *  sun2ps [-s sizex sizey] [-t transx transy] [-r rot] [-l] [-i] [-a] file ...
                    111:  *
                    112:  *     -s sizex sizey   = size of postscript image - default 7.5 x 10 inches.
                    113:  *     -t transx transy = translate image - default 0.5 0.5 inches
                    114:  *     -r rotate        = rotate image     - default 0 degress
                    115:  *      -l              = landscape (overrides *all* settings.) 
                    116:  *     -i               = inverse image - default no inverse 
                    117:  *                             (Inverse enabled implies white on black.)
                    118:  *     -a               = maintain correct aspect ratio - default none.
                    119:  *
                    120:  */
                    121: 
                    122: /* Sun standard raster file format (as obtained by screendump(1)).
                    123:  *
                    124:  * Header      (8 16-bit quantities)
                    125:  * Color Map
                    126:  * Image
                    127:  *
                    128:  */
                    129: 
                    130: /* Header Format:
                    131:  * 
                    132:  * ras_magic           (int)   Raster Magic number 0x59a66a95
                    133:  * ras_width           (int)   Width of image in pixels.
                    134:  * ras_height          (int)   Height of image in pixels.
                    135:  * ras_depth           (int)   Bits per pixel. Either 1 or 8 bits.
                    136:  * ras_length          (int)   Length of image in bytes.
                    137:  * ras_type            (int)   Type of file. Assumed to be RT_STANDARD (1) if
                    138:  *                             produced by a screendump command.
                    139:  * ras_maptype         (int)   Type of color map. 
                    140:  * ras_maplength       (int)   Length of color map in bytes.
                    141:  *
                    142:  */
                    143: 
                    144: /* Ras_maplength bytes of Color map data. */
                    145: 
                    146: /* Ras_length bytes of Image data. */
                    147: 
                    148: /* Buffer and Input Modes... */
                    149: #define LITERAL        0
                    150: #define COPY   1
                    151: #define IGNORE 2
                    152: 
                    153: /* Transmission Variables. */
                    154: int BufCount;
                    155: 
                    156: unsigned char Buffer[128],
                    157:              CurrByte,
                    158:              NextByte,
                    159:              *BufferP = Buffer;
                    160: 
                    161: /* Diagnostic Variables. */
                    162: int    DiagNLongRuns = 0,
                    163:        DiagMaxRunLength = 0,
                    164:        DiagNumRuns = 0;
                    165: double DiagSumRunLength = 0;
                    166: 
                    167: postmain(argc,argv,width,height)
                    168: int argc;
                    169: char **argv;
                    170: int width, height;
                    171: {
                    172:      char      *filename;
                    173:      double    sizex, sizey, transx, transy, rotate;
                    174: 
                    175:      extern double atof();
                    176:      
                    177:      filename = "STDIN";
                    178:      sizex = 7.5;
                    179:      sizey = 10.0;
                    180:      transx = transy = 0.5;
                    181:      rotate = 0.0;
                    182:      
                    183:      while(--argc > 0)
                    184:      {
                    185:          ++argv;
                    186:          if((*argv)[0] == '-')
                    187:          {
                    188:               switch((*argv)[1])
                    189:               {
                    190:                 case 'l':
                    191:                 case 'L':
                    192:                    Land = 1;
                    193:                    break;
                    194:                    
                    195:                 case 's':
                    196:                 case 'S':
                    197:                    sizex = atof(*++argv);
                    198:                    sizey = atof(*++argv);
                    199:                    argc -= 2;
                    200:                    break;
                    201:                    
                    202:                 case 't':
                    203:                 case 'T':
                    204:                    transx = atof(*++argv);
                    205:                    transy = atof(*++argv);
                    206:                    argc -= 2;
                    207:                    break;
                    208:                    
                    209:                 case 'r':
                    210:                 case 'R':
                    211:                    rotate = atof(*++argv);
                    212:                    argc--;
                    213:                    break;
                    214:                    
                    215:                 case 'I':
                    216:                 case 'i':
                    217:                    Inv = 1;
                    218:                    break;
                    219:                    
                    220:                 case 'A':
                    221:                 case 'a':
                    222:                    Aspect = 1;
                    223:                    break;
                    224:                    
                    225:                 default:
                    226:                    fprintf(stderr,"Illegal switch %c - ignored\n",
                    227:                            (*argv)[1]);
                    228:               }
                    229:          }
                    230:      }
                    231:      if (Land)
                    232:      {
                    233:          transx = 8.0;
                    234:          transy = 0.5;
                    235:          sizex  = 10.0;
                    236:          sizey  = 7.5;
                    237:          rotate = 90.0;
                    238:      }
                    239:        if (Aspect) {
                    240:                if ((sizex / width) < (sizey / height)) {
                    241:                        sizey = sizex * (height * 1.0 / width);
                    242:                }
                    243:                else {
                    244:                        sizex = sizey * (width * 1.0 / height);
                    245:                }
                    246:        }
                    247:        PrintPostScriptRoutines(height, width, 1 /*depth*/ ,
                    248:                             transx, transy, sizex, sizey, rotate);
                    249: }
                    250: 
                    251: /******************************************************************************
                    252: *      I/O Routines.                                                         *
                    253: ******************************************************************************/
                    254: int
                    255: gb()           /* Get a byte from Fp. */
                    256: {
                    257:      int byte;
                    258:      
                    259:      if (!feof(Fp))
                    260:          byte = getc(Fp);
                    261:      else
                    262:          Error("Premature EOF.\n");
                    263:      if (ferror(Fp))
                    264:          Error("I/O Error.\n");
                    265:      return(Revbyte[byte]);
                    266: }
                    267: 
                    268: SendHex(Byte)          /* Send a Hex char to Stdout. */
                    269: unsigned char Byte;
                    270: {
                    271:      static int LineCount = 0;
                    272: 
                    273:      printf("%02x",  0xff & Byte);
                    274:      if (++LineCount == Rasbytes)
                    275:      {
                    276:          putchar('\n');
                    277:          LineCount = 0;
                    278:      }
                    279: }
                    280:      
                    281: int
                    282: SendBuffer(Inv)                /* Send a buffer to Stdout. Return BytesSent. */
                    283: int Inv;
                    284: {
                    285:      int i, BytesSent;
                    286:      
                    287:      if (BufferMode() == LITERAL)
                    288:      {
                    289:          SendHex( (unsigned char) 0xff & BufCount );
                    290:          for (i = 0; i < BufCount+1; i++)
                    291:          {
                    292:               SendHex( (Inv) ? Buffer[i] : ~Buffer[i]);
                    293:          }
                    294:          BytesSent = BufCount+2;
                    295:      }
                    296:      else if (BufferMode() == COPY)
                    297:      {
                    298:          SendHex( (unsigned char) 0xff & (0x100 + BufCount) );
                    299:          SendHex( (Inv) ? Buffer[0] : ~Buffer[0]);
                    300:          BytesSent = 2;
                    301:          DiagRecLRun(mag(BufCount)+1);
                    302:      }
                    303:      return(BytesSent);
                    304: }
                    305: 
                    306: /******************************************************************************
                    307: *      Utility Routines.                                                     *
                    308: ******************************************************************************/
                    309: int
                    310: mag(Byte)      /* Magitude of a signed char. */
                    311: int Byte;
                    312: {
                    313:      if (Byte & 0x80)
                    314:      {
                    315:          /* Signed */
                    316:          Byte = ~(--Byte);
                    317:      }
                    318:      return( 0xff & Byte );
                    319: }
                    320:          
                    321: /******************************************************************************
                    322: *      Buffer Management Routines.                                           *
                    323: ******************************************************************************/
                    324: int
                    325: InputMode()
                    326: {
                    327:      if (CurrByte == NextByte)
                    328:          return(COPY);
                    329:      return(LITERAL);
                    330: }
                    331: 
                    332: int
                    333: BufferMode()
                    334: {
                    335:      if (BufCount >= 0 && BufCount <= 127)
                    336:          return(LITERAL);
                    337:      else if (BufCount >= -127 && BufCount <= -1)
                    338:          return(COPY);
                    339:      return(IGNORE);
                    340: }
                    341: 
                    342: InitLitMode(NBytes, Inv)
                    343: int *NBytes, Inv;
                    344: {
                    345:      BufferP    = Buffer;
                    346:      BufCount   = -1;
                    347:      ContLitMode(NBytes, Inv);
                    348: }
                    349: 
                    350: ContLitMode(NBytes, Inv)
                    351: int *NBytes, Inv;
                    352: {
                    353:      if (BufCount == 127)
                    354:      {
                    355:          SendBuffer(Inv);
                    356:          BufferP  = Buffer;
                    357:          BufCount = -1;
                    358:      }
                    359:      *BufferP++ = CurrByte;
                    360:      BufCount++;
                    361:      CurrByte   = NextByte;
                    362:      NextByte   = (unsigned char) gb();
                    363:      (*NBytes)--;
                    364: }
                    365:      
                    366: InitCopyMode(NBytes, Inv)
                    367: int *NBytes, Inv;
                    368: {
                    369:      BufferP    = Buffer;
                    370:      *BufferP++ = CurrByte;
                    371:      BufCount   = -1;
                    372:      CurrByte   = (unsigned char) gb();
                    373:      NextByte   = (unsigned char) gb();
                    374:      *NBytes   -= 2;
                    375: }
                    376: 
                    377: ContCopyMode(NBytes, Inv)
                    378: int *NBytes, Inv;
                    379: {
                    380:      if (BufCount == -127)
                    381:      {
                    382:          SendBuffer(Inv);
                    383:          InitCopyMode(NBytes, Inv);
                    384:          DiagNLongRuns++;
                    385:      }
                    386:      BufCount--;
                    387:      CurrByte   = NextByte;
                    388:      NextByte   = gb();
                    389:      (*NBytes)--;
                    390: }
                    391: 
                    392: /******************************************************************************
                    393: *      Encoding Algorithm.                                                   *
                    394: ******************************************************************************/
                    395: int
                    396: Encode(NBytes, Inv)
                    397: int NBytes, Inv;
                    398: {
                    399:      int BytesSent = 0;
                    400:      
                    401:      /* Initialize Buffer, BufCount, NextByte, CurrByte */
                    402:      CurrByte = (unsigned char) gb();
                    403:      NextByte = (unsigned char) gb();
                    404:      if (InputMode() == LITERAL)
                    405:      {
                    406:          InitLitMode(&NBytes, Inv);
                    407:      }
                    408:      else
                    409:      {
                    410:          InitCopyMode(&NBytes, Inv);
                    411:      }
                    412:      while (NBytes > 3)
                    413:      {
                    414:          switch(BufferMode())
                    415:          {
                    416:            case LITERAL:
                    417:               if (InputMode() == COPY)
                    418:               {
                    419:                    BytesSent += SendBuffer(Inv);
                    420:                    InitCopyMode(&NBytes, Inv);
                    421:               }
                    422:               else
                    423:               {
                    424:                    ContLitMode(&NBytes, Inv);
                    425:               }
                    426:               break;
                    427:            case COPY:
                    428:               if (CurrByte == Buffer[0])
                    429:               {
                    430:                    ContCopyMode(&NBytes, Inv);
                    431:               }
                    432:               else
                    433:               {
                    434:                    BytesSent += SendBuffer(Inv);
                    435:                    if (InputMode() == COPY)
                    436:                    {
                    437:                         InitCopyMode(&NBytes, Inv);
                    438:                    }
                    439:                    else
                    440:                    {
                    441:                         InitLitMode(&NBytes, Inv);
                    442:                    }
                    443:               }
                    444:               break;
                    445:            default:
                    446:               Error("Bad Buffer Mode... Sorry\n");
                    447:               break;
                    448:          }
                    449:      }
                    450:      BytesSent += SendBuffer(Inv);
                    451:      /* Send out rem'g 2-3 bytes in LITERAL mode. */
                    452:      Buffer[0] = CurrByte;
                    453:      Buffer[1] = NextByte;
                    454:      if (NBytes == 3)
                    455:          Buffer[2] = gb();
                    456:      BufCount = NBytes-1;
                    457:      BytesSent += SendBuffer(Inv);
                    458:      return(BytesSent);
                    459: }
                    460: 
                    461: /******************************************************************************
                    462: *      Diagnostic Routines.                                                  *
                    463: ******************************************************************************/
                    464: DiagRecLRun(Rlength)
                    465: int Rlength;
                    466: {
                    467: #ifdef DIAGS
                    468:      if (Rlength > DiagMaxRunLength)
                    469:          DiagMaxRunLength = Rlength;
                    470:      DiagSumRunLength += Rlength;
                    471:      DiagNumRuns++;
                    472: #endif
                    473: }
                    474: 
                    475: Diags()
                    476: {
                    477: #ifdef DIAGS
                    478:      fprintf(stderr, "Longest Run (<= 128) = %d\n", DiagMaxRunLength);
                    479:      fprintf(stderr, "Number of Runs over 128 = %d\n", DiagNLongRuns);
                    480:      fprintf(stderr, "Average Run Length of %d. (%d Runs)\n",
                    481:             (int) DiagSumRunLength / DiagNumRuns, DiagNumRuns);
                    482: #endif
                    483: }
                    484: 
                    485: /******************************************************************************
                    486: *      PostScript Output Routines.                                           *
                    487: ******************************************************************************/
                    488: PrintPostScriptRoutines(ras_h, ras_w, ras_d, tx, ty, sx, sy, rot)
                    489: int ras_h, ras_w, ras_d;
                    490: double tx, ty, sx, sy, rot;
                    491: {
                    492:      printf("%%!\n/inch {72 mul} def\n");
                    493:      printf("/bpp %d def\n", ras_d);
                    494:      printf("/scanlines %d def\n", ras_h);
                    495:      printf("/scansize %d def\n", ras_w);
                    496:      printf("/bitmapx\n{");
                    497:      printf(" %d %d %d [%d 0 0 %d 0 %d] ", ras_w, ras_h, ras_d, ras_w, 
                    498:            -ras_h, ras_h);
                    499:      printf("{currentfile readrlehexstring pop } image\n} def\n");
                    500:      printf("gsave\n");
                    501:      printf("%f inch %f inch translate\n",tx, ty);
                    502:      printf("%f rotate\n", rot );
                    503:      printf("%f inch %f inch scale\n", sx, sy);
                    504:      printf("/readrlehexstring\t%% rle_file => decoded_string boolean\n");
                    505:      printf("{\n\t/fileptr exch def\n\tfileptr 1 string readhexstring {");
                    506:      printf("\n\t\t0 get dup 128 and 0 eq\n");
                    507:      printf("\t\t{ 1 add /Buffer exch string def\n");
                    508:      printf("\t\t\tfileptr Buffer readhexstring\n\t\t}\n\t\t{");
                    509:      printf(" 256 exch sub /BufCount exch def\n");
                    510:      printf("\t\t\t/Buffer BufCount 1 add string def\n");
                    511:      printf("\t\t\t/RunInt fileptr 1 string readhexstring");
                    512:      printf(" pop 0 get def\n");
                    513:      printf("\t\t\t0 1 BufCount { RunInt Buffer 3 1 roll put } for\n");
                    514:      printf("\t\t\tBuffer true\n\t\t} ifelse\n\t}\n\t{ false } ifelse\n");
                    515:      printf("} def\n");
                    516:      printf("/clipathx\n{\tnewpath\n\t0 0 moveto\n\t%f inch 0", sx);
                    517:      printf(" lineto\n\t%f inch %f inch lineto\n\t0 %f inch lineto\n",
                    518:            sx, sy, sy);
                    519:      printf("\tclosepath\n} def\nclipathx clip\n");
                    520:      printf("bitmapx\n");
                    521: }
                    522: 
                    523: PrintPostScriptClosing()
                    524: {     
                    525:      printf("\ngrestore\n");
                    526:      printf("showpage\n");
                    527: }
                    528: 
                    529: /******************************************************************************
                    530: *      Error Routine.                                                        *
                    531: ******************************************************************************/
                    532: Error(S1, S2, S3)
                    533: char *S1, *S2, *S3;
                    534: {
                    535:      fprintf(stderr, S1, S2, S3);
                    536:      exit(-1);
                    537: }

unix.superglobalmegacorp.com

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