This file is indexed.

/usr/share/gnudatalanguage/astrolib/tvlaser.pro is in gdl-astrolib 2018.02.16+dfsg-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
PRO TVLASER, hdr, Image, BARPOS=BarPos, CARROWS=CArrows, CLABELS=CLabels, $
	COLORPS=ColorPS, COMMENTS=Comments, CSIZE=CSize, CTITLE=CTitle, $
 	DX=dX, DY=dY, ENCAP=encap, FILENAME=filename, HEADER=Header, HELP=Help,$
	IMAGEOut=ImageOut, INTERP=Interp, MAGNIFY=Magnify, NoClose=noclose, $
        NODELETE=NoDelete, NO_PERS_INFO=No_Pers_Info, NOEIGHT=NoEight, $ 
        NOPRINT=NoPrint, NORETAIN = NoRetain, PORTRAIT=Portrait, $
        PRINTER = Printer, REVERSE=Reverse, SCALE=Scale, TITLE=Title, $
        XSTART=XStart, YSTART=YStart, XDIM=XDim, YDIM=YDim, $
        TrueColor=TrueColor, BOTTOMDW=bottomdw, NCOLORSDW=ncolorsdw
;+
; NAME:
;      TVLASER
; PURPOSE:
;      Prints screen or image array onto a Postscript file or printer.
;      Information from FITS header is optionally used for labeling.  
;
; CALLING SEQUENCE:     
;      TVLASER, [header, Image, BARPOS = ,CARROWS =, CLABELS = ,/COLORPS, 
;             COMMENTS = ,CSIZE = ,CTITLE = , DX = , DY =, /ENCAP, FILENAME =
;             HEADER = ,/HELP, IMAGEOUT = ,/INTERP, /MAGNIFY, /NoCLOSE, 
;             /NoDELETE, /NO_PERS_INFO, /NoEIGHT, /NoPRINT, /NoRETAIN, 
;             /PORTRAIT, PRINTER = , /REVERSE, /SCALE, TITLE = , /TrueColor, 
;             XDIM=, XSTART=, YDIM=, YSTART=, BOTTOMDW=, NCOLORSDW= ]	
;
;       Note that the calling sequence was changed in May 1997
; OPTIONAL INPUTS: 
;       HEADER - FITS header string array.   Object and astrometric info from
;               the FITS header will be used for labeling, if available
;       IMAGE - if an array is passed through this parameter, then this image
;               will be used rather than reading off the current window.  This
;		allows easy use of large images.     It is usually preferable
;               to optimally byte scale IMAGE before supplying it to TVLASER   
;
; OPTIONAL KEYWORD INPUT PARAMETERS: 
;       BARPOS - A four- or five-element vector giving the position and
;            orientation of the color bar.  The first four elements
;            [X0,Y0,XSize,YSize] indicate the position and size of the color
;            bar in INCHES, relative to origin of the displayed image.
;            (X0,Y0) are the position of the lower left corner and 
;            (XSize,YSize) are the width and height.  The fifth element is
;            optional, and if present, the color bar will be printed
;            horizontally rather than vertically.  If BARPOS is set to
;            anything but a four- or five-element vector, the bar is NOT
;            printed.  The default value is BARPOS = [-0.25, 0.0, 0.2, 2.0] 
;       BOTTOMDW - The lowest value to use in building the density
;            wedge.  Used with NCOLORSDW.  Compatible with BOTTOM and
;            NCOLORS keywords of XLOADCT.
;       CARROWS - The color to print the North-East arrows.  Default is dark.
;            Three types of values can be passed:
;                 SCALAR: that value's color in the current color table
;                 3-ELEMENT VECTOR: the color will be [R,G,B]
;                 STRING: A letter indicating the color.  Valid names are:  
;                 'W' (white), 'D' (dark/black), 'R' (red),    'G' (green), 
;                 'B' (blue),  'T' (turquoise),  'V' (violet), 'Y' (yellow), 
;             If the keyword is set to a value of -1, the arrows are
;             NOT printed.
;       COLORPS - If present and non-zero, the idl.ps file is written using
;             color postscript.
;       COMMENTS - A string that will be included in the comment line below the
;                image.  For multi-line comments you can either use "!C" in the
;                string as a carriage return {although the vertical spacing
;                might be a little off} or, preferably, make the COMMENTS a
;                string array with each line as a separate element. 
;       CLABELS - Color to print the labels, same format as for CARROWS.
;       CSIZE - Color to print the size-scale bar and label, same format as for
;                CARROWS.
;       CTITLE - Color to print the title, same format as for CARROWS.
;       DX,DY - offsets in INCHES added to the position of the figure on the
;               paper.  As is the case for the device keywords XOFFSET and
;               YOFFSET, when in landscape mode DX and DY are the same
;               *relative to the paper*, not relative to the plot (e.g., DX is
;               the horizontal offset in portrait mode, but the *vertical*
;               offset in landscape mode).
;       ENCAP - If present and non-zero, the IDL.PS file is written in
;               encapsulated postscript for import into LaTeX documents
;       FILENAME - scalar string giving name of output postscript file.
;               Default is idl.ps.   Automatically sets /NODELETE
;       HEADER = FITS header.   This is an alternative to supplying the FITS
;                header in the first parameter.
;       HELP - print out the sytax for this procedure.
;       INTERP - If present and non-zero, current color table will be
;                interpolated to fill the full range of the PostScript color
;                table (256 colors).  Otherwise, the current color table will be
;                directly copied.   You probably will want to use this if you
;                are using IMAGE keyword and a shared color table.
;       MAGNIFY - The net magnification of the entire figure.  At this point,
;                the figure is not automatically centered on the paper if the
;                value of MAGNIFY is not equal to 1, but the DX and DY keywords
;                can be used to shift location.  For example, to fit a full plot
;                on the printable area (8.5x8.5 inches) of the Tek PhaserIISD
;                color printer use:  MAGNIFY=0.8, DX=0.5, DY=0.5.;       
;       NCOLORSDW - The number of values to include in the density
;                wedge.  Used with BOTTOMDW.  Compatible with
;                BOTTOM/NCOLORS keywords of XLOADCT.
;       NoCLOSE - If present and non-zero, then the postscript file is not
;             closed (or printed), the device is set to 'PS', and the data 
;             coordinate system is set to match the image size.  This allows the
;             user to add additional plotting commands before printing.  For 
;             example, to include a 15 pixel circle around a source at 
;             coordinates (150,160), around an image, im, with FITS header 
;             array, h
;
;                IDL> tvlaser,h,im,/NoClose      ;Write image & annotation
;                IDL> tvcircle,15,150,160,/data  ;Draw circle
;                IDL> device,/close              ;Close postscript file & print
;
;       NoDELETE - If present and non-zero, the postscript file is kept AND is 
;                 also sent to the printer
;       NoEIGHT - if set then only four bits sent to printer (saves space)
;       NO_PERS_INFO - if present and non-zero, output notation will NOT
;                 include date/user block of information.
;       NoPRINT - If present and non-zero, the output is sent to a file (default
;                name 'idl.ps'), which is NOT deleted and is NOT sent to the 
;                printer.
;       NoRETAIN - In order to avoid possible problems when using TVRD with
;                 an obscured window, TVLASER will first copy the current window
;                 to a temporary RETAIN=2 window.    Set /NORETAIN to skip this
;                 step and improve performance
;       PORTRAIT - if present and non-zero, the printer results will be in
;                 portrait format; otherwise, they will be in landscape format.
;                 If labels are requested, image will be in portrait mode,
;                 regardless
;       PRINTER - scalar string giving the OS command to send a the postscript
;               file to the printer.   Under Unix, the default value of PRINTER
;               is 'lpr ' while for other OS it is 'print ' 
;       REVERSE - if present and non-zero, color table will be fliped, so black
;               and white are reversed.
;       SCALE - if present and non-zero, image will be bytscaled before being
;               sent to postscript file.      
;       TITLE - if present and non-zero, the string entered here will be the
;               title of the picture.  Default is the OBJECT field in the
;               header (if present).
;       TRUECOLOR - if present and non-zero, the postscript file is created
;               using the truecolor switch (i.e. true=3). The colorbar is
;               not displayed in this mode.  
;       XDIM,YDIM - Number of pixels.  Default is from !d.x_size and !d.y_size,
;               or size of image if passed with IMAGE keyword.
;       XSTART,YSTART - lower left corner (default of (0,0))
;
; OPTIONAL KEYWORD OUTPUT PARAMETER
;        IMAGEOUT = the image byte array actually sent to the postscript file.
;
; SIDE EFFECTS: 
;        A postscript file is created in the current directory.  User must have 
;        write privileges in the current directory.  The file is named idl.ps
;        unless the FILENAME keyword is given.   The file is directed to the
;        printer unless the /ENCAP, /NoCLOSE, or /NOPRINT keywords are given.
;        After printing, the file is deleted unless the /NODELETE or FILENAME 
;        keywords are given. 
; PROCEDURE:  
;       Read display or take IMAGE and then redisplay into a postscript file.
;       If a header exists, printout header information.  If header has
;       astrometry, then print out orientation and scale information.
; PROCEDURES USED:
;        ARROWS, EXTAST, FDECOMP, GETROT, PIXCOLOR, SXPAR(), XYAD, ZPARCHECK
;
;*EXAMPLE:
;       1) Send a true color image (xsize,ysize,3) to a printer (i.e. print23l),
;                tvlaser,huv,cpic,/colorps,/truecolor,printer="print23l"
;                % TVLASER: Now printing image: $print23l idl.ps
;
; MODIFICATION HISTORY:     
;       Major rewrite from UIT version   W. Landsman   Dec 94
;       Massive rewrite.  Added North-East arrows, pixel scale bar, color bar,
;       and keywords DX, DY, MAGNIFY, INTERP, HELP, and COMMENTS.
;       Created ablility to define colors for annotation and
;       text.  Repositioned text labels.     J.Wm.Parker, HITC, 5/95
;       Make Header and Image parameters instead of keywords.   Add PRINTER
;       keyword.   Include alternate FITS keywords.   W. Landsman May 97      
;       Copy to a RETAIN=2 window, work without FITS header W. Landsman June 97
;       Cleaner output when no astrometry in header  W. Landsman  June 97
;       Added /INFO to final MESSAGE  W. Landsman   July 1997
;       12/4/97	jkf/acc	- added TrueColor optional keyword.
;       Added /NoClose keyword, trim Equinox format  W. Landsman 9-Jul-1998
;       Don't display coordinate labels if no astrometry, more flexible
;       formatting of exposure time W. Landsman 30-Aug-1998
;       BottomDW and NColorsDW added.  R. S. Hill, 1-Mar-1999
;       Apply func tab to color bar if not colorps.  RSH, 21 Mar 2000
;       Fix problem with /NOCLOSE and unequal X,Y sizes  W. Landsman Feb 2001
;       Use TVRD(True=3) if /TRUECOLOR set    W. Landsman   November 2001
;       More synonyms, check for header supplied W. Landsman November 2007
;-
 compile_opt idl2
 on_error,2

 if keyword_set(Help) then begin
   print, 'Syntax:  TVLASER, [ Header, Image ]'
   print, 'Keywords:  BARPOS= ,CARROWS= , CLABELS= ,/COLOPS, COMMENTS= ,'
   print, '           CSIZE= , CTITLE= , DX= , DY= , /ENCAP, FILENAME= ,'
   print, '           HEADER= ,/HELP, IMAGEOUT= , /INTERP, /MAGNIFY,/NoCLOSE ,'
   print, '           /NoDELETE, NO_PERS_INFO, /NoEIGHT, /NoPRINT, /NORETAIN,'
   print, '           /PORTRAIT,PRINTER=,/REVERSE, /SCALE, TITLE= , /TRUECOLOR,' 
   print, '           XDIM= ,XSTART=, YDIM= , YSTART= ] '
   print, '   '        
   return
 endif

