#if defined(SP_SUN4) C THIS ROUTINE DID NOT COMPILE ON SUN SUBROUTINE spdtotiff COMMON /UNITS/LUNC,NIN,NOUT WRITE(NOUT,*) 'DUMMY CALL: spdtotiff' RETURN END #else C++********************************************************************* C C SPDTOTIFF.FOR -- CREATED, DEC 28, 94 al 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 SPDTOTIFF(LUNO,LUNN,NSAM,NROW,NSLICE,IRTFLG) C C PURPOSE: TO CONVERT A SPIDER IMAGE FILE TO TIFF FORMAT C RUNNING ON A UNIX MACHINE C C PARAMETERS: C LUNO LOGICAL UNIT NUMBER TO BE ASSIGNED INPUT. C LUNN LOGICAL UNIT NUMBER TO BE ASSIGNED TO FILNEW C IRTFLG ERROR RETURN FLAG. (0 IS NORMAL) C C TIFF TAGS ------------------------- C TIFFTAG_IMAGEWIDTH 256 C TIFFTAG_IMAGELENGTH 257 C TIFFTAG_BITSPERSAMPLE 258 C TIFFTAG_COMPRESSION 259 C TIFFTAG_PHOTOMETRIC 262 C TIFFTAG_STRIPOFFSETS 273 C TIFFTAG_ROWSPERSTRIP 278 C TIFFTAG_STRIPBYTECOUNTS 279 C TIFFTAG_RESOLUTIONUNIT 296 C C NOTE: Thanks to Trevor Sewell for fixing code to run on C little-ended Alpha's. C C--******************************************************************** #if defined(__osf__) C CODE MODIFIED BY Trevor Sewell for ALPHA USE Nov 2000 SUBROUTINE SPDTOTIFF(LUNO,LUNN,NSAM,NROW,NSLICE,IRTFLG) INCLUDE 'CMBLOCK.INC' COMMON /IOERR/ IERR CHARACTER *80 FILNEW COMMON /COMMUN/FILNEW REAL BUFO INTEGER*1 LBUF COMMON BUFO(17000),LBUF(1) C THE BUFFER FOR TIFF INTEGER*2 TIFFINT(70),TIFFDAT(70) INTEGER*1 TIFFBYTE(140) EQUIVALENCE (TIFFINT, TIFFBYTE) LOGICAL*1 LVAL REAL IPVAL CHARACTER * 1 NULL LOGICAL EX INTEGER*1 LTEMP C SET THE TIFFINT INVARIANT HEADER C BYTE ORDER, VERSION(=42), OFFSET TO IFD, IFD COUNT C DIRECTORY ENTRIES: TAG #, TYPE(3=SHORT,4=LONG), C LENGTH(4 BYTES),VALUE(4 BYTES) C MM=4D4D=19789 C II=4949=18761 DATA TIFFDAT/18761,42,8,0,9, 1 256,4,1,0,0,0, 257,4,1,0,0,0, 1 258,3,1,0,0,0, 259,3,1,0,0,0, 1 262,3,1,0,0,0, 273,4,1,0,0,0, 1 278,4,1,0,0,0, 279,4,1,0,0,0, 1 296,3,1,0,0,3, 11*0/ NULL = CHAR(0) IRTFLG = 1 C INITIALIZE THE TIFF HEADER WITH CONSTANT VALUES DO I=1,70 TIFFINT(I) = TIFFDAT(I) ENDDO C CHECK THE FILE SIZE. IF IT IS TOO BIG, JUST RETURN IF ((NSAM .GT. 8192) .OR. (NROW .GT. 8192)) THEN WRITE(NOUT,*) ' *** IMAGE TOO LARGE' CALL ERRT(100,'SPDTOTIFF',NE) RETURN ENDIF C CONVERT SPIDER HEADER TO TIFF HEADER C TIFFTAG_IMAGEWIDTH 256 TIFFINT(10) = NSAM C TIFFTAG_IMAGELENGTH 257 TIFFINT(16) = NROW C TIFFTAG_BITSPERSAMPLE 258 TIFFINT(22) = 8 C TIFFTAG_COMPRESSION 259 TIFFINT(28) = 1 C TIFFTAG_PHOTOMETRIC 262 TIFFINT(34) = 1 C TIFFTAG_STRIPOFFSETS 273 TIFFINT(40) = 512 C TIFFTAG_ROWSPERSTRIP 278 TIFFINT(46) = NROW C TIFFTAG_STRIPBYTECOUNTS 279 TIFFINT(53) = NSAM*NROW/65536.0 TIFFINT(52) = NSAM*NROW C NORMALIZE INPUT IMAGE FIRST IF (IMAMI .EQ. 0)CALL NORM3(LUNO,NSAM,NROW,NSLICE,FMAX,FMIN,AV) C COMPUTE THE SCALE VALUE IPVAL = 255.0 / (FMAX - FMIN) C GET OUTPUT FILE NAME C OPEN NEW FILE FOR TIFF VERSION, 1024 BYTE RECORD LENGTH LENOPN = 1024 CALL OPAUXFILE(.TRUE.,FILNEW,'tif',LUNN,LENOPN,'N', & 'TIFF OUTPUT',.TRUE.,IRTFLGT) IF (IRTFLGT .NE. 0) RETURN C CHECK THE DATA IS AN IMAGE OR A VOLUME C IF IT IS AN IMAGE, CONVERT IT TO A TIFF FILE C IF IT IS A VOLUME, ASK THE USER WHICH SLICE SHOULD BE CONVERTED IF (ABS(NSLICE) .LE. 1) THEN C IT IS AN IMAGE .... ISLICE = 1 ELSEIF (ABS(NSLICE) .GT. 1) THEN C IT IS A VOLUME, ASK FOR THE SLICE NO. THAT WILL BE CONVERTED CALL RDPRI1S(ISLICE,NOT_USED, 'SLICE NUMBER',IRTFLGT) IF (IRTFLGT .NE. 0) RETURN ENDIF ISTREC = (ISLICE - 1) * NROW + 1 IENDREC = ISTREC + NROW - 1 C WRITE THE TIFF HEADER DO K= 1, 140 LBUF(K) = TIFFBYTE(K) ENDDO DO K= 141, 512 LBUF(K) = 0 ENDDO C FLIP BYTES IN HEADER DO K= 1, 512, 2 LTEMP = LBUF(K) LBUF(K) = LBUF(K+1) LBUF(K+1) = LTEMP ENDDO C LBUF HAS 512 BYTES IN IT NOW FROM TIFF HEADER K = 512 IRECOUT = 0 IERR = 0 DO I = ISTREC,IENDREC C READ EACH RECORD OF SPIDER FILE CALL REDLIN(LUNO,BUFO,NSAM,I) IF (IERR .NE. 0) THEN CALL ERRT(12,'SPDTOTIFF',NE) RETURN ENDIF C CONVERT FLOATING POINT NUMBERS TO BYTE DO J=1,NSAM IF (K .GE. LENOPN) THEN C BUFFER IS FULL, PUT IT OUT TO FILE IRECOUT = IRECOUT + 1 CALL WRTLIN8(LUNN,LBUF,LENOPN,IRECOUT) K = 0 ENDIF K = K + 1 LBUF(K) = (BUFO(J) - FMIN) * IPVAL ENDDO ENDDO IF (K .GT. 0) THEN C BUFFER STILL HAS PIXELS IN IT, PUT THEM OUT TO FILE IRECOUT = IRECOUT + 1 CALL WRTLIN8(LUNN,LBUF,K,IRECOUT) ENDIF NLET = LNBLNKN(FILNEW) WRITE(NOUT,*) ' OUTPUT PLACED IN: ',FILNEW(1:NLET) C SET FLAG FOR NORMAL RETURN IRTFLG = 0 WRITE(6,*) ' FLIPPED OUTPUT PLACED ' RETURN END #else SUBROUTINE SPDTOTIFF(LUNO,LUNN,NSAM,NROW,NSLICE,IRTFLG) INCLUDE 'CMBLOCK.INC' COMMON /IOERR/ IERR CHARACTER *80 FILNEW COMMON /COMMUN/FILNEW REAL BUFO INTEGER*1 LBUF COMMON BUFO(17000),LBUF(1) C THE BUFFER FOR TIFF INTEGER*2 TIFFINT(70),TIFFDAT(70) INTEGER*1 TIFFBYTE(140) EQUIVALENCE (TIFFINT, TIFFBYTE) LOGICAL :: FLIP,ISSWAB LOGICAL*1 LVAL REAL IPVAL CHARACTER * 1 NULL LOGICAL EX INTEGER*1 LTEMP C SET THE TIFFINT INVARIANT HEADER C BYTE ORDER, VERSION(=42), OFFSET TO IFD, IFD COUNT C DIRECTORY ENTRIES: TAG #, TYPE(3=SHORT,4=LONG), C LENGTH(4 BYTES),VALUE(4 BYTES) DATA TIFFDAT/19789,42,0,8,9, 1 256,4,0,1,0,0, 257,4,0,1,0,0, 1 258,3,0,1,8,0, 259,3,0,1,1,0, 1 262,3,0,1,1,0, 273,4,0,1,0,1024, 1 278,4,0,1,0,0, 279,4,0,1,0,0, 1 296,3,0,1,3,0, 11*0/ NULL = CHAR(0) IRTFLG = 1 C INITIALIZE THE TIFF HEADER WITH CONSTANT VALUES DO I=1,70 TIFFINT(I) = TIFFDAT(I) ENDDO C CHECK THE FILE SIZE. IF IT IS TOO BIG, JUST RETURN IF ((NSAM .GT. 8192) .OR. (NROW .GT. 8192)) THEN WRITE(NOUT,*) ' *** IMAGE TOO LARGE' CALL ERRT(100,'SPDTOTIFF',NE) RETURN ENDIF C CONVERT SPIDER HEADER TO TIFF HEADER C TIFFTAG_IMAGEWIDTH 256 TIFFINT(11) = NSAM C TIFFTAG_IMAGELENGTH 257 TIFFINT(17) = NROW C TIFFTAG_STRIPOFFSETS 273 TIFFINT(41) = 512 C TIFFTAG_ROWSPERSTRIP 278 TIFFINT(47) = NROW C TIFFTAG_STRIPBYTECOUNTS 279 TIFFINT(52) = NSAM*NROW/65536.0 TIFFINT(53) = NSAM*NROW C NORMALIZE INPUT IMAGE FIRST IF (IMAMI .EQ. 0)CALL NORM3(LUNO,NSAM,NROW,NSLICE,FMAX,FMIN,AV) C COMPUTE THE SCALE VALUE IPVAL = 255.0 / (FMAX - FMIN) C GET OUTPUT FILE NAME C OPEN NEW FILE FOR TIFF VERSION, 1024 BYTE RECORD LENGTH LENOPN = 1024 CALL OPAUXFILE(.TRUE.,FILNEW,'tif',LUNN,LENOPN,'N', & 'TIFF OUTPUT',.TRUE.,IRTFLGT) IF (IRTFLGT .NE. 0) RETURN C CHECK THE DATA IS AN IMAGE OR A VOLUME C IF IT IS AN IMAGE, CONVERT IT TO A TIFF FILE C IF IT IS A VOLUME, ASK THE USER WHICH SLICE SHOULD BE CONVERTED IF (ABS(NSLICE) .LE. 1) THEN C IT IS AN IMAGE .... ISLICE = 1 ELSEIF (ABS(NSLICE) .GT. 1) THEN C IT IS A VOLUME, ASK FOR THE SLICE NO. THAT WILL BE CONVERTED CALL RDPRI1S(ISLICE,NOT_USED, 'SLICE NUMBER',IRTFLGT) IF (IRTFLGT .NE. 0) RETURN ENDIF ISTREC = (ISLICE - 1) * NROW + 1 IENDREC = ISTREC + NROW - 1 C WRITE THE TIFF HEADER #if defined (__linux__) && defined(osf_ieee) C flip the header's bytes on linux if -byteswap DO K= 1, 140,2 LBUF(K+1) = TIFFBYTE(K) LBUF(K) = TIFFBYTE(K+1) ENDDO #else DO K= 1, 140 LBUF(K) = TIFFBYTE(K) ENDDO #endif DO K= 141, 512 LBUF(K) = 0 ENDDO C FIND IF CURRENTLY SWAPPING BYTES FLIP = ISSWAB(99) C LBUF HAS 512 BYTES IN IT NOW FROM TIFF HEADER K = 512 IRECOUT = 0 IERR = 0 DO I = ISTREC,IENDREC C READ EACH RECORD OF SPIDER FILE CALL REDLIN(LUNO,BUFO,NSAM,I) IF (IERR .NE. 0) THEN CALL ERRT(12,'SPDTOTIFF',NE) RETURN ENDIF C CONVERT FLOATING POINT NUMBERS TO BYTE DO J=1,NSAM IF (K .GE. LENOPN) THEN C BUFFER IS FULL, PUT IT OUT TO FILE IRECOUT = IRECOUT + 1 CALL WRTLIN8(LUNN,LBUF,LENOPN,IRECOUT) K = 0 ENDIF K = K + 1 LBUF(K) = (BUFO(J) - FMIN) * IPVAL ENDDO ENDDO IF (K .GT. 0) THEN C BUFFER STILL HAS PIXELS IN IT, PUT THEM OUT TO FILE IRECOUT = IRECOUT + 1 CALL WRTLIN8(LUNN,LBUF,K,IRECOUT) ENDIF NLET = LNBLNKN(FILNEW) WRITE(NOUT,*) ' OUTPUT PLACED IN: ',FILNEW(1:NLET) C SET FLAG FOR NORMAL RETURN IRTFLG = 0 WRITE(6,*) ' UNFLIPPED OUTPUT' RETURN END #endif #endif