home *** CD-ROM | disk | FTP | other *** search
/ Encyclopedia of Graphics File Formats Companion / GFF_CD.ISO / software / unix / saoimage / sao1_07.tar / imgread.c < prev    next >
C/C++ Source or Header  |  1992-04-23  |  6KB  |  236 lines

  1. #ifndef lint
  2. static char SccsId[] = "%W%  %G%";
  3. #endif
  4.  
  5. /* Module:    imgread.c (Image Read)
  6.  * Purpose:    Read image headers and image files
  7.  * Subroutine:    init_image()            returns: int
  8.  * Subroutine:    load_image()
  9.  * Xlib calls:    none
  10.  * Copyright:    1989 Smithsonian Astrophysical Observatory
  11.  *        You may do anything you like with this file except remove
  12.  *        this copyright.  The Smithsonian Astrophysical Observatory
  13.  *        makes no representations about the suitability of this
  14.  *        software for any purpose.  It is provided "as is" without
  15.  *        express or implied warranty.
  16.  * Modified:    {0} Michael VanHilst    initial version             1 July 1989
  17.  *        {n} <who> -- <does what> -- <when>
  18.  */
  19.  
  20. #include <stdio.h>            /* stderr, NULL, etc. */
  21. #include <X11/Xlib.h>            /* X window stuff */
  22. #include <X11/Xutil.h>            /* X window manager stuff */
  23. #include "hfiles/constant.h"        /* constants and codes */
  24. #include "hfiles/struct.h"        /* declare structure types */
  25. #include "hfiles/extern.h"        /* extern main parameter structures */
  26.  
  27. static int init_imtool;
  28.  
  29. /*
  30.  * Subroutine:    init_image
  31.  * Purpose:    Set the image dimensions
  32.  * Returns:    1 if OK, 0 if trouble
  33.  * Method:    set image info from known values or read from a header
  34.  */
  35. int init_image ( )
  36. {
  37.   int get_fbconfig();        /* get IRAF expected frame size */
  38.   void init_img(), init_dispcen();
  39. #ifdef FITS
  40.   int init_fits();
  41. #endif
  42. #ifdef OIF
  43.   int init_irafimh();
  44. #endif
  45.  
  46.   /* read and strip subsection suffix */
  47. /* %%  get_subsection(&img); */
  48.   switch( img.file_type ) {
  49.   case SOP_Array:
  50. #ifdef DEBUG
  51.     if( (img.filerows <= 0) || (img.filecols <= 0) ) {
  52.       (void)fprintf(stderr, "Error: array dimensions not set");
  53.       return( 0 );
  54.     }
  55. #endif
  56.     img.block_type = SOP_ZoomNone;
  57.     break;
  58.   case SOP_FITS:
  59. #ifdef FITS
  60.     if( (img.fd = init_fits(&img)) < 0 )
  61.       return( 0 );
  62.     img.block_type = SOP_ZoomNone;
  63.     break;
  64. #else
  65.     (void)fprintf(stderr, "WARNING: not compiled with -DFITS switch\n");
  66.     return( 0 );
  67. #endif
  68.   case SOP_IRAF:
  69. #ifdef OIF
  70.     if( (img.fd = init_irafimh(&img)) < 0 )
  71.       return( 0 );
  72.     img.block_type = SOP_ZoomNone;
  73.     break;
  74. #else
  75.     (void)fprintf(stderr, "WARNING: not compiled with -DIRAF switch\n");
  76.     return( 0 );
  77. #endif
  78.   case SOP_SAOCCD:
  79. #ifdef SAOCCD
  80.     init_saoccd(&img);
  81.     img.block_type = SOP_ZoomNone;
  82.     break;
  83. #else
  84.     (void)fprintf(stderr, "WARNING: not compiled with -DSAOCCD switch\n");
  85.     return( 0 );
  86. #endif
  87.   case SOP_Imtool:
  88.   case SOP_PROS:
  89. #ifdef IMTOOL
  90.     /* remote access from iraf, start with standard screen size */
  91. fprintf (stdout,"DBG: img.fbconfig=%d  -> ",img.fbconfig);
  92.     if( get_fbconfig(img.fbconfig, &img.filecols, &img.filerows) == 0 ) {
  93.       img.filecols = 512;
  94.       img.filerows = 512;
  95.     }
  96. fprintf (stdout,"filecols=%d  filerows=%d\n",img.filecols,img.filecols);fflush(stdout);
  97.     img.block_type = SOP_ZoomNone;
  98.     /* signal load_image to load a default image */
  99.     init_imtool = 1;
  100.     break;
  101. #else
  102.     (void)fprintf(stderr, "Note: IRAF pipe support not compiled.\n");
  103.     return( 0 );
  104. #endif
  105.   case SOP_Logo:
  106.   default:
  107.     img.filerows = 512;
  108.     img.filecols = 512;
  109.     img.block_type = SOP_ZoomNone;
  110.     break;
  111.   }
  112.   /* fix up image record parameters and img to file conversions */
  113.   init_img(&img, &coord);
  114.   init_dispcen(&img, &coord);
  115.   return( 1 );
  116. }
  117.  
  118. /*
  119.  * Subroutine:    load_image
  120.  * Purpose:    Open if necessary, then read the appropriate image file
  121.  *        and create a 16 bit image array
  122.  */
  123. void load_image ( fb, buf, bftrans, imgbuf, filebuf, buf_squared, buf_doubled )
  124.      Edges *fb;            /* coord structures (for disp or pan) */
  125.      Coordsys *buf;
  126.      Transform *bftrans;
  127.      short *imgbuf;
  128.      char *filebuf;
  129.      int buf_squared, buf_doubled;    /* buf is larger to enable rotation */
  130. {
  131.   static int init = 1;    /* signal first time through */
  132.   int x, y;
  133.   int width, height;
  134.   int read_image;    /* avoid doing rotate if there is nothing to rotate */
  135.   void read_array(), rotate_buf(), clear_coord_area(), load_logo();
  136.  
  137. #ifdef SUBSEC
  138.   float X, Y;
  139.   void i_transform();
  140.   /* THIS ISN'T RIGHT (WHAT IF IMAGE IS ROTATED OR FLIPPED?) */
  141.   /* get file coords of buffer's 0,0 element */
  142.   i_transform(bftrans, 0, 0, &X, &Y);
  143.   x = (int)(X + 0.5);
  144.   y = (int)(Y + 0.5);
  145. #else
  146.   x = 0;
  147.   y = 0;
  148.   fb->block = 1;
  149. #endif
  150.   /* if rotation has a 90 degree component, get cross zoom factor */
  151.   if( img.rotate_code & 1 ) {
  152.     width = buf->height;
  153.     height = buf->width;
  154.   } else {
  155.     width = buf->width;
  156.     height = buf->height;
  157.   }
  158.   read_image = 0;
  159.   switch(img.file_type) {
  160.   case SOP_Array:
  161.     read_array(-1, &img, imgbuf, filebuf, width, height, x, y,
  162.            fb->block, control.verbose);
  163.     read_image = 1;
  164.     break;
  165. #ifdef FITS
  166.   case SOP_FITS:
  167. #endif
  168. #ifdef OIF
  169.   case SOP_IRAF:
  170. #endif
  171.     read_array(img.fd, &img, imgbuf, filebuf,
  172.            width, height, x, y, fb->block, control.verbose);
  173.     read_image = 1;
  174.     break;
  175. #ifdef SAOCCD
  176.   case SOP_SAOCCD:
  177.     load_saoccd(&img, imgbuf, width, height, x, y, fb->block);
  178.     read_image = 1;
  179.     break;
  180. #endif
  181. #ifdef XRAY
  182.   case SOP_HRI:
  183.   case SOP_IPC:
  184.     load_einstein(&img, imgbuf, width, height,
  185.           fb->cenX, fb->cenY, fb->block);
  186.     read_image = 1;
  187.     break;
  188. #endif
  189. #ifdef ROSAT
  190.   case SOP_ROSAT:
  191.     load_rosat(&img, imgbuf, width, height, fb->cenX, fb->cenY, fb->block);
  192.     read_image = 1;
  193.     break;
  194. #endif
  195. #ifdef IMTOOL
  196.   case SOP_Imtool:
  197.   case SOP_PROS:
  198.     if( init )
  199.       load_logo(imgbuf, width, height);
  200.     if( init_imtool ) {
  201.       init_imtool = 0;
  202.     }
  203.     break;
  204. #endif
  205.   case SOP_Logo:
  206.     if( init )
  207.       load_logo(imgbuf, width, height);
  208.   default:
  209.     break;
  210.   }
  211.   if( read_image ) {
  212.     if( (img.row_order != 0) || (img.rotate_code != 0) ) {
  213.       rotate_buf(imgbuf, img.row_order, img.rotate_code, width, height,
  214.          buf_squared, buf_doubled);
  215.     }
  216.     if( (img.file_type != SOP_Imtool) && (img.file_type != SOP_PROS) ) {
  217.       /* we loaded a non-imtool image */
  218.       img.imtool_200 = 0;
  219.       /* if there was a second coordinate system, cancel it */
  220.       if( coord.imtool_aux ) {
  221.     clear_coord_area();
  222.     coord.imtool_aux = 0;
  223.       }
  224.       /* if artificial limits were applied to input, mark short_buf extremes */
  225.       if( img.fimin < img.fimax ) {
  226.     buffer.clipmin = (int)((img.fimin - img.fibias) / img.fiscale);
  227.     buffer.clipmax = (int)((img.fimax - img.fibias) / img.fiscale);
  228.       } else {
  229.     /* imtool limits are set when an image is read from the pipe */
  230.     buffer.clipmin = -32768;
  231.     buffer.clipmax = 32767;
  232.       }
  233.     }
  234.   }
  235. }
  236.