;----------------------------;
;  SECTION:  INITIALIZATION  ;
;----------------------------;

;;;
;   Save some info and set some variables.  LogoDir may need to be changed
; depending on where the GIF logos are.
;
 sv_device = !D.NAME
 sv_color = !P.Color
 if !D.NAME EQ 'PS' then set_plot,'X'     ;Return to X terminal
 tvlct,sv_rr,sv_gg,sv_bb,/get

 if keyword_set(NoEight)  THEN NBits = 4 ELSE NBits = 8
 if keyword_set(Portrait) THEN Lands = 0 ELSE Lands = 1
 ColorPS  = keyword_set(ColorPS)
 Encap    = keyword_set(Encap)
 NoPrint  = keyword_set(NoPrint)
 NoDelete = keyword_set(NoDelete)
 TrueColor= keyword_set(TrueColor)
 if TrueColor then TrueValue =3 else TrueValue =0
 
 if N_elements(hdr) EQ 0 then $
	if N_elements(header) NE 0 then hdr = header
 if (N_params() GE 1) and (N_elements(hdr) EQ 0) then message,/INF, $
        'Warning - No valid FITS header supplied'	
 if N_elements(hdr) NE 0 then zparcheck,'TVLASER',hdr,1,7,1,'FITS image header'
;;;
;   If no image was passed in the IMAGE keyword, then we will be reading the
; image from the screen.  Default values are to start at 0,0 and read the
; entire window.
;
 FromTV = N_elements(Image) eq 0
 if FromTV then begin
   if !D.WINDOW EQ -1 then begin
	tvlaser,/help
	return
   endif
   message,'Reading image from window ' + strtrim(!D.WINDOW,2) + $
        ' ... Please be patient', /INF
   if not keyword_set(XStart) then XStart = 0
   if not keyword_set(YStart) then YStart = 0
   if not keyword_set(XDim) then XDim = !d.x_size
   if not keyword_set(YDim) then YDim = !d.y_size
   if not keyword_set(noretain) then begin
	chan = !D.WINDOW
	xsize = !D.X_SIZE & ysize = !D.Y_SIZE
	window,/free,xsize=xsize,ysize=ysize
	wset,!D.WINDOW
	device,copy=[0,0,xsize,ysize,0,0,chan]
   endif
   ImageOut = tvrd(XStart,YStart,XDim,YDim,true = truevalue)
   if not keyword_set(noretain) then begin
	wdelete,!D.WINDOW
	wset,chan
   endif
 endif else begin
   XStart = 0
   YStart = 0
   XDim   = (size(Image))[1]
   YDim   = (size(Image))[2]
   ImageOut = Image
 endelse
