passepartout overlay wasnt written into thumbnails
[blender.git] / source / blender / windowmanager / intern / wm_files.c
index efa8aa7e8199c712ece78f059610de1aa48f43a4..44768116c7ce6c4acb2784afbb84a9a131f917cd 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * $Id: wm_files.c
+ * $Id$
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
 #include "BLO_writefile.h"
 
 #include "RNA_access.h"
-#include "RNA_define.h"
+
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
+#include "IMB_thumbs.h"
 
 #include "ED_datafiles.h"
 #include "ED_object.h"
 #include "ED_screen.h"
 #include "ED_sculpt.h"
+#include "ED_view3d.h"
 #include "ED_util.h"
 
 #include "GHOST_C-api.h"
@@ -236,11 +240,19 @@ static void wm_window_match_do(bContext *C, ListBase *oldwmlist)
 }
 
 /* in case UserDef was read, we re-initialize all, and do versioning */
-static void wm_init_userdef()
+static void wm_init_userdef(bContext *C)
 {
+       extern char btempdir[];
+
        UI_init_userdef();
        MEM_CacheLimiter_set_maximum(U.memcachelimit * 1024 * 1024);
-       sound_init();
+       sound_init(CTX_data_main(C));
+
+       /* set the python auto-execute setting from user prefs */
+       /* disabled by default, unless explicitly enabled in the command line */
+       if ((U.flag & USER_SCRIPT_AUTOEXEC_DISABLE) == 0) G.f |=  G_SCRIPT_AUTOEXEC;
+
+       if(U.tempdir[0]) strncpy(btempdir, U.tempdir, FILE_MAXDIR+FILE_MAXFILE);
 }
 
 void WM_read_file(bContext *C, char *name, ReportList *reports)
@@ -254,6 +266,7 @@ void WM_read_file(bContext *C, char *name, ReportList *reports)
        
        /* we didn't succeed, now try to read Blender file */
        if (retval== 0) {
+               int G_f= G.f;
                ListBase wmbase;
 
                /* put aside screens to match with persistant windows later */
@@ -263,17 +276,23 @@ void WM_read_file(bContext *C, char *name, ReportList *reports)
                retval= BKE_read_file(C, name, NULL, reports);
                G.save_over = 1;
 
+               /* this flag is initialized by the operator but overwritten on read.
+                * need to re-enable it here else drivers + registered scripts wont work. */
+               if(G_f & G_SCRIPT_AUTOEXEC) G.f |= G_SCRIPT_AUTOEXEC;
+               else                                            G.f &= ~G_SCRIPT_AUTOEXEC;
+
                /* match the read WM with current WM */
                wm_window_match_do(C, &wmbase);
                WM_check(C); /* opens window(s), checks keymaps */
                
 // XXX         mainwindow_set_filename_to_title(G.main->name);
 
-               if(retval==2) wm_init_userdef();        // in case a userdef is read from regular .blend
+               if(retval==2) wm_init_userdef(C);       // in case a userdef is read from regular .blend
                
                if (retval!=0) {
                        G.relbase_valid = 1;
-                       writeBlog();
+                       if(!G.background) /* assume automated tasks with background, dont write recent file list */
+                               writeBlog();
                }
 
 // XXX         undo_editmode_clear();
@@ -283,11 +302,14 @@ void WM_read_file(bContext *C, char *name, ReportList *reports)
                WM_event_add_notifier(C, NC_WM|ND_FILEREAD, NULL);
 //             refresh_interface_font();
 
-               CTX_wm_window_set(C, NULL); /* exits queues */
+               CTX_wm_window_set(C, CTX_wm_manager(C)->windows.first);
+               ED_editors_init(C);
+
 #ifndef DISABLE_PYTHON
                /* run any texts that were loaded in and flagged as modules */
                BPY_load_user_modules(C);
 #endif
+               CTX_wm_window_set(C, NULL); /* exits queues */
        }
        else if(retval==1)
                BKE_write_undo(C, "Import file");
@@ -338,7 +360,7 @@ int WM_read_homefile(bContext *C, wmOperator *op)
 
        strcpy(G.sce, scestr); /* restore */
        
-       wm_init_userdef();
+       wm_init_userdef(C);
        
        /* When loading factory settings, the reset solid OpenGL lights need to be applied. */
        if (!G.background) GPU_default_lights();
@@ -353,6 +375,8 @@ int WM_read_homefile(bContext *C, wmOperator *op)
 //     undo_editmode_clear();
        BKE_reset_undo();
        BKE_write_undo(C, "original");  /* save current state */
+
+       ED_editors_init(C);
        
        WM_event_add_notifier(C, NC_WM|ND_FILEREAD, NULL);
        CTX_wm_window_set(C, NULL); /* exits queues */
@@ -467,25 +491,74 @@ static void do_history(char *name, ReportList *reports)
                BKE_report(reports, RPT_ERROR, "Unable to make version backup");
 }
 
