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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to