[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28968] trunk/blender/source/blender: blend file thumbnailing

Campbell Barton ideasman42 at gmail.com
Mon May 24 23:52:19 CEST 2010


Revision: 28968
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28968
Author:   campbellbarton
Date:     2010-05-24 23:52:18 +0200 (Mon, 24 May 2010)

Log Message:
-----------
blend file thumbnailing
- uses same thumbnail system as image browser
- blend files show thumbnails in ubuntu/gnome (freedesktop spec)
- 128x128 images are embedded into the blend file header, a simple loader avoids reading the entire blend file to extract it when generating thumbnails in the file selector.
  When the image browser reads a directory it loads images and creates thumbnails, blend files embedded images are treated just like loading an image.
- the thumbnail is created from the camera view in solid mode. (no camera == no thumbnal).
- readfile/writefile.c: had to use the 'TEST' code name to save thumbnails, anything else would segfault older blender versions on load. (its not used elsewhere).

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_utildefines.h
    trunk/blender/source/blender/blenkernel/intern/blender.c
    trunk/blender/source/blender/blenloader/BLO_writefile.h
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/editors/space_file/filelist.c
    trunk/blender/source/blender/imbuf/IMB_thumbs.h
    trunk/blender/source/blender/imbuf/intern/thumbs.c
    trunk/blender/source/blender/windowmanager/intern/wm_files.c

Added Paths:
-----------
    trunk/blender/source/blender/imbuf/intern/thumbs_blend.c

Modified: trunk/blender/source/blender/blenkernel/BKE_utildefines.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_utildefines.h	2010-05-24 21:10:58 UTC (rev 28967)
+++ trunk/blender/source/blender/blenkernel/BKE_utildefines.h	2010-05-24 21:52:18 UTC (rev 28968)
@@ -166,7 +166,7 @@
 #define IMAG MAKE_ID('I','M','A','G')
 
 #define DNA1 MAKE_ID('D','N','A','1')
-#define TEST MAKE_ID('T','E','S','T')
+#define TEST MAKE_ID('T','E','S','T') /* used as preview between 'REND' and 'GLOB' */
 #define REND MAKE_ID('R','E','N','D')
 #define USER MAKE_ID('U','S','E','R')
 

Modified: trunk/blender/source/blender/blenkernel/intern/blender.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/blender.c	2010-05-24 21:10:58 UTC (rev 28967)
+++ trunk/blender/source/blender/blenkernel/intern/blender.c	2010-05-24 21:52:18 UTC (rev 28968)
@@ -534,7 +534,7 @@
 		sprintf(numstr, "%d.blend", counter);
 		BLI_make_file_string("/", tstr, btempdir, numstr);
 	
-		success= BLO_write_file(CTX_data_main(C), tstr, G.fileflags, NULL);
+		success= BLO_write_file(CTX_data_main(C), tstr, G.fileflags, NULL, NULL);
 		
 		strcpy(curundo->str, tstr);
 	}

Modified: trunk/blender/source/blender/blenloader/BLO_writefile.h
===================================================================
--- trunk/blender/source/blender/blenloader/BLO_writefile.h	2010-05-24 21:10:58 UTC (rev 28967)
+++ trunk/blender/source/blender/blenloader/BLO_writefile.h	2010-05-24 21:52:18 UTC (rev 28968)
@@ -35,10 +35,12 @@
 struct Main;
 struct ReportList;
 
-extern int BLO_write_file(struct Main *mainvar, char *dir, int write_flags, struct ReportList *reports);
+extern int BLO_write_file(struct Main *mainvar, char *dir, int write_flags, struct ReportList *reports, int *thumb);
 extern int BLO_write_file_mem(struct Main *mainvar, struct MemFile *compare, struct MemFile *current, 
 							  int write_flags, struct ReportList *reports);
 extern int BLO_write_runtime(struct Main *mainvar, char *file, char *exename, struct ReportList *reports);
 
+#define BLEN_THUMB_SIZE 128
+
 #endif
 

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2010-05-24 21:10:58 UTC (rev 28967)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2010-05-24 21:52:18 UTC (rev 28968)
@@ -10971,7 +10971,7 @@
 		switch(bhead->code) {
 		case DATA:
 		case DNA1:
-		case TEST:
+		case TEST: /* used as preview since 2.5x */
 		case REND:
 			bhead = blo_nextbhead(fd, bhead);
 			break;

Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c	2010-05-24 21:10:58 UTC (rev 28967)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c	2010-05-24 21:52:18 UTC (rev 28968)
@@ -62,6 +62,7 @@
 	- write library block
 	- per LibBlock
 		- write the ID of LibBlock
+- write TEST (128x128, blend file preview, optional)
 - write FileGlobal (some global vars)
 - write SDNA
 - write USER if filename is ~/.B.blend
@@ -2390,9 +2391,19 @@
 	writestruct(wd, GLOB, "FileGlobal", 1, &fg);
 }
 
