Revision: 26688
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26688
Author:   elubie
Date:     2010-02-07 20:07:56 +0100 (Sun, 07 Feb 2010)

Log Message:
-----------
Partial fix for [#20567] SEQUENCER: Image Preview completely unusable
* Zoom and Pan should work now (thanks Aligorith for reviewing)
* mostly removed ancient drawing code
* Fit preview in Window still has issue, HOME key in preview area should be 
working though

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_intern.h
    trunk/blender/source/blender/editors/space_sequencer/space_sequencer.c
    trunk/blender/source/blender/makesdna/DNA_space_types.h

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c   2010-02-07 
18:14:38 UTC (rev 26687)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c   2010-02-07 
19:07:56 UTC (rev 26688)
@@ -5921,6 +5921,29 @@
        ar->v2d.flag = (V2D_PIXELOFS_X|V2D_PIXELOFS_Y);
 }
 
+static void sequencer_init_preview_region(ARegion* ar)
+{
+       // XXX a bit ugly still, copied from space_sequencer
+       /* NOTE: if you change values here, also change them in 
space_sequencer.c, sequencer_new */
+       ar->regiontype= RGN_TYPE_PREVIEW;
+       ar->alignment= RGN_ALIGN_TOP;
+       ar->flag |= RGN_FLAG_HIDDEN;
+       ar->v2d.keepzoom= V2D_KEEPASPECT | V2D_KEEPZOOM;
+       ar->v2d.minzoom= 0.00001f;
+       ar->v2d.maxzoom= 100000.0f;
+       ar->v2d.tot.xmin= -960.0f; /* 1920 width centered */
+       ar->v2d.tot.ymin= -540.0f; /* 1080 height centered */
+       ar->v2d.tot.xmax= 960.0f;
+       ar->v2d.tot.ymax= 540.0f;
+       ar->v2d.min[0]= 0.0f;
+       ar->v2d.min[1]= 0.0f;
+       ar->v2d.max[0]= 12000.0f;
+       ar->v2d.max[1]= 12000.0f;
+       ar->v2d.cur= ar->v2d.tot;
+       ar->v2d.align= V2D_ALIGN_FREE; // 
(V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_NEG_Y);
+       ar->v2d.keeptot= V2D_KEEPTOT_FREE;
+}
+
 /* 2.50 patch */
 static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
 {
@@ -6001,9 +6024,7 @@
                                }
                                ar= MEM_callocN(sizeof(ARegion), "preview area 
for sequencer");
                                BLI_insertlinkbefore(lb, ar_main, ar);
-                               ar->regiontype= RGN_TYPE_PREVIEW;
-                               ar->alignment= RGN_ALIGN_TOP;
-                               ar->flag |= RGN_FLAG_HIDDEN;
+                               sequencer_init_preview_region(ar);
                                break;
                        case SPACE_VIEW3D:
                                /* toolbar */
@@ -10300,7 +10321,7 @@
                                                                break;
                                                }
 
-                                               if (ar) {
+                                               if (ar && (ar->regiontype == 
RGN_TYPE_PREVIEW)) {
                                                        SpaceType *st= 
BKE_spacetype_from_id(SPACE_SEQ);
                                                        
BKE_area_region_free(st, ar);
                                                        
BLI_freelinkN(regionbase, ar);
@@ -10345,9 +10366,7 @@
                                                        }
                                                        ar= 
MEM_callocN(sizeof(ARegion), "preview area for sequencer");
                                                        
BLI_insertlinkbefore(regionbase, ar_main, ar);
-                                                       ar->regiontype= 
RGN_TYPE_PREVIEW;
-                                                       ar->alignment= 
RGN_ALIGN_TOP;
-                                                       ar->flag |= 
RGN_FLAG_HIDDEN;
+                                                       
sequencer_init_preview_region(ar);
                                                }
                                        }
                                }
@@ -10454,7 +10473,6 @@
                                ma->vol.ms_intensity = 1.f;     
                        }
                }
-               
        }
        
        if (main->versionfile < 250 || (main->versionfile == 250 && 
main->subversionfile < 13)) {
@@ -10558,6 +10576,40 @@
                                sce->r.border.ymax= 1.0f;
                        }
                }
