This patch adds a new Media Type option to image format settings, which is used in the Render Output panel, File Output node, and Image Saving operation. The option does not provide any new functionality, but improves the UX of selecting file types by categorizing the existing file type option into: - Image. - Multi-Layer EXR. - Video. Each option would then list only the file types that fit that media type. For Multi-Layer and Video, the file type option is no longer drawn for now since only one option exist for now, OpenEXR Multi-Layer and FFMPEG respectively. This also improves the experience by not listing technical terms like FFMPEG in the UI, but rather use "Video" instead. The original motivation for introducing this option is the recent redesign of the File Output node. The problem is that the distinction between images and multi-layers images is not at all clear, while the behavior of the node changes quite a bit when multi-layer is chosen. While now with the new option, the distinction is quite clear. Implementation-wise, the new option is mostly a UI layer that controls the available enum items for the file format and callbacks to set a default format if the existing format doesn't match the media type. However, core code is unaffected and still transparently reads the image format only. Pull Request: https://projects.blender.org/blender/blender/pulls/142955
145 lines
5.3 KiB
C++
145 lines
5.3 KiB
C++
/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#pragma once
|
|
|
|
/** \file
|
|
* \ingroup bke
|
|
*/
|
|
|
|
#include <cstddef>
|
|
|
|
#include "BKE_path_templates.hh"
|
|
|
|
struct BlendDataReader;
|
|
struct BlendWriter;
|
|
struct ID;
|
|
struct ImbFormatOptions;
|
|
struct ImageFormatData;
|
|
struct ImBuf;
|
|
struct Scene;
|
|
struct RenderData;
|
|
|
|
/* Init/Copy/Free */
|
|
|
|
void BKE_image_format_init(ImageFormatData *imf, const bool render);
|
|
void BKE_image_format_copy(ImageFormatData *imf_dst, const ImageFormatData *imf_src);
|
|
void BKE_image_format_free(ImageFormatData *imf);
|
|
|
|
/* Updates the color space of the given image format based on its image type. This can be used to
|
|
* set a good default color space when the user changes the image type. See the implementation for
|
|
* more information on the logic. */
|
|
void BKE_image_format_update_color_space_for_type(ImageFormatData *format);
|
|
|
|
void BKE_image_format_blend_read_data(BlendDataReader *reader, ImageFormatData *imf);
|
|
void BKE_image_format_blend_write(BlendWriter *writer, ImageFormatData *imf);
|
|
|
|
/* Sets the media type of the given format that belongs to the given ID. This involves updating the
|
|
* imtype to a default format if it does not match the newly set media type. */
|
|
void BKE_image_format_media_type_set(ImageFormatData *format,
|
|
ID *owner_id,
|
|
const MediaType media_type);
|
|
void BKE_image_format_set(ImageFormatData *imf, ID *owner_id, const char imtype);
|
|
|
|
/* File Paths */
|
|
|
|
/**
|
|
* \param template_variables: the map of variables to use for template
|
|
* substitution. Optional: if null, template substitution will not be performed.
|
|
*
|
|
* \return If any template errors are encountered, returns those errors. On
|
|
* success, returns an empty Vector.
|
|
*/
|
|
blender::Vector<blender::bke::path_templates::Error> BKE_image_path_from_imformat(
|
|
char *filepath,
|
|
const char *base,
|
|
const char *relbase,
|
|
const blender::bke::path_templates::VariableMap *template_variables,
|
|
int frame,
|
|
const ImageFormatData *im_format,
|
|
bool use_ext,
|
|
bool use_frames,
|
|
const char *suffix);
|
|
blender::Vector<blender::bke::path_templates::Error> BKE_image_path_from_imtype(
|
|
char *filepath,
|
|
const char *base,
|
|
const char *relbase,
|
|
const blender::bke::path_templates::VariableMap *template_variables,
|
|
int frame,
|
|
char imtype,
|
|
bool use_ext,
|
|
bool use_frames,
|
|
const char *suffix);
|
|
|
|
/**
|
|
* The number of extensions an image may have (`.jpg`, `.jpeg` for example).
|
|
* Add 1 as the array is nil terminated.
|
|
*/
|
|
#define BKE_IMAGE_PATH_EXT_MAX 3
|
|
/**
|
|
* Fill in an array of acceptable image extensions for the image format.
|
|
*
|
|
* \note In the case a file has no valid extension,
|
|
* the first extension should be used (`r_ext[0]`).
|
|
* \return the number of extensions assigned to `r_ext`, 0 for unsupported formats.
|
|
*/
|
|
int BKE_image_path_ext_from_imformat(const ImageFormatData *im_format,
|
|
const char *r_ext[BKE_IMAGE_PATH_EXT_MAX]);
|
|
int BKE_image_path_ext_from_imtype(const char imtype, const char *r_ext[BKE_IMAGE_PATH_EXT_MAX]);
|
|
|
|
int BKE_image_path_ext_from_imformat_ensure(char *filepath,
|
|
size_t filepath_maxncpy,
|
|
const ImageFormatData *im_format);
|
|
int BKE_image_path_ext_from_imtype_ensure(char *filepath, size_t filepath_maxncpy, char imtype);
|
|
|
|
/* File Types */
|
|
|
|
#define IMA_CHAN_FLAG_BW 1
|
|
#define IMA_CHAN_FLAG_RGB 2
|
|
#define IMA_CHAN_FLAG_RGBA 4
|
|
|
|
char BKE_ftype_to_imtype(int ftype, const ImbFormatOptions *options);
|
|
int BKE_imtype_to_ftype(char imtype, ImbFormatOptions *r_options);
|
|
|
|
/* Returns true if the given imtype represents an image. This excludes multi-layer images, use
|
|
* BKE_imtype_is_multi_layer_image to detect those images. */
|
|
bool BKE_imtype_is_image(char imtype);
|
|
/* Returns true if the given imtype represents a multi-layer image. */
|
|
bool BKE_imtype_is_multi_layer_image(char imtype);
|
|
bool BKE_imtype_is_movie(char imtype);
|
|
bool BKE_imtype_supports_compress(char imtype);
|
|
bool BKE_imtype_supports_quality(char imtype);
|
|
bool BKE_imtype_requires_linear_float(char imtype);
|
|
char BKE_imtype_valid_channels(char imtype);
|
|
char BKE_imtype_valid_depths(char imtype);
|
|
char BKE_imtype_valid_depths_with_video(char imtype, const ID *owner_id);
|
|
char BKE_imtype_first_valid_depth(const char valid_depths);
|
|
|
|
/**
|
|
* String is from command line `--render-format` argument,
|
|
* keep in sync with `creator_args.cc` help info.
|
|
*/
|
|
char BKE_imtype_from_arg(const char *imtype_arg);
|
|
|
|
/* Conversion between #ImBuf settings. */
|
|
|
|
void BKE_image_format_from_imbuf(ImageFormatData *im_format, const ImBuf *imbuf);
|
|
void BKE_image_format_to_imbuf(ImBuf *ibuf, const ImageFormatData *imf);
|
|
|
|
bool BKE_image_format_is_byte(const ImageFormatData *imf);
|
|
|
|
/* Color Management */
|
|
|
|
void BKE_image_format_color_management_copy(ImageFormatData *imf, const ImageFormatData *imf_src);
|
|
void BKE_image_format_color_management_copy_from_scene(ImageFormatData *imf, const Scene *scene);
|
|
|
|
/* Image Output
|
|
*
|
|
* Initialize an image format that can be used for file writing, including
|
|
* color management settings from the scene. */
|
|
|
|
void BKE_image_format_init_for_write(ImageFormatData *imf,
|
|
const Scene *scene_src,
|
|
const ImageFormatData *imf_src);
|