-void WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports)
+static ImBuf *blend_file_thumb(const char *path, Scene *scene, int **thumb_pt)
+{
+       /* will be scaled down, but gives some nice oversampling */
+       ImBuf *ibuf;
+       int *thumb;
+
+       *thumb_pt= NULL;
+       
+       if(G.background || scene->camera==NULL)
+               return NULL;
+
+       /* gets scaled to BLEN_THUMB_SIZE */
+       ibuf= ED_view3d_draw_offscreen_imbuf_simple(scene, BLEN_THUMB_SIZE * 2, BLEN_THUMB_SIZE * 2, OB_SOLID);
+       
+       if(ibuf) {              
+               float aspect= (scene->r.xsch*scene->r.xasp) / (scene->r.ysch*scene->r.yasp);
+
+               /* dirty oversampling */
+               IMB_scaleImBuf(ibuf, BLEN_THUMB_SIZE, BLEN_THUMB_SIZE);
+
+               /* add pretty overlay */
+               IMB_overlayblend_thumb(ibuf->rect, ibuf->x, ibuf->y, aspect);
+               
+               /* first write into thumb buffer */
+               thumb= MEM_mallocN(((2 + (BLEN_THUMB_SIZE * BLEN_THUMB_SIZE))) * sizeof(int), "write_file thumb");
+
+               thumb[0] = BLEN_THUMB_SIZE;
+               thumb[1] = BLEN_THUMB_SIZE;
+
+               memcpy(thumb + 2, ibuf->rect, BLEN_THUMB_SIZE * BLEN_THUMB_SIZE * sizeof(int));
+       }
+       else {
+               /* '*thumb_pt' needs to stay NULL to prevent a bad thumbnail from being handled */
+               thumb= NULL;
+       }
+       
+       /* must be freed by caller */
+       *thumb_pt= thumb;
+       
+       return ibuf;
+}
+
+int WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports)
 {
        Library *li;
        int len;
        char di[FILE_MAX];
-       
+
+       int *thumb= NULL;
+       ImBuf *ibuf_thumb= NULL;
+
        len = strlen(target);
        
-       if (len == 0) return;
+       if (len == 0) {
+               BKE_report(reports, RPT_ERROR, "Path is empty, cannot save");
+               return -1;
+       }
+
        if (len >= FILE_MAX) {
                BKE_report(reports, RPT_ERROR, "Path too long, cannot save");
-               return;
+               return -1;
        }
  
        /* send the OnSave event */
        for (li= G.main->library.first; li; li= li->id.next) {
                if (BLI_streq(li->name, target)) {
                        BKE_report(reports, RPT_ERROR, "Cannot overwrite used library");
-                       return;
+                       return -1;
                }
        }
        
@@ -509,7 +582,10 @@ void WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports
 
        do_history(di, reports);
        
-       if (BLO_write_file(CTX_data_main(C), di, fileflags, reports)) {
+       /* blend file thumbnail */
+       ibuf_thumb= blend_file_thumb(di, CTX_data_scene(C), &thumb);
+
+       if (BLO_write_file(CTX_data_main(C), di, fileflags, reports, thumb)) {
                strcpy(G.sce, di);
                G.relbase_valid = 1;
                strcpy(G.main->name, di);       /* is guaranteed current file */
@@ -519,10 +595,27 @@ void WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports
                if(fileflags & G_FILE_COMPRESS) G.fileflags |= G_FILE_COMPRESS;
                else G.fileflags &= ~G_FILE_COMPRESS;
                
+               if(fileflags & G_FILE_AUTOPLAY) G.fileflags |= G_FILE_AUTOPLAY;
+               else G.fileflags &= ~G_FILE_AUTOPLAY;
+
                writeBlog();
+
+               /* run this function after because the file cant be written before the blend is */
+               if (ibuf_thumb) {
+                       ibuf_thumb= IMB_thumb_create(di, THB_NORMAL, THB_SOURCE_BLEND, ibuf_thumb);
+                       IMB_freeImBuf(ibuf_thumb);
+               }
+
+               if(thumb) MEM_freeN(thumb);
+       }
+       else {
+               if(ibuf_thumb) IMB_freeImBuf(ibuf_thumb);
+               if(thumb) MEM_freeN(thumb);
+               return -1;
        }
 
 // XXX waitcursor(0);
+       return 0;
 }
 
 /* operator entry */
@@ -540,9 +633,9 @@ int WM_write_homefile(bContext *C, wmOperator *op)
        BLI_make_file_string("/", tstr, BLI_gethome(), ".B25.blend");
        
        /*  force save as regular blend file */
-       fileflags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_LOCK | G_FILE_SIGN);
+       fileflags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_AUTOPLAY | G_FILE_LOCK | G_FILE_SIGN);
 
-       BLO_write_file(CTX_data_main(C), tstr, fileflags, op->reports);
+       BLO_write_file(CTX_data_main(C), tstr, fileflags, op->reports, NULL);
        
        G.save_over= 0;
        
@@ -608,10 +701,10 @@ void wm_autosave_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
        wm_autosave_location(filename);
 
        /*  force save as regular blend file */
-       fileflags = G.fileflags & ~(G_FILE_COMPRESS|G_FILE_LOCK|G_FILE_SIGN);
+       fileflags = G.fileflags & ~(G_FILE_COMPRESS|G_FILE_AUTOPLAY |G_FILE_LOCK|G_FILE_SIGN);
 
        /* no error reporting to console */
-       BLO_write_file(CTX_data_main(C), filename, fileflags, NULL);
+       BLO_write_file(CTX_data_main(C), filename, fileflags, NULL, NULL);
 
        /* do timer after file write, just in case file write takes a long time */
        wm->autosavetimer= WM_event_add_timer(wm, NULL, TIMERAUTOSAVE, U.savetime*60.0);