+
+               /* sequencer changes */
+               {
+                       bScreen *screen;
+                       ScrArea *sa;
+                       SpaceLink *sl;
+
+                       for(screen= main->screen.first; screen; screen= 
screen->id.next) {
+                               for(sa= screen->areabase.first; sa; sa= 
sa->next) {
+                                       for(sl= sa->spacedata.first; sl; sl= 
sl->next) {
+                                               if(sl->spacetype==SPACE_SEQ) {
+                                                       ARegion *ar_preview;
+                                                       ListBase *regionbase;
+                                                       SpaceSeq *sseq = 
(SpaceSeq *)sl;
+
+                                                       if (sl == 
sa->spacedata.first) {
+                                                               regionbase = 
&sa->regionbase;
+                                                       } else {
+                                                               regionbase = 
&sl->regionbase;
+                                                       }
+
+                                                       ar_preview = 
(ARegion*)regionbase->first;
+                                                       for (; ar_preview; 
ar_preview = ar_preview->next) {
+                                                               if 
(ar_preview->regiontype == RGN_TYPE_PREVIEW)
+                                                                       break;
+                                                       }
+                                                       if (ar_preview && 
(ar_preview->regiontype == RGN_TYPE_PREVIEW)) {
+                                                               
sequencer_init_preview_region(ar_preview);
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               } /* sequencer changes */
        }
 
        /* WATCH IT!!!: pointers from libdata have not been converted yet here! 
*/

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c       
2010-02-07 18:14:38 UTC (rev 26687)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c       
2010-02-07 19:07:56 UTC (rev 26688)
@@ -611,22 +611,19 @@
        else special_seq_update= 0;
 }
 
-// XXX todo: remove special offset code for image-buf calculations...
-void draw_image_seq(Scene *scene, ARegion *ar, SpaceSeq *sseq)
+void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq 
*sseq)
 {
        extern void gl_round_box(int mode, float minx, float miny, float maxx, 
float maxy, float rad);
        struct ImBuf *ibuf;
-       int x1, y1, rectx, recty;
+       struct View2D *v2d = &ar->v2d;
+       int rectx, recty;
        int free_ibuf = 0;
        static int recursive= 0;
-       float zoom;
-       float zoomx, zoomy;
        float render_size = 0.0;
        float proxy_size = 100.0;
+       GLuint texid;
+       GLuint last_texid;
 
-       glClearColor(0.0, 0.0, 0.0, 0.0);
-       glClear(GL_COLOR_BUFFER_BIT);
-
        render_size = sseq->render_size;
        if (render_size == 0) {
                render_size = scene->r.size;
@@ -637,14 +634,21 @@
                return;
        }
 
-       rectx= (render_size*scene->r.xsch)/100;
-       recty= (render_size*scene->r.ysch)/100;
+       rectx= (render_size*(float)scene->r.xsch)/100.0f+0.5f;
+       recty= (render_size*(float)scene->r.ysch)/100.0f+0.5f;
 
+       /* XXX TODO: take color from theme */
+       glClearColor(0.0, 0.0, 0.0, 0.0);
+       glClear(GL_COLOR_BUFFER_BIT);
+
+       UI_view2d_totRect_set(v2d, rectx, recty);
+       UI_view2d_curRect_validate(v2d);
+
        /* BIG PROBLEM: the give_ibuf_seq() can call a rendering, which in turn 
calls redraws...
           this shouldn't belong in a window drawing....
           So: solve this once event based. 
           Now we check for recursion, space type and active area again (ton) */
-       
+
        if(recursive)
                return;
        else {
@@ -708,34 +712,37 @@
                IMB_rect_from_float(ibuf);      
        }
        
-       /* needed for gla draw */
-       glaDefine2DArea(&ar->winrct);
-       
-       zoom= SEQ_ZOOM_FAC(sseq->zoom);
-       if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
-               zoom /= proxy_size / 100.0;
-               zoomx = zoom * ((float)scene->r.xasp / (float)scene->r.yasp);
-               zoomy = zoom;
-       } else {
-               zoomx = zoomy = zoom;
-       }
+       /* setting up the view - actual drawing starts here */
+       UI_view2d_view_ortho(C, v2d);
 
-       /* calc location */
-       x1= (ar->winx-zoomx*ibuf->x)/2 + sseq->xof;
-       y1= (ar->winy-zoomy*ibuf->y)/2 + sseq->yof;
-       
-       glPixelZoom(zoomx, zoomy);
-       
-       glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, 
GL_UNSIGNED_BYTE, ibuf->rect);
-       
-       glPixelZoom(1.0, 1.0);
+       last_texid= glaGetOneInteger(GL_TEXTURE_2D);
+       glEnable(GL_TEXTURE_2D);
+       glGenTextures(1, (GLuint *)&texid);
 
+       glBindTexture(GL_TEXTURE_2D, texid);
+
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, ibuf->x, ibuf->y, 0, GL_RGBA, 
GL_UNSIGNED_BYTE, ibuf->rect);
+       glBegin(GL_QUADS); 
+               glTexCoord2f(0.0f, 0.0f); glVertex2f(v2d->tot.xmin, 
v2d->tot.ymin);
+               glTexCoord2f(0.0f, 1.0f);glVertex2f(v2d->tot.xmin, 
v2d->tot.ymax); 
+               glTexCoord2f(1.0f, 1.0f);glVertex2f(v2d->tot.xmax, 
v2d->tot.ymax);
+               glTexCoord2f(1.0f, 0.0f);glVertex2f(v2d->tot.xmax, 
v2d->tot.ymin); 
+       glEnd( );
+       glBindTexture(GL_TEXTURE_2D, last_texid);
+       glDisable(GL_TEXTURE_2D);
+       glDeleteTextures(1, &texid);
+
        /* safety border */
        if (sseq->mainb == SEQ_DRAW_IMG_IMBUF && 
            (sseq->flag & SEQ_DRAW_SAFE_MARGINS) != 0) {
                float fac= 0.1;
-               float x2 = x1 + ibuf->x * zoomx;
-               float y2 = y1 + ibuf->y * zoomy;
+               float x1 = v2d->tot.xmin;
+               float y1 = v2d->tot.ymin;
+               float x2 = v2d->tot.xmax;
+               float y2 = v2d->tot.ymax;
                
                float a= fac*(x2-x1);
                x1+= a; 
@@ -769,83 +776,10 @@
 //     if (sseq->flag & SEQ_DRAW_GPENCIL)
 // XXX         draw_gpencil_2dview(sa, 0);
        
-       /* ortho at pixel level sa */
-// XXX myortho2(-0.375, sa->winx-0.375, -0.375, sa->winy-0.375);
-       
+       /* ortho at pixel level */
+       UI_view2d_view_restore(C);
 }
 