;;;
;   YSpace is used to scale the vertical spacing of text and the title.
;
 YSpace  = (float(Xdim) / Ydim) > 1.              ;Modified December 1994 WBL
 XSpace  = (float(Ydim) / Xdim) > 1.

;;;
;   If using B/W PostScript, use NTSC color -> B/W formula, J Brinkmann
;   Scale and/or reverse if desired.
;
 if not(ColorPS) then ImageOut = $
   0.299 * sv_rr[ImageOut] + 0.587 * sv_gg[ImageOut] + 0.114 * sv_bb[ImageOut]
 if keyword_set(Scale)   then ImageOut = bytscl(ImageOut)
 if keyword_set(Reverse) then ImageOut = 255b - temporary(ImageOut)

;;;
;   If a header is given, put in portrait mode regardless. 
;
 if N_elements(hdr) NE 0 then Lands = 0

;;;
;   Set up colors for density wedge.
;
 if N_elements(BottomDW) LE 0 then BottomDW = 0
 nc = !D.table_size - BottomDW
 if n_elements(NColors) GT 0 then nc = nc < ncolors
 if nc LE 0 then begin
   message, /INFO, 'Bad color spec; using default'
   BottomDW = 0
   nc = !D.table_size
 endif


;------------------------------;
;  SECTION:  POSTSCRIPT SETUP  ;
;------------------------------;

