C++*********************************************************************
C
C ROT2QS.F
C               COSMETIC                             MAY 09 ARDEAN LEITH

C **********************************************************************
C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM.   AUTHOR: J.FRANK  *
C=* Copyright (C) 1985-2009  Health Research Inc.                      *
C=*                                                                    *
C=* HEALTH RESEARCH INCORPORATED (HRI),                                *   
C=* ONE UNIVERSITY PLACE, RENSSELAER, NY 12144-3455.                   *
C=*                                                                    *
C=* Email:  spider@wadsworth.org                                       *
C=*                                                                    *
C=* This program is free software; you can redistribute it and/or      *
C=* modify it under the terms of the GNU General Public License as     *
C=* published by the Free Software Foundation; either version 2 of the *
C=* License, or (at your option) any later version.                    *
C=*                                                                    *
C=* This program is distributed in the hope that it will be useful,    *
C=* but WITHOUT ANY WARRANTY; without even the implied warranty of     *
C=* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  *
C=* General Public License for more details.                           *
C=*                                                                    *
C=* You should have received a copy of the GNU General Public License  *
C=* along with this program; if not, write to the                      *
C=* Free Software Foundation, Inc.,                                    *
C=* 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.      *
C=*                                                                    *
C **********************************************************************
C
C ROT2QS(X,OUT,NSAM,NROW, THETA,SCLI,SHXI,SHYI,LUN2,LB).F
C
C PURPOSE: ROTATES AND SHIFTS A SLICE OF AN IMAGE, ROW BY ROW
C
C PARAMETERS: X           INPUT IMAGE                        (INPUT)
C             OUT         OUTPUT IMAGE OR LINE BUFFER        (OUTPUT)
C             NSAM,NROW   IMAGE SIZE                         (INPUT)
C             THETA,SCLI  ROTATION AND SCALE                 (INPUT)
C             SHXI,SHYI   SHIFTS                             (INPUT)
C             LB          IMAGE STARTING RECORD              (INPUT)
C             LUN2        LUN FOR OUTPUT (0 IS NO FILE OUT)  (INPUT)
C
C--*********************************************************************

         SUBROUTINE ROT2QS(X,OUT,NSAM,NROW,
     &                        THETA,SCLI,SHXI,SHYI,LUN2,LB)

         DIMENSION  X(NSAM,NROW),OUT(NSAM)
	 PARAMETER (QUADPI = 3.14159265358979)
	 PARAMETER (DGR_TO_RAD = (QUADPI/180))

         SHX   = MOD(SHXI,FLOAT(NSAM))
         SHY   = MOD(SHYI,FLOAT(NROW))
         ICENT = NROW/2+1
         KCENT = NSAM/2+1
         RN2   = -NROW/2
         SN2   = -NSAM/2
         RW2   = -RN2
         RS2   = -SN2

         IF (MOD(NSAM,2) .EQ. 0) RW2 = RW2 - 1.0
         IF (MOD(NROW,2) .EQ. 0) RS2 = RS2 - 1.0

         COD = COS(THETA*DGR_TO_RAD)
         SID = SIN(THETA*DGR_TO_RAD)
         
         DO I=1,NROW
           YI = I - ICENT - SHY
           IF (YI .LT. RN2) YI = MIN(RW2+YI-RN2+1.0, RW2)
           IF (YI .GT. RW2) YI = MAX(RN2+YI-RW2-1.0, RN2)

           YCOD =  YI * COD / SCLI + ICENT
           YSID = -YI * SID / SCLI + KCENT

c$omp      parallel do private(k,xi,xold,yold)
           DO K=1,NSAM
              XI = K - KCENT - SHX
              IF (XI .LT. SN2) XI = MIN(RS2+XI-SN2+1.0, RS2)
              IF (XI .GT. RS2) XI = MAX(SN2+XI-RS2-1.0, SN2)

              YOLD   = XI * SID / SCLI + YCOD
              XOLD   = XI * COD / SCLI + YSID

              OUT(K) = QUADRI(XOLD, YOLD, NSAM, NROW, X)

	   ENDDO
           CALL WRTLIN(LUN2,OUT,NSAM,LB+I)
	 ENDDO
         END


