Revision: 14772
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14772
Author:   campbellbarton
Date:     2008-05-09 22:08:28 +0200 (Fri, 09 May 2008)

Log Message:
-----------
fix for [#8359] Sequencer image preview: HOME hotkey zooming at output res, not 
at "full view"
also made image and sequencer account for aspect ratio and added numpad 1,2,4,8 
keys for zooming.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_arithb.h
    trunk/blender/source/blender/blenlib/intern/arithb.c
    trunk/blender/source/blender/include/BIF_drawseq.h
    trunk/blender/source/blender/src/drawimage.c
    trunk/blender/source/blender/src/drawseq.c
    trunk/blender/source/blender/src/header_seq.c
    trunk/blender/source/blender/src/space.c

Modified: trunk/blender/source/blender/blenlib/BLI_arithb.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_arithb.h   2008-05-09 20:00:18 UTC 
(rev 14771)
+++ trunk/blender/source/blender/blenlib/BLI_arithb.h   2008-05-09 20:08:28 UTC 
(rev 14772)
@@ -96,8 +96,8 @@
 void CalcNormLong(int *v1, int *v2, int *v3, float *n);
 /* CalcNormShort: is ook uitprodukt - (translates as 'is also out/cross 
product') */
 void CalcNormShort(short *v1, short *v2, short *v3, float *n);
+float power_of_2(float val);
 
-
 /**
  * @section Euler conversion routines
  */

Modified: trunk/blender/source/blender/blenlib/intern/arithb.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/arithb.c        2008-05-09 
20:00:18 UTC (rev 14771)
+++ trunk/blender/source/blender/blenlib/intern/arithb.c        2008-05-09 
20:08:28 UTC (rev 14772)
@@ -4345,3 +4345,8 @@
        if ((ct[0]*n[0] + ct[1]*n[1] + ct[2]*n[2]) < 0.0f)
                VecMulf(tang, -1.0f);
 }
+
+/* used for zoom values*/
+float power_of_2(float val) {
+       return pow(2, ceil(log(val) / log(2)));
+}

Modified: trunk/blender/source/blender/include/BIF_drawseq.h
===================================================================
--- trunk/blender/source/blender/include/BIF_drawseq.h  2008-05-09 20:00:18 UTC 
(rev 14771)
+++ trunk/blender/source/blender/include/BIF_drawseq.h  2008-05-09 20:08:28 UTC 
(rev 14772)
@@ -39,5 +39,7 @@
 
 void seq_viewmove(SpaceSeq *sseq);
 void seq_reset_imageofs(SpaceSeq *sseq);
+void seq_viewzoom(unsigned short event, int invert);
+void seq_home(void);
 #endif
 

Modified: trunk/blender/source/blender/src/drawimage.c
===================================================================
--- trunk/blender/source/blender/src/drawimage.c        2008-05-09 20:00:18 UTC 
(rev 14771)
+++ trunk/blender/source/blender/src/drawimage.c        2008-05-09 20:08:28 UTC 
(rev 14772)
@@ -2349,17 +2349,6 @@
        sa->win_swap= WIN_BACK_OK;
 }
 
-static void image_zoom_power_of_two(void)
-{
-       /* Make zoom a power of 2 */
-
-       G.sima->zoom = 1 / G.sima->zoom;
-       G.sima->zoom = log(G.sima->zoom) / log(2);
-       G.sima->zoom = ceil(G.sima->zoom);
-       G.sima->zoom = pow(2, G.sima->zoom);
-       G.sima->zoom = 1 / G.sima->zoom;
-}
-
 static void image_zoom_set_factor(float zoomfac)
 {
        SpaceImage *sima= curarea->spacedata.first;
@@ -2503,8 +2492,10 @@
                imgheight = 256;
        }
        else {
-               imgwidth = ibuf->x;
-               imgheight = ibuf->y;
+               float xuser_asp, yuser_asp;
+               image_pixel_aspect(G.sima->image, &xuser_asp, &yuser_asp);
+               imgwidth = ibuf->x * xuser_asp;
+               imgheight = ibuf->y * yuser_asp;
        }
 
        /* Check if the image will fit in the image with zoom==1 */
@@ -2515,9 +2506,7 @@
                /* Find the zoom value that will fit the image in the image 
space */
                zoomX = ((float)width) / ((float)imgwidth);
                zoomY = ((float)height) / ((float)imgheight);
-               G.sima->zoom= MIN2(zoomX, zoomY);
-
-               image_zoom_power_of_two();
+               G.sima->zoom = 1.0f / power_of_2(1/ MIN2(zoomX, zoomY) );
        }
        else {
                G.sima->zoom= 1.0f;

Modified: trunk/blender/source/blender/src/drawseq.c
===================================================================
--- trunk/blender/source/blender/src/drawseq.c  2008-05-09 20:00:18 UTC (rev 
14771)
+++ trunk/blender/source/blender/src/drawseq.c  2008-05-09 20:08:28 UTC (rev 
14772)
@@ -913,6 +913,64 @@
        sseq->xof = sseq->yof = sseq->zoom = 0;
 }
 