;;;
;   Redirect output to Postscript printer file, which may be printed.
;   Size of image is restricted to 7.5 inches in the paper's narrow direction
; for MAGNIFY=1.  If we will be printing out header info, then restrict the
; Y size to be no more than 7.5 also.
;
if (Lands eq 1) then begin
   inx = 10.0
   iny = float(YDim)/float(XDim)*float(inx)
   if (iny gt 7.5) then begin
     iny = 7.5
     inx = (float(XDim)/float(YDim))*float(iny)
   endif
 endif

 if (Lands eq 0) then begin
   if N_elements(hdr) NE 0 then iny = 7.5 else iny = 10.0
   inx = float(XDim)/float(YDim)*float(iny)
   if (inx gt 7.5) then begin
     inx = 7.5
     iny = (float(YDim)/float(XDim))*float(inx)
   endif
 endif

;;;
;   Some info for the user, and setting the filename.
;
 pstype = ' '
 if Encap then pstype = pstype + 'encapsulated '
 if ColorPS then pstype = pstype + 'color '
 if not keyword_set(filename) then fname = 'idl.ps' else begin
   fdecomp,filename,disk,dir,name,ext
   if ext EQ '' then ext = 'ps'
   fname = disk + dir + name + '.' + ext
   NoDelete = 1
 endelse 
 if keyword_set(NoDelete) or keyword_set(EnCap) or keyword_set(NoPrint) then $ 
 message,'Writing image to' + pstype + 'postscript file ' + fname, /INF

