tornavis/source/blender/imbuf/intern/filetype.cc

261 lines
7.0 KiB
C++

/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup imbuf
*/
#include <cstddef>
#include "BLI_utildefines.h"
#include "IMB_filetype.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
#include "IMB_colormanagement.h"
#include "oiio/openimageio_api.h"
#ifdef WITH_OPENEXR
# include "openexr/openexr_api.h"
#endif
const ImFileType IMB_FILE_TYPES[] = {
{
/*init*/ nullptr,
/*exit*/ nullptr,
/*is_a*/ imb_is_a_jpeg,
/*load*/ imb_load_jpeg,
/*load_filepath*/ nullptr,
/*load_filepath_thumbnail*/ imb_thumbnail_jpeg,
/*save*/ imb_savejpeg,
/*flag*/ 0,
/*filetype*/ IMB_FTYPE_JPG,
/*default_save_role*/ COLOR_ROLE_DEFAULT_BYTE,
},
{
/*init*/ nullptr,
/*exit*/ nullptr,
/*is_a*/ imb_is_a_png,
/*load*/ imb_load_png,
/*load_filepath*/ nullptr,
/*load_filepath_thumbnail*/ nullptr,
/*save*/ imb_save_png,
/*flag*/ 0,
/*filetype*/ IMB_FTYPE_PNG,
/*default_save_role*/ COLOR_ROLE_DEFAULT_BYTE,
},
{
/*init*/ nullptr,
/*exit*/ nullptr,
/*is_a*/ imb_is_a_bmp,
/*load*/ imb_load_bmp,
/*load_filepath*/ nullptr,
/*load_filepath_thumbnail*/ nullptr,
/*save*/ imb_save_bmp,
/*flag*/ 0,
/*filetype*/ IMB_FTYPE_BMP,
/*default_save_role*/ COLOR_ROLE_DEFAULT_BYTE,
},
{
/*init*/ nullptr,
/*exit*/ nullptr,
/*is_a*/ imb_is_a_tga,
/*load*/ imb_load_tga,
/*load_filepath*/ nullptr,
/*load_filepath_thumbnail*/ nullptr,
/*save*/ imb_save_tga,
/*flag*/ 0,
/*filetype*/ IMB_FTYPE_TGA,
/*default_save_role*/ COLOR_ROLE_DEFAULT_BYTE,
},
{
/*init*/ nullptr,
/*exit*/ nullptr,
/*is_a*/ imb_is_a_iris,
/*load*/ imb_loadiris,
/*load_filepath*/ nullptr,
/*load_filepath_thumbnail*/ nullptr,
/*save*/ imb_saveiris,
/*flag*/ 0,
/*filetype*/ IMB_FTYPE_IMAGIC,
/*default_save_role*/ COLOR_ROLE_DEFAULT_BYTE,
},
#ifdef WITH_CINEON
{
/*init*/ nullptr,
/*exit*/ nullptr,
/*is_a*/ imb_is_a_dpx,
/*load*/ imb_load_dpx,
/*load_filepath*/ nullptr,
/*load_filepath_thumbnail*/ nullptr,
/*save*/ imb_save_dpx,
/*flag*/ IM_FTYPE_FLOAT,
/*filetype*/ IMB_FTYPE_DPX,
/*default_save_role*/ COLOR_ROLE_DEFAULT_FLOAT,
},
{
/*init*/ nullptr,
/*exit*/ nullptr,
/*is_a*/ imb_is_a_cineon,
/*load*/ imb_load_cineon,
/*load_filepath*/ nullptr,
/*load_filepath_thumbnail*/ nullptr,
/*save*/ imb_save_cineon,
/*flag*/ IM_FTYPE_FLOAT,
/*filetype*/ IMB_FTYPE_CINEON,
/*default_save_role*/ COLOR_ROLE_DEFAULT_FLOAT,
},
#endif
{
/*init*/ nullptr,
/*exit*/ nullptr,
/*is_a*/ imb_is_a_tiff,
/*load*/ imb_load_tiff,
/*load_filepath*/ nullptr,
/*load_filepath_thumbnail*/ nullptr,
/*save*/ imb_save_tiff,
/*flag*/ 0,
/*filetype*/ IMB_FTYPE_TIF,
/*default_save_role*/ COLOR_ROLE_DEFAULT_BYTE,
},
{
/*init*/ nullptr,
/*exit*/ nullptr,
/*is_a*/ imb_is_a_hdr,
/*load*/ imb_load_hdr,
/*load_filepath*/ nullptr,
/*load_filepath_thumbnail*/ nullptr,
/*save*/ imb_save_hdr,
/*flag*/ IM_FTYPE_FLOAT,
/*filetype*/ IMB_FTYPE_RADHDR,
/*default_save_role*/ COLOR_ROLE_DEFAULT_FLOAT,
},
#ifdef WITH_OPENEXR
{
/*init*/ imb_initopenexr,
/*exit*/ imb_exitopenexr,
/*is_a*/ imb_is_a_openexr,
/*load*/ imb_load_openexr,
/*load_filepath*/ nullptr,
/*load_filepath_thumbnail*/ imb_load_filepath_thumbnail_openexr,
/*save*/ imb_save_openexr,
/*flag*/ IM_FTYPE_FLOAT,
/*filetype*/ IMB_FTYPE_OPENEXR,
/*default_save_role*/ COLOR_ROLE_DEFAULT_FLOAT,
},
#endif
#ifdef WITH_OPENJPEG
{
/*init*/ nullptr,
/*exit*/ nullptr,
/*is_a*/ imb_is_a_jp2,
/*load*/ imb_load_jp2,
/*load_filepath*/ nullptr,
/*load_filepath_thumbnail*/ nullptr,
/*save*/ imb_save_jp2,
/*flag*/ IM_FTYPE_FLOAT,
/*filetype*/ IMB_FTYPE_JP2,
/*default_save_role*/ COLOR_ROLE_DEFAULT_BYTE,
},
#endif
{
/*init*/ imb_init_dds,
/*exit*/ nullptr,
/*is_a*/ imb_is_a_dds,
/*load*/ imb_load_dds,
/*load_filepath*/ nullptr,
/*load_filepath_thumbnail*/ nullptr,
/*save*/ nullptr,
/*flag*/ 0,
/*filetype*/ IMB_FTYPE_DDS,
/*default_save_role*/ COLOR_ROLE_DEFAULT_BYTE,
},
{
/*init*/ nullptr,
/*exit*/ nullptr,
/*is_a*/ imb_is_a_psd,
/*load*/ imb_load_psd,
/*load_filepath*/ nullptr,
/*load_filepath_thumbnail*/ nullptr,
/*save*/ nullptr,
/*flag*/ IM_FTYPE_FLOAT,
/*filetype*/ IMB_FTYPE_PSD,
/*default_save_role*/ COLOR_ROLE_DEFAULT_FLOAT,
},
#ifdef WITH_WEBP
{
/*init*/ nullptr,
/*exit*/ nullptr,
/*is_a*/ imb_is_a_webp,
/*load*/ imb_loadwebp,
/*load_filepath*/ nullptr,
/*load_filepath_thumbnail*/ imb_load_filepath_thumbnail_webp,
/*save*/ imb_savewebp,
/*flag*/ 0,
/*filetype*/ IMB_FTYPE_WEBP,
/*default_save_role*/ COLOR_ROLE_DEFAULT_BYTE,
},
#endif
{
/* Only implementing thumbnailing for SVG file type to support specialized importers.
* General file loading, if wanted, would require a better library and would have to
* support features like user-specified resolution. */
/*init*/ nullptr,
/*exit*/ nullptr,
/*is_a*/ nullptr,
/*load*/ nullptr,
/*load_filepath*/ nullptr,
/*load_filepath_thumbnail*/ imb_load_filepath_thumbnail_svg,
/*save*/ nullptr,
/*flag*/ 0,
/*filetype*/ IMB_FTYPE_NONE,
/*default_save_role*/ COLOR_ROLE_DEFAULT_BYTE,
},
{nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, 0, 0, 0},
};
const ImFileType *IMB_FILE_TYPES_LAST = &IMB_FILE_TYPES[ARRAY_SIZE(IMB_FILE_TYPES) - 1];
const ImFileType *IMB_file_type_from_ftype(int ftype)
{
for (const ImFileType *type = IMB_FILE_TYPES; type < IMB_FILE_TYPES_LAST; type++) {
if (ftype == type->filetype) {
return type;
}
}
return nullptr;
}
const ImFileType *IMB_file_type_from_ibuf(const ImBuf *ibuf)
{
return IMB_file_type_from_ftype(ibuf->ftype);
}
void imb_filetypes_init()
{
const ImFileType *type;
OIIO_init();
for (type = IMB_FILE_TYPES; type < IMB_FILE_TYPES_LAST; type++) {
if (type->init) {
type->init();
}
}
}
void imb_filetypes_exit()
{
const ImFileType *type;
for (type = IMB_FILE_TYPES; type < IMB_FILE_TYPES_LAST; type++) {
if (type->exit) {
type->exit();
}
}
}