[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