;;;
;   Set plot to the PostScript printer.  Set all the device keywords.
;
set_plot, 'ps', INTERPOLATE=keyword_set(Interp)
sv_font = !P.FONT
!p.font = 0

 if not keyword_set(dX) then dX = 0
 if not keyword_set(dY) then dY = 0

 XOff =  0.75 + dX
 YOff = 10.25 + dY
 if Lands then begin
   device, /landscape
   YOff = inx + ((11 - inx) / 2.0) + dY   ; centered
 endif else begin
   device, /portrait
   YOff = Yoff - iny
 endelse

 device, xsize=inx, ysize=iny, xoffset=XOff, yoffset=YOff, /inches, $
   bits=NBits, filename=fname, /helvetica, encapsulated=Encap, color=ColorPS

 if keyword_set(Magnify) then device, scale=Magnify else device, scale=1


;-----------------------;
;  SECTION:  TV OUTPUT  ;
;-----------------------;

 tv, ImageOut,true=TrueValue

;   If the BarPos keyword has four or five elements, then show the color bar.

 if (not(TrueValue)) then begin 
   if (N_elements(BarPos) eq 0) then BarPos = [-0.25, 0.0, 0.2, 2.0]
   NumEls = N_elements(BarPos)
   if ( (NumEls eq 4) or (NumEls eq 5) ) then begin
    ColorBar = byte(round(congrid(findgen(nc)+BottomDW, 256))) $
       # make_array(20,val=1b)
    if not(ColorPS) then $
       ColorBar = 0.299 * sv_rr[ColorBar] + 0.587 * sv_gg[ColorBar] $
                  + 0.114 * sv_bb[ColorBar]
    ColorBar[0:*,[0,19]]  = 0
    ColorBar[[0,255],0:*] = 0
    if (NumEls eq 4) then ColorBar = transpose(ColorBar)
    tv, ColorBar, BarPos[0],BarPos[1], xsize=BarPos[2],ysize=BarPos[3], /INCHES
   endif
 endif

;;;
;   Now that the image has been displayed with the desired color table, we will 
; play with the color table a bit to get the appropriate colors for the text,
; arrows, and scale bar.  The three RGB values for each one will be loaded into
; vectors called things like 'CArrowsRGBN', 'CSizeRGBN', etc.  The last value
; in this vector will be the location of that color in the color table.
;   "Colors" is a string array of the keyword names, then via the EXECUTE
; function, we determine what the content of each variable is: a string to be
; used inthe pixcolor procedure, a single number indicating the location in the
; current color table, or a 3-element vector with RGB values.  One reason for
; doing it this way, is that if more objects to be colored are added to the
; keywords, only the variable COLORS need be changed here by adding those
; keyword names.
;   "Val" is where we will be temporarily putting the new colors (usually in
; the bottom bin).
;
 Colors = ['CArrows','CSize','CTitle','CLabels']
 r_new = bytarr(n_elements(Colors))
 g_new = r_new
 b_new = r_new

 for N=0,(n_elements(Colors) -1) do begin
  tvlct, sv_rr, sv_gg, sv_bb
  Val = 0

  dummy = execute( 'NumEls = n_elements(' + Colors[N] + ')' )
  if (NumEls eq 0) then begin
    dummy = execute( Colors[N] + ' = "D"' )
    NumEls = 1
  endif
  dummy = execute( 'C = ' + Colors[N] )
  if (NumEls eq 1) then begin  ; string or color value
    if ((size(C))[1] eq 7) then pixcolor, Val, C else Val = C
  endif else begin
    if (NumEls eq 3) then tvlct,transpose(C) else pixcolor, Val, 'D'
  endelse

  tvlct, r, g, b, /get
  if (Val[0] ne -1) then begin
     r_new[N] = r[Val]
     g_new[N] = g[Val]
     b_new[N] = b[Val]
     dummy = execute(Colors[N]+'RGBN = [r[Val],g[Val],b[Val],N]')
  endif
