Revision: 17772
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17772
Author:   aligorith
Date:     2008-12-10 10:07:15 +0100 (Wed, 10 Dec 2008)

Log Message:
-----------
View2D - Bugfixes

Fixed a few typos in View2D code, which included the zoom-locking flags not 
being checked for correctly by the zoom operators. 

This commit does NOT fix the problems with the Outliner 'cur' rect 
expanding/contracting as the view changes size. I still haven't found the cause 
of this, but it might be related to the off-by-1 errors with UI-widgets that 
brecht noted in TimeLine header...

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/include/UI_view2d.h
    branches/blender2.5/blender/source/blender/editors/interface/view2d.c
    branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c

Modified: branches/blender2.5/blender/source/blender/editors/include/UI_view2d.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/UI_view2d.h      
2008-12-10 05:41:21 UTC (rev 17771)
+++ branches/blender2.5/blender/source/blender/editors/include/UI_view2d.h      
2008-12-10 09:07:15 UTC (rev 17772)
@@ -89,10 +89,9 @@
 
 /* refresh and validation (of view rects) */
 void UI_view2d_size_update(struct View2D *v2d, int winx, int winy);
-void UI_view2d_status_enforce(struct View2D *v2d);
-
-void UI_view2d_totRect_set(struct View2D *v2d, int width, int height);
+void UI_view2d_curRect_validate(struct View2D *v2d);
 void UI_view2d_curRect_reset(struct View2D *v2d);
+void UI_view2d_totRect_set(struct View2D *v2d, int width, int height);
 
 /* view matrix operations */
 void UI_view2d_view_ortho(const struct bContext *C, struct View2D *v2d);

Modified: branches/blender2.5/blender/source/blender/editors/interface/view2d.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/view2d.c       
2008-12-10 05:41:21 UTC (rev 17771)
+++ branches/blender2.5/blender/source/blender/editors/interface/view2d.c       
2008-12-10 09:07:15 UTC (rev 17772)
@@ -78,7 +78,7 @@
                else if (v2d->scroll & V2D_SCROLL_RIGHT) {
                        /* on right-hand edge of region */
                        v2d->vert= v2d->mask;
-                       v2d->vert.xmin= v2d->vert.xmax-V2D_SCROLL_WIDTH;
+                       v2d->vert.xmin= v2d->vert.xmax - V2D_SCROLL_WIDTH;
                        v2d->mask.xmax= v2d->vert.xmin;
                }
                
@@ -92,7 +92,7 @@
                else if (v2d->scroll & V2D_SCROLL_TOP) {
                        /* on upper edge of region */
                        v2d->hor= v2d->mask;
-                       v2d->hor.ymin= v2d->hor.ymax-V2D_SCROLL_HEIGHT;
+                       v2d->hor.ymin= v2d->hor.ymax - V2D_SCROLL_HEIGHT;
                        v2d->mask.ymax= v2d->hor.ymin;
                }
        }
@@ -102,17 +102,16 @@
  *     - cur is not allowed to be: larger than max, smaller than min, or 
outside of tot
  */
 // XXX pre2.5 -> this used to be called  test_view2d()
