/************************************************************************** FUNCTION Redraw without flickering. ***************************************************************************/ void DrawUpTrackerWindow(struct Tracker_Windows *window){ //printf("Draw up tracker. width: %d, height: %d\n",window->width,window->height); if(window->must_redraw==true) return; #if UPDATECOORDINATES_WHEN_DRAWING struct WBlocks *wblock = window->wblock; #endif #if 0 while(GetXSubTrack_B2(wblock,window->curr_track,window->curr_track_sub) >= wblock->a.x2){ if(window->curr_track<wblock->left_track) break; // should not be possible if(window->curr_track==wblock->left_track && window->curr_track_sub==wblock->left_subtrack) break; CursorLeft_CurrPos(window); } #endif #if !USE_OPENGL GFX_BouncePoints(window); // To clear point buffer. (TODO: Implement a clear point buffer function.) #endif #if UPDATECOORDINATES_WHEN_DRAWING UpdateTrackerWindowCoordinates(window); UpdateWBlockCoordinates(window,wblock); #endif #if !USE_OPENGL PixMap_reset(window); #endif #if !USE_OPENGL struct WTracks *wtrack=ListLast1(&wblock->wtracks->l); int x2=wtrack->fxarea.x2; EraseAllLines(window, window->wblock, 0, x2); GFX_FilledBox(window,0, x2,0, window->width-1,window->height-1, PAINT_BUFFER); DrawLeftSlider(window); #endif DrawWBlock(window,window->wblock); window->wblock->isgfxdatahere=true; #if !USE_OPENGL ClearUnusedWindowsAreas(window); Blt_unMarkVisible(window); // Need a better name for this function. #endif }
int MoveWTrackBorder_Mouse( struct Tracker_Windows *window, float x,float y ){ struct WBlocks *wblock=window->wblock; struct WTracks *wtrack=(struct WTracks *)ListFindElement1_r0(&wblock->wtracks->l,(NInt)window->prevaction.eint1); if(window->prevaction.action==NOACTION) window->must_redraw=true; // fix up slightly skewed gradient caused by the direct blitting. (blitting is wrong, but it's faster) if(wtrack==NULL) return 0; x=R_BOUNDARIES(wtrack->fxarea.x+3, x, wblock->t.x2-3); int oldfxwidth=wtrack->fxwidth; wtrack->fxwidth=x - wtrack->fxarea.x; wtrack->fxwidth=R_MAX(wtrack->fxwidth,2); if(oldfxwidth==wtrack->fxwidth && window->prevaction.action!=NOACTION){ return 0; } #if !USE_OPENGL NInt oldrighttrack=wblock->right_track; GFX_BitBlt(window,wtrack->fxwidth-oldfxwidth,0, wtrack->fxarea.x2-2,wblock->a.y1, wblock->a.x2,wblock->t.y2 ); #endif UpdateWBlockCoordinates(window,wblock); DrawAllWTrackHeaders(window,wblock); #if !USE_OPENGL DrawUpWTrack(window,wblock,wtrack); struct WTracks *wtrack2; if(oldfxwidth>wtrack->fxwidth){ wtrack2=ListFindElement1(&wblock->wtracks->l,oldrighttrack); while(wtrack2!=NULL && wtrack2->l.num<=wblock->right_track){ DrawUpWTrack(window,wblock,wtrack2); DrawWTrackHeader(window,wblock,wtrack2); wtrack2=NextWTrack(wtrack2); } }else{ while(GetXSubTrack_B2(wblock,window->curr_track,window->curr_track_sub)+3>=wblock->a.x2){ window->curr_track_sub--; if(window->curr_track_sub==-2){ wblock->wtrack=ListFindElement1(&wblock->wtracks->l,window->curr_track-1); window->curr_track_sub=wblock->wtrack->num_vel-1; window->curr_track--; } } } wtrack2=ListLast1(&wblock->wtracks->l); if(wtrack2->fxarea.x2<wblock->a.x2){ GFX_FilledBox(window,0, wtrack2->fxarea.x2+1,wblock->a.y1, wblock->a.x2,wblock->t.y1, PAINT_BUFFER); GFX_FilledBox(window,0,wtrack2->fxarea.x2+3,wblock->a.y1,wblock->a.x2,wblock->t.y2,PAINT_BUFFER); EraseAllLines(window,wblock, wtrack2->x, wtrack2->x2); } UpdateBottomSlider(window); if(wtrack->fxarea.x2<wblock->a.x2){ Blt_mark(window,wblock->top_realline,wblock->bot_realline, wtrack->fxarea.x2,wblock->a.x2 ); Blt_marktrackheader(window,wtrack->l.num,wblock->right_track); } #else UpdateBottomSlider(window); { struct WTracks *wtrack2=wtrack; while(wtrack2!=NULL && wtrack2->l.num<=wblock->right_track){ DrawAllWTrackHeaders(window,wblock); wtrack2=NextWTrack(wtrack2); } } #endif //window->must_redraw=true; return 0; }