[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42154] trunk/blender/source/blender: Image save as operator 'BW' option wasnt working on some formats, now only show when its supported.

Campbell Barton ideasman42 at gmail.com
Fri Nov 25 04:47:35 CET 2011


Revision: 42154
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42154
Author:   campbellbarton
Date:     2011-11-25 03:47:34 +0000 (Fri, 25 Nov 2011)
Log Message:
-----------
Image save as operator 'BW' option wasnt working on some formats, now only show when its supported.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_image.h
    trunk/blender/source/blender/blenkernel/intern/image.c
    trunk/blender/source/blender/makesrna/RNA_define.h
    trunk/blender/source/blender/makesrna/intern/rna_define.c
    trunk/blender/source/blender/makesrna/intern/rna_scene.c

Modified: trunk/blender/source/blender/blenkernel/BKE_image.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_image.h	2011-11-25 02:35:23 UTC (rev 42153)
+++ trunk/blender/source/blender/blenkernel/BKE_image.h	2011-11-25 03:47:34 UTC (rev 42154)
@@ -60,10 +60,10 @@
 int		BKE_imtype_to_ftype(char imtype);
 
 int		BKE_imtype_is_movie(const char imtype);
-int		BKE_imtype_supports_alpha(const char imtype);
 int		BKE_imtype_supports_zbuf(const char imtype);
 int		BKE_imtype_supports_compress(const char imtype);
 int		BKE_imtype_supports_quality(const char imtype);
+char    BKE_imtype_valid_channels(const char imtype);
 char	BKE_imtype_valid_depths(const char imtype);
 
 char    BKE_imtype_from_arg(const char *arg);
@@ -115,6 +115,10 @@
 	/* image-user gets a new image, check settings */
 #define IMA_SIGNAL_USER_NEW_IMAGE	6
 
+#define IMA_CHAN_FLAG_BW    1
+#define IMA_CHAN_FLAG_RGB   2
+#define IMA_CHAN_FLAG_ALPHA 4
+
 /* depending Image type, and (optional) ImageUser setting it returns ibuf */
 /* always call to make signals work */
 struct ImBuf *BKE_image_get_ibuf(struct Image *ima, struct ImageUser *iuser);

Modified: trunk/blender/source/blender/blenkernel/intern/image.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/image.c	2011-11-25 02:35:23 UTC (rev 42153)
+++ trunk/blender/source/blender/blenkernel/intern/image.c	2011-11-25 03:47:34 UTC (rev 42154)
@@ -900,24 +900,6 @@
 	return 0;
 }
 
-int BKE_imtype_supports_alpha(const char imtype)
-{
-	switch(imtype) {
-	case R_IMF_IMTYPE_TARGA:
-	case R_IMF_IMTYPE_IRIS:
-	case R_IMF_IMTYPE_PNG:
-	/* case R_IMF_IMTYPE_BMP: */ /* read but not write */
-	case R_IMF_IMTYPE_RADHDR:
-	case R_IMF_IMTYPE_TIFF:
-	case R_IMF_IMTYPE_OPENEXR:
-	case R_IMF_IMTYPE_MULTILAYER:
-	case R_IMF_IMTYPE_DDS:
-	case R_IMF_IMTYPE_JP2:
-			return 1;
-	}
-	return 0;
-}
-
 int BKE_imtype_supports_zbuf(const char imtype)
 {
 	switch(imtype) {
@@ -948,6 +930,39 @@
 	return 0;
 }
 
+char BKE_imtype_valid_channels(const char imtype)
+{
+	char chan_flag= IMA_CHAN_FLAG_RGB; /* assume all support rgb */
+
+	/* alpha */
+	switch(imtype) {
+	case R_IMF_IMTYPE_TARGA:
+	case R_IMF_IMTYPE_IRIS:
+	case R_IMF_IMTYPE_PNG:
+	/* case R_IMF_IMTYPE_BMP: */ /* read but not write */
+	case R_IMF_IMTYPE_RADHDR:
+	case R_IMF_IMTYPE_TIFF:
+	case R_IMF_IMTYPE_OPENEXR:
+	case R_IMF_IMTYPE_MULTILAYER:
+	case R_IMF_IMTYPE_DDS:
+	case R_IMF_IMTYPE_JP2:
+			chan_flag |= IMA_CHAN_FLAG_ALPHA;
+	}
+
+	/* bw */
+	switch(imtype) {
+	case R_IMF_IMTYPE_PNG:
+	case R_IMF_IMTYPE_JPEG90:
+	case R_IMF_IMTYPE_TARGA:
+	case R_IMF_IMTYPE_RAWTGA:
+	case R_IMF_IMTYPE_TIFF:
+	case R_IMF_IMTYPE_IRIS:
+			chan_flag |= IMA_CHAN_FLAG_BW;
+	}
+
+	return chan_flag;
+}
+
 char BKE_imtype_valid_depths(const char imtype)
 {
 	switch (imtype) {

Modified: trunk/blender/source/blender/makesrna/RNA_define.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_define.h	2011-11-25 02:35:23 UTC (rev 42153)
+++ trunk/blender/source/blender/makesrna/RNA_define.h	2011-11-25 03:47:34 UTC (rev 42154)
@@ -187,7 +187,7 @@
 /* Dynamic Enums
  * strings are not freed, assumed pointing to static location. */
 
-void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, EnumPropertyItem *item);
+void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item);
 void RNA_enum_item_add_separator(EnumPropertyItem **items, int *totitem);
 void RNA_enum_items_add(EnumPropertyItem **items, int *totitem, EnumPropertyItem *item);
 void RNA_enum_items_add_value(EnumPropertyItem **items, int *totitem, EnumPropertyItem *item, int value);

Modified: trunk/blender/source/blender/makesrna/intern/rna_define.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_define.c	2011-11-25 02:35:23 UTC (rev 42153)
+++ trunk/blender/source/blender/makesrna/intern/rna_define.c	2011-11-25 03:47:34 UTC (rev 42154)
@@ -2696,7 +2696,7 @@
 
 /* Dynamic Enums */
 
-void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, EnumPropertyItem *item)
+void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item)
 {
 	EnumPropertyItem *newitems;
 	int tot= *totitem;

Modified: trunk/blender/source/blender/makesrna/intern/rna_scene.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_scene.c	2011-11-25 02:35:23 UTC (rev 42153)
+++ trunk/blender/source/blender/makesrna/intern/rna_scene.c	2011-11-25 03:47:34 UTC (rev 42154)
@@ -217,6 +217,10 @@
 	{R_IMF_PLANES_RGBA, "RGBA", 0, "RGBA", "Images are saved with RGB and Alpha data (if supported)"},
 	{0, NULL, 0, NULL, NULL}};
 