-// XXX part of wacko image-drawing system...
-void seq_reset_imageofs(SpaceSeq *sseq)
-{
-       sseq->xof = sseq->yof = sseq->zoom = 0;
-}
-
-
-#if 0
-/* XXX - these should really be made to use View2D instead of so wacko private 
system - Aligorith */
-
-void seq_viewzoom(SpaceSeq *sseq, unsigned short event, int invert)
-{
-
-       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(Scene *scene, ARegion *ar, SpaceSeq *sseq)
-{      
-       short mval[2], mvalo[2];
-       short rectx, recty, xmin, xmax, ymin, ymax, pad;
-       int oldcursor;
-       Window *win;
-       
-       sa = sseq->area;
-       rectx= (scene->r.size*scene->r.xsch)/100;
-       recty= (scene->r.size*scene->r.ysch)/100;
-       
-       pad = 10;
-       xmin = -(ar->winx/2) - rectx/2 + pad;
-       xmax = ar->winx/2 + rectx/2 - pad;
-       ymin = -(ar->winy/2) - recty/2 + pad;
-       ymax = ar->winy/2 + recty/2 - pad;
-       
-       getmouseco_sc(mvalo);
-
-       oldcursor=get_cursor();
-       win=winlay_get_active_window();
-       
-       SetBlenderCursor(BC_NSEW_SCROLLCURSOR);
-       
-       while(get_mbut()&(L_MOUSE|M_MOUSE)) {
-               
-               getmouseco_sc(mval);
-               
-               if(mvalo[0]!=mval[0] || mvalo[1]!=mval[1]) {
-
-                       sseq->xof -= (mvalo[0]-mval[0]);
-                       sseq->yof -= (mvalo[1]-mval[1]);
-                       
-                       /* prevent dragging image outside of the window and 
losing it! */
-                       CLAMP(sseq->xof, xmin, xmax);
-                       CLAMP(sseq->yof, ymin, ymax);
-                       
-                       mvalo[0]= mval[0];
-                       mvalo[1]= mval[1];
-                       
-               }
-       }
-}
-#endif
-
 void drawprefetchseqspace(Scene *scene, ARegion *ar, SpaceSeq *sseq)
 {
        int rectx, recty;

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c       
2010-02-07 18:14:38 UTC (rev 26687)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c       
2010-02-07 19:07:56 UTC (rev 26688)
@@ -2226,13 +2226,17 @@
 static int sequencer_view_all_preview_exec(bContext *C, wmOperator *op)
 {
        Scene *scene= CTX_data_scene(C);
-       //bScreen *sc= CTX_wm_screen(C);
+       bScreen *sc= CTX_wm_screen(C);
        ScrArea *area= CTX_wm_area(C);
        ARegion *ar= CTX_wm_region(C);
        SpaceSeq *sseq= area->spacedata.first;
-       //View2D *v2d= UI_view2d_fromcontext(C);
+       View2D *v2d= UI_view2d_fromcontext(C);
 
-
+       v2d->cur= v2d->tot;
+       UI_view2d_curRect_validate(v2d);
+       UI_view2d_sync(sc, area, v2d, V2D_LOCK_COPY);
+       
+#if 0
        /* Like zooming on an image view */
        float zoomX, zoomY;
        int width, height, imgwidth, imgheight;
@@ -2261,6 +2265,7 @@
        else {
                sseq->zoom= 1.0f;
        }
+#endif
 
        ED_area_tag_redraw(CTX_wm_area(C));
        return OPERATOR_FINISHED;


@@ Diff output truncated at 10240 characters. @@

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

Reply via email to