home *** CD-ROM | disk | FTP | other *** search
/ Encyclopedia of Graphics File Formats Companion / GFF_CD.ISO / software / unix / saoimage / sao1_07.tar / imgrot.c < prev    next >
C/C++ Source or Header  |  1991-01-07  |  4KB  |  144 lines

  1. #ifndef lint
  2. static char SccsId[] = "%W%  %G%";
  3. #endif
  4.  
  5. /* Module:    imgrot.c (Image Rotate)
  6.  * Purpose:    Routines to rotate the img buffer 90 degrees
  7.  * Subroutine:    cwturn_buf()            returns: void
  8.  * Subroutine:    ccwturn_buf()            returns: void
  9.  * Copyright:    1988 Smithsonian Astrophysical Observatory
  10.  *        You may do anything you like with this file except remove
  11.  *        this copyright.  The Smithsonian Astrophysical Observatory
  12.  *        makes no representations about the suitability of this
  13.  *        software for any purpose.  It is provided "as is" without
  14.  *        express or implied warranty.
  15.  * Modified:    {0} Michael VanHilst    initial version         3 December 1988
  16.  *        {n} <who> -- <does what> -- <when>
  17.  */
  18.  
  19. /*
  20.  * Subroutine:    cwturn_buf
  21.  * Purpose:    Rotate a square buffer 90 degrees clockwise
  22.  */
  23. void cwturn_buf ( buf, bufdim )
  24.      short *buf;
  25.      int bufdim;
  26. {
  27.   register short *row, *rowend, *col;
  28.   register int bufwdth = bufdim;
  29.   short *linebuf, *toprow, *botrow;
  30.   int linedim;
  31.   int ring, center;
  32.   char *calloc_errchk();
  33.  
  34.   /* allocate space for temporary storage for two lines */
  35.   linebuf = (short *)calloc_errchk(bufwdth, sizeof(short), "Temp line");
  36.   /* perform rotations from outer ring in toward center */
  37.   center = bufwdth / 2;
  38.   linedim = bufwdth - 1;
  39.   for( ring = 0; ring < center; ring++ ) {
  40.     /* store top row of ring */
  41.     toprow = buf + (ring * (bufwdth + 1));
  42.     botrow = toprow + (linedim * bufwdth) + 1;
  43.     bcopy((char *)toprow, (char *)linebuf, linedim * sizeof(short));
  44.     /* copy left column onto top row */
  45.     row = toprow + linedim - 1;
  46.     rowend = toprow;
  47.     col = toprow + bufwdth;
  48.     do {
  49.       *row = *col;
  50.       col += bufwdth;
  51.     } while( --row >= rowend );
  52.     /* copy bottom row onto left column */
  53.     row = botrow;
  54.     rowend = row + linedim;
  55.     col = toprow + bufwdth;
  56.     do {
  57.       *col = *row;
  58.       col += bufwdth;
  59.     } while( ++row < rowend );
  60.     /* copy right column onto bottom row */
  61.     row--;
  62.     rowend = botrow;
  63.     col = toprow + linedim;
  64.     do {
  65.       *row = *col;
  66.       col += bufwdth;
  67.     } while( --row >= rowend );
  68.     /* copy saved top line onto right column */
  69.     row = linebuf;
  70.     rowend = row + linedim;
  71.     col = toprow + linedim;
  72.     do {
  73.       *col = *row;
  74.       col += bufwdth;
  75.     } while( ++row < rowend );
  76.     linedim -= 2;
  77.   }
  78.   /* free work space */
  79.   free((char *)linebuf);
  80. }
  81.  
  82. /*
  83.  * Subroutine:    ccwturn_buf
  84.  * Purpose:    Rotate a square buffer 90 degrees counter-clockwise
  85.  */
  86. void ccwturn_buf ( buf, bufdim )
  87.      short *buf;
  88.      int bufdim;
  89. {
  90.   register short *row, *rowend, *col;
  91.   register int bufwdth = bufdim;
  92.   short *linebuf, *toprow, *botrow;
  93.   int linedim;
  94.   int ring, center;
  95.   char *calloc_errchk();
  96.  
  97.   /* allocate space for temporary storage for two lines */
  98.   linebuf = (short *)calloc_errchk(bufwdth, sizeof(short), "Temp line");
  99.   /* perform rotations from outer ring in toward center */
  100.   center = bufwdth / 2;
  101.   linedim = bufwdth - 1;
  102.   for( ring = 0; ring < center; ring++ ) {
  103.     /* store top row of ring */
  104.     toprow = buf + (ring * (bufwdth + 1));
  105.     botrow = toprow + (linedim * bufwdth) + 1;
  106.     bcopy((char *)toprow, (char *)linebuf, linedim * sizeof(short));
  107.     /* copy right column onto top row */
  108.     row = toprow;
  109.     rowend = toprow + linedim;
  110.     col = toprow + linedim;
  111.     do {
  112.       *row = *col;
  113.       col += bufwdth;
  114.     } while( ++row < rowend );
  115.     /* copy bottom row onto right column */
  116.     rowend = botrow;
  117.     row = rowend + linedim - 1;
  118.     col = toprow + linedim;
  119.     do {
  120.       *col = *row;
  121.       col += bufwdth;
  122.     } while( --row >= rowend );
  123.     /* copy left column onto bottom row */
  124.     ++row;
  125.     rowend = row + linedim;
  126.     col = toprow + bufwdth;
  127.     do {
  128.       *row = *col;
  129.       col += bufwdth;
  130.     } while( ++row < rowend );
  131.     /* copy saved top line onto left column */
  132.     rowend = linebuf;
  133.     row = rowend + linedim - 1;
  134.     col = toprow + bufwdth;
  135.     do {
  136.       *col = *row;
  137.       col += bufwdth;
  138.     } while( --row >= rowend );
  139.     linedim -= 2;
  140.   }
  141.   /* free work space */
  142.   free((char *)linebuf);
  143. }
  144.