home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 015.lha / tracer_source / show.c < prev    next >
C/C++ Source or Header  |  1986-11-10  |  5KB  |  212 lines

  1. /*
  2.     show.c
  3.  
  4.     Take a file of grey scales and display them with dithering.
  5.     The first line has the resolution dimensions.
  6.                         mcr
  7. */
  8.  
  9. #include <graphics/gfxbase.h>
  10. #include <graphics/display.h>
  11. #include <intuition/intuition.h>
  12. #include <stdio.h>
  13.  
  14. struct    GfxBase        *GfxBase;    /* Export the library pointers */
  15. struct    IntuitionBase    *IntuitionBase;
  16. struct    RastPort    *rp;        /* Graphics structures           */
  17. struct    ViewPort    *vp;
  18. struct    Window        *w;        /* Intuition structures        */ 
  19. struct    Screen        *screen;
  20.  
  21. struct    NewScreen    ns = {
  22.     0, 0,                /* start position                */
  23.     640, 400, 4,            /* width, height, depth          */
  24.     15, 0,                /* detail pen, block pen         */
  25.     HIRES|INTERLACE,        /* Hires ViewMode                */
  26.     CUSTOMSCREEN,            /* screen type                   */
  27.     NULL,                /* font to use                   */
  28.     " Tracer Output ",        /* default title for screen      */
  29.     NULL                /* pointer to additional gadgets */
  30. };
  31.  
  32. struct NewWindow nw = {
  33.     0, 11,                /* start position                */
  34.     640, 386,            /* width, height                 */
  35.     15, 0,                /* detail pen, block pen         */
  36.     NULL,                /* IDCMP flags                   */
  37.     BORDERLESS,            /* window flags                  */
  38.     NULL,                /* pointer to first user gadget  */
  39.     NULL,                /* pointer to user checkmark     */
  40.     NULL,                /* window title                  */
  41.     NULL,                /* pointer to screen (set below) */
  42.     NULL,                /* pointer to superbitmap        */
  43.     0, 0, 640, 386,            /* ignored since not sizeable    */
  44.     CUSTOMSCREEN            /* type of screen desired        */
  45. };
  46.  
  47. FILE    *in;
  48. int    do_dither=0;
  49.  
  50. main(argc, argv)
  51. int    argc;
  52. char    **argv;
  53. {
  54.     char    wait[10];
  55.  
  56.     if(argv[1][0] == '-') {
  57.         switch (argv[1][1]) {
  58.         case    'd'    :
  59.                 do_dither = 1;
  60.                 break;
  61.  
  62.         default        :
  63.                 printf("option not recognized\n");
  64.         }
  65.  
  66.         argv++;
  67.     }
  68.  
  69.     if( !(in=fopen(argv[1], "r")) ) {
  70.         printf("no input file\n");
  71.         exit(-1);
  72.     }
  73.     if ( !(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library") ) ) {
  74.         cleanup();
  75.         exit(103);
  76.     }
  77.  
  78.     if ( !( IntuitionBase = (struct IntuitionBase *)
  79.         OpenLibrary("intuition.library") )
  80.      ) {
  81.         cleanup();
  82.         exit(103);
  83.     }
  84.     if ( !( screen = (struct Screen *)
  85.         OpenScreen(&ns) )
  86.     ) { 
  87.         cleanup();
  88.         exit(103);
  89.     }
  90.  
  91.     nw.Screen = screen;                /* Open window in our new screen */
  92.     if ( !( w = (struct Window *)
  93.         OpenWindow(&nw) )
  94.     ) {
  95.         cleanup();
  96.         exit(103);
  97.     }
  98.  
  99.     vp = &screen->ViewPort;             /* Set colors in screen's VP    */
  100.     rp = w->RPort;                      /* Render into the window's RP  */
  101.  
  102.     /* Set the color registers ( cut down on ugly greens )    */
  103.     SetRGB4(vp, 00, 00, 00, 00);
  104.     SetRGB4(vp, 01, 01, 00, 01);    
  105.     SetRGB4(vp, 02, 02, 01, 02);   
  106.     SetRGB4(vp, 03, 03, 02, 03);
  107.     SetRGB4(vp, 04, 04, 03, 04);
  108.     SetRGB4(vp, 05, 05, 04, 05);
  109.     SetRGB4(vp, 06, 06, 05, 06);
  110.     SetRGB4(vp, 07, 07, 06, 07);
  111.     SetRGB4(vp, 08, 08, 07, 08);
  112.     SetRGB4(vp, 09, 09, 08, 09);
  113.     SetRGB4(vp, 10, 10, 09, 10);
  114.     SetRGB4(vp, 11, 11, 10, 11);
  115.     SetRGB4(vp, 12, 12, 11, 12);
  116.     SetRGB4(vp, 13, 13, 12, 13);
  117.     SetRGB4(vp, 14, 14, 13, 14);
  118.     SetRGB4(vp, 15, 15, 14, 15);
  119.  
  120.     show(in);
  121.     
  122.     gets(wait);
  123.  
  124.     cleanup();
  125. }
  126.  
  127. cleanup()
  128. {
  129.     fclose(in);
  130.  
  131.     if (w)
  132.         CloseWindow(w);
  133.  
  134.     if (screen)
  135.         CloseScreen(screen);
  136.  
  137.     if (IntuitionBase)
  138.         CloseLibrary(IntuitionBase);
  139.  
  140.     if (GfxBase)
  141.         CloseLibrary(GfxBase);
  142. }
  143.  
  144. show(in)
  145. FILE    *in;
  146. {
  147.     int    x, y, ox, oy;
  148.  
  149.     fscanf(in, "%d %d\n", &ox, &oy);
  150.  
  151.     /* waste 8 bits */
  152.     y = getc(in);
  153.  
  154.     if (do_dither) {
  155.         for(y=0; y<oy; y++)
  156.             for(x=0; x<ox; x++) {
  157.                 SetAPen(rp, dither(x, y, getc(in)) );
  158.  
  159.                 if ( (x<640) && (y<400) )
  160.                     WritePixel(rp, x/*+100*/, y/*+30*/);
  161.             }
  162.     } else
  163.         for(y=0; y<oy; y++)
  164.             for(x=0; x<ox; x++) {
  165.                 SetAPen(rp, (getc(in) >> 4) );
  166.  
  167.                 if ( (x<640) && (y<400) )
  168.                     WritePixel(rp, x/*+100*/, y/*+30*/);
  169.             }
  170. }
  171.  
  172.  
  173. /* 8 x 8 dithering matrix */
  174. static    int    matrix[8][8] = {
  175.     {   0, 128,  32, 160,   8, 136,  40, 168 },
  176.     { 192,  64, 224,  96, 200,  72, 232, 104 },
  177.     {  48, 176,  16, 144,  56, 184,  24, 152 },
  178.     { 240, 112, 208,  80, 248, 120, 216,  88 },
  179.     {  12, 140,  44, 174,   4, 132,  36, 164 },
  180.     { 204,  76, 236, 108, 196,  68, 228, 100 },
  181.     {  60, 188,  28, 156,  52, 180,  20, 148 },
  182.     { 252, 124, 210,  92, 244, 116, 212,  84 }
  183. };
  184.  
  185. /*
  186.     dithering by area access to matrix by using
  187.     the MOD function on the x and y coordinates
  188. */
  189. dither(x, y, level) /* dithering function */
  190. register    int    x, y, level;
  191. {
  192.     register    int    base, dith;
  193.  
  194.     base = level >> 4;
  195.     if (base == 0x0F)
  196.         return(base);
  197.  
  198.     dith = (level & 0x0F) << 4;
  199.  
  200.     /*
  201.      * skew every second line over by half a grid to get a brick-layer's
  202.      * pattern, rather than a straight grid.  The human eye is too good
  203.      * at seeing straight lines when the points in the grid line up.
  204.      */
  205.     x += (y & 8) >> 1;
  206.  
  207.     if ( dith > matrix [x%8] [y%8] )
  208.         return(base+1);
  209.  
  210.     return(base);
  211. }
  212.