Revision: 42439
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42439
Author:   blendix
Date:     2011-12-05 16:37:31 +0000 (Mon, 05 Dec 2011)
Log Message:
-----------
Fix #28107: save screenshot operator option to save full screen or only a single
editor was not working. Solution is to take full screenshot and crop it on save.
Also fixed screenshot showing popup menu used to execute operator.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/screen/screendump.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm_draw.c

Modified: trunk/blender/source/blender/editors/screen/screendump.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screendump.c    2011-12-05 
15:57:57 UTC (rev 42438)
+++ trunk/blender/source/blender/editors/screen/screendump.c    2011-12-05 
16:37:31 UTC (rev 42439)
@@ -68,28 +68,20 @@
 typedef struct ScreenshotData {
        unsigned int *dumprect;
        int dumpsx, dumpsy;
+       rcti crop;
 } ScreenshotData;
 
 /* get shot from frontbuffer */
-static unsigned int *screenshot(bContext *C, int *dumpsx, int *dumpsy, int 
fscreen)
+static unsigned int *screenshot(bContext *C, int *dumpsx, int *dumpsy)
 {
        wmWindow *win= CTX_wm_window(C);
-       ScrArea *curarea= CTX_wm_area(C);
        int x=0, y=0;
        unsigned int *dumprect= NULL;
        
-       if(fscreen) {   /* full screen */
-               x= 0;
-               y= 0;
-               *dumpsx= win->sizex;
-               *dumpsy= win->sizey;
-       } 
-       else {
-               x= curarea->totrct.xmin;
-               y= curarea->totrct.ymin;
-               *dumpsx= curarea->totrct.xmax-x;
-               *dumpsy= curarea->totrct.ymax-y;
-       }
+       x= 0;
+       y= 0;
+       *dumpsx= win->sizex;
+       *dumpsy= win->sizey;
 
        if (*dumpsx && *dumpsy) {
                
@@ -108,15 +100,23 @@
 {
        unsigned int *dumprect;
        int dumpsx, dumpsy;
+
+       /* do redraw so we don't show popups/menus */
+       WM_redraw_windows(C);
        
-       dumprect= screenshot(C, &dumpsx, &dumpsy, RNA_boolean_get(op->ptr, 
"full"));
+       dumprect= screenshot(C, &dumpsx, &dumpsy);
+
        if(dumprect) {
                ScreenshotData *scd= MEM_callocN(sizeof(ScreenshotData), 
"screenshot");
+               ScrArea *sa= CTX_wm_area(C);
                
                scd->dumpsx= dumpsx;
                scd->dumpsy= dumpsy;
                scd->dumprect= dumprect;
+               if(sa)
+                       scd->crop= sa->totrct;
                op->customdata= scd;
+
                return TRUE;
        }
        else {
@@ -137,6 +137,21 @@
        }
 }
 
+static void screenshot_crop(ImBuf *ibuf, rcti crop)
+{
+       unsigned int *to= ibuf->rect;
+       unsigned int *from= ibuf->rect + crop.ymin*ibuf->x + crop.xmin;
+       int y, cropw= crop.xmax - crop.xmin, croph = crop.ymax - crop.ymin;
+
+       if(cropw > 0 && croph > 0) {
+               for(y=0; y<croph; y++, to+=cropw, from+=ibuf->x)
+                       memmove(to, from, sizeof(unsigned int)*cropw);
+
+               ibuf->x= cropw;
+               ibuf->y= croph;
+       }
+}
+
 static int screenshot_exec(bContext *C, wmOperator *op)
 {
        ScreenshotData *scd= op->customdata;
@@ -166,6 +181,10 @@
                        ibuf= IMB_allocImBuf(scd->dumpsx, scd->dumpsy, 24, 0);
                        ibuf->rect= scd->dumprect;
 
+                       /* crop to show only single editor */
+                       if(!RNA_boolean_get(op->ptr, "full"))
+                               screenshot_crop(ibuf, scd->crop);
+
                        BKE_write_ibuf(ibuf, path, &scene->r.im_format);
 
                        IMB_freeImBuf(ibuf);
@@ -213,7 +232,6 @@
        
        WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE, FILE_SPECIAL, 
FILE_SAVE, WM_FILESEL_FILEPATH);
        prop= RNA_def_boolean(ot->srna, "full", 1, "Full Screen", "");
-       RNA_def_property_flag(prop, PROP_HIDDEN); /* hide because once the file 
sel is displayed, the option no longer does anything */
 }
 
 /* *************** screenshot movie job ************************* */

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h 2011-12-05 15:57:57 UTC 
(rev 42438)
+++ trunk/blender/source/blender/windowmanager/WM_api.h 2011-12-05 16:37:31 UTC 
(rev 42439)
@@ -331,6 +331,9 @@
 void           WM_console_toggle(struct bContext *C, short show);
 #endif
 
+                       /* Draw (for screenshot) */
+void           WM_redraw_windows(struct bContext *C);
+
 /* debugging only, convenience function to write on crash */
 int write_crash_blend(void);
 

Modified: trunk/blender/source/blender/windowmanager/intern/wm_draw.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_draw.c 2011-12-05 
15:57:57 UTC (rev 42438)
+++ trunk/blender/source/blender/windowmanager/intern/wm_draw.c 2011-12-05 
16:37:31 UTC (rev 42439)
@@ -835,3 +835,16 @@
        win->screen->do_draw= 1;
 }
 
+void WM_redraw_windows(bContext *C)
+{
+       wmWindow *win_prev= CTX_wm_window(C);
+       ScrArea *area_prev= CTX_wm_area(C);
+       ARegion *ar_prev= CTX_wm_region(C);
+
+       wm_draw_update(C);
+
+       CTX_wm_window_set(C, win_prev);
+       CTX_wm_area_set(C, area_prev);
+       CTX_wm_region_set(C, ar_prev);
+}
+

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

Reply via email to