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(¬_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); }