Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/imbuf')
-rw-r--r--source/blender/imbuf/IMB_imbuf.h2
-rw-r--r--source/blender/imbuf/intern/IMB_filetype.h1
-rw-r--r--source/blender/imbuf/intern/filetype.c17
-rw-r--r--source/blender/imbuf/intern/oiio/openimageio_api.cpp14
-rw-r--r--source/blender/imbuf/intern/oiio/openimageio_api.h2
-rw-r--r--source/blender/imbuf/intern/util.c62
6 files changed, 58 insertions, 40 deletions
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index 2f848b5be08..0f9aa7055e7 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -474,6 +474,8 @@ bool IMB_prepare_write_ImBuf(const bool isfloat, struct ImBuf *ibuf);
* \attention Defined in util.c
*/
bool IMB_ispic(const char *name);
+bool IMB_ispic_type_matches(const char *name, int filetype);
+int IMB_ispic_type_from_memory(const unsigned char *mem, const size_t mem_size);
int IMB_ispic_type(const char *name);
/**
diff --git a/source/blender/imbuf/intern/IMB_filetype.h b/source/blender/imbuf/intern/IMB_filetype.h
index 53d9a1a2919..b7763976853 100644
--- a/source/blender/imbuf/intern/IMB_filetype.h
+++ b/source/blender/imbuf/intern/IMB_filetype.h
@@ -33,7 +33,6 @@ typedef struct ImFileType {
void (*exit)(void);
int (*is_a)(const unsigned char *buf);
- int (*is_a_filepath)(const char *filepath);
int (*ftype)(const struct ImFileType *type, const struct ImBuf *ibuf);
struct ImBuf *(*load)(const unsigned char *mem,
size_t size,
diff --git a/source/blender/imbuf/intern/filetype.c b/source/blender/imbuf/intern/filetype.c
index 667027ebfeb..1746be85131 100644
--- a/source/blender/imbuf/intern/filetype.c
+++ b/source/blender/imbuf/intern/filetype.c
@@ -54,7 +54,6 @@ const ImFileType IMB_FILE_TYPES[] = {
{NULL,
NULL,
imb_is_a_jpeg,
- NULL,
imb_ftype_default,
imb_load_jpeg,
NULL,
@@ -66,7 +65,6 @@ const ImFileType IMB_FILE_TYPES[] = {
{NULL,
NULL,
imb_is_a_png,
- NULL,
imb_ftype_default,
imb_loadpng,
NULL,
@@ -78,7 +76,6 @@ const ImFileType IMB_FILE_TYPES[] = {
{NULL,
NULL,
imb_is_a_bmp,
- NULL,
imb_ftype_default,
imb_bmp_decode,
NULL,
@@ -90,7 +87,6 @@ const ImFileType IMB_FILE_TYPES[] = {
{NULL,
NULL,
imb_is_a_targa,
- NULL,
imb_ftype_default,
imb_loadtarga,
NULL,
@@ -102,7 +98,6 @@ const ImFileType IMB_FILE_TYPES[] = {
{NULL,
NULL,
imb_is_a_iris,
- NULL,
imb_ftype_iris,
imb_loadiris,
NULL,
@@ -115,7 +110,6 @@ const ImFileType IMB_FILE_TYPES[] = {
{NULL,
NULL,
imb_is_a_dpx,
- NULL,
imb_ftype_default,
imb_load_dpx,
NULL,
@@ -127,7 +121,6 @@ const ImFileType IMB_FILE_TYPES[] = {
{NULL,
NULL,
imb_is_a_cineon,
- NULL,
imb_ftype_default,
imb_load_cineon,
NULL,
@@ -141,7 +134,6 @@ const ImFileType IMB_FILE_TYPES[] = {
{imb_inittiff,
NULL,
imb_is_a_tiff,
- NULL,
imb_ftype_default,
imb_loadtiff,
NULL,
@@ -155,7 +147,6 @@ const ImFileType IMB_FILE_TYPES[] = {
{NULL,
NULL,
imb_is_a_hdr,
- NULL,
imb_ftype_default,
imb_loadhdr,
NULL,
@@ -169,7 +160,6 @@ const ImFileType IMB_FILE_TYPES[] = {
{imb_initopenexr,
imb_exitopenexr,
imb_is_a_openexr,
- NULL,
imb_ftype_default,
imb_load_openexr,
NULL,
@@ -183,7 +173,6 @@ const ImFileType IMB_FILE_TYPES[] = {
{NULL,
NULL,
imb_is_a_jp2,
- NULL,
imb_ftype_default,
imb_load_jp2,
NULL,
@@ -197,7 +186,6 @@ const ImFileType IMB_FILE_TYPES[] = {
{NULL,
NULL,
imb_is_a_dds,
- NULL,
imb_ftype_default,
imb_load_dds,
NULL,
@@ -210,8 +198,7 @@ const ImFileType IMB_FILE_TYPES[] = {
#ifdef WITH_OPENIMAGEIO
{NULL,
NULL,
- NULL,
- imb_is_a_filepath_photoshop,
+ imb_is_a_photoshop,
imb_ftype_default,
NULL,
imb_load_photoshop,
@@ -221,7 +208,7 @@ const ImFileType IMB_FILE_TYPES[] = {
IMB_FTYPE_PSD,
COLOR_ROLE_DEFAULT_FLOAT},
#endif
- {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0},
+ {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0},
};
const ImFileType *IMB_FILE_TYPES_LAST = &IMB_FILE_TYPES[ARRAY_SIZE(IMB_FILE_TYPES) - 1];
diff --git a/source/blender/imbuf/intern/oiio/openimageio_api.cpp b/source/blender/imbuf/intern/oiio/openimageio_api.cpp
index 9d8c5d50a89..0b787a7842f 100644
--- a/source/blender/imbuf/intern/oiio/openimageio_api.cpp
+++ b/source/blender/imbuf/intern/oiio/openimageio_api.cpp
@@ -163,16 +163,10 @@ static ImBuf *imb_oiio_load_image_float(
extern "C" {
-int imb_is_a_filepath_photoshop(const char *filename)
+int imb_is_a_photoshop(const unsigned char *mem)
{
- const char *photoshop_extension[] = {
- ".psd",
- ".pdd",
- ".psb",
- nullptr,
- };
-
- return BLI_path_extension_check_array(filename, photoshop_extension);
+ const unsigned char magic[4] = {'8', 'B', 'P', 'S'};
+ return memcmp(magic, mem, sizeof(magic)) == 0;
}
int imb_save_photoshop(struct ImBuf *ibuf, const char * /*name*/, int flags)
@@ -198,7 +192,7 @@ struct ImBuf *imb_load_photoshop(const char *filename, int flags, char colorspac
const bool is_colorspace_manually_set = (colorspace[0] != '\0');
/* load image from file through OIIO */
- if (imb_is_a_filepath_photoshop(filename) == 0) {
+ if (IMB_ispic_type_matches(filename, IMB_FTYPE_PSD) == 0) {
return nullptr;
}
diff --git a/source/blender/imbuf/intern/oiio/openimageio_api.h b/source/blender/imbuf/intern/oiio/openimageio_api.h
index 135e3521f71..0ac6e560cfa 100644
--- a/source/blender/imbuf/intern/oiio/openimageio_api.h
+++ b/source/blender/imbuf/intern/oiio/openimageio_api.h
@@ -31,7 +31,7 @@ extern "C" {
struct ImBuf;
-int imb_is_a_filepath_photoshop(const char *name);
+int imb_is_a_photoshop(const unsigned char *mem);
int imb_save_photoshop(struct ImBuf *ibuf, const char *name, int flags);
diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c
index 7be58a9ca14..37a1afb5dd7 100644
--- a/source/blender/imbuf/intern/util.c
+++ b/source/blender/imbuf/intern/util.c
@@ -117,13 +117,11 @@ const char *imb_ext_audio[] = {
NULL,
};
-int IMB_ispic_type(const char *name)
-{
- /* increased from 32 to 64 because of the bitmaps header size */
+/* Increased from 32 to 64 because of the bitmaps header size. */
#define HEADER_SIZE 64
- unsigned char buf[HEADER_SIZE];
- const ImFileType *type;
+static bool imb_ispic_read_header_from_filename(const char *name, unsigned char buf[HEADER_SIZE])
+{
BLI_stat_t st;
int fp;
@@ -144,32 +142,70 @@ int IMB_ispic_type(const char *name)
return false;
}
- memset(buf, 0, sizeof(buf));
+ memset(buf, 0, HEADER_SIZE);
if (read(fp, buf, HEADER_SIZE) <= 0) {
close(fp);
return false;
}
close(fp);
+ return true;
+}
- for (type = IMB_FILE_TYPES; type < IMB_FILE_TYPES_LAST; type++) {
+int IMB_ispic_type_from_memory(const unsigned char *mem, const size_t mem_size)
+{
+ unsigned char buf_static[HEADER_SIZE];
+ const unsigned char *buf;
+
+ if (mem_size >= HEADER_SIZE) {
+ buf = buf_static;
+ }
+ else {
+ memset(buf_static, 0, HEADER_SIZE);
+ memcpy(buf_static, mem, mem_size);
+ buf = buf_static;
+ }
+
+ for (const ImFileType *type = IMB_FILE_TYPES; type < IMB_FILE_TYPES_LAST; type++) {
if (type->is_a) {
if (type->is_a(buf)) {
return type->filetype;
}
}
- else if (type->is_a_filepath) {
- if (type->is_a_filepath(name)) {
- return type->filetype;
- }
- }
}
return 0;
+}
-#undef HEADER_SIZE
+int IMB_ispic_type(const char *name)
+{
+ unsigned char buf[HEADER_SIZE];
+ if (!imb_ispic_read_header_from_filename(name, buf)) {
+ return false;
+ }
+ return IMB_ispic_type_from_memory(buf, HEADER_SIZE);
}
+bool IMB_ispic_type_matches(const char *name, int filetype)
+{
+ unsigned char buf[HEADER_SIZE];
+ if (!imb_ispic_read_header_from_filename(name, buf)) {
+ return false;
+ }
+
+ for (const ImFileType *type = IMB_FILE_TYPES; type < IMB_FILE_TYPES_LAST; type++) {
+ if (type->filetype == filetype) {
+ /* Requesting to load a type that can't check it's own header doesn't make sense.
+ * Keep the check for developers. */
+ BLI_assert(type->is_a != NULL);
+ return type->is_a ? type->is_a(buf) : false;
+ }
+ }
+ return false;
+}
+
+#undef HEADER_SIZE
+
bool IMB_ispic(const char *name)
{
return (IMB_ispic_type(name) != 0);