+#define IMAGE_COLOR_MODE_BW   image_color_mode_items[0]
+#define IMAGE_COLOR_MODE_RGB  image_color_mode_items[1]
+#define IMAGE_COLOR_MODE_RGBA image_color_mode_items[2]
+
 EnumPropertyItem image_color_depth_items[] = {
 	/* 1 (monochrome) not used */
 	{R_IMF_CHAN_DEPTH_8,   "8", 0, "8",  "8 bit color channels"},
@@ -615,11 +619,16 @@
 {
 	ImageFormatData *imf= (ImageFormatData *)ptr->data;
 	ID *id= ptr->id.data;
+	const char is_render= (id && GS(id->name) == ID_SCE);
+	/* see note below on why this is */
+	const char chan_flag= BKE_imtype_valid_channels(imf->imtype) | (is_render ? IMA_CHAN_FLAG_BW : 0);
 
 	imf->imtype= value;
 
 	/* ensure depth and color settings match */
-	if (!BKE_imtype_supports_alpha(imf->imtype)) {
+	if ( ((imf->planes == R_IMF_PLANES_BW) &&   !(chan_flag & IMA_CHAN_FLAG_BW)) ||
+	     ((imf->planes == R_IMF_PLANES_RGBA) && !(chan_flag & IMA_CHAN_FLAG_ALPHA)))
+	{
 		imf->planes= R_IMF_PLANES_RGB;
 	}
 
@@ -675,16 +684,30 @@
                                                                   PropertyRNA *UNUSED(prop), int *free)
 {
 	ImageFormatData *imf= (ImageFormatData *)ptr->data;
+	ID *id= ptr->id.data;
+	const char is_render= (id && GS(id->name) == ID_SCE);
 
-	if ((imf == NULL) || BKE_imtype_supports_alpha(imf->imtype)) {
+	/* note, we need to act differently for render
+	 * where 'BW' will force greyscale even if the output format writes
+	 * as RGBA, this is age old blender convention and not sure how useful
+	 * it really is but keep it for now - campbell */
+	const char chan_flag= BKE_imtype_valid_channels(imf->imtype) | (is_render ? IMA_CHAN_FLAG_BW : 0);
+
+	if (chan_flag == (IMA_CHAN_FLAG_BW|IMA_CHAN_FLAG_RGB|IMA_CHAN_FLAG_ALPHA)) {
 		return image_color_mode_items;
 	}
 	else {
-		static EnumPropertyItem color_mode_items[] ={
-			{R_IMF_PLANES_BW, "BW", 0, "BW", "Images get saved in 8 bits grayscale (only PNG, JPEG, TGA, TIF)"},
-			{R_IMF_PLANES_RGB, "RGB", 0, "RGB", "Images are saved with RGB (color) data"},
-			{0, NULL, 0, NULL, NULL}};
-		return color_mode_items;
+		int totitem= 0;
+		EnumPropertyItem *item= NULL;
+
+		if (chan_flag & IMA_CHAN_FLAG_BW)    RNA_enum_item_add(&item, &totitem, &IMAGE_COLOR_MODE_BW);
+		if (chan_flag & IMA_CHAN_FLAG_RGB)   RNA_enum_item_add(&item, &totitem, &IMAGE_COLOR_MODE_RGB);
+		if (chan_flag & IMA_CHAN_FLAG_ALPHA) RNA_enum_item_add(&item, &totitem, &IMAGE_COLOR_MODE_RGBA);
+
+		RNA_enum_item_end(&item, &totitem);
+		*free= 1;
+
+		return item;
 	}
 }
 
@@ -2727,18 +2750,6 @@
 	RNA_def_struct_path_func(srna, "rna_RenderSettings_path");
 	RNA_def_struct_ui_text(srna, "Render Data", "Rendering settings for a Scene datablock");
 
-#if 0 /* moved */
-
-	prop= RNA_def_property(srna, "color_mode", PROP_ENUM, PROP_NONE);
-	RNA_def_property_enum_bitflag_sdna(prop, NULL, "planes");
-	RNA_def_property_enum_items(prop, image_color_mode_items);
-	RNA_def_property_ui_text(prop, "Color Mode",
-	                         "Choose BW for saving greyscale images, RGB for saving red, green and blue channels, "
-	                         "and RGBA for saving red, green, blue and alpha channels");
-	RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
-
-#endif
-
 	/* Render Data */
 	prop= RNA_def_property(srna, "image_settings", PROP_POINTER, PROP_NONE);
 	RNA_def_property_flag(prop, PROP_NEVER_NULL);




More information about the Bf-blender-cvs mailing list