C++*********************************************************************
C
C ROT2QS_DL.F    BUFOUT RETURN ADDED, SPEEDED UP      12/28/06 ArDean Leith
C **********************************************************************
C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM.   AUTHOR: J.FRANK  *
C=* Copyright (C) 1985-2007  Health Research Inc.                      *
C=*                                                                    *
C=* HEALTH RESEARCH INCORPORATED (HRI),                                *   
C=* ONE UNIVERSITY PLACE, RENSSELAER, NY 12144-3455.                   *
C=*                                                                    *
C=* Email:  spider@wadsworth.org                                       *
C=*                                                                    *
C=* This program is free software; you can redistribute it and/or      *
C=* modify it under the terms of the GNU General Public License as     *
C=* published by the Free Software Foundation; either version 2 of the *
C=* License, or (at your option) any later version.                    *
C=*                                                                    *
C=* This program is distributed in the hope that it will be useful,    *
C=* but WITHOUT ANY WARRANTY; without even the implied warranty of     *
C=* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  *
C=* General Public License for more details.                           *
C=*                                                                    *
C=* You should have received a copy of the GNU General Public License  *
C=* along with this program; if not, write to the                      *
C=* Free Software Foundation, Inc.,                                    *
C=* 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.      *
C=*                                                                    *
C **********************************************************************
C
C ROT2QS_DL(XIMG,BUFOUT,NSAM,NROW,THETA,SCLI,SHXI,SHYI,IREC1,LUN)
C
C PURPOSE: ROTATES AND SHIFTS A SLICE OF AN IMAGE, ROW BY ROW
C
C PARAMETERS: XIMG        INPUT IMAGE                        (INPUT)
C             BUFOUT      OUTPUT IMAGE OR LINE BUFFER        (OUTPUT)
C             NSAM,NROW   IMAGE SIZE                         (INPUT)
C             THETA,SCLI  ROTATION AND SCALE                 (INPUT)
C             SHXI,SHYI   SHIFTS                             (INPUT)
C             IREC1       IMAGE STARTING RECORD              (INPUT)
C             LUN         LUN FOR OUTPUT (0 IS NO FILE OUT)  (INPUT)
C  
C--*********************************************************************

         SUBROUTINE ROT2QS_DL(XIMG,BUFOUT, NSAM,NROW,
     &                     THETA,SCLI,SHXI,SHYI, IREC1,LUN)

         REAL            :: XIMG(NSAM,NROW)
         REAL            :: BUFOUT(NSAM,*)
	 REAL, PARAMETER :: QUADPI = 3.14159265358979323846
	 REAL, PARAMETER :: DGR_TO_RAD = (QUADPI/180)

         SHX   = AMOD(SHXI,FLOAT(NSAM))
         SHY   = AMOD(SHYI,FLOAT(NROW))
         ICENT = NROW/2+1
         KCENT = NSAM/2+1
         RN2   = -NROW/2
         SN2   = -NSAM/2
         RW2   = -RN2
         RS2   = -SN2

         IF (MOD(NSAM,2) .EQ. 0) RW2 = RW2 - 1.0
         IF (MOD(NROW,2) .EQ. 0) RS2 = RS2 - 1.0

         COD        = COS(THETA * DGR_TO_RAD)
         SID        = SIN(THETA * DGR_TO_RAD)
         CODDSCLI   = COD / SCLI
         SIDDSCLI   = SID / SCLI

         FKCENTMSHX = -KCENT - SHX
         FICENTMSHY = -ICENT - SHY

         RE1        = RW2 - RN2 + 1.0
         RE2        = RN2 - RW2 - 1.0
         RF1        = RS2 - SN2 + 1.0
         RF2        = SN2 - RS2 - 1.0

         IT = 1
         DO I=1,NROW
            IF (LUN .LE. 0) IT = I

            YI = I + FICENTMSHY
            IF (YI.LT.RN2) YI = MIN(YI+RE1, RW2)
            IF (YI.GT.RW2) YI = MAX(YI+RE2, RN2)

            YCOD =  YI * CODDSCLI + ICENT
            YSID = -YI * SIDDSCLI + KCENT

c$omp       parallel do private(k,xi,xold,yold)
            DO K=1,NSAM
               XI = K + FKCENTMSHX                           
               IF (XI .LT. SN2) XI = MIN(XI+RF1, RS2)   
               IF (XI .GT. RS2) XI = MAX(XI+RF2, SN2)  
               YOLD         = XI * SIDDSCLI + YCOD  
               XOLD         = XI * CODDSCLI + YSID  
               BUFOUT(K,IT) = QUADRI(XOLD, YOLD, NSAM, NROW, XIMG)
            ENDDO

            IF (LUN .GT. 0) THEN
C              WRITE CURRENT LINE TO FILE
               CALL WRTLIN(LUN,BUFOUT,NSAM,IREC1+I)
            ENDIF
         ENDDO
         END

