diff options
author | Ton Roosendaal <ton@blender.org> | 2004-10-12 19:47:15 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2004-10-12 19:47:15 +0400 |
commit | 5ae1191a12929240d6f0b38e83ebfa0f72c5fa94 (patch) | |
tree | 58e752eabfe6ff825786ec62b05f05866a6fe1d3 /source/blender/src/editscreen.c | |
parent | c957ec93dfabcd459bcf243075786a605d2d5314 (diff) |
Added safety test for occurance of zero scaled areas in Blender. This
totally screws up opengl calls...
If it detects a zero area now, it removes it and prints warning in terminal
Diffstat (limited to 'source/blender/src/editscreen.c')
-rw-r--r-- | source/blender/src/editscreen.c | 60 |
1 files changed, 36 insertions, 24 deletions
diff --git a/source/blender/src/editscreen.c b/source/blender/src/editscreen.c index 75590ad59cd..96b0b6f803c 100644 --- a/source/blender/src/editscreen.c +++ b/source/blender/src/editscreen.c @@ -1637,38 +1637,51 @@ static int rcti_eq(rcti *a, rcti *b) { static void testareas(void) { - ScrArea *sa; + ScrArea *sa, *next; /* test for header, if removed, or moved */ - /* testen for window, if removed, or moved */ - - for (sa= G.curscreen->areabase.first; sa; sa= sa->next) { + /* test for window, if removed, or moved */ + + sa= G.curscreen->areabase.first; + while(sa) { + next= sa->next; + rcti oldhr= sa->headrct; rcti oldwr= sa->winrct; calc_arearcts(sa); - - /* test header */ - if (sa->headwin) { - if (!rcti_eq(&oldhr, &sa->headrct)) { - mywinposition(sa->headwin, sa->headrct.xmin, sa->headrct.xmax, sa->headrct.ymin, sa->headrct.ymax); - addqueue(sa->headwin, CHANGED, 1); - } - - if(sa->headbutlen<sa->winx) { - sa->headbutofs= 0; - addqueue(sa->headwin, CHANGED, 1); - } - else if(sa->headbutofs+sa->winx > sa->headbutlen) { - sa->headbutofs= sa->headbutlen-sa->winx; - addqueue(sa->headwin, CHANGED, 1); - } + + /* ilegally scaled down area.... */ + if(sa->totrct.xmin>=sa->totrct.xmax || sa->totrct.ymin>=sa->totrct.ymax) { + del_area(sa); + BLI_remlink(&G.curscreen->areabase, sa); + MEM_freeN(sa); + printf("Warning, removed zero sized window from screen %s\n", G.curscreen->id.name+2); } + else { + /* test header */ + if (sa->headwin) { + if (!rcti_eq(&oldhr, &sa->headrct)) { + mywinposition(sa->headwin, sa->headrct.xmin, sa->headrct.xmax, sa->headrct.ymin, sa->headrct.ymax); + addqueue(sa->headwin, CHANGED, 1); + } + + if(sa->headbutlen<sa->winx) { + sa->headbutofs= 0; + addqueue(sa->headwin, CHANGED, 1); + } + else if(sa->headbutofs+sa->winx > sa->headbutlen) { + sa->headbutofs= sa->headbutlen-sa->winx; + addqueue(sa->headwin, CHANGED, 1); + } + } - if (!rcti_eq(&oldwr, &sa->winrct)) { - mywinposition(sa->win, sa->winrct.xmin, sa->winrct.xmax, sa->winrct.ymin, sa->winrct.ymax); - addqueue(sa->win, CHANGED, 1); + if (!rcti_eq(&oldwr, &sa->winrct)) { + mywinposition(sa->win, sa->winrct.xmin, sa->winrct.xmax, sa->winrct.ymin, sa->winrct.ymax); + addqueue(sa->win, CHANGED, 1); + } } + sa= next; } /* remake global windowarray */ @@ -2647,7 +2660,6 @@ void test_scale_screen(bScreen *sc) } /* make each window at least HEADERY high */ - sa= sc->areabase.first; while(sa) { |