C++******************************************************************* C C WINDOW.F C C ********************************************************************** C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM. AUTHOR: J.FRANK * C=* Copyright (C) 1985-2005 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 WINDOW(LUN1,LUN2,BUF,NSAM,NROW,NSLICE,NSAMW1,NROWW1, C NSLIW1,NSAM2,NROW2,NSLIC2,BACKG) C C PURPOSE: CUTS OUT A RECTANGULAR IMAGE SECTION C C THIS SUBROUTINE CUTS OUT A RECTANGULAR IMAGE SECTION FROM C PICTURE 1 WITH A SPECIFIED SIZE NSAM2,NROW2 AT A SPECIFIED C LOCATION NSAMW1,NROWW1 AND WRITES OUT AN IMAGE. C C WINDOW(LUN1,LUN2,BUF,NSAM,NROW,NSLICE,NSAMW1,NROWW1, C NSLIW1,NSAM2,NROW2,NSLIC2) C LUN1 LOGICAL UNIT NUMBER OF INPUT IMAGE C LUN2 LOGICAL UNIT NUMBER OF OUTPUT IMAGE C BUF BUFFER ARRAY OF SIZE NSAM + NSAM2 C NSAM,NROW,NSLICE DIMENSIONS OF INPUT VOLUME/PICTURE C NSAMW1,NROWW1,NSLIW1 COORDINATES, WITH RESPECT TO INPUT VOLUME, C OF TOP LEFT CORNER OF WINDOW C NSAM2,NROW2,NSLIC2 DIMENSIONS OF WINDOW = DIMENSIONS OF OUTPUT C VOLUME C C NOTE: THIS APPEARS TO BE POORLY DESIGNED FOR EFFICIENCY, BUT I AM C RELUCTANT TO TAMPER WITH IT. agl NOV 95 C C FINALLY FIXED THIS ROUTINE. IT HAS BEEN BUGGY FOR YEARS C AND SLOW ALSO. agl AUG 96 C C--******************************************************************* SUBROUTINE WINDOW(LUN1,LUN2, NSAM, NROW, NSLICE, & NSAMW1,NROWW1,NSLIW1, & NSAM2, NROW2, NSLIC2, BACKG) INCLUDE 'CMBLOCK.INC' COMMON BUF(1) C ASSUMES THAT COMMON BUFFER > NSAM + 2 * NSAMW1 IF (NSAMW1 .GT. NSAM .OR. NROWW1 .GT. NROW .OR. & NSLIW1 .GT. NSLICE) THEN WRITE(NOUT,*) '*** WINDOW OUTSIDE OF IMAGE.' CALL ERRT(100,'WINDOW',NE) RETURN ENDIF C FIND NUMBER OF BLANK SLICES AT TOP OF WINDOW ITOPS = 0 IF (NSLIW1 .LT. 1) ITOPS = -NSLIW1 + 1 C FIND NUMBER OF BLANK SLICES AT BOTTEM OF WINDOW IBOTS = 0 NSLIW2 = NSLIW1 + NSLIC2 - 1 IF (NSLIW2 .GT. NSLICE) IBOTS = NSLIW2 - NSLICE NSLS = 1 NSLE = 1 IF (NSLICE .GT. 1) THEN C INPUT/OUTPUT FILE IS A VOLUME NSLS = MAX(1,NSLIW1) NSLE = MIN(NSLIW2,NSLICE) ENDIF C FIND NUMBER OF BLANK ROWS AT TOP OF WINDOW ITOP = 0 IF (NROWW1 .LT. 1) ITOP = -NROWW1 + 1 C FIND NUMBER OF BLANK ROWS AT BOTTEM OF WINDOW IBOT = 0 NROWW2 = NROWW1 + NROW2 -1 IF (NROWW2 .GT. NROW) IBOT = NROWW2 - NROW C FIND FIRST ROW READ FROM IMAGE NS = MAX(NROWW1,1) C FIND LAST ROW READ FROM IMAGE NE = MIN(NROWW2,NROW) C CLEAR BUFFERS ONCE IF ((ITOP .GT. 0 .OR. IBOT .GT. 0) .OR. & (ITOPS .GT. 0 .OR. IBOTS .GT. 0)) THEN C FILL BLANKING BUFFER FOR TOP / BOTTEM OVERFLOW DO I=1,NSAM2 BUF(I) = BACKG ENDDO ENDIF C SET BUFFER LOCATION FOR READ/WRITE OF IMAGE DATA KBUF1 = NSAM2 + 1 IIN = KBUF1 IIOUT = KBUF1 + NSAMW1 - 1 IF (NSAMW1 .LT. 1) THEN C WINDOW STARTS BEFORE SOURCE IMAGE ON LEFT IIN = KBUF1 - NSAMW1 + 1 IIOUT = KBUF1 ENDIF IF (NSAMW1 .LT. 1 .OR. (NSAMW1 + NSAM2 - 1) .GT. NSAM) THEN C FILL OUTBUT BUFFER FOR LEFT / RIGHT OVERFLOW DO I=KBUF1,KBUF1+NSAM2+NSAM+NSAM2 BUF(I) = BACKG ENDDO ENDIF IRECT = 1 IF (ITOPS .GT. 0) THEN C FILL BLANK SLICES BEFORE WINDOW DO L = 1,ITOPS*NROW2 CALL WRTLIN(LUN2,BUF,NSAM2,IRECT) IRECT = IRECT + 1 ENDDO ENDIF DO L = NSLS,NSLE IRECIN = (L-1)*NROW IF (ITOP .GT. 0) THEN C WINDOW STARTS BEFORE IMAGE AT TOP, FILL ROWS WITH BACKG DO I = 1,ITOP CALL WRTLIN(LUN2,BUF,NSAM2,IRECT) IRECT = IRECT + 1 ENDDO ENDIF DO I = NS,NE CALL REDLIN(LUN1,BUF(IIN), NSAM, I+IRECIN) CALL WRTLIN(LUN2,BUF(IIOUT),NSAM2,IRECT) IRECT = IRECT + 1 ENDDO IF (IBOT .GT. 0) THEN C WINDOW GOES OFF IMAGE AT BOTTEM, FILL THESE WITH BACKG DO I = 1,IBOT CALL WRTLIN(LUN2,BUF,NSAM2,IRECT) IRECT = IRECT + 1 ENDDO ENDIF ENDDO IF (IBOTS .GT. 0) THEN C FILL BLANK SLICES AFTER WINDOW DO L = 1,IBOTS*NROW2 CALL WRTLIN(LUN2,BUF,NSAM2,IRECT) IRECT = IRECT + 1 ENDDO ENDIF RETURN END