Image save as operator 'BW' option wasnt working on some formats, now only show when its supported.

This commit is contained in:
Campbell Barton 2011-11-25 03:47:34 +00:00
parent ddf934dedf
commit a044f532ab
5 changed files with 70 additions and 40 deletions

@ -60,10 +60,10 @@ char BKE_ftype_to_imtype(const int ftype);
int BKE_imtype_to_ftype(char imtype); int BKE_imtype_to_ftype(char imtype);
int BKE_imtype_is_movie(const 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_zbuf(const char imtype);
int BKE_imtype_supports_compress(const char imtype); int BKE_imtype_supports_compress(const char imtype);
int BKE_imtype_supports_quality(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_valid_depths(const char imtype);
char BKE_imtype_from_arg(const char *arg); char BKE_imtype_from_arg(const char *arg);
@ -115,6 +115,10 @@ struct RenderResult;
/* image-user gets a new image, check settings */ /* image-user gets a new image, check settings */
#define IMA_SIGNAL_USER_NEW_IMAGE 6 #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 */ /* depending Image type, and (optional) ImageUser setting it returns ibuf */
/* always call to make signals work */ /* always call to make signals work */
struct ImBuf *BKE_image_get_ibuf(struct Image *ima, struct ImageUser *iuser); struct ImBuf *BKE_image_get_ibuf(struct Image *ima, struct ImageUser *iuser);

@ -900,24 +900,6 @@ int BKE_imtype_is_movie(const char imtype)
return 0; 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) int BKE_imtype_supports_zbuf(const char imtype)
{ {
switch(imtype) { switch(imtype) {
@ -948,6 +930,39 @@ int BKE_imtype_supports_quality(const char imtype)
return 0; 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) char BKE_imtype_valid_depths(const char imtype)
{ {
switch (imtype) { switch (imtype) {

@ -187,7 +187,7 @@ void RNA_def_function_ui_description(FunctionRNA *func, const char *description)
/* Dynamic Enums /* Dynamic Enums
* strings are not freed, assumed pointing to static location. */ * 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_item_add_separator(EnumPropertyItem **items, int *totitem);
void RNA_enum_items_add(EnumPropertyItem **items, int *totitem, EnumPropertyItem *item); 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); void RNA_enum_items_add_value(EnumPropertyItem **items, int *totitem, EnumPropertyItem *item, int value);

@ -2696,7 +2696,7 @@ int rna_parameter_size_alloc(PropertyRNA *parm)
/* Dynamic Enums */ /* 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; EnumPropertyItem *newitems;
int tot= *totitem; int tot= *totitem;

@ -217,6 +217,10 @@ EnumPropertyItem image_color_mode_items[] ={
{R_IMF_PLANES_RGBA, "RGBA", 0, "RGBA", "Images are saved with RGB and Alpha data (if supported)"}, {R_IMF_PLANES_RGBA, "RGBA", 0, "RGBA", "Images are saved with RGB and Alpha data (if supported)"},
{0, NULL, 0, NULL, NULL}}; {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[] = { EnumPropertyItem image_color_depth_items[] = {
/* 1 (monochrome) not used */ /* 1 (monochrome) not used */
{R_IMF_CHAN_DEPTH_8, "8", 0, "8", "8 bit color channels"}, {R_IMF_CHAN_DEPTH_8, "8", 0, "8", "8 bit color channels"},
@ -615,11 +619,16 @@ static void rna_ImageFormatSettings_file_format_set(PointerRNA *ptr, int value)
{ {
ImageFormatData *imf= (ImageFormatData *)ptr->data; ImageFormatData *imf= (ImageFormatData *)ptr->data;
ID *id= ptr->id.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; imf->imtype= value;
/* ensure depth and color settings match */ /* 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; imf->planes= R_IMF_PLANES_RGB;
} }
@ -675,16 +684,30 @@ static EnumPropertyItem *rna_ImageFormatSettings_color_mode_itemf(bContext *C, P
PropertyRNA *UNUSED(prop), int *free) PropertyRNA *UNUSED(prop), int *free)
{ {
ImageFormatData *imf= (ImageFormatData *)ptr->data; 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; return image_color_mode_items;
} }
else { else {
static EnumPropertyItem color_mode_items[] ={ int totitem= 0;
{R_IMF_PLANES_BW, "BW", 0, "BW", "Images get saved in 8 bits grayscale (only PNG, JPEG, TGA, TIF)"}, EnumPropertyItem *item= NULL;
{R_IMF_PLANES_RGB, "RGB", 0, "RGB", "Images are saved with RGB (color) data"},
{0, NULL, 0, NULL, NULL}}; if (chan_flag & IMA_CHAN_FLAG_BW) RNA_enum_item_add(&item, &totitem, &IMAGE_COLOR_MODE_BW);
return color_mode_items; 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 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_struct_path_func(srna, "rna_RenderSettings_path"); RNA_def_struct_path_func(srna, "rna_RenderSettings_path");
RNA_def_struct_ui_text(srna, "Render Data", "Rendering settings for a Scene datablock"); 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 */ /* Render Data */
prop= RNA_def_property(srna, "image_settings", PROP_POINTER, PROP_NONE); prop= RNA_def_property(srna, "image_settings", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL); RNA_def_property_flag(prop, PROP_NEVER_NULL);