Listing 2 (djet.c) The Function print_hist_image

  /******************************
   *
   *   print_hist_image(...
   *
   ******************************/


print_hist_image(printer, hist)
   FILE *printer;
   unsigned long hist[];
{
   char   c, d;
   int          i, j, k;
   unsigned long limit, max;

   d = 0;
   c = 255;

      /**********************************
      *
      *   First scale the histogram
      *
      **********************************/

   max = 0;
   for(i=0; i<256; i++)
      if(hist[i] > max) max = hist[i];

   if(max > 200){
      for(i=0; i<256; i++){
        hist[i] = (hist[i]*200)/max;
      }
   }


      /*********************************
      *
      *   Second print it
      *
      *   Print a space between the image
      *   and the histogram.
      *
      **********************************/


   for(i=0; i<20; i++){
        end_graphics_mode(printer);
        select_300_dpi_resolution(printer);
        set_raster_width(printer);
        start_raster_graphics(printer);
        select_full_graphics_mode(printer);
        set_horizontal_offset(printer);
        putc(ESCAPE, printer);
        putc('*', printer);
        putc('b', printer);
        putc('2', printer);
        putc('0', printer);
        putc('0', printer);
        putc('W', rinter);

        for(j=0; j<200; j++)
           putc(d, printer);
}


printf("\n\nHIST> Now printing the histogram");
for(i=0; i<256; i++){
   printf("\n\tHIST> Histogram[%d]=%ld", i, hist[i]);
        /* print the line 2 times */
   for(k=0; k<2; k++){

      end_graphics_mode(printer);
      select_300_dpi_resolution(printer);
      set_raster_width(printer);
      start_raster_graphics(printer);
      select_full_graphics_mode(printer);

        /***************************
        *
        *    Print grid marks every
        *    50 pixels. Do this by
        *    setting a shorter margin
        *    then printing 2 marks then
        *    the data.
        *
        ****************************/

      if( (i == 0)         ||
         (i == 50)  ||
         (i == 100) ||
         (i == 150) ||
         (i == 200) ||
         (i == 255)){

        set_shorter_horizontal_offset(printer);
        putc(ESCAPE, printer);
        putc('*', printer);
        putc('b', printer);
        putc('2', printer);
        putc('0', printer);
        putc('2', printer);
        putc('W', printer);

        putc(c, printer);
        putc(c, printer);

        if(hist[i] >= 200)
           hist[i] = 200;

        limit = 200 - hist[i];

        if(hist[i] == 0)
           putc(c, printer);

        for(j=0; j<hist[i]; j++)
           putc(c, printer);

        for(j=0; j<limit; j++)
          putc(d, printer);

      } /* ends print grid marks */

        /********************************
        *
        *  If you do not print
        *  grid marks, set the normal
        *  margin and then print the
        *  data.
        *
        ********************************/

      else{
        set_horizontal_offset(printer);
        /* this prints 200 bytes so print 200 */

           putc(ESCAPE, printer);
           putc('*', printer);
           putc('b', printer);
           putc('2', printer);
           putc('0', printer);
           putc('0', printer);
           putc('W', printer);

           if(hist[i] >= 200)
              hist[i] = 200;

           limit = 200 - hist[i];

           if(hist[i] == 0)
              putc(c, printer);

           for(j=0; j<hist[i]; j++)
              putc(c, printer);

           for(j=0; j<limit; j++)
             putc(d, printer);

        }  /* ends else no grid marks */

      } /* ends loop over k */

   }  /* ends loop over i */

}  /* ends print_hist_image */

/* End of File */