[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60621] trunk/blender: Photoshop PSD support

Dalai Felinto dfelinto at gmail.com
Tue Oct 8 23:17:24 CEST 2013


Revision: 60621
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60621
Author:   dfelinto
Date:     2013-10-08 21:17:24 +0000 (Tue, 08 Oct 2013)
Log Message:
-----------
Photoshop PSD support

We now support the combined layer of Photoshop files (stored as layer 0
in the file). This way users can keep their files as multilayer PSD and
Blender always handle them as flat images.

For perfect alpha this requires an OpenImageIO update:
https://github.com/OpenImageIO/oiio/commit/342cc2633ff590a3bb278481c61ae798c7148361

Photoshop sample files:
https://github.com/OpenImageIO/oiio-images

Brecht has some pending fixes to push for OIIO as well, so we may as
well wait to update our libraries.

What works:
===========
* 8bit images (with or without alpha)
* 16bits images (alpha discarded)
* Photoshop files saved with 'Maximum Compatibility'
* Cycles, Blender internal,  BGE (and player)

Known limitations
(due to OIIO dependency):
=========================
* Images with less than 4 channels show a wrong thumbnail (bug may be in  OIIO)
* Packed images are not supported
* We do not write PSD files.

Note: old Blenders have support for PSD via Quicktime library. But due
to license issues this was discontinued.

Many thanks for Brecht van Lommel for reviewing the patch, suggesting
multiple improvements and to help solving the alpha issue.

Modified Paths:
--------------
    trunk/blender/CMakeLists.txt
    trunk/blender/SConstruct
    trunk/blender/source/blender/CMakeLists.txt
    trunk/blender/source/blender/blenkernel/intern/image.c
    trunk/blender/source/blender/editors/space_file/CMakeLists.txt
    trunk/blender/source/blender/editors/space_image/CMakeLists.txt
    trunk/blender/source/blender/imbuf/CMakeLists.txt
    trunk/blender/source/blender/imbuf/IMB_imbuf.h
    trunk/blender/source/blender/imbuf/IMB_imbuf_types.h
    trunk/blender/source/blender/imbuf/intern/IMB_filetype.h
    trunk/blender/source/blender/imbuf/intern/colormanagement.c
    trunk/blender/source/blender/imbuf/intern/filetype.c
    trunk/blender/source/blender/imbuf/intern/readimage.c
    trunk/blender/source/blender/imbuf/intern/util.c
    trunk/blender/source/blender/imbuf/intern/writeimage.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/makesrna/intern/CMakeLists.txt
    trunk/blender/source/blender/makesrna/intern/rna_scene.c
    trunk/blender/source/blender/python/intern/CMakeLists.txt
    trunk/blender/source/blenderplayer/CMakeLists.txt
    trunk/blender/source/creator/CMakeLists.txt

Added Paths:
-----------
    trunk/blender/source/blender/imbuf/intern/oiio/
    trunk/blender/source/blender/imbuf/intern/oiio/CMakeLists.txt
    trunk/blender/source/blender/imbuf/intern/oiio/SConscript
    trunk/blender/source/blender/imbuf/intern/oiio/openimageio_api.cpp
    trunk/blender/source/blender/imbuf/intern/oiio/openimageio_api.h
    trunk/blender/source/blender/imbuf/intern/oiio/openimageio_stub.cpp

Modified: trunk/blender/CMakeLists.txt
===================================================================
--- trunk/blender/CMakeLists.txt	2013-10-08 20:18:38 UTC (rev 60620)
+++ trunk/blender/CMakeLists.txt	2013-10-08 21:17:24 UTC (rev 60621)
@@ -206,6 +206,7 @@
 option(WITH_IMAGE_OPENEXR       "Enable OpenEXR Support (http://www.openexr.com)" ON)
 option(WITH_IMAGE_OPENJPEG      "Enable OpenJpeg Support (http://www.openjpeg.org)" ON)
 option(WITH_IMAGE_TIFF          "Enable LibTIFF Support" ON)
+option(WITH_IMAGE_PSD           "Enable Photoshop PSD Support" ON)
 option(WITH_IMAGE_DDS           "Enable DDS Image Support" ON)
 option(WITH_IMAGE_CINEON        "Enable CINEON and DPX Image Support" ON)
 option(WITH_IMAGE_HDR           "Enable HDR Image Support" ON)
@@ -441,6 +442,11 @@
 	set(WITH_CYCLES OFF)
 endif()
 
