home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 004.lha / Vax_Ray_Tracing / display.c < prev    next >
C/C++ Source or Header  |  1986-03-02  |  6KB  |  244 lines

  1. /***********************************************************************
  2.  *
  3.  *  DISPLAY package for .img files (DBW encoding)
  4.  *
  5.  *    File format:
  6.  *        MAXX MAXY MAXCOLORS                    - header
  7.  *        256 hex colors in descending usage      - colortable
  8.  *        Encoding of pixels: (all printable ASCII)
  9.  *        @ - O    = Absolute color (low four bits) in color table
  10.  *        P - _    = Relative color. Low four bits is new BLUE  value
  11.  *        ` - o    = Relative color. Low four bits is new RED   value
  12.  *        p - DEL    = Relative color. Low four bits is new GREEN value
  13.  *        ' ' - >    = Repeat introducer (next char - ' ' = repeat count)
  14.  *        ?       = Alternate encoding for <DEL>
  15.  *        \r \n    = Ignored (end of line markers) (NOT scan line)
  16.  *
  17.  *    v1.0    860907    DBW
  18.  *
  19.  ***********************************************************************/
  20.  
  21. #include <stdio.h>
  22. #include <exec/types.h>
  23. #include <intuition/intuition.h>
  24. #include <intuition/intuitionbase.h>
  25. #include <functions.h>
  26.  
  27. extern    char    *fgets();
  28.  
  29. #undef    NULL
  30. #define    NULL    ((void *)0)
  31.  
  32. #define CHECK(x)    while (line[x] < ' ') {\
  33.     if (fgets(line,128,fp) == NULL) return(-1);\
  34.     x = 0;\
  35.     }
  36.  
  37. struct    GfxBase        *GfxBase;
  38. struct    IntuitionBase    *IntuitionBase;
  39. struct    RastPort    *rp;
  40. struct    ViewPort    *vp;
  41. struct    Window        *w;
  42. struct    Screen        *screen;
  43. struct    IntuiMessage    *message;
  44. struct    NewScreen    ns = {
  45.     0L,0L,320L,400L,6L,
  46.     0,1,HAM|LACE,
  47.     CUSTOMSCREEN,NULL,
  48.     (UBYTE *)"Display screen",
  49.     NULL,NULL };
  50. struct    NewWindow    nw = {
  51.     0L,0L,320L,400L,0L,1L,
  52.     MOUSEBUTTONS|CLOSEWINDOW,
  53.     ACTIVATE|WINDOWCLOSE|BORDERLESS,
  54.     NULL,NULL,
  55.     (UBYTE *)"Display window",
  56.     NULL,NULL,
  57.     0L,0L,320L,400L,CUSTOMSCREEN };
  58.  
  59. FILE        *fp = NULL;
  60. unsigned char    line[128];
  61. int        maxx,maxy,maxc;
  62. int        colors[16];
  63. int        cpix,cr,cg,cb,count,pos;
  64.  
  65. main(argc,argv)
  66. int argc;
  67. char *argv[];
  68.     {
  69.     unsigned long class;
  70.     unsigned short code;
  71.     int        i,x,y,val,bflg;
  72.  
  73.     GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L);
  74.     if (GfxBase == NULL) exit(100);
  75.  
  76.     IntuitionBase = 
  77.     (struct IntuitionBase *)OpenLibrary("intuition.library",0L);
  78.     if (IntuitionBase == NULL) {
  79.     CloseLibrary(GfxBase);
  80.     exit(200);
  81.     }
  82.  
  83.     screen = (struct Screen *)OpenScreen(&ns);
  84.     if (screen == NULL) {
  85.     CloseLibrary(IntuitionBase);
  86.     CloseLibrary(GfxBase);
  87.     exit(300);
  88.     }
  89.  
  90.     nw.Screen = screen;
  91.     w          = (struct Window *)OpenWindow(&nw);
  92.     if (w == NULL) {
  93.     CloseScreen(screen);
  94.     CloseLibrary(IntuitionBase);
  95.     CloseLibrary(GfxBase);
  96.     exit(400);
  97.     }
  98.  
  99.     vp = &screen->ViewPort;
  100.     rp = w->RPort;
  101.  
  102.     /* get the file to read */
  103.     if (argc < 2) fp = stdin;
  104.     else      fp = fopen(argv[1],"r");
  105.  
  106.     if (fp == NULL) error("Can't open input file");
  107.     if (fgets(line,128,fp) == NULL) error("Can't read first line");
  108.     if (sscanf(line,"%d %d %d\n",&maxx,&maxy,&maxc) != 3) error("Bad header");
  109.     if (maxc != 256) error("expecting 256 colors");
  110.     for (i = 0; i < 16; i++) {
  111.     if (fgets(line,128,fp) == NULL) error("Can't read colors");
  112.     if (i == 0 &&
  113.         sscanf(line,"%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n",
  114.          &colors[0],&colors[1],&colors[2],&colors[3],&colors[4],&colors[5],
  115.          &colors[6],&colors[7],&colors[8],&colors[9],&colors[10],&colors[11],
  116.          &colors[12],&colors[13],&colors[14],&colors[15]) != 16)
  117.         error("Didn't find 16 colors as expected");
  118.     }
  119.  
  120.     /* now set the color map */
  121.     for (i = 0; i < 16; i++) {
  122.     SetRGB4(vp, (long)i, (long)((colors[i] >> 8) & 0xF),
  123.                  (long)((colors[i] >> 4) & 0xF),
  124.                  (long)((colors[i]     ) & 0xF));
  125.     }
  126.  
  127.     /* now init the read buffer */
  128.     line[0] = '\n';
  129.     pos        = 0;
  130.     count   = 0;
  131.     cr        = 0;
  132.     cg        = 0;
  133.     cb        = 0;
  134.     cpix    = '@';
  135.     SetDrMd(rp,JAM1);
  136.  
  137.     /* Read through the file and display the results */
  138.     bflg = 0;
  139.     for (y = 0; y < maxy; y++) {
  140.  
  141.     /* check if there was an attempt to abort */
  142.     while ((message=(struct IntuiMessage *)GetMsg(w->UserPort))!=NULL) {
  143.         class   = message->Class;
  144.         code    = message->Code;
  145.         ReplyMsg(message);
  146.  
  147.         if (class == CLOSEWINDOW) error(NULL);
  148.         }
  149.  
  150.     /* now dump the scan line */
  151.     for (x = 0; x < maxx; x++) {
  152.         if (getnext() == -1) {
  153.         bflg = 1;
  154.         break;
  155.         }
  156. /*
  157.         val  = ((cr * 7 + cg * 4 + cb * 2) / 2) + 32;
  158.         if (val > 126) val = 126;
  159.         if ((y % 10) == 9 && (x % 4) == 3) printf("%c",(char)val);
  160. */        
  161.         if (x < 320 && y < 400) {
  162.         SetAPen(rp,(long)(cpix & 0x3F));
  163.         WritePixel(rp,(long)x,(long)y);
  164.         }
  165.         }
  166.     if (bflg == 1) break;
  167. /*
  168.     if ((y % 10) == 9) printf("\n");
  169. */
  170.     }
  171.  
  172.     /* wait here until we get a close window message */
  173.     while (1) {
  174.     WaitPort(w->UserPort);
  175.     while ((message=(struct IntuiMessage *)GetMsg(w->UserPort))!=NULL) {
  176.         class   = message->Class;
  177.         code    = message->Code;
  178.         ReplyMsg(message);
  179.  
  180.         if (class == CLOSEWINDOW) error(NULL);
  181.         }
  182.     }
  183.     }
  184.  
  185. error(msg)
  186. char *msg;
  187.     {
  188.     if (msg) {
  189.     puts("ERROR: ");
  190.     puts(msg);
  191.     puts("\n");
  192.     }
  193.     CloseWindow(w);
  194.     CloseScreen(screen);
  195.     CloseLibrary(IntuitionBase);
  196.     CloseLibrary(GfxBase);
  197.     if (fp != NULL && fp != stdin) fclose(fp);
  198.     if (msg) exit(-1);
  199.     else     exit(0);
  200.     }
  201.  
  202. getnext() {
  203.     int    scr,crgb;
  204.  
  205.     /* first see if we're in a repeat count */
  206.     if (count-- > 0) return(0);
  207.  
  208.     /* now see if we need a new buffer */
  209.     CHECK(pos);
  210.  
  211.     /* see if we got a repeat count */
  212.     if (line[pos] < '?') {
  213.     count = (line[pos] - ' ') * 94;
  214.     ++pos;
  215.     CHECK(pos);
  216.     count += line[pos++] - ' ';
  217.     CHECK(pos);
  218.     }
  219.     else
  220.     count = 1;
  221.  
  222.     /* now bring the character in */
  223.     cpix = line[pos++];
  224.     if (cpix == '?') cpix = 127;
  225.     if (--count < 0) return(0);
  226.  
  227.     /* now set up all the associated variables */
  228.     scr = (cpix >> 4) & 3;
  229.     switch (scr) {
  230.     case 0:    crgb = colors[cpix & 0xF];
  231.         cr   = (crgb >> 8) & 0xF;
  232.         cg   = (crgb >> 4) & 0xF;
  233.         cb   = (crgb     ) & 0xF;
  234.         break;
  235.     case 1:    cb   = cpix & 0xF;
  236.         break;
  237.     case 2:    cr   = cpix & 0xF;
  238.         break;
  239.     case 3:    cg   = cpix & 0xF;
  240.         break;
  241.     }
  242.     return(0);
  243.     }
  244.