Listing 4

/*****************************************************
*   file c:\cips\display.c
*
*   Purpose: These functions display images on
*   a the monitor.
*
*       External Calls:
*          cips.c - clear_text_screen
*
*       Modifications:
*          17 June 1987 - created
*          August 1990 - extension modifications for use
*              in the C Image Processing System
********************************************************/

#include "d:\cips\cips.h"

/*****************************
 *   display_image(...
 *******************************/

display_image(file_name, image, il, ie, ll, le,
            image_header, monitor_type,
            color_transform, invert,
            image_colors, display_colors)
   char    color_transform[],
          file_name[],
          monitor_type[];
   int     display_colors,
          image_colors,
          invert,
          il,
          ie,
          ll,
          le;
   short   image[ROWS][COLs];
   struct  tiff_header_struct *image_header;
{
   char  channels[80],
        response[80];

   int   a,
        b,
        c,
        channel,
        display_mode,
        key,
        horizontal,
        max_horizontal,
        max_vertical,
        not_finished,
        r,
        vertical;

   unsigned int block,
              color,
              i,
              j,
              x,
              y;


   not_finished = 1;
   while(not_finished){


      if(display_colors == 16){
         if(monitor_type[0] == 'V'){
            horizontal = 4;
            vertical  = 6;
            display_mode: _VRES16COLOR; /*MSC 6.0 */
         }  /* ends if V*/
         if(monitor_type[0] == 'E'){
            horizontal  = 3;
            vertical    = 6;
         display_mode = _ERESCOLOR; /* MSC 6.0 */
      }  /* ends if E */
   }  /* ends if colors == 16 */

   else{
      horizontal    = 2;
      vertical      = 2;
      display_mode = MAXCOLORMODE; /* MSC 6.0 */
   }

   max_horizontal = (image_header->image_length+50)/100;
   max_vertical   = (image_header->image_width+50)/100;

   if(horizontal > max_horizontal) horizontal = max_horizontal;
   if(vertical > max_vertical) vertical = max_vertical;

     /* set graphics mode */

_setvideomode(display_mode); /* MSC 6.0 */
if(display_colors == 16) map_16_shades_of_gray(display_mode);

/****************************************
*   Loop over this size and
*   read and display ROWSxCOLS arrays.
*****************************************/
   for(a=0; a<vertical; a++){
      for(b=0; b<horizontal; b++){
         x = a*100;
         y = b*100;
         read_tiff_image(file_name, image, il+y,
                      ie+x, ll+y, le+x);
            display_image_portion(image, x, y, display_colors,
                              image_colors, invert);
         }      /* ends loop over b */
      }       /* ends loop over a */

      read_string(response);
      printf("\nEnter 0 to quit 1 to do again");
      get_integer(&not_finished);

         /* set display back to text mode */
      clear_text_screen();

   }  /* ends while not_finished */
}  /* ends main */
 /**********************************
 *   display_menu_for_display_image(
 ***********************************/

