[Bf-blender-cvs] [d2363db] multiview: Packing of multiview images working

Dalai Felinto noreply at git.blender.org
Tue Sep 9 23:00:36 CEST 2014


Commit: d2363db2389b890fc04956b90a43f3ecea480b2c
Author: Dalai Felinto
Date:   Tue Sep 9 02:21:07 2014 +0200
Branches: multiview
https://developer.blender.org/rBd2363db2389b890fc04956b90a43f3ecea480b2c

Packing of multiview images working

Notes:
* This will pack multiple images if the format is R_IMF_VIEWS_INDIVIDUAL
* When packing as PNG we convert the views_format to R_IMF_VIEWS_INDIVIDUAL
* Technically we could use the same principle to pack a sequence of images (with some changes of course, since this approach relies on ImageView

===================================================================

M	source/blender/blenkernel/BKE_image.h
M	source/blender/blenkernel/BKE_scene.h
M	source/blender/blenkernel/intern/bpath.c
M	source/blender/blenkernel/intern/image.c
M	source/blender/blenkernel/intern/packedFile.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/versioning_270.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/collada/ImageExporter.cpp
M	source/blender/editors/sculpt_paint/paint_image_2d.c
M	source/blender/editors/space_image/image_buttons.c
M	source/blender/editors/space_image/image_ops.c
M	source/blender/makesdna/DNA_image_types.h
M	source/blender/makesrna/intern/rna_image_api.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 5dc5fde..4207b4f 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -46,6 +46,7 @@ struct Object;
 struct ImageFormatData;
 struct ImagePool;
 struct Main;
+struct ReportList;
 
 #define IMA_MAX_SPACE       64
 
@@ -53,6 +54,7 @@ void   BKE_images_init(void);
 void   BKE_images_exit(void);
 
 int     BKE_image_cache_count(struct Image *image);
+void    BKE_image_free_packedfiles(struct Image *image);
 void    BKE_image_free_views(struct Image *image);
 void    BKE_image_free_buffers(struct Image *image);
 /* call from library */
@@ -219,7 +221,8 @@ void    BKE_image_free_anim_ibufs(struct Image *ima, int except_frame);
 /* does all images with type MOVIE or SEQUENCE */
 void BKE_image_all_free_anim_ibufs(int except_frame);
 
-void BKE_image_memorypack(struct Image *ima);
+void BKE_image_memorypack(struct Scene *scene, struct Image *ima);
+void BKE_image_packfiles(struct ReportList *reports, struct Image *ima, const char *basepath);
 
 /* prints memory statistics for images */
 void BKE_image_print_memlist(void);
@@ -252,6 +255,7 @@ float *BKE_image_get_float_pixels_for_frame(struct Image *image, int frame);
 /* Guess offset for the first frame in the sequence */
 int BKE_image_sequence_guess_offset(struct Image *image);
 bool BKE_image_has_anim(struct Image *image);
+bool BKE_image_has_packedfile(struct Image *image);
 bool BKE_image_is_animated(struct Image *image);
 bool BKE_image_is_dirty(struct Image *image);
 void BKE_image_file_format_set(struct Image *image, int ftype);
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index d34575a..d8ace5a 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -153,6 +153,7 @@ bool BKE_scene_render_view_first(const struct RenderData *rd, const char *viewna
 bool BKE_scene_render_view_last(const struct RenderData *rd, const char *viewname);
 struct SceneRenderView *BKE_scene_render_view_findindex(const struct RenderData *rd, const int view_id);
 size_t BKE_scene_view_get_id(const struct RenderData *rd, const char *viewname);
+void BKE_scene_view_get_filepath(struct Scene *scene, const char *filepath, const char *view, char *r_filepath);
 void BKE_scene_videos_dimensions(const struct RenderData *rd, const size_t width, const size_t height, size_t *r_width, size_t *r_height);
 size_t BKE_scene_num_videos(const struct RenderData *rd);
 
diff --git a/source/blender/blenkernel/intern/bpath.c b/source/blender/blenkernel/intern/bpath.c
index 3cd26da..ba34fd2 100644
--- a/source/blender/blenkernel/intern/bpath.c
+++ b/source/blender/blenkernel/intern/bpath.c
@@ -423,10 +423,10 @@ void BKE_bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int
 		{
 			Image *ima;
 			ima = (Image *)id;
-			if (ima->packedfile == NULL || (flag & BKE_BPATH_TRAVERSE_SKIP_PACKED) == 0) {
+			if (BKE_image_has_packedfile(ima) == false || (flag & BKE_BPATH_TRAVERSE_SKIP_PACKED) == 0) {
 				if (ELEM(ima->source, IMA_SRC_FILE, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
 					if (rewrite_path_fixed(ima->name, visit_cb, absbase, bpath_user_data)) {
-						if (!ima->packedfile) {
+						if (!BKE_image_has_packedfile(ima)) {
 							BKE_image_signal(ima, NULL, IMA_SIGNAL_RELOAD);
 							BKE_image_walk_all_users(bmain, ima, bpath_traverse_image_user_cb);
 						}
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index b524d4c..267ed0d 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -98,6 +98,9 @@
 
 static SpinLock image_spin;
 
+/* prototypes */
+static size_t image_num_files(struct Image *ima);
+
 /* max int, to indicate we don't store sequences in ibuf */
 #define IMA_NO_INDEX    0x7FEFEFEF
 
@@ -264,6 +267,23 @@ int BKE_image_cache_count(Image *image)
 		return 0;
 }
 
+static void image_free_packedfiles(Image *ima)
+{
+	while (ima->packedfiles.last) {
+		ImagePackedFile *imapf = ima->packedfiles.last;
+		if (imapf->packedfile) {
+			freePackedFile(imapf->packedfile);
+		}
+		BLI_remlink(&ima->packedfiles, imapf);
+		MEM_freeN(imapf);
+	}
+}
+
+void BKE_image_free_packedfiles(Image *ima)
+{
+	image_free_packedfiles(ima);
+}
+
 static void image_free_views(Image *ima)
 {
 	while (ima->views.last) {
@@ -317,10 +337,9 @@ void BKE_image_free(Image *ima)
 	int a;
 
 	BKE_image_free_buffers(ima);
-	if (ima->packedfile) {
-		freePackedFile(ima->packedfile);
-		ima->packedfile = NULL;
-	}
+
+	image_free_packedfiles(ima);
+
 	BKE_icon_delete(&ima->id);
 	ima->id.icon_id = 0;
 
@@ -360,6 +379,8 @@ static Image *image_alloc(Main *bmain, const char *name, short source, short typ
 		BKE_color_managed_colorspace_settings_init(&ima->colorspace_settings);
 		ima->stereo3d_format = MEM_mallocN(sizeof(Stereo3dFormat), "Image Stereo Format");
 		ima->anims.first = ima->anims.last = NULL;
+		ima->packedfiles.first = ima->packedfiles.last = NULL;
+		ima->views.first = ima->views.last = NULL;
 	}
 
 	return ima;
@@ -392,6 +413,23 @@ static void image_assign_ibuf(Image *ima, ImBuf *ibuf, int index, int frame)
 	}
 }
 
+static void copy_image_packedfiles(ListBase *lbn, ListBase *lbo)
+{
+	ImagePackedFile *imapf, *imapfn;
+	lbn->first = lbn->last = NULL;
+	imapf = lbo->first;
+	while(imapf) {
+		imapfn = MEM_mallocN(sizeof(ImagePackedFile), "Image Packed Files (copy)");
+		BLI_strncpy(imapfn->filepath, imapf->filepath, sizeof(imapfn->filepath));
+
+		if (imapf->packedfile)
+			imapfn->packedfile = dupPackedFile(imapf->packedfile);
+
+		BLI_addtail(lbn, imapfn);
+		imapf = imapf->next;
+	}
+}
+
 static void copy_image_views(ListBase *lbn, ListBase *lbo)
 {
 	ImageView *iv, *ivn;
@@ -438,8 +476,7 @@ Image *BKE_image_copy(Main *bmain, Image *ima)
 
 	BKE_color_managed_colorspace_settings_copy(&nima->colorspace_settings, &ima->colorspace_settings);
 
-	if (ima->packedfile)
-		nima->packedfile = dupPackedFile(ima->packedfile);
+	copy_image_packedfiles(&nima->packedfiles, &ima->packedfiles);
 
 	nima->stereo3d_format = MEM_dupallocN(ima->stereo3d_format);
 	copy_image_views(&nima->views, &ima->views);
@@ -882,17 +919,76 @@ Image *BKE_image_add_from_imbuf(ImBuf *ibuf)
 	return ima;
 }
 
+/* packs rects from memory as PNG
+ * convert multiview images to R_IMF_VIEWS_INDIVIDUAL
+ */
+static void image_memorypack_multiview(Scene *scene, Image *ima)
+{
+	ImageView *iv;
+	size_t i;
+	const size_t totfiles = image_num_files(ima);
+
+	image_free_packedfiles(ima);
+
+	for (i = 0, iv = ima->views.first; iv; iv = iv->next, i++) {
+		ImBuf *ibuf = image_get_cached_ibuf_for_index_frame(ima, i, 0);
+
+		ibuf->ftype = PNG;
+		ibuf->planes = R_IMF_PLANES_RGBA;
+
+		/* if the image was a R_IMF_VIEWS_STEREO_3D we need to create
+		 *  new names for the new individual views */
+		if (totfiles == 1)
+			BKE_scene_view_get_filepath(scene, ima->name, iv->name, iv->filepath);
+
+		IMB_saveiff(ibuf, iv->filepath, IB_rect | IB_mem);
+
+		if (ibuf->encodedbuffer == NULL) {
+			printf("memory save for pack error\n");
+			IMB_freeImBuf(ibuf);
+			image_free_packedfiles(ima);
+			return;
+		}
+		else {
+			ImagePackedFile *imapf;
+			PackedFile *pf = MEM_callocN(sizeof(*pf), "PackedFile");
+
+			pf->data = ibuf->encodedbuffer;
+			pf->size = ibuf->encodedsize;
+
+			imapf = MEM_mallocN(sizeof(ImagePackedFile), "Image PackedFile");
+			BLI_strncpy(imapf->filepath, iv->filepath, sizeof(imapf->filepath));
+			imapf->packedfile = pf;
+			BLI_addtail(&ima->packedfiles, imapf);
+
+			ibuf->encodedbuffer = NULL;
+			ibuf->encodedsize = 0;
+			ibuf->userflags &= ~IB_BITMAPDIRTY;
+		}
+		IMB_freeImBuf(ibuf);
+	}
+
+	if (ima->source == IMA_SRC_GENERATED) {
+		ima->source = IMA_SRC_FILE;
+		ima->type = IMA_TYPE_IMAGE;
+	}
+	ima->views_format = R_IMF_VIEWS_INDIVIDUAL;
+}
+
 /* packs rect from memory as PNG */
-void BKE_image_memorypack(Image *ima)
+void BKE_image_memorypack(Scene *scene, Image *ima)
 {
-	ImBuf *ibuf = image_get_cached_ibuf_for_index_frame(ima, IMA_NO_INDEX, 0);
+	ImBuf *ibuf;
+
+	if ((ima->flag & IMA_IS_MULTIVIEW))
+		return image_memorypack_multiview(scene, ima);
+
+	ibuf = image_get_cached_ibuf_for_index_frame(ima, IMA_NO_INDEX, 0);
 
 	if (ibuf == NULL)
 		return;
-	if (ima->packedfile) {
-		freePackedFile(ima->packedfile);
-		ima->packedfile = NULL;
-	}
+
+	image_free_packedfiles(ima);
 
 	ibuf->ftype = PNG;
 	ibuf->planes = R_IMF_PLANES_RGBA;
@@ -902,11 +998,17 @@ void BKE_image_memorypack(Image *ima)
 		printf("memory save for pack error\n");
 	}
 	else {
+		ImagePackedFile *imapf;
 		PackedFile *pf = MEM_callocN(sizeof(*pf), "PackedFile");
 
 		pf->data = ibuf->encodedbuffer;
 		pf->size = ibuf->encodedsize;
-		ima->packedfile = pf;
+
+		imapf = MEM_mallocN(sizeof(ImagePackedFile), "Image PackedFile");
+		BLI_strncpy(imapf->filepath, ima->name, sizeof(imapf->filepath));
+		imapf->packedfile = pf;
+		BLI_addtail(&ima->packedfiles, imapf);
+
 		ibuf->encodedbuffer = NULL;
 		ibuf->encodedsize = 0;
 		ibuf->userflags &= ~IB_BITMAPDIRTY;
@@ -920,6 +1022,28 @@ void BKE_image_memorypack(Image *ima)
 	IMB_freeImBuf(ibuf);
 }
 
+void BKE_image_packfiles(ReportList *reports, Image *ima, const char *basepath)
+{
+	const size_t totfiles = image_num_files(ima);
+
+	if (totfiles == 1) {
+		ImagePackedFile *imapf = MEM_mallocN(sizeof(ImagePackedFile), "Image packed file");
+		BLI_addtail(&ima->packedfiles, imapf);
+		imapf->packedfile = newPackedFile(reports, ima->name, basepath);
+		BLI_strncpy(imapf->filepath, ima->name, sizeof(imapf->filepath));
+	}
+	else {
+		ImageView *iv;
+		for (iv = ima->views.first; iv; iv = iv->next) {
+			ImagePackedFile *imapf = MEM_mallocN(sizeof(ImagePackedFile), "Image packed file");
+			BLI_addtail(&ima->packedfiles, imapf);
+
+			imapf->packedfile = newPackedFile(reports, iv->filepath, basepath);
+			BLI_strncpy(imapf->filepath, iv->filepath, sizeof(imapf->filepath));
+		}
+	}
+}
+
 void BKE_image_tag_time(Image *ima)
 {
 	ima->lastused = (int)PIL_check_seconds_timer();
@@ -2449,17 +2573,31 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
 
 		case IMA_SIGNAL_RELOAD:
 			/* try to repack file */
-			if (ima->p

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list