+void seq_home(void)
+{
+       SpaceSeq *sseq= curarea->spacedata.first;
+       
+       if (!sseq->mainb) {
+               G.v2d->cur= G.v2d->tot;
+               test_view2d(G.v2d, curarea->winx, curarea->winy);
+               view2d_do_locks(curarea, V2D_LOCK_COPY);
+       } else {
+               float zoomX, zoomY;
+               int width, height, imgwidth, imgheight; 
+               
+               width = curarea->winx;
+               height = curarea->winy;
+               
+               seq_reset_imageofs(sseq);
+               
+               imgwidth= (G.scene->r.size*G.scene->r.xsch)/100;
+               imgheight= (G.scene->r.size*G.scene->r.ysch)/100;
+               
+               /* Apply aspect, dosnt need to be that accurate */
+               imgwidth= (int)(imgwidth * ((float)G.scene->r.xasp / 
(float)G.scene->r.yasp));
+               
+               if (((imgwidth >= width) || (imgheight >= height)) && 
+                       ((width > 0) && (height > 0))) {
+                       
+                       /* Find the zoom value that will fit the image in the 
image space */
+                       zoomX = ((float)width) / ((float)imgwidth);
+                       zoomY = ((float)height) / ((float)imgheight);
+                       sseq->zoom= (zoomX < zoomY) ? zoomX : zoomY;
+       
+                       sseq->zoom = 1.0f / power_of_2(1/ MIN2(zoomX, zoomY) );
+               }
+               else {
+                       sseq->zoom= 1.0f;
+               }
+       }
+       scrarea_queue_winredraw(curarea);
+}
+
+void seq_viewzoom(unsigned short event, int invert)
+{
+       SpaceSeq *sseq= curarea->spacedata.first;
+
+       if(event==PAD1)
+               sseq->zoom= 1.0;
+       else if(event==PAD2)
+               sseq->zoom= (invert)? 2.0: 0.5;
+       else if(event==PAD4)
+               sseq->zoom= (invert)? 4.0: 0.25;
+       else if(event==PAD8)
+               sseq->zoom= (invert)? 8.0: 0.125;
+       
+       /* ensure pixel exact locations for draw */
+       sseq->xof= (int)sseq->xof;
+       sseq->yof= (int)sseq->yof;
+}
+
 void seq_viewmove(SpaceSeq *sseq)
 {      
        ScrArea *sa;

Modified: trunk/blender/source/blender/src/header_seq.c
===================================================================
--- trunk/blender/source/blender/src/header_seq.c       2008-05-09 20:00:18 UTC 
(rev 14771)
+++ trunk/blender/source/blender/src/header_seq.c       2008-05-09 20:08:28 UTC 
(rev 14772)
@@ -75,13 +75,13 @@
        switch(event)
        {
        case 1: /* Play Back Animation */
-                       play_anim(0);
-                       break;
+               play_anim(0);
+               break;
        case 2: /* Play Back Animation in All */
-                       play_anim(1);
-                       break;
+               play_anim(1);
+               break;
        case 3:
-               do_seq_buttons(B_SEQHOME);
+               seq_home();
                break;
        case 4:
                if(last_seq) {
@@ -450,7 +450,7 @@
                seq_mute_sel(0);
                break;
        case 22:
-               seq_mute_sel(-1);
+               seq_mute_sel(0);
                break;
        case 23:
                seq_cut(CFRA, 0);
@@ -620,21 +620,13 @@
 void do_seq_buttons(short event)
 {
        Editing *ed;
-       SpaceSeq *sseq= curarea->spacedata.first;
        
        ed= G.scene->ed;
        if(ed==0) return;
        
        switch(event) {
-       case B_SEQHOME:
-               if(sseq->mainb)
-                       seq_reset_imageofs(sseq);
-               else {
-                       G.v2d->cur= G.v2d->tot;
-                       test_view2d(G.v2d, curarea->winx, curarea->winy);
-                       view2d_do_locks(curarea, V2D_LOCK_COPY);
-               }
-               scrarea_queue_winredraw(curarea);
+       case B_HOME:
+               seq_home();
                break;
        case B_SEQCLEAR:
                free_imbuf_seq();

Modified: trunk/blender/source/blender/src/space.c
===================================================================
--- trunk/blender/source/blender/src/space.c    2008-05-09 20:00:18 UTC (rev 
14771)
+++ trunk/blender/source/blender/src/space.c    2008-05-09 20:08:28 UTC (rev 
14772)
@@ -4909,7 +4909,7 @@
                        break;
                case HOMEKEY:
                        if((G.qual==0))
-                               do_seq_buttons(B_SEQHOME);
+                               seq_home();
                        break;
                case PADPERIOD: 
                        if(last_seq) {
@@ -5073,7 +5073,11 @@
                                        del_seq();
                        }
                        break;
-               }
+               case PAD1: case PAD2: case PAD4: case PAD8:
+                       seq_viewzoom(event, (G.qual & LR_SHIFTKEY)==0);
+                       doredraw= 1;
+                       break;
+               }       
        }
 
        if(doredraw) scrarea_queue_winredraw(curarea);


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to