Viewing contents of file '../idllib/ssw/allpro/blink_images.pro'
PRO BLINK_IMAGES, ARRAY1, ARRAY2, NOSQUARE=NOSQUARE, NOBOX=NOBOX, $
SIZE=SIZE, DISABLE=DISABLE, MISSING=MISSING, CHAR=CHAR, $
NOMESSAGE=NOMESSAGE
;+
; Project : SOHO - CDS
;
; Name :
; BLINK_IMAGES
; Purpose :
; Blinks two images together by modifying the color tables.
; Explanation :
; A combined image is formed in which the lower bits are assigned to
; ARRAY1 and the higher bits to ARRAY2. Two color tables are defined
; relative to the current one so that the different images are shown by
; changing between these two color tables.
;
; A better way to blink together two images on an X-windows display is to
; use the routine XBLINK.
;
; Use :
; BLINK_IMAGES
; BLINK_IMAGES, ARRAY1, ARRAY2
; Inputs :
; None required.
; Opt. Inputs :
; ARRAY1 = First image to be blinked against the second image.
; ARRAY2 = Second image. Must have the same dimensions as the first
; image.
;
; If the two arrays are not passed, then it is assumed that the images
; are already displayed, and the program goes directly to loading the
; color tables.
;
; Outputs :
; None.
; Opt. Outputs:
; None.
; Keywords :
; NOSQUARE = If passed, then pixels are not forced to be square.
; NOBOX = If passed, then box is not drawn, and no space is reserved
; for a border around the image.
; SIZE = If passed and positive, then used to determine the scale of
; the image. Returned as the value of the image scale. May
; not be compatible with /NOSQUARE.
; DISABLE = If set, then TVSELECT not used.
; MISSING = Value flagging missing pixels. These points are scaled to
; zero.
; CHAR = Returns the final character entered from the keyboard.
; NOMESSAGE= If set, then the message explaining about the keys is not
; printed out. This is for routines such as MOVE_AND_BLINK,
; which call BLINK_IMAGES, and want to print out their own message.
; Calls :
; EXPTV, GET_IM_KEYWORD, TVSELECT, TVUNSELECT
; Common :
; None.
; Restrictions:
; ARRAY1 and ARRAY2 must have the same dimensions.
;
; In general, the SERTS image display routines use several non-standard
; system variables. These system variables are defined in the procedure
; IMAGELIB. It is suggested that the command IMAGELIB be placed in the
; user's IDL_STARTUP file.
;
; Some routines also require the SERTS graphics devices software,
; generally found in a parallel directory at the site where this software
; was obtained. Those routines have their own special system variables.
;
; Side effects:
; The combined image formed from ARRAY1 and ARRAY2 is left on the screen.
; It may look a little strange.
; Category :
; Utilities, Image_display.
; Prev. Hist. :
; William Thompson, March 1991.
; William Thompson, April 1992, changed to use TVLCT,/GET instead of
; common block.
; William Thompson, August 1992, renamed BADPIXEL to MISSING.
; Written :
; William Thompson, GSFC, March 1991.
; Modified :
; Version 1, William Thompson, GSFC, 14 May 1993.
; Incorporated into CDS library.
; Version 2, William Thompson, GSFC, 3-Sep-1997
; Renamed to BLINK_IMAGES
; Version 3, William Thompson, GSFC, 8 April 1998
; Changed !D.N_COLORS to !D.TABLE_SIZE for 24-bit displays
; Version :
; Version 3, 8 April 1998
;-
;
GET_IM_KEYWORD, MISSING, !IMAGE.MISSING
;
; Check the input parameters.
;
IF N_PARAMS() EQ 0 THEN BEGIN
PRINT,'*** Assuming the combined image is already ' + $
'displayed, routine BLINK_IMAGES.'
END ELSE IF N_PARAMS() EQ 2 THEN BEGIN
SZ1 = SIZE(ARRAY1)
SZ2 = SIZE(ARRAY2)
IF SZ1(0) NE 2 THEN BEGIN
PRINT,'*** ARRAY1 must be two-dimensional, ' + $
'routine BLINK_IMAGES.'
RETURN
END ELSE IF SZ2(0) NE 2 THEN BEGIN
PRINT,'*** ARRAY2 must be two-dimensional, ' + $
'routine BLINK_IMAGES.'
RETURN
END ELSE IF (SZ1(1) NE SZ2(1)) OR (SZ1(2) NE SZ2(2)) THEN BEGIN
PRINT,'*** ARRAY1 and ARRAY2 must have the same ' + $
'dimensions, routine BLINK_IMAGES.'
RETURN
ENDIF
END ELSE BEGIN
PRINT,'*** BLINK_IMAGES must be called with zero or two parameters:'
PRINT,' [ ARRAY1, ARRAY2 ]'
RETURN
ENDELSE
;
; Get the current color table, and degrade to the resolution needed to combine
; two color tables.
;
TVSELECT, DISABLE=DISABLE
TVLCT,R_ORIG,G_ORIG,B_ORIG,/GET
NCOLORS = FIX(SQRT(!D.TABLE_SIZE))
I = INDGEN(NCOLORS)
R = R_ORIG(I*!D.TABLE_SIZE/NCOLORS)
G = G_ORIG(I*!D.TABLE_SIZE/NCOLORS)
B = B_ORIG(I*!D.TABLE_SIZE/NCOLORS)
;
; Form separate color tables for each image.
;
I1 = INDGEN(NCOLORS^2) MOD NCOLORS
I2 = INDGEN(NCOLORS^2) / NCOLORS
RR1 = R_ORIG & RR2 = RR1
GG1 = G_ORIG & GG2 = GG1
BB1 = B_ORIG & BB2 = BB1
RR1(0) = R(I1) & RR2(0) = R(I2)
GG1(0) = G(I1) & GG2(0) = G(I2)
BB1(0) = B(I1) & BB2(0) = B(I2)
;
; Get the data ranges for each array.
;
IF N_PARAMS() EQ 2 THEN BEGIN
IF N_ELEMENTS(MISSING) EQ 1 THEN BEGIN
W = WHERE(ARRAY1 NE MISSING)
AMIN1 = MIN(ARRAY1(W)) & AMAX1 = MAX(ARRAY1(W))
W = WHERE(ARRAY2 NE MISSING)
AMIN2 = MIN(ARRAY2(W)) & AMAX2 = MAX(ARRAY2(W))
END ELSE BEGIN
AMIN1 = MIN(ARRAY1) & AMAX1 = MAX(ARRAY1)
AMIN2 = MIN(ARRAY2) & AMAX2 = MAX(ARRAY2)
ENDELSE
;
; Scale the images into the appropriate data ranges.
;
TOP = BYTE(NCOLORS-1)
A1 = BYTSCL(FLOAT(ARRAY1),MIN=AMIN1,MAX=AMAX1,TOP=TOP)
A2 = BYTSCL(FLOAT(ARRAY2),MIN=AMIN2,MAX=AMAX2,TOP=TOP)
;
; Set all missing pixels to zero.
;
IF N_ELEMENTS(MISSING) EQ 1 THEN BEGIN
W = WHERE(ARRAY1 EQ MISSING, N_FOUND)
IF N_FOUND GT 0 THEN A1(W) = 0
W = WHERE(ARRAY2 EQ MISSING, N_FOUND)
IF N_FOUND GT 0 THEN A2(W) = 0
ENDIF
;
; Combine the two images into one and display it.
;
A = A1 + A2*BYTE(NCOLORS)
EXPTV,A,/NOSCALE,/DISABLE,NOSQUARE=NOSQUARE,NOBOX=NOBOX, $
SIZE=SIZE
ENDIF
;
; Start out with a one second delay between color tables. Keep changing the
; color tables until the user enters some letter other than S or F.
;
DELAY = 1
IF NOT KEYWORD_SET(NOMESSAGE) THEN $
PRINT,"S for slower, F for faster, anything else to quit."
CHAR = ""
WHILE CHAR EQ "" DO BEGIN
TVLCT,RR1,GG1,BB1
EMPTY
WAIT,DELAY
TVLCT,RR2,GG2,BB2
EMPTY
WAIT,DELAY
CHAR = GET_KBRD(0)
CASE STRUPCASE(CHAR) OF
'S': BEGIN & DELAY = DELAY * 1.5 & CHAR = '' & END
'F': BEGIN & DELAY = DELAY / 1.5 & CHAR = '' & END
ELSE: DELAY = DELAY
ENDCASE
ENDWHILE
;
; Restore the original color table and graphics device.
;
TVLCT,R_ORIG,G_ORIG,B_ORIG
TVUNSELECT, DISABLE=DISABLE
;
RETURN
END