endfor

 tvlct, r_new, g_new, b_new


;-------------------------------;
;  SECTION:  HEADER and LABELS  ;
;-------------------------------;

;;;
;   If a FITS header was given then include whatever of the following FITS
; keywords that are present as annotation:  OBJECT (becomes the title if none
; given), TELESCOP, IMAGE, EXPTIME, EQUINOX, CRVAL1 (Right Ascension), CRVAL2
; (Declination), NAXIS1, NAXIS2, CD (Rotation angle and pixel size), PDSDATIM
; (Date of Microdensitometry).  Also will include the name of the user and the
; current date.  Some blocks can be suppressed...see description of keywords
; above.  Also prints directional arrows and scale.
;  
if (N_elements(Hdr) NE 0) then begin
 

;;;
;   Does the header have astrometry?
;
  extast, hdr, astr, NoAstrom
  if NoAstrom GT 0 then begin
    ast_type = strmid( strupcase( strtrim(astr.ctype[0],2) ), 0 ,4)
    if  ((ast_type NE 'RA--') and (ast_type NE 'GLON') and $ ;Valid projection?
         (ast_type NE 'ELAT') ) then NoAstrom = -1
  endif
	
  if (NoAstrom LT 0) then begin
    rga      = 'N/A'
    decl     = 'N/A'
    equi     = ''
    ROTATE   = 'N/A'
    CDELT    = [0.0,0.0]
    CDELTAS  = 'N/A'
  endif else begin
    xcen = (XDim-XStart-1)/2.
    ycen = (YDim-YStart-1)/2.
    if FromTV then zoom_xy,xcen,ycen ;In case TV image has non-zero zoom or roam
    xyad,hdr, xcen, ycen, ra_cen, dec_cen
    str = adstring(ra_cen,dec_cen,1)
    rga = strmid( str, 1, 11)
    decl = strmid( str, 14, 11)
    equi = sxpar( hdr, 'EQUINOX', Count = N_equi)
    if N_equi EQ 0 then equi = '' else $ 
              equi = '(' + strmid(strtrim(equi,2),0,7) + ')'
    getrot, hdr ,ROTATE, CDELT
    ROTATE  = strtrim(string(ROTATE,  format='(f7.2)'),2) + ' degrees'
    CDELT   = abs(CDELT*60.*60.)
    if CDELT[0] LT 0.1 then fmt = '(f7.3)' else fmt = '(f7.2)'
    CDELTAS = strtrim(string(CDELT[0],format=fmt ),2)
    if (abs(CDELT[0] - CDELT[1]) GT 0.05*CDELT[0]) THEN $
       CDELTAS = CDELTAS + ' by ' + strtrim(string(CDELT[1],format=fmt),2)
    CDELTAS = CDELTAS + ' arcsec/pixel'
  endelse

;;;
;   Printout the image information?  YSpace is used to scale the spacing of the
; linformation lines in NORMAL units.  dY is one line height.  LabXs and LabYs
; are arrays that define the placement of Label/Value pairs in the NORMAL
; coordinates.  So to increment to the next line, simply use:
;   LabYs = LabYs + dY
;
if (strtrim(CLabels[0],2) ne '-1') then begin
    dY     = -0.025 * YSpace
    LabYs  = [-0.05, -0.05] * YSpace
    LabX1s = [ 0.01,  0.21] * XSpace
    LabX2s = [ 0.64,  0.74] * XSpace

;;;
;  Set the label color and print out each label/value.
;
  !P.Color = CLabelsRGBN[3]

;OBJECT
    OBJ = strtrim( sxpar(hdr,'OBJECT', Count = N_Obj),2 )
    if N_Obj EQ 0 then begin 
    OBJ = strtrim( sxpar( hdr,'TARGNAME', Count = N_Obj),2)
    if N_Obj EQ 0 then OBJ = 'N/A'
    endif
    XYOUTS, LabX1s, LabYs, ['OBJECT:',OBJ],/ NORMAL
    LabYs = LabYs + dY

;TITLE (set here, but print out later in case no header was given)
    if NOT keyword_set(TITLE) then begin
      if (N_Obj NE 0) then TITLE=OBJ else TITLE = ''
    endif 