+# auto enable openimageio for photoshop psd
+if(WITH_IMAGE_PSD)
+	set(WITH_OPENIMAGEIO ON)
+endif()
+
 # enable boost for cycles, booleans, audaspace or i18n
 # otherwise if the user disabled
 if(NOT WITH_BOOST)
@@ -2297,6 +2303,7 @@
 	info_cfg_option(WITH_IMAGE_OPENJPEG)
 	info_cfg_option(WITH_IMAGE_REDCODE)
 	info_cfg_option(WITH_IMAGE_TIFF)
+	info_cfg_option(WITH_IMAGE_PSD)
 
 	info_cfg_text("Audio:")
 	info_cfg_option(WITH_OPENAL)

Modified: trunk/blender/SConstruct
===================================================================
--- trunk/blender/SConstruct	2013-10-08 20:18:38 UTC (rev 60620)
+++ trunk/blender/SConstruct	2013-10-08 21:17:24 UTC (rev 60621)
@@ -246,6 +246,7 @@
     target_env_defs['WITH_BF_CYCLES'] = False
     target_env_defs['WITH_BF_OPENAL'] = False
     target_env_defs['WITH_BF_OPENEXR'] = False
+    target_env_defs['WITH_BF_PSD'] = False
     target_env_defs['WITH_BF_OPENMP'] = False
     target_env_defs['WITH_BF_ICONV'] = False
     target_env_defs['WITH_BF_INTERNATIONAL'] = False

Modified: trunk/blender/source/blender/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/CMakeLists.txt	2013-10-08 20:18:38 UTC (rev 60620)
+++ trunk/blender/source/blender/CMakeLists.txt	2013-10-08 21:17:24 UTC (rev 60621)
@@ -117,6 +117,10 @@
 	add_subdirectory(imbuf/intern/openexr)
 endif()
 
+if(WITH_IMAGE_PSD)
+	add_subdirectory(imbuf/intern/oiio)
+endif()
+
 if(WITH_IMAGE_DDS)
 	add_subdirectory(imbuf/intern/dds)
 endif()

Modified: trunk/blender/source/blender/blenkernel/intern/image.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/image.c	2013-10-08 20:18:38 UTC (rev 60620)
+++ trunk/blender/source/blender/blenkernel/intern/image.c	2013-10-08 21:17:24 UTC (rev 60621)
@@ -1250,6 +1250,12 @@
 		}
 	}
 #endif
