Color Management, Stage 2: Switch color pipeline to use OpenColorIO
[blender.git] / source / blender / imbuf / intern / bmp.c
index eb12b219da9b44409817bc27c048e9301a867af3..df12f0b703e26ea80e5606cedd308bb5aa833560 100644 (file)
@@ -38,6 +38,9 @@
 #include "IMB_allocimbuf.h"
 #include "IMB_filetype.h"
 
+#include "IMB_colormanagement.h"
+#include "IMB_colormanagement_intern.h"
+
 /* some code copied from article on microsoft.com, copied
  * here for enhanced BMP support in the future
  * http://www.microsoft.com/msj/defaultframe.asp?page=/msj/0197/mfcp1/mfcp1.htm&nav=/msj/0197/newnav.htm
@@ -69,16 +72,25 @@ typedef struct BMPHEADER {
 
 static int checkbmp(unsigned char *mem)
 {
+#define CHECK_HEADER_FIELD(mem, field) ((mem[0] == field[0]) && (mem[1] == field[1]))
+
        int ret_val = 0;
        BMPINFOHEADER bmi;
        unsigned int u;
 
        if (mem) {
-               if ((mem[0] == 'B') && (mem[1] == 'M')) {
+               if (CHECK_HEADER_FIELD(mem, "BM") ||
+                   CHECK_HEADER_FIELD(mem, "BA") ||
+                   CHECK_HEADER_FIELD(mem, "CI") ||
+                   CHECK_HEADER_FIELD(mem, "CP") ||
+                   CHECK_HEADER_FIELD(mem, "IC") ||
+                   CHECK_HEADER_FIELD(mem, "PT"))
+               {
                        /* skip fileheader */
                        mem += BMP_FILEHEADER_SIZE;
                }
                else {
+                       return 0;
                }
 
                /* for systems where an int needs to be 4 bytes aligned */
@@ -97,6 +109,8 @@ static int checkbmp(unsigned char *mem)
        }
 
        return(ret_val);
+
+#undef CHECK_HEADER_FIELD
 }
 
 int imb_is_a_bmp(unsigned char *buf)
@@ -104,7 +118,7 @@ int imb_is_a_bmp(unsigned char *buf)
        return checkbmp(buf);
 }
 
-struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags)
+struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags, char colorspace[IM_MAX_SPACE])
 {
        struct ImBuf *ibuf = NULL;
        BMPINFOHEADER bmi;
@@ -116,6 +130,8 @@ struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags)
 
        if (checkbmp(mem) == 0) return(NULL);
 
+       colorspace_set_default_role(colorspace, IM_MAX_SPACE, COLOR_ROLE_DEFAULT_BYTE);
+
        if ((mem[0] == 'B') && (mem[1] == 'M')) {
                /* skip fileheader */
                mem += BMP_FILEHEADER_SIZE;
@@ -184,7 +200,6 @@ struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags)
 
        if (ibuf) {
                ibuf->ftype = BMP;
-               ibuf->profile = IB_PROFILE_SRGB;
        }
        
        return(ibuf);