PRO MVIPLAY3, win_index, NAMES=names, HDRS=hdrs, FITSCREEN=fitscreen, SKIP=skip, $ TIMES=times, START=start, LENGTH=length, DISK=disk, SPEED=speed COMMON MVI_COMMON, base, imgs IF keyword_set(SPEED) THEN stall0 = speed ELSE stall0=90 IF stall0 LE 0 THEN stall0=1 IF stall0 GT 100 THEN stall0=100 stall = (100 - stall0)/50. stallsave = stall filename = 'default.mvi' filepath = './' ftitle='' IF KEYWORD_SET(DISK) THEN disk=1 ELSE disk=0 ;** have user select movie file (.mvi) sz = SIZE(win_index) IF (sz(1) EQ 0) THEN BEGIN file = DIALOG_PICKFILE(filter='*.mvi', /MUST_EXIST, TITLE='Select movie file to load',GET_PATH=path) IF (file EQ '') THEN RETURN BREAK_FILE, file, a, dir, name, ext IF (dir EQ '') THEN win_index = path+file ELSE win_index = file ENDIF ;** read movie in from movie file (.mvi) sz = SIZE(win_index) IF (sz(N_ELEMENTS(sz)-2) EQ 7) THEN BEGIN BREAK_FILE, win_index, a, dir, name, ext ftitle = name+ext filename = win_index filepath = a+dir OPENR,lu,filename,/GET_LUN READ_MVI3, lu, file_hdr, ihdrs, imgs, swapflag win_index = INTARR(file_hdr.nf) names = STRARR(file_hdr.nf) ahdr = {filename:'',detector:'',time_obs:'',date_obs:'',filter:'',polar:'',sector:''} hdrs = REPLICATE(ahdr,file_hdr.nf) nx = file_hdr.nx ny = file_hdr.ny IF (KEYWORD_SET(FITSCREEN)) THEN BEGIN orig_nx = nx orig_ny = ny max_nx = 640 max_ny = 480 IF (orig_nx GT orig_ny) THEN BEGIN ;** bigger in x dimension nx = max_nx ny = FLOAT(nx)/orig_nx*orig_ny ENDIF ELSE BEGIN ;** bigger in y dimension ny = max_ny nx = FLOAT(ny)/orig_ny*orig_nx ENDELSE ENDIF IF KEYWORD_SET(SKIP) THEN BEGIN skip = skip ENDIF ELSE skip=0 IF KEYWORD_SET(START) THEN start=start-1 ELSE start=0 IF KEYWORD_SET(LENGTH) THEN length=start+length ELSE length=file_hdr.nf FOR i=start,length-1,skip+1 DO BEGIN IF NOT(KEYWORD_SET(DISK)) THEN BEGIN PRINT, '%%MVIPLAY3 reading frame ', STRING(i+1,FORMAT='(I4)'), ' of ',STRING(file_hdr.nf,FORMAT='(I4)'), $ ' from movie file ', filename WINDOW, XSIZE = nx, YSIZE = ny, /PIXMAP, /FREE image = imgs(i) IF (KEYWORD_SET(FITSCREEN)) THEN image = CONGRID(image, nx, ny) TV, image ENDIF IF ((SIZE(win_ind))(1) eq 0) THEN win_ind = !D.WINDOW ELSE win_ind = [win_ind, !D.WINDOW] hdr = ihdrs(i) hdrs(i).date_obs = STRTRIM(hdr(0:14),2) hdrs(i).time_obs = STRTRIM(hdr(15:29),2) hdrs(i).filename = STRTRIM(hdr(30:44),2) hdrs(i).filter = STRTRIM(hdr(45:54),2) hdrs(i).detector = STRTRIM(hdr(65:74),2) IF (hdrs(i).detector EQ 'EIT') THEN $ hdrs(i).sector = STRTRIM(hdr(55:64),2) $ ELSE $ hdrs(i).polar = STRTRIM(hdr(55:64),2) IF NOT(KEYWORD_SET(DISK)) THEN BEGIN IF KEYWORD_SET(TIMES) THEN $ XYOUTS, 10, 10, hdrs(i).date_obs + ' ' + STRMID(hdrs(i).time_obs,0,5), CHARSIZE=1.5,/DEVICE ENDIF ENDFOR win_index = win_ind names = hdrs.filename IF NOT(KEYWORD_SET(DISK)) THEN BEGIN CLOSE,lu FREE_LUN,lu ENDIF ENDIF IF NOT(KEYWORD_SET(DISK)) THEN BEGIN ;** load movies from existing pixmaps WSET, win_index(0) hsize = !D.X_SIZE vsize = !D.Y_SIZE ENDIF ELSE BEGIN hsize = nx vsize = ny ENDELSE ;** get length of movie len = N_ELEMENTS(win_index) frames = STRARR(len) ;** array of movie frame names (empty) IF (KEYWORD_SET(names) NE 0) THEN frames = names first = 0 last = len-1 current = 0 forward = 1 dirsave = 1 bounce = 0 pause = 0 dopause = 1 deleted = BYTARR(len) showmenu = 0 ;**--------------------Create Widgets-------------------------------** hhsize = (hsize+20) > (512+20) title = 'MVIPLAY3: '+ftitle winbase = WIDGET_BASE(TITLE=title) base = WIDGET_BASE(/COLUMN, XOFFSET=275, YOFFSET=275, TITLE='MVIPLAY3 Control') ;** create window widget to display images in draw_w = WIDGET_DRAW(winbase, XSIZE=hsize, YSIZE=vsize, EVENT_PRO='WRUNMOVIE_DRAW0', $ /FRAME, /BUTTON_EVENTS, RETAIN=2) base1 = WIDGET_BASE(base, /ROW) base2 = WIDGET_BASE(base1, /COLUMN, /FRAME) flabel = WIDGET_LABEL(base2, VALUE=' # Frame') base25 = WIDGET_BASE(base2, /ROW) cframe = WIDGET_TEXT(base25, VALUE='0', XSIZE=3, YSIZE=1, /EDITABLE, UVALUE='FRAME_NUM') cname = WIDGET_TEXT(base25, VALUE=' ', XSIZE=12, YSIZE=1) slide2 = WIDGET_SLIDER(base1, TITLE='First Frame', $ VALUE=0, UVALUE='SLIDE_FIRST', MIN=0, MAX=len) slide3 = WIDGET_SLIDER(base1, TITLE='Last Frame', $ VALUE=len-1, UVALUE='SLIDE_LAST', MIN=0, MAX=len-1) slide1 = WIDGET_SLIDER(base1, TITLE='Playback Speed', SCROLL=1, $ VALUE=stall0, UVALUE='SPEED', MIN=0, MAX=100, /DRAG) base3 = WIDGET_BASE(base, /ROW) tmp = CW_BGROUP(base3, ['Forward', 'Reverse', 'Bounce'], /EXCLUSIVE, /COLUMN, IDS=dirb, $ BUTTON_UVALUE = ['FORWARD', 'REVERSE','BOUNCE'], /FRAME, EVENT_FUNCT='WRUNMOVIE_BGROUP0') tmp = CW_BGROUP(base3, ['Pause At End', 'No Pause'], /EXCLUSIVE, /COLUMN, IDS=pauseb, $ BUTTON_UVALUE = ['PAUSE','NO_PAUSE'], /FRAME, EVENT_FUNCT='WRUNMOVIE_BGROUP0') tmp = CW_BGROUP(base3, ['Continuous', 'Next Frame', 'Prev. Frame'], /COLUMN, $ BUTTON_UVALUE = ['CONTINUOUS', 'NEXT','PREV'], /FRAME, EVENT_FUNCT='WRUNMOVIE_BGROUP0') tmp = CW_BGROUP(base3, ['Adjust Color', 'Delete Frame'], /COLUMN, IDS=otherb, $ BUTTON_UVALUE = ['ADJCT', 'DELETE'], /FRAME, EVENT_FUNCT='WRUNMOVIE_BGROUP0') tmp = CW_BGROUP(base3, [' Load Movie ', ' Quit '], /COLUMN, $ BUTTON_UVALUE = ['LOAD','DONE'], /FRAME, EVENT_FUNCT='WRUNMOVIE_BGROUP0') sliden = WIDGET_SLIDER(base, TITLE='Current Frame', VALUE=0, UVALUE='SLIDE_NUM', $ /DRAG, /SCROLL, MIN=0, MAX=len-1) ;**--------------------Done Creating Widgets-----------------------------** WIDGET_CONTROL, /REAL, winbase WIDGET_CONTROL, draw_w, GET_VALUE=draw_win WIDGET_CONTROL, base, MAP=0 WIDGET_CONTROL, /REAL, base WIDGET_CONTROL, dirb(0), SET_BUTTON=1 WIDGET_CONTROL, pauseb(0), SET_BUTTON=1 WIDGET_CONTROL, base, TIMER=.01 WSET, draw_win IF (KEYWORD_SET(HDRS) NE 0) THEN img_hdrs = hdrs ELSE img_hdrs = 0 moviev = { $ base:base, $ winbase:winbase, $ current:current, $ forward:forward, $ dirsave:dirsave, $ bounce:bounce, $ first:first, $ last:last, $ pause:pause, $ dopause:dopause, $ len:len, $ hsize:hsize, $ vsize:vsize, $ win_index:win_index, $ draw_win:draw_win, $ cframe:cframe, $ cname:cname, $ frames:frames, $ deleted:deleted, $ showmenu:showmenu, $ filename:filename, $ filepath:filepath, $ img_hdrs:img_hdrs, $ stallsave:stallsave, $ sliden:sliden, $ disk:disk, $ lu:lu, $ stall:stall $ } WIDGET_CONTROL, base, SET_UVALUE=moviev PRINT, '%%' PRINT, '%%MVIPLAY3: Click any mouse button in the display window to bring up control panel.' PRINT, '%%MVIPLAY3: Click in display window again to hide control panel.' PRINT, '%%' PRINT, '%% If you are running out of memory when loading a mvi try a combination of these options:' PRINT, '%% IDL> MVIPLAY3, "mymovie.mvi", LENGTH=30 ;** to load only the first 30 frames' PRINT, '%% IDL> MVIPLAY3, "mymovie.mvi", START=20,LENGTH=30 ;** to load frames 20-49' PRINT, '%% IDL> MVIPLAY3, "mymovie.mvi", SKIP=1 ;** to load every other frame' PRINT, '%% IDL> MVIPLAY3, "mymovie.mvi", /DISK ;** play from disk not RAM (slower) PRINT, '%%' XMANAGER, 'WRUNMOVIE', base, EVENT_HANDLER='WRUNMOVIE_EVENT0' END