display_menu_for_display_image(image_colors,
           display_colors, invert,
           color_transform, monitor_type)
   char color_transform[], monitor_type[];
   int *invert, *image_colors, *display_colors;
{
   char response[80];
   int int_response, not_finished, r;

   not_finished = 1;
   while(not_finished){
      printf("\n\nDISPLAY> Enter choice (0 for no change) ");
      printf("\nDISPLAY> 1. Invert is %d (1=on 0=off)", *invert);
      printf("\nDISPLAY> 2. Color Transform-- %s",
            color_transform);
      printf("\nDISPLAY> 3. Input image has %d colors",
            *image_colors);
      printf("\nDISPLAY> 4. Display will show %d colors",
            *display_colors);
      printf("\nDISPLAY> 5. Monitor type is %s",
            monitor_type);

      printf("\nDISPLAY> _\b");
      get_integer(&r);

      if(r == 0){
        not_finished = 0;
      }
      if(r == 1){
        printf(
           "\nDISPLAY> Enter 1 for invert on 0 for invert off");
        printf("\nDISPLAY> ___");
        get_integer(&int_response);
        *invert = int_response;
      } /* ends if r == 1 */
      if(r == 2){
        printf("\nDISPLAY> Enter the new color transform mode ");
        printf(
           "\nDISPLAY> (S) Straight mode  (M) Modified mode");
        printf("\nDISPLAY> \b");
        read_string(response);
        if((response[0] == 'S') ||
           (response[0] == 's'))
             strcpy(color_transform, "Straight mode");
        else
             strcpy(color_transform, "Modified mode*);
      } /* ends if r == 2 */

      if(r == 3){
        printf(
        "\nDISPLAY> Enter the number of colors in the input image"
         );
        printf("\nDISPLAY> __");
        get_integer(&int_response);
        *image_colors = int_response;
      } /* ends if r == 3 */

      if(r == 4){
        printf(
         "\nDISPLAY> Enter the number of colors for the display");
        printf("\nDiSPLAY> __");
        get_integer(&int_response);
        *display_colors = int_response;
      } /* ends if r == 4 */
      if(r == 5){
        printf("\nDISPLAY> Enter the new monitor type");
        printf(
           "\nDISPLAY> (E) EGA     (V) VGA");
        printf("\nDISPLAY> _\b");
        read_string(response);
        if(response[0] == 'E') ||
          (response[0] == 'e'))
            strcpy(monitor_type, "EGA");
          else
                strcpy(monitor_type, "VGA");
      }   /* ends if r == 5 */

   }  /* ends white not_finished */
}  /* ends display_menu */
 /*********************************
 *   display_image_portion(...
 **********************************/

display_image_portion(image, x, y, display_colors, image_colors,
                  invert)
   int      invert, display_colors,image_colors;
   short    image[ROWS] [COLS];
   unsigned int x, y;
{
   unsigned int color, i, j;

      if(invert == 1){
         if(image_colors == 256){
            for(i=0; i<ROWS; i++)
               for(j=0; j<COLS; j++)
                  image[i] [j] = 255 - image[i][j];
         } /* ends if image_colors = 256 */

         if(image_colors == 16){
            for(i=0; i<ROWS; i++)
               for(j=0; j<COLS; j++)
                  image[i][j] = 15 - image[i][j];
         } /* ends if image_colors = 16 */

      }  /* ends if invert == 1 */

      for(i=0; i<ROWS; i++){
         for(j=0; j<COLS; j++){

            if( (display_colors == 16) &&
                (image_colors == 256))
              color = image[i] [j]/16;
            if( (display_colors == 16) &&
                (image_colors == 16))
              color = image[i] [j];
            if( (display_colors == 256) &&
                (image_colors == 256))
              color = image[i][j];
            if( (display_colors == 256) &&
                (image colors == 16))
              color = image[i][j]*16;
            _setcolor(color);   /* MSC 6.0 statements */
            _setpixel(j+x, i+y);

            /*my_set_pixel(j+x, i+y, color);*/
         }  /* ends loop over j */
      }     /* ends loop over i */

}  /*  ends display_image_portion */

/**********************************************
*   map_16_shades_of_gray(...
*
*  This function maps 16 shades of gray into
*  the first 16 color indices. This allows
*  you to display a true "black and white"
*  image on a color monitor.
**********************************************/

map_16_shades_of_gray(display_mode)
   int display_mode;
{
   /* all MSC 6.0 statements */
_setvideomode(display_mode);
_remappalette(0,  0x000000L);
_remappalette(1,  0x040404L);
_remappalette(2,  0x080808L);
_remappalette(3,  0x0c0c0cL);
_remappelette(4,  0x101010L);
_remappalette(5,  0x141414L);
_remappalette(6,  0x181818L);
_remappalette(7,  0x1c1c1cL);
_remappalette(8,  0x202020L);
_remappalette(9,  0x242424L);
_remappalette(10, 0x282828L);
_remappalette(11, 0x2c2c2cL);
_remappalette(12, 0x303030L);
_remappalette(13, 0x343434L);
_remappalette(14, 0x383838L);
_remappalette(15, 0x3f3f3fL);
}