home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_02_03 / 2n03010a < prev    next >
Text File  |  1991-01-14  |  2KB  |  88 lines

  1. /*
  2.  * Listing 4: Dithered print_stripe().
  3.  */
  4. #define DSZ 2    /* 2x2 dither will be used */
  5.  
  6. /*
  7.  * 2x2 dither pattern:
  8.  * contains five 2x2 squares
  9.  */
  10. unsigned char dither[5][DSZ][DSZ] =
  11.     {
  12.         {0, 0,
  13.          0, 0},
  14.  
  15.         {0, 1,
  16.          0, 0},
  17.  
  18.         {1, 0,
  19.          0, 1},
  20.  
  21.         {0, 1,
  22.          1, 1},
  23.  
  24.         {1, 1,
  25.          1, 1}
  26.      };
  27.  
  28.  
  29. void print_stripe( int y_start )
  30.     {
  31.     int num_pix, x, y, bit_num, which_color, r, g, b, v;
  32.     unsigned char out_pixel, c;
  33.     static char graph_cmd[4] = {ESC, 'L', 0, 0};
  34.     static char color_sel[3] = {ESC, 'r', 0};
  35.  
  36.     for (which_color = 1; which_color <= 4; which_color <<= 1)
  37.         {
  38.         color_sel[2] = which_color + '0';
  39.         write(print_fh, color_sel, 3);
  40.  
  41.         /* Send ESC L n1 n2, where (256 * n2) + n1 is the
  42.          * number of pixels across a line.
  43.          */
  44.         num_pix = (x_max + 1) * DSZ;    /* note dither size */
  45.         graph_cmd[2] = num_pix & 0xff;
  46.         graph_cmd[3] = num_pix >> 8;
  47.         write(print_fh, graph_cmd, 4);
  48.  
  49.         for (x = 0; x < num_pix; ++x)
  50.             {
  51.             /* Accumulate 8 pixels, vertically, into out_pixel.
  52.              */
  53.             out_pixel = 0;
  54.             y = y_start;
  55.             for (bit_num = 7; bit_num >= 0; --bit_num, ++y)
  56.                 {
  57.                 getrgb(x / DSZ, y / DSZ, &r, &g, &b);
  58.                 switch (which_color)    /* pick R, G, or B */
  59.                     {
  60.                     case 1:
  61.                         v = g;
  62.                         break;
  63.                     case 2:
  64.                         v = r;
  65.                         break;
  66.                     case 4:
  67.                         v = b;
  68.                         break;
  69.                     }
  70.  
  71.                 /* Map 0..255 into 0..4 and look up
  72.                  * the proper dither pattern dot.
  73.                  */
  74.                 v /= 52;
  75.                 if (dither[v][x % DSZ][y % DSZ] == 0)
  76.                     out_pixel |= (1 << bit_num);
  77.                 }
  78.             write(print_fh, &out_pixel, 1);
  79.             }
  80.  
  81.         c = CR;        /* send CR after each data set */
  82.         write(print_fh, &c, 1);
  83.         }
  84.  
  85.     c = LF;        /* send LF after all three sets */
  86.     write(print_fh, &c, 1);
  87.     }
  88.