From e9fb9f2c33eb8238d6483d8adddd3ad030335e54 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Sun, 4 Jun 2006 16:26:02 +0000 Subject: [PATCH] Bugfix #4223 Sequencer: A call to view2d_do_locks() got accidentally added in main drawing loop, causing an infinite loop of redraws when this option was used with more sequence windows open. Added missing view2d_do_locks() to zooming in Sequence window. Also cleaned this call a bit. --- source/blender/src/drawipo.c | 16 ++++--- source/blender/src/drawseq.c | 83 ++++++++++++++++++------------------ source/blender/src/space.c | 6 ++- 3 files changed, 55 insertions(+), 50 deletions(-) diff --git a/source/blender/src/drawipo.c b/source/blender/src/drawipo.c index 8c3cd7c1a53..233f040bd7b 100644 --- a/source/blender/src/drawipo.c +++ b/source/blender/src/drawipo.c @@ -441,6 +441,7 @@ static View2D *spacelink_get_view2d(SpaceLink *sl) } /* copies changes in this view from or to all 2d views with lock option open */ +/* do not call this inside of drawing routines, to prevent eternal loops */ void view2d_do_locks(ScrArea *cursa, int flag) { ScrArea *sa; @@ -468,8 +469,10 @@ void view2d_do_locks(ScrArea *cursa, int flag) scrarea_queue_winredraw(sa); } - if(flag & V2D_LOCK_REDRAW) - scrarea_do_windraw(sa); + if(flag & V2D_LOCK_REDRAW) { + if(sl == sa->spacedata.first) + scrarea_do_windraw(sa); + } else scrarea_queue_winredraw(sa); } @@ -2194,7 +2197,7 @@ int view2dzoom(unsigned short event) mval[1]= mvalo[1]; while( (get_mbut()&(L_MOUSE|M_MOUSE)) || is_wheel ) { - + /* regular mousewheel: zoom regular * alt-shift mousewheel: zoom y only * alt-ctrl mousewheel: zoom x only @@ -2275,6 +2278,7 @@ int view2dzoom(unsigned short event) } } } + if (ELEM(event, WHEELUPMOUSE, WHEELDOWNMOUSE) || mval[0]!=mvalo[0] || mval[1]!=mvalo[1]) { if(U.viewzoom!=USER_ZOOM_CONT) { @@ -2311,13 +2315,13 @@ int view2dzoom(unsigned short event) G.v2d->cur.ymin+= dy; G.v2d->cur.ymax-= dy; } - + test_view2d(G.v2d, curarea->winx, curarea->winy); /* cur min max rects */ sa= curarea; /* now when are you going to kill this one! */ view2d_do_locks(curarea, V2D_LOCK_COPY|V2D_LOCK_REDRAW); - mywinset(sa->win); - + areawinset(sa->win); + scrarea_do_windraw(curarea); screen_swapbuffers(); } diff --git a/source/blender/src/drawseq.c b/source/blender/src/drawseq.c index cc38efe17bf..353ef78cebc 100644 --- a/source/blender/src/drawseq.c +++ b/source/blender/src/drawseq.c @@ -923,7 +923,8 @@ static void seq_blockhandlers(ScrArea *sa) void drawseqspace(ScrArea *sa, void *spacedata) { - SpaceSeq *sseq; + SpaceSeq *sseq= sa->spacedata.first; + View2D *v2d= &sseq->v2d; Editing *ed; Sequence *seq; float col[3]; @@ -931,9 +932,8 @@ void drawseqspace(ScrArea *sa, void *spacedata) ed= G.scene->ed; - sseq= curarea->spacedata.first; if(sseq->mainb) { - draw_image_seq(curarea); + draw_image_seq(sa); return; } @@ -946,22 +946,22 @@ void drawseqspace(ScrArea *sa, void *spacedata) glClear(GL_COLOR_BUFFER_BIT); - calc_scrollrcts(sa, G.v2d, curarea->winx, curarea->winy); + calc_scrollrcts(sa, v2d, sa->winx, sa->winy); - if(curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) { - if(G.v2d->scroll) { - ofsx= curarea->winrct.xmin; /* because of mywin */ - ofsy= curarea->winrct.ymin; - glViewport(ofsx+G.v2d->mask.xmin, ofsy+G.v2d->mask.ymin, ( ofsx+G.v2d->mask.xmax-1)-(ofsx+G.v2d->mask.xmin)+1, ( ofsy+G.v2d->mask.ymax-1)-( ofsy+G.v2d->mask.ymin)+1); - glScissor(ofsx+G.v2d->mask.xmin, ofsy+G.v2d->mask.ymin, ( ofsx+G.v2d->mask.xmax-1)-(ofsx+G.v2d->mask.xmin)+1, ( ofsy+G.v2d->mask.ymax-1)-( ofsy+G.v2d->mask.ymin)+1); + if(sa->winx>SCROLLB+10 && sa->winy>SCROLLH+10) { + if(v2d->scroll) { + ofsx= sa->winrct.xmin; /* because of mywin */ + ofsy= sa->winrct.ymin; + glViewport(ofsx+v2d->mask.xmin, ofsy+v2d->mask.ymin, ( ofsx+v2d->mask.xmax-1)-(ofsx+v2d->mask.xmin)+1, ( ofsy+v2d->mask.ymax-1)-( ofsy+v2d->mask.ymin)+1); + glScissor(ofsx+v2d->mask.xmin, ofsy+v2d->mask.ymin, ( ofsx+v2d->mask.xmax-1)-(ofsx+v2d->mask.xmin)+1, ( ofsy+v2d->mask.ymax-1)-( ofsy+v2d->mask.ymin)+1); } } - myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax); + myortho2(v2d->cur.xmin, v2d->cur.xmax, v2d->cur.ymin, v2d->cur.ymax); BIF_ThemeColorShade(TH_BACK, -20); - glRectf(G.v2d->cur.xmin, 0.0, G.v2d->cur.xmax, 1.0); + glRectf(v2d->cur.xmin, 0.0, v2d->cur.xmax, 1.0); boundbox_seq(); @@ -971,16 +971,16 @@ void drawseqspace(ScrArea *sa, void *spacedata) /*Draw Track Gradients Comment out for now do somthing more subtle start drawing gradients at the bottom of the screen.*/ /* - i= MAX2(1, ((int)G.v2d->cur.ymin)-1); + i= MAX2(1, ((int)v2d->cur.ymin)-1); glShadeModel(GL_SMOOTH); glBegin(GL_QUADS); - while (icur.ymax) { + while (icur.ymax) { BIF_ThemeColorShade(TH_BACK, 0); - glVertex2f(G.v2d->cur.xmax, i); - glVertex2f(G.v2d->cur.xmin, i); + glVertex2f(v2d->cur.xmax, i); + glVertex2f(v2d->cur.xmin, i); BIF_ThemeColorShade(TH_BACK, 30); - glVertex2f(G.v2d->cur.xmin, i+1); - glVertex2f(G.v2d->cur.xmax, i+1); + glVertex2f(v2d->cur.xmin, i+1); + glVertex2f(v2d->cur.xmax, i+1); i+=1.0; } glEnd(); @@ -989,18 +989,18 @@ void drawseqspace(ScrArea *sa, void *spacedata) /* Quad Stripes ?*/ - /*i= MAX2(1, ((int)G.v2d->cur.ymin)-1); + /*i= MAX2(1, ((int)v2d->cur.ymin)-1); glBegin(GL_QUADS); - while (icur.ymax) { + while (icur.ymax) { if (((int)i) & 1) BIF_ThemeColorShade(TH_BACK, -15); else BIF_ThemeColorShade(TH_BACK, -25); - glVertex2f(G.v2d->cur.xmax, i); - glVertex2f(G.v2d->cur.xmin, i); - glVertex2f(G.v2d->cur.xmin, i+1); - glVertex2f(G.v2d->cur.xmax, i+1); + glVertex2f(v2d->cur.xmax, i); + glVertex2f(v2d->cur.xmin, i); + glVertex2f(v2d->cur.xmin, i+1); + glVertex2f(v2d->cur.xmax, i+1); i+=1.0; } glEnd();*/ @@ -1008,10 +1008,10 @@ void drawseqspace(ScrArea *sa, void *spacedata) /* Force grid lines instead - Hangs on andys pc... will look at later */ /* glBegin(GL_LINES); - while (icur.ymax) { + while (icur.ymax) { BIF_ThemeColorShade(TH_BACK, -40); - glVertex2f(G.v2d->cur.xmax, i); - glVertex2f(G.v2d->cur.xmin, i); + glVertex2f(v2d->cur.xmax, i); + glVertex2f(v2d->cur.xmin, i); i+=1.0; } glEnd(); @@ -1026,10 +1026,10 @@ void drawseqspace(ScrArea *sa, void *spacedata) seq= ed->seqbasep->first; while(seq) { /* bound box test, dont draw outside the view */ if (seq->flag & SELECT || - seq->start > G.v2d->cur.xmax || - seq->start+seq->len < G.v2d->cur.xmin || - seq->machine+1.0 < G.v2d->cur.ymin || - seq->machine > G.v2d->cur.ymax) + seq->start > v2d->cur.xmax || + seq->start+seq->len < v2d->cur.xmin || + seq->machine+1.0 < v2d->cur.ymin || + seq->machine > v2d->cur.ymax) { /* dont draw */ } else { @@ -1043,10 +1043,10 @@ void drawseqspace(ScrArea *sa, void *spacedata) seq= ed->seqbasep->first; while(seq) { /* bound box test, dont draw outside the view */ if (!(seq->flag & SELECT) || - seq->start > G.v2d->cur.xmax || - seq->start+seq->len < G.v2d->cur.xmin || - seq->machine+1.0 < G.v2d->cur.ymin || - seq->machine > G.v2d->cur.ymax) + seq->start > v2d->cur.xmax || + seq->start+seq->len < v2d->cur.xmin || + seq->machine+1.0 < v2d->cur.ymin || + seq->machine > v2d->cur.ymax) { /* dont draw */ } else { @@ -1059,13 +1059,13 @@ void drawseqspace(ScrArea *sa, void *spacedata) draw_extra_seqinfo(); /* restore viewport */ - mywinset(curarea->win); + mywinset(sa->win); - /* ortho at pixel level curarea */ - myortho2(-0.375, curarea->winx-0.375, -0.375, curarea->winy-0.375); + /* ortho at pixel level sa */ + myortho2(-0.375, sa->winx-0.375, -0.375, sa->winy-0.375); - if(curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) { - if(G.v2d->scroll) { + if(sa->winx>SCROLLB+10 && sa->winy>SCROLLH+10) { + if(v2d->scroll) { drawscroll(0); } } @@ -1078,8 +1078,7 @@ void drawseqspace(ScrArea *sa, void *spacedata) seq_blockhandlers(sa); } - view2d_do_locks(curarea, V2D_LOCK_COPY); - curarea->win_swap= WIN_BACK_OK; + sa->win_swap= WIN_BACK_OK; } diff --git a/source/blender/src/space.c b/source/blender/src/space.c index 9ae3d546dcd..16412516a5f 100644 --- a/source/blender/src/space.c +++ b/source/blender/src/space.c @@ -3675,7 +3675,8 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt) dx= 0.1154f*(v2d->cur.xmax-v2d->cur.xmin); v2d->cur.xmin+= dx; v2d->cur.xmax-= dx; - test_view2d(G.v2d, curarea->winx, curarea->winy); + test_view2d(G.v2d, sa->winx, sa->winy); + view2d_do_locks(sa, V2D_LOCK_COPY); } else if((G.qual==LR_SHIFTKEY)) { insert_gap(25, CFRA); @@ -3704,7 +3705,8 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt) dx= 0.15f*(v2d->cur.xmax-v2d->cur.xmin); v2d->cur.xmin-= dx; v2d->cur.xmax+= dx; - test_view2d(G.v2d, curarea->winx, curarea->winy); + test_view2d(G.v2d, sa->winx, sa->winy); + view2d_do_locks(sa, V2D_LOCK_COPY); } } doredraw= 1;