+#ifdef WITH_PSD
+	else if (imtype == R_IMF_IMTYPE_PSD) {
+		if (!BLI_testextensie(string, ".psd"))
+			extension = ".psd";
+	}
+#endif
 #ifdef WITH_OPENEXR
 	else if (ELEM(imtype, R_IMF_IMTYPE_OPENEXR, R_IMF_IMTYPE_MULTILAYER)) {
 		if (!BLI_testextensie(string, ".exr"))

Modified: trunk/blender/source/blender/editors/space_file/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/editors/space_file/CMakeLists.txt	2013-10-08 20:18:38 UTC (rev 60620)
+++ trunk/blender/source/blender/editors/space_file/CMakeLists.txt	2013-10-08 21:17:24 UTC (rev 60621)
@@ -58,6 +58,10 @@
 	add_definitions(-DWITH_OPENEXR)
 endif()
 
+if(WITH_IMAGE_PSD)
+	add_definitions(-DWITH_PSD)
+endif()
+
 if(WITH_IMAGE_TIFF)
 	add_definitions(-DWITH_TIFF)
 endif()

Modified: trunk/blender/source/blender/editors/space_image/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/editors/space_image/CMakeLists.txt	2013-10-08 20:18:38 UTC (rev 60620)
+++ trunk/blender/source/blender/editors/space_image/CMakeLists.txt	2013-10-08 21:17:24 UTC (rev 60621)
@@ -58,6 +58,9 @@
 	add_definitions(-DWITH_OPENEXR)
 endif()
 
+if(WITH_IMAGE_PSD)
+	add_definitions(-DWITH_PSD)
+endif()
 if(WITH_IMAGE_TIFF)
 	add_definitions(-DWITH_TIFF)
 endif()

Modified: trunk/blender/source/blender/imbuf/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/imbuf/CMakeLists.txt	2013-10-08 20:18:38 UTC (rev 60620)
+++ trunk/blender/source/blender/imbuf/CMakeLists.txt	2013-10-08 21:17:24 UTC (rev 60621)
@@ -105,6 +105,15 @@
 	add_definitions(-DWITH_TIFF)
 endif()
 
+
+if(WITH_IMAGE_PSD)
+	add_definitions(-DWITH_PSD)
+else()
+	list(APPEND SRC
+		intern/oiio/openimageio_stub.cpp
+	)
+endif()
+
 if(WITH_IMAGE_OPENJPEG)
 	list(APPEND INC_SYS
 		${OPENJPEG_INCLUDE_DIRS}

Modified: trunk/blender/source/blender/imbuf/IMB_imbuf.h
===================================================================
--- trunk/blender/source/blender/imbuf/IMB_imbuf.h	2013-10-08 20:18:38 UTC (rev 60620)
+++ trunk/blender/source/blender/imbuf/IMB_imbuf.h	2013-10-08 21:17:24 UTC (rev 60621)
@@ -429,7 +429,7 @@
  *
  * \attention defined in readimage.c
  */  
-struct ImBuf *IMB_loadifffile(int file, int flags, char colorspace[IM_MAX_SPACE], const char *descr);
+struct ImBuf *IMB_loadifffile(int file, const char *filepath, int flags, char colorspace[IM_MAX_SPACE], const char *descr);
 
 /**
  *

Modified: trunk/blender/source/blender/imbuf/IMB_imbuf_types.h
===================================================================
--- trunk/blender/source/blender/imbuf/IMB_imbuf_types.h	2013-10-08 20:18:38 UTC (rev 60620)
+++ trunk/blender/source/blender/imbuf/IMB_imbuf_types.h	2013-10-08 21:17:24 UTC (rev 60621)
@@ -180,6 +180,10 @@
  */
 #define IB_CUSTOM_FLAGS_MASK 0x7ff
 
+#ifdef WITH_PSD
+#define PSD				(1 << 31)
+#endif
+
 #define PNG				(1 << 30)
 #define TGA				(1 << 28)
 #define JPG				(1 << 27)
@@ -273,6 +277,9 @@
 extern const char *imb_ext_movie[];
 extern const char *imb_ext_audio[];
 
+/* image formats that can only be loaded via filepath */
+extern const char *imb_ext_image_filepath_only[];
+
 enum {
 	IMB_COLORMANAGE_IS_DATA = (1 << 0)
 };

Modified: trunk/blender/source/blender/imbuf/intern/IMB_filetype.h
===================================================================
--- trunk/blender/source/blender/imbuf/intern/IMB_filetype.h	2013-10-08 20:18:38 UTC (rev 60620)
+++ trunk/blender/source/blender/imbuf/intern/IMB_filetype.h	2013-10-08 21:17:24 UTC (rev 60621)
@@ -39,8 +39,10 @@
 	void (*exit)(void);
 
 	int (*is_a)(unsigned char *buf);
+	int (*is_a_filepath)(const char *name);
 	int (*ftype)(struct ImFileType *type, struct ImBuf *ibuf);
 	struct ImBuf *(*load)(unsigned char *mem, size_t size, int flags, char colorspace[IM_MAX_SPACE]);
+	struct ImBuf *(*load_filepath)(const char *name, int flags, char colorspace[IM_MAX_SPACE]);
 	int (*save)(struct ImBuf *ibuf, const char *name, int flags);
 	void (*load_tile)(struct ImBuf *ibuf, unsigned char *mem, size_t size, int tx, int ty, unsigned int *rect);
 
@@ -50,6 +52,7 @@
 } ImFileType;
 
 extern ImFileType IMB_FILE_TYPES[];
+extern ImFileType *IMB_FILE_TYPES_LAST;
 
 void imb_filetypes_init(void);
 void imb_filetypes_exit(void);

Modified: trunk/blender/source/blender/imbuf/intern/colormanagement.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/colormanagement.c	2013-10-08 20:18:38 UTC (rev 60620)
+++ trunk/blender/source/blender/imbuf/intern/colormanagement.c	2013-10-08 21:17:24 UTC (rev 60621)
@@ -1915,7 +1915,7 @@
 		 * we need to allocate byte buffer and store color managed
 		 * image there
 		 */
-		for (type = IMB_FILE_TYPES; type->is_a; type++) {
+		for (type = IMB_FILE_TYPES; type < IMB_FILE_TYPES_LAST; type++) {
 			if (type->save && type->ftype(type, colormanaged_ibuf)) {
 				if ((type->flag & IM_FTYPE_FLOAT) == 0)
 					make_byte = true;
@@ -2451,7 +2451,7 @@
 {
 	ImFileType *type;
 
-	for (type = IMB_FILE_TYPES; type->is_a; type++) {
+	for (type = IMB_FILE_TYPES; type < IMB_FILE_TYPES_LAST; type++) {
 		if (type->save && type->ftype(type, ibuf)) {
 			const char *role_colorspace;
 

Modified: trunk/blender/source/blender/imbuf/intern/filetype.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/filetype.c	2013-10-08 20:18:38 UTC (rev 60620)
+++ trunk/blender/source/blender/imbuf/intern/filetype.c	2013-10-08 21:17:24 UTC (rev 60621)
@@ -39,6 +39,10 @@
 #include "openexr/openexr_api.h"
 #endif
 
+#ifdef WITH_PSD
+#include "oiio/openimageio_api.h"
+#endif
+
 #ifdef WITH_DDS
 #include "dds/dds_api.h"
 #endif
@@ -71,41 +75,46 @@
 #endif
 
 ImFileType IMB_FILE_TYPES[] = {
-	{NULL, NULL, imb_is_a_jpeg, imb_ftype_default, imb_load_jpeg, imb_savejpeg, NULL, 0, JPG, COLOR_ROLE_DEFAULT_BYTE},
-	{NULL, NULL, imb_is_a_png, imb_ftype_default, imb_loadpng, imb_savepng, NULL, 0, PNG, COLOR_ROLE_DEFAULT_BYTE},
-	{NULL, NULL, imb_is_a_bmp, imb_ftype_default, imb_bmp_decode, imb_savebmp, NULL, 0, BMP, COLOR_ROLE_DEFAULT_BYTE},
-	{NULL, NULL, imb_is_a_targa, imb_ftype_default, imb_loadtarga, imb_savetarga, NULL, 0, TGA, COLOR_ROLE_DEFAULT_BYTE},
-	{NULL, NULL, imb_is_a_iris, imb_ftype_iris, imb_loadiris, imb_saveiris, NULL, 0, IMAGIC, COLOR_ROLE_DEFAULT_BYTE},
+	{NULL, NULL, imb_is_a_jpeg, NULL, imb_ftype_default, imb_load_jpeg, NULL, imb_savejpeg, NULL, 0, JPG, COLOR_ROLE_DEFAULT_BYTE},
+	{NULL, NULL, imb_is_a_png, NULL, imb_ftype_default, imb_loadpng, NULL, imb_savepng, NULL, 0, PNG, COLOR_ROLE_DEFAULT_BYTE},
+	{NULL, NULL, imb_is_a_bmp, NULL, imb_ftype_default, imb_bmp_decode, NULL, imb_savebmp, NULL, 0, BMP, COLOR_ROLE_DEFAULT_BYTE},
+	{NULL, NULL, imb_is_a_targa, NULL, imb_ftype_default, imb_loadtarga, NULL, imb_savetarga, NULL, 0, TGA, COLOR_ROLE_DEFAULT_BYTE},
+	{NULL, NULL, imb_is_a_iris, NULL, imb_ftype_iris, imb_loadiris, NULL, imb_saveiris, NULL, 0, IMAGIC, COLOR_ROLE_DEFAULT_BYTE},
 #ifdef WITH_CINEON
-	{NULL, NULL, imb_is_dpx, imb_ftype_default, imb_load_dpx, imb_save_dpx, NULL, IM_FTYPE_FLOAT, DPX, COLOR_ROLE_DEFAULT_FLOAT},
-	{NULL, NULL, imb_is_cineon, imb_ftype_default, imb_load_cineon, imb_save_cineon, NULL, IM_FTYPE_FLOAT, CINEON, COLOR_ROLE_DEFAULT_FLOAT},
+	{NULL, NULL, imb_is_dpx, NULL, imb_ftype_default, imb_load_dpx, NULL, imb_save_dpx, NULL, IM_FTYPE_FLOAT, DPX, COLOR_ROLE_DEFAULT_FLOAT},
+	{NULL, NULL, imb_is_cineon, NULL, imb_ftype_default, imb_load_cineon, NULL, imb_save_cineon, NULL, IM_FTYPE_FLOAT, CINEON, COLOR_ROLE_DEFAULT_FLOAT},
 #endif
 #ifdef WITH_TIFF

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list