;IMAGE ID
    imname = 'N/A'
    imname = sxpar(hdr,'IMAGE', Count = N_image)
    if N_image EQ 0 then imname = sxpar(hdr,'EXPNAME', Count = N_image)
    if N_image EQ 0 then imname = sxpar(hdr,'OBS_ID', Count = N_image)
    if N_image EQ 0 then imname = sxpar(hdr,'ROOTNAME', Count = N_image)
    imname = strtrim(imname,2)
 
  
    XYOUTS,LabX1s,LabYs,['IMAGE:',IMNAME],/NORMAL
    LabYs = LabYs + dY

  LabYs = LabYs + dY

;TELESCOPE
    scop = sxpar( hdr,'INSTRUME', Count = N_Scop)
    if N_Scop EQ 0 then scop = sxpar( hdr,'TELESCOP', Count = N_Scop)
    if N_Scop EQ 0 then scop = sxpar( hdr,'OBSERVAT', Count = N_Scop)
    if N_Scop EQ 0 then scop = '' else scop = strtrim(scop,2)
    detector = sxpar( hdr,'DETECTOR', Count = N_det)
    if N_det EQ 0 then detector = '' else detector = strtrim(detector,2)
    if scop EQ '' then scop = detector else $
    if detector NE '' then scop = scop + '/' + detector
    XYOUTS,LabX1s,LabYs,['INSTRUMENT:',scop],/NORMAL

;SIZE
    SIZ = strtrim(XDim,2) +' by ' + strtrim(YDim,2) + ' pixels'
    XYOUTS,LabX2s,LabYs,['SIZE:',SIZ],/NORMAL
    LabYs = LabYs + dY

;FILTER
    filter = sxpar(hdr, 'FILTER', Count= N_filter)
    if N_filter EQ 0 then filter = sxpar(hdr, 'FILTNAM1', Count= N_filter)
    if N_filter EQ 0 then filter = sxpar(hdr, 'FILTER1', Count= N_filter)
    if N_filter EQ 0 then FILTER = 'N/A' else filter = strtrim(filter,2)
    XYOUTS,LabX1s,LabYs,['CAMERA/FILTER:',FILTER],/NORMAL

;SCALE
    if NoAstrom GE 0 then XYOUTS,LabX2s,LabYs,['SCALE:',CDELTAS],/NORMAL
    LabYs = LabYs + dY

;EXPOSURE TIME   First try 'EXPTIME' then 'EXPOSURE' then 'INTEG'
    exptime = sxpar(hdr, 'EXPTIME', Count = N_time)
    if N_time EQ 0 then exptime = sxpar(hdr, 'EXPOSURE', Count = N_time)
    if N_time EQ 0 then exptime = sxpar(hdr, 'INTEG', Count = N_time)
    if N_time EQ 0 then exptime = 'N/A' else $
	exptime = strmid( strtrim(exptime,2),0,6) + ' seconds'
    XYOUTS,LabX1s,LabYs,['EXPOSURE TIME:',EXPTIME],/NORMAL	
    LabYs = LabYs + dY

    LabYs = LabYs + dY

    if noastrom GE 0 then begin
;CENTER COORDINATES
    XYOUTS, LabX1s, LabYs,['CENTER '+ equi + ':', $
     'RA = ' + RGA + '    DEC = ' + DECL], /NORMAL
    LabYs = LabYs + dY

;ROTATION
    XYOUTS,LabX1s,LabYs,['ROTATION:',strtrim(ROTATE,2)],/NORMAL
    LabYs = LabYs + dY
    endif



;COMMENTS
    if keyword_set(Comments) then begin
      XYOUTS,LabX1s[0],LabYs[0],'COMMENTS:',/NORMAL
      for N=0,(n_elements(Comments)-1) do $
        XYOUTS,LabX1s[1],(LabYs[1] + (dY * N)),Comments[N],/NORMAL
    endif
    LabYs = LabYs + dY

;USER and DATE/TIME
    if not keyword_set(No_pers_info) then begin
      XYOUTS, LabX2s[0],LabYs[0], GetEnv('USER') + '  (' + $
      STRMID(systime(),4,20) + ')' ,SIZE=0.9, /NORMAL
    endif

  endif


