[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