Blame view

src/idl_misc/coyote_for_Dustemwrap/cgimagegroup__define.pro 5.09 KB
6db3528a   Jean-Philippe Bernard   adding librairies...
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
;+
; The initialization module for the cgImageGroup object creates a specific
; instance of the object.
; 
; :Params:
;    image: in, required, type=varies
;       A 2D or true-color image variable to display and interact with. Optionally,
;       this variable may also be the name of an image file that IDL can open with
;       READ_IMAGE.
;  
; :Keywords:
;     filename: in, optional, type=string
;        The name of an IDL image file that IDL can read with READ_IMAGE.
;     reverse: in, optional, type=boolean, default=0
;        Set this keyword to reverse the image in the Y direction before display.
;-
FUNCTION cgImageGroup::Init, image, FILENAME=filename, REVERSE=reverse

   Compile_Opt idl2
   
   Catch, theError
   IF theError NE 0 THEN BEGIN
       Catch, /CANCEL
       void = cgErrorMsg()
       RETURN,1
   ENDIF

   ; Required parameter.
   IF N_Elements(image) EQ 0 THEN Message, 'Must supply either an image or the name of an image file.'
   
   ; Is the parameter a string?
   IF Size(image, /TNAME) EQ 'STRING' THEN BEGIN
       filename = image
       Undefine, image
       ok = Query_Image(filename, info)
       IF ~ok THEN Message, 'Image file cannot be read with READ_IMAGE.'
       channels = info.channels
       dims = info.dimensions
       has_palette = info.has_palette
       image_index = info.image_index
       dataType = info.pixel_type
       fileType = info.type
       
       ; Only certain types of data files are allowed.
       validDataTypes = [1,2,3,4,5,12,13,14,15]
       void = Where(validDataTypes EQ dataType, count)
       IF count EQ 0 THEN Message, 'Image file does not contain a valid IDL data type.'
       
       
       
       image = Read_Image(filename, r, g, b, IMAGE_INDEX=image_index)
       IF StrUpCase(fileType) EQ 'TIFF' THEN BEGIN
           dims = Image_Dimensions(image, YINDEX=yindex)
           image = Reverse(image, yindex)
       ENDIF
       
       ; Load the color table, if you have color vectors.
       IF N_Elements(r) NE 0 THEN TVLCT, r, g, b
   ENDIF
   
   original = image
   range = Max(original) - Min(original)
   IF range LE 256 THEN image = BytScl(original) ELSE image = ClipScl(original)
   
   ; Get the dimensions of the image.
   dims = Image_Dimensions(image, YINDEX=yindex, XINDEX=xindex, TRUEINDEX=trueIndex, $
      ALPHACHANNEL=alphaChannel, XSIZE=xsize, YSIZE=ysize)
   
   ; Need to reverse the image before display?
   IF Keyword_Set(reverse) THEN image = Reverse(image, yindex)
   
   ; Save the color table palette.
   TVLCT, palette, /Get
   
   ; Create the widgets for the display.
   imgAspect = Float(ysize) / xsize
   
   ; Calculate the size of the full-size draw widget.
   fullSize = 200 < xsize < ysize
   IF imgAspect LE 1.0 THEN BEGIN
       full_ysize = 250 * imgAspect
       full_xsize = 250 
   ENDIF ELSE BEGIN
       full_xsize = 250 / imgAspect
       full_ysize = 250
   ENDELSE
   tlb_full = Widget_Base(Title='Scroll Image', TLB_Size_Events=1, $
      UNAME='TLB_FULL_EVENTS', UVALUE=self)
   win_full = Obj_New('cgCmdWindow', tlb_full, WXSize=full_xsize, WYSize=full_ysize)
   win_full -> AddCommand, win_full -> PackageCommand('cgImage', image)
   
   ; Calculate the size of the main draw widget.
   main_xsize = 400 < xsize
   main_ysize = 400 < ysize
   tlb_main = Widget_Base(Title='1:1 Image', TLB_Size_Events=1, $
      UNAME='TLB_MAIN_EVENTS', UVALUE=self, XOFFSET=25, YOFFSET=25)
   win_main = Obj_New('cgCmdWindow', tlb_main, WXSize=main_xsize, WYSize=main_ysize)
   win_main -> AddCommand, win_full -> PackageCommand('cgImage', image[0:main_xsize-1,0:main_ysize-1])
   
   ; Calculate the size of the main draw widget.
   zoom_xsize = 200 < xsize
   zoom_ysize = 200 < ysize
   tlb_zoom = Widget_Base(Title='Zoom', TLB_Size_Events=1, $
      UNAME='TLB_ZOOM_EVENTS', UVALUE=self)
   win_zoom = Obj_New('cgCmdWindow', tlb_zoom, WXSize=zoom_xsize, WYSize=zoom_ysize)
   win_zoom -> AddCommand, win_full -> PackageCommand('cgImage', image[0:zoom_xsize/4-1,0:zoom_ysize/4-1])

   Widget_Control, tlb_main, /Realize
   geo = Widget_Info(tlb_main, /Geometry)
   Widget_Control, tlb_full, $
      XOFFSET=geo.xoffset, $
      YOFFSET=geo.yoffset + geo.ysize + 40
   Widget_Control, tlb_full, /Realize, Group_Leader=tlb_main
   geo1 = Widget_Info(tlb_full, /Geometry)
   
   Widget_Control, tlb_zoom, $
      XOFFSET=geo1.xoffset + geo1.xsize + 20, $
      YOFFSET=geo.yoffset + geo.ysize + 40
   Widget_Control, tlb_zoom, /Realize, Group_Leader=tlb_main
   
   RETURN, 1
END 

;+
; The class definition module for the cgImageGroup object.
;-
PRO cgImageGroup__Define, class

   class = { cgIMAGEGROUP, $
             INHERITS IDL_OBJECT, $
             palette: BytArr(256,3), $
             image: Ptr_New(), $
             tlb_full: 0L, $
             tlb_mail: 0L, $
             tlb_zoom: 0L, $
             wid_full: 0L, $
             wid_main: 0L, $
             wid_zoom: 0L, $
             win_full: Obj_New(), $
             win_main: Obj_New(), $
             win_zoom: Obj_New(), $
             zoom_factor: 0L }
END