-// XXX FIXME - this is an old mess function... let's rewrite!
-void UI_view2d_status_enforce(View2D *v2d)
+void UI_view2d_curRect_validate(View2D *v2d)
 {
        /* cur is not allowed to be larger than max, smaller than min, or 
outside of tot */
        float totwidth, totheight, curwidth, curheight, width, height;
-       int winx, winy;
+       float winx, winy;
        rctf *cur, *tot;
        
        /* use mask as size of region that View2D resides in, as it takes into 
account scrollbars already  */
-       winx= v2d->mask.xmax - v2d->mask.xmin + 1;
-       winy= v2d->mask.ymax - v2d->mask.ymin + 1;
+       winx= (float)(v2d->mask.xmax - v2d->mask.xmin + 1);
+       winy= (float)(v2d->mask.ymax - v2d->mask.ymin + 1);
        
        /* get pointers to rcts for less typing */
        cur= &v2d->cur;
@@ -122,7 +121,7 @@
         *      - cur must not fall outside of tot
         *      - axis locks (zoom and offset) must be maintained
         *      - zoom must not be excessive (check either sizes or zoom values)
-        *      - aspect ratio should be respected
+        *      - aspect ratio should be respected (NOTE: this is quite closely 
realted to zoom too)
         */
        
        /* Step 1: if keepzoom, adjust the sizes of the rects only
@@ -136,9 +135,9 @@
        
        /* if zoom is locked, size on the appropriate axis is reset to mask 
size */
        if (v2d->keepzoom & V2D_LOCKZOOM_X)
-               width= (float)winy;
+               width= winx;
        if (v2d->keepzoom & V2D_LOCKZOOM_Y)
-               height= (float)winx;
+               height= winy;
                
        /* keepzoom (V2D_KEEPZOOM set), indicates that zoom level on each axis 
must not exceed limits 
         * NOTE: in general, it is not expected that the lock-zoom will be used 
in conjunction with this
@@ -147,14 +146,14 @@
                float zoom, fac;
                
                /* check if excessive zoom on x-axis */
-               zoom= (float)winx / width;
+               zoom= winx / width;
                if ((zoom < v2d->minzoom) || (zoom > v2d->maxzoom)) {
                        fac= (zoom < v2d->minzoom) ? (zoom / v2d->minzoom) : 
(zoom / v2d->maxzoom);
                        width *= fac;
                }
                
                /* check if excessive zoom on y-axis */
-               zoom= (float)winy / height;
+               zoom= winy / height;
                if ((zoom < v2d->minzoom) || (zoom > v2d->maxzoom)) {
                        fac= (zoom < v2d->minzoom) ? (zoom / v2d->minzoom) : 
(zoom / v2d->maxzoom);
                        height *= fac;
@@ -171,16 +170,14 @@
                short do_x=0, do_y=0, do_cur, do_win;
                float curRatio, winRatio;
                
-                       // XXX this is old code here to be cleaned up still
                /* when a window edge changes, the aspect ratio can't be used to
                 * find which is the best new 'cur' rect. thats why it stores 
'old' 
                 */
                if (winx != v2d->oldwinx) do_x= 1;
                if (winy != v2d->oldwiny) do_y= 1;
                
-               /* here dx is cur ratio, while dy is win ratio */
                curRatio= height / width;
-               winRatio= ((float)winy) / ((float)winx);
+               winRatio= winy / winx;
                
                /* both sizes change (area/region maximised)  */
                if (do_x == do_y) {
@@ -233,20 +230,19 @@
                float temp, dh;
                
                /* resize around 'center' of frame */
-               // FIXME: maybe we should just scale down on min?
                if (width != curwidth) {
-                       temp= (cur->xmax + cur->xmin) / 2.0f;
-                       dh= (width - curwidth) * 0.5f;
+                       temp= (cur->xmax + cur->xmin) * 0.5f;
+                       dh= width * 0.5f;
                        
-                       cur->xmin -= dh;
-                       cur->xmax += dh;
+                       cur->xmin = temp - dh;
+                       cur->xmax = temp + dh;
                }
                if (height != curheight) {
-                       temp= (cur->ymax + cur->ymin) / 2.0f;
-                       dh= (height - curheight) * 0.5f;
+                       temp= (cur->ymax + cur->ymin) * 0.5f;
+                       dh= height * 0.5f;
                        
-                       cur->ymin -= dh;
-                       cur->ymax += dh;
+                       cur->ymin = temp - dh;
+                       cur->ymax = temp + dh;
                }
        }
        
@@ -284,6 +280,7 @@
                                temp= cur->xmax - tot->xmax;
                                
                                if ((cur->xmin - temp) < tot->xmin) {
+                                       /* only offset by difference from 
cur-min and tot-min */
                                        temp= cur->xmin - tot->xmin;
                                        
                                        cur->xmin -= temp;
@@ -342,7 +339,7 @@
                                cur->ymax += temp;
                        }
                        else if (cur->ymax > tot->ymax) {
-                               /* there's still space remaining, so shift up */
+                               /* there's still space remaining, so shift down 
*/
                                temp= cur->ymax - tot->ymax;
                                
                                cur->ymin -= temp;
@@ -354,101 +351,101 @@
 
 /* ------------------ */
 
-/* Change the size of the maximum viewable area (i.e. 'tot' rect) */
-void UI_view2d_totRect_set(View2D *v2d, int width, int height)
+/* Restore 'cur' rect to standard orientation (i.e. optimal maximum view of 
tot) */
+void UI_view2d_curRect_reset (View2D *v2d)
 {
-       /* don't do anything if either value is 0 */
-       if (ELEM3(0, v2d, width, height))
-               return;
-               
+       float width, height;
+       
+       /* assume width and height of 'cur' rect by default, should be same 
size as mask */
+       width= (float)(v2d->mask.xmax - v2d->mask.xmin + 1);
+       height= (float)(v2d->mask.ymax - v2d->mask.ymin + 1);
+       
        /* handle width - posx and negx flags are mutually exclusive, so watch 
out */
        if ((v2d->align & V2D_ALIGN_NO_POS_X) && !(v2d->align & 
V2D_ALIGN_NO_NEG_X)) {
                /* width is in negative-x half */
-               v2d->tot.xmin= (float)-width;
-               v2d->tot.xmax= 0.0f;
+               v2d->cur.xmin= (float)-width;
+               v2d->cur.xmax= 0.0f;
        }
        else if ((v2d->align & V2D_ALIGN_NO_NEG_X) && !(v2d->align & 
V2D_ALIGN_NO_POS_X)) {
                /* width is in positive-x half */
-               v2d->tot.xmin= 0.0f;
-               v2d->tot.xmax= (float)width;
+               v2d->cur.xmin= 0.0f;
+               v2d->cur.xmax= (float)width;
        }
        else {
                /* width is centered around x==0 */
                const float dx= (float)width / 2.0f;
                
-               v2d->tot.xmin= -dx;
-               v2d->tot.xmax= dx;
+               v2d->cur.xmin= -dx;
+               v2d->cur.xmax= dx;
        }
        
        /* handle height - posx and negx flags are mutually exclusive, so watch 
out */
        if ((v2d->align & V2D_ALIGN_NO_POS_Y) && !(v2d->align & 
V2D_ALIGN_NO_NEG_Y)) {
                /* height is in negative-y half */
-               v2d->tot.ymin= (float)-height;
-               v2d->tot.ymax= 0.0f;
+               v2d->cur.ymin= (float)-height;
+               v2d->cur.ymax= 0.0f;
        }
        else if ((v2d->align & V2D_ALIGN_NO_NEG_Y) && !(v2d->align & 
V2D_ALIGN_NO_POS_Y)) {
                /* height is in positive-y half */
-               v2d->tot.ymin= 0.0f;
-               v2d->tot.ymax= (float)height;
+               v2d->cur.ymin= 0.0f;
+               v2d->cur.ymax= (float)height;
        }
        else {
                /* height is centered around y==0 */
                const float dy= (float)height / 2.0f;
                
-               v2d->tot.ymin= -dy;
-               v2d->tot.ymax= dy;
+               v2d->cur.ymin= -dy;
+               v2d->cur.ymax= dy;
        }
-       
-       /* make sure that 'cur' rect is in a valid state as a result of these 
changes */
-       UI_view2d_status_enforce(v2d);
 }
 
-/* Restore 'cur' rect to standard orientation (i.e. optimal maximum view of 
tot) */
-void UI_view2d_curRect_reset (View2D *v2d)
+/* Change the size of the maximum viewable area (i.e. 'tot' rect) */
+void UI_view2d_totRect_set (View2D *v2d, int width, int height)
 {
-       float width, height;
+       /* don't do anything if either value is 0 */
+       if (ELEM3(0, v2d, width, height))
+               return;
        
-       /* assume width and height of 'cur' rect by default, should be same 
size as mask */
-       width= (float)(v2d->mask.xmax - v2d->mask.xmin + 1);
-       height= (float)(v2d->mask.ymax - v2d->mask.ymin + 1);
-       
        /* handle width - posx and negx flags are mutually exclusive, so watch 
out */
        if ((v2d->align & V2D_ALIGN_NO_POS_X) && !(v2d->align & 
V2D_ALIGN_NO_NEG_X)) {
                /* width is in negative-x half */
-               v2d->cur.xmin= (float)-width;
-               v2d->cur.xmax= 0.0f;
+               v2d->tot.xmin= (float)-width;
+               v2d->tot.xmax= 0.0f;
        }
        else if ((v2d->align & V2D_ALIGN_NO_NEG_X) && !(v2d->align & 
V2D_ALIGN_NO_POS_X)) {
                /* width is in positive-x half */
-               v2d->cur.xmin= 0.0f;
-               v2d->cur.xmax= (float)width;
+               v2d->tot.xmin= 0.0f;
+               v2d->tot.xmax= (float)width;
        }
        else {
                /* width is centered around x==0 */
                const float dx= (float)width / 2.0f;
                
-               v2d->cur.xmin= -dx;
-               v2d->cur.xmax= dx;
+               v2d->tot.xmin= -dx;
+               v2d->tot.xmax= dx;
        }
        
        /* handle height - posx and negx flags are mutually exclusive, so watch 
out */
        if ((v2d->align & V2D_ALIGN_NO_POS_Y) && !(v2d->align & 
V2D_ALIGN_NO_NEG_Y)) {
                /* height is in negative-y half */
-               v2d->cur.ymin= (float)-height;
-               v2d->cur.ymax= 0.0f;
+               v2d->tot.ymin= (float)-height;
+               v2d->tot.ymax= 0.0f;
        }
        else if ((v2d->align & V2D_ALIGN_NO_NEG_Y) && !(v2d->align & 
V2D_ALIGN_NO_POS_Y)) {
                /* height is in positive-y half */
-               v2d->cur.ymin= 0.0f;
-               v2d->cur.ymax= (float)height;
+               v2d->tot.ymin= 0.0f;
+               v2d->tot.ymax= (float)height;
        }
        else {
                /* height is centered around y==0 */
                const float dy= (float)height / 2.0f;
                
-               v2d->cur.ymin= -dy;
-               v2d->cur.ymax= dy;
+               v2d->tot.ymin= -dy;
+               v2d->tot.ymax= dy;
        }
+       
+       /* make sure that 'cur' rect is in a valid state as a result of these 
changes */
+       UI_view2d_curRect_validate(v2d);
 }
 
 /* *********************************************************************** */


@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to