;ARROWS
;   The calculations AX and XY allow the smallest use of space for the arrows
; for all possible rotation angles.  To test the extent of the circle, add
; code like the following in before the "R = float(..." line:
;   hextract,ImageOut,h,i1,h1,0,5,0,5 & for N=0,18 do begin
;   hrot,i1,h1,i2,h2,N*20,-1,-1,0  & getrot, h2 ,Rotate
;
  if ((strtrim(CArrows[0],2) ne '-1') and (NoAstrom ne -1)) then begin
    R = float(rotate) * !pi / 180
    AX = ( 0.50 + (0.05 * (cos(R) + sin(R)))) * XSpace
    AY = (-0.10 - (0.05 * (cos(R) - sin(R)))) * YSpace

    !P.Font  = -1
    !P.Color = CArrowsRGBN[3]
    arrows, hdr, AX, AY, /NORMAL, FONT=13, COLOR=!P.Color, arrowlen=3, charsize=2
    !P.Font  = 0
  endif 


;SIZE SCALE BAR
;   This is probably more complicated than necessary, but the idea is to find
; the best size scale bar for any image, where the scale may be a few arcsec
; or a few degrees.
;   "BarLength" is the length of a 1 arcsecond bar in normal coordinates
;   "BarScale" is the list of standard sizes for the bar in arcsec or arcmin.
;   "BarLength" is the length in normal coordiates of the "best" scale bar.
;
  if ((strtrim(CSize[0],2) ne '-1') and (NoAstrom ne -1)) then begin
    BarLength = 1.0 / (CDelt[0] * XDim)
    BarScale = [1,2,3,5,10,15,20,25,30,40]
    MinBar   = 0.1 * XSpace

    BS = where((BarLength * BarScale) gt MinBar)        ; bar scale in arcsec?
    if (BS[0] ne -1) then begin
      BarLength = BarLength * BarScale[BS[0]]
      BarLabel  = strtrim(BarScale[BS[0]], 2) + '"'
    endif else begin
      BS = where((BarLength * BarScale * 60) gt MinBar) ; bar scale in arcmin?
      if (BS[0] ne -1) then begin
        BarLength = BarLength * BarScale[BS[0]] * 60
        BarLabel  = strtrim(BarScale[BS[0]], 2) + "'"
      endif else begin
        BarLength = BarLength * 3600
        BarLabel  = '1 degree'
      endelse
    endelse

;    Barlength = BarLength * XSpace
    BarX      =   0.7 * XSpace             ; left end of bar
    BarY      = -0.03 * YSpace             ; Y position of bar
    BarDY     = 0.01 * [-1,1] * YSpace     ; height of bar's endpoints
    LabY      = BarY - (0.025 * YSpace)    ; position of label

    !P.Color = CSizeRGBN[3]
    plots, BarX+[0,BarLength], [BarY,BarY], /NORMAL
    plots, [BarX,BarX], BarY+BarDY, /NORMAL
    plots, BarLength+[BarX,BarX], BarY+BarDY,/NORMAL
    xyouts, ((BarX + (BarX + BarLength)) / 2.0), LabY, /NORMAL, ALIGN=0.5, $
      '!6'+BarLabel+'!X', FONT=-1

  endif

endif 

;;;
; TITLE  (handle here in case no header was given but TITLE keyword was used.)
;
 if (keyword_set(TITLE) and (strtrim(CTitle[0],2) ne '-1')) then begin
   !P.Color = CTitleRGBN[3]
   XYOUTS, 0.50*XSpace, 1+(0.01*YSpace), TITLE,SIZE=2.0, /NORMAL, ALIGN=0.5
 endif

 if keyword_set(NoClose) then begin
       plot,[0,xdim-1],[0,ydim-1],/noerase,xsty=5,ysty=5,/nodata, $
       pos = [0,0,1,1]
       return
 endif 

 Device,/close

;-------------------------------;
;  SECTION:  PRINTING THE FILE  ;
;-------------------------------;

 if not(NoPrint or Encap) then begin        ;Should the file be printed out?
 if not keyword_set(PRINTER) then begin
	 case !VERSION.OS_FAMILY of
	 'unix': printer = 'lpr'
	 else: printer = 'print'
	 endcase
 endif
 spawn,printer + ' ' + fname
 message,/INFO,'Now printing image: $' + printer + ' ' + fname
 endif

;  Reset output direction to X-windows, and restore some variables.

 tvlct,sv_rr,sv_gg,sv_bb
 set_plot, sv_device
 !P.font = sv_font
 !P.Color = sv_color

 return
 end