+/* preview image, first 2 values are width and height
+ * second are an RGBA image (unsigned char)
+ * note, this uses 'TEST' since new types will segfault on file load for older blender versions.
+ */
+static void write_thumb(WriteData *wd, int *img)
+{
+	if(img)
+		writedata(wd, TEST, (2 + img[0] * img[1]) * sizeof(int), img);
+}
+
 /* if MemFile * there's filesave to memory */
 static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFile *current, 
-							 int write_user_block, int write_flags)
+							 int write_user_block, int write_flags, int *thumb)
 {
 	BHead bhead;
 	ListBase mainlist;
@@ -2407,6 +2418,7 @@
 	mywrite(wd, buf, 12);
 
 	write_renderinfo(wd, mainvar);
+	write_thumb(wd, thumb);
 	write_global(wd, write_flags, mainvar);
 
 	/* no UI save in undo */
@@ -2458,7 +2470,7 @@
 }
 
 /* return: success (1) */
-int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *reports)
+int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *reports, int *thumb)
 {
 	char userfilename[FILE_MAXDIR+FILE_MAXFILE];
 	char tempname[FILE_MAXDIR+FILE_MAXFILE+1];
@@ -2497,7 +2509,7 @@
 		makeFilesRelative(dir, NULL); /* note, making relative to something OTHER then G.sce */
 
 	/* actual file writing */
-	err= write_file_handle(mainvar, file, NULL,NULL, write_user_block, write_flags);
+	err= write_file_handle(mainvar, file, NULL,NULL, write_user_block, write_flags, thumb);
 	close(file);
 
 	/* rename/compress */
@@ -2550,7 +2562,7 @@
 {
 	int err;
 
-	err= write_file_handle(mainvar, 0, compare, current, 0, write_flags);
+	err= write_file_handle(mainvar, 0, compare, current, 0, write_flags, NULL);
 	
 	if(err==0) return 1;
 	return 0;
@@ -2646,7 +2658,7 @@
 	outfd= open(gamename, O_BINARY|O_WRONLY|O_CREAT|O_TRUNC, 0777);
 	if (outfd != -1) {
 
-		write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags);
+		write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags, NULL);
 
 		if (write(outfd, " ", 1) != 1) {
 			BKE_report(reports, RPT_ERROR, "Unable to write to output file.");
@@ -2732,7 +2744,7 @@
 
 	datastart= lseek(outfd, 0, SEEK_CUR);
 
-	write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags);
+	write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags, NULL);
 
 	if (!handle_write_msb_int(outfd, datastart) || (write(outfd, "BRUNTIME", 8)!=8)) {
 		BKE_report(reports, RPT_ERROR, "Unable to write to output file.");

Modified: trunk/blender/source/blender/editors/space_file/filelist.c
===================================================================
--- trunk/blender/source/blender/editors/space_file/filelist.c	2010-05-24 21:10:58 UTC (rev 28967)
+++ trunk/blender/source/blender/editors/space_file/filelist.c	2010-05-24 21:52:18 UTC (rev 28968)
@@ -1280,6 +1280,8 @@
 	while ( (*stop==0) && (limg) ) {
 		if ( limg->flags & IMAGEFILE ) {
 			limg->img = IMB_thumb_manage(limg->path, THB_NORMAL, THB_SOURCE_IMAGE);
+		} else if ( limg->flags & BLENDERFILE ) {
+			limg->img = IMB_thumb_manage(limg->path, THB_NORMAL, THB_SOURCE_BLEND);
 		} else if ( limg->flags & MOVIEFILE ) {
 			limg->img = IMB_thumb_manage(limg->path, THB_NORMAL, THB_SOURCE_MOVIE);
 			if (!limg->img) {
@@ -1334,7 +1336,7 @@
 	tj->filelist = filelist;
 	for (idx = 0; idx < filelist->numfiles;idx++) {
 		if (!filelist->filelist[idx].image) {
-			if ( (filelist->filelist[idx].flags & IMAGEFILE) || (filelist->filelist[idx].flags & MOVIEFILE) ) {
+			if ( (filelist->filelist[idx].flags & (IMAGEFILE|MOVIEFILE|BLENDERFILE)) ) {
 				FileImage* limg = MEM_callocN(sizeof(struct FileImage), "loadimage");
 				BLI_strncpy(limg->path, filelist->filelist[idx].path, FILE_MAX);
 				limg->index= idx;
@@ -1364,4 +1366,4 @@
 int thumbnails_running(struct FileList* filelist, const struct bContext* C)
 {
 	return WM_jobs_test(CTX_wm_manager(C), filelist);
-}
\ No newline at end of file
+}

Modified: trunk/blender/source/blender/imbuf/IMB_thumbs.h
===================================================================
--- trunk/blender/source/blender/imbuf/IMB_thumbs.h	2010-05-24 21:10:58 UTC (rev 28967)
+++ trunk/blender/source/blender/imbuf/IMB_thumbs.h	2010-05-24 21:52:18 UTC (rev 28968)
@@ -50,13 +50,14 @@
 
 typedef enum ThumbSource {
 	THB_SOURCE_IMAGE,
-	THB_SOURCE_MOVIE
+	THB_SOURCE_MOVIE,
+	THB_SOURCE_BLEND
 } ThumbSource;
 
 // IB_metadata
 
 /* create thumbnail for file and returns new imbuf for thumbnail */
-ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source);
+ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, ImBuf *ibuf);
 
 /* read thumbnail for file and returns new imbuf for thumbnail */
 ImBuf* IMB_thumb_read(const char* path, ThumbSize size);
@@ -70,6 +71,8 @@
 /* create the necessary dirs to store the thumbnails */
 void IMB_thumb_makedirs();
 
+/* special function for loading a thumbnail embedded into a blend file */
+ImBuf *IMB_loadblend_thumb(const char *path);
 
 #endif /* _IMB_THUMBS_H */
 

Modified: trunk/blender/source/blender/imbuf/intern/thumbs.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/thumbs.c	2010-05-24 21:10:58 UTC (rev 28967)
+++ trunk/blender/source/blender/imbuf/intern/thumbs.c	2010-05-24 21:52:18 UTC (rev 28968)
@@ -241,9 +241,8 @@
 }
 
 /* create thumbnail for file and returns new imbuf for thumbnail */
-ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source)
+ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, ImBuf *img)
 {
-	ImBuf *img = 0;
 	char uri[URI_MAX];
 	char desc[URI_MAX+22];
 	char tpath[FILE_MAX];
@@ -285,8 +284,18 @@
 			img = IMB_allocImBuf(0,0,32, IB_rect | IB_metadata, 0);
 			if (!img) return 0;
 		} else {
-			if (THB_SOURCE_IMAGE == source) {
-				img = IMB_loadiffname(path, IB_rect | IB_metadata);
+			if (THB_SOURCE_IMAGE == source || THB_SOURCE_BLEND == source) {
+				
+				/* only load if we didnt give an image */
+				if(img==NULL) {
+					if(THB_SOURCE_BLEND == source) {
+						img = IMB_loadblend_thumb(path);
+					}
+					else {
+						img = IMB_loadiffname(path, IB_rect | IB_metadata);
+					}
+				}
+
 				if (img != NULL) {
 					stat(path, &info);
 					sprintf(mtime, "%ld", info.st_mtime);
@@ -425,10 +434,10 @@
 						IMB_thumb_delete(path, THB_NORMAL);
 						IMB_thumb_delete(path, THB_LARGE);
 						IMB_thumb_delete(path, THB_FAIL);
-						img = IMB_thumb_create(path, size, source);
+						img = IMB_thumb_create(path, size, source, NULL);
 						if(!img){
 							/* thumb creation failed, write fail thumb */
-							img = IMB_thumb_create(path, THB_FAIL, source);
+							img = IMB_thumb_create(path, THB_FAIL, source, NULL);
 							if (img) {
 								/* we don't need failed thumb anymore */
 								IMB_freeImBuf(img);
@@ -438,10 +447,10 @@
 					}
 				}
 			} else {
-				img = IMB_thumb_create(path, size, source);
+				img = IMB_thumb_create(path, size, source, NULL);
 				if(!img){
 					/* thumb creation failed, write fail thumb */
-					img = IMB_thumb_create(path, THB_FAIL, source);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list