=Cineon Bug=
authorJoseph Eagar <joeedh@gmail.com>
Sun, 11 Mar 2007 12:27:57 +0000 (12:27 +0000)
committerJoseph Eagar <joeedh@gmail.com>
Sun, 11 Mar 2007 12:27:57 +0000 (12:27 +0000)
In my attempts to get cinepaint's cineon code to work with files in memory,
I accidently rewrote something that should have been left as it is.  This
causes images whose image buffers didn't start right after the cineon header to
become "shifted" to the left.

The DPX code looks correct, though.

source/blender/imbuf/intern/cineon/cineon_dpx.c
source/blender/imbuf/intern/cineon/cineonlib.c

index 4058f27b929878532dc1584151c5b88a7a36fe73..691b81745e0cb1f091fbb9f27f9c8599c89d5eee 100644 (file)
@@ -47,7 +47,7 @@ static struct ImBuf *imb_load_dpx_cineon(unsigned char *mem, int use_cineon, int
        ImBuf *ibuf;
        LogImageFile *image;
        int x, y;
-       unsigned short *row;
+       unsigned short *row, *upix;
        int width, height, depth;
        float *frow;
        
@@ -64,6 +64,7 @@ static struct ImBuf *imb_load_dpx_cineon(unsigned char *mem, int use_cineon, int
                logImageClose(image);
                return NULL;
        }
+       
        if (width == 0 && height == 0) {
                logImageClose(image);
                return NULL;
@@ -72,23 +73,20 @@ static struct ImBuf *imb_load_dpx_cineon(unsigned char *mem, int use_cineon, int
        ibuf = IMB_allocImBuf(width, height, 32, IB_rectfloat | flags, 0);
 
        row = MEM_mallocN(sizeof(unsigned short)*width*depth, "row in cineon_dpx.c");
+       frow = ibuf->rect_float+width*height*4;
        
        for (y = 0; y < height; y++) {
-               unsigned int index = (width) * (height-y-1);
-               index = index * 4;
-               
-               frow = &ibuf->rect_float[index];
-               
                logImageGetRowBytes(image, row, y);
+               upix = row;
+               frow -= width*4;
                
                for (x=0; x<width; x++) {
-                       unsigned short *upix = &row[x*depth];
-                       float *fpix = &frow[x*4];
-                       fpix[0] = ((float)upix[0]) / 65535.0f;
-                       fpix[1] = ((float)upix[1]) / 65535.0f;
-                       fpix[2] = ((float)upix[2]) / 65535.0f;
-                       fpix[3] = 1.0f;
+                       *(frow++) = ((float)*(upix++)) / 65535.0f;
+                       *(frow++) = ((float)*(upix++)) / 65535.0f;
+                       *(frow++) = ((float)*(upix++)) / 65535.0f;
+                       *(frow++) = 1.0f;
                }
+               frow -= width*4;
        }
 
        MEM_freeN(row);
index 5253646be4d3e83c6da4a58b46ca190941b9a000..91973927fab0d4989d065e46a61172bccaf0c586 100644 (file)
@@ -662,11 +662,12 @@ cineonOpenFromMem(unsigned char *mem, unsigned int size) {
 
        i = cineon->imageOffset;
        
-       if (i >= size) {
+       if (logimage_fseek(cineon, cineon->imageOffset, SEEK_SET) != 0) {
                if (verbose) d_printf("Couldn't seek to image data at %d\n", cineon->imageOffset);
                cineonClose(cineon);
                return 0;
        }
+       
        cineon->fileYPos = 0;
 
        logImageGetByteConversionDefaults(&cineon->params);