Revision: 28236
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28236
Author:   blendix
Date:     2010-04-16 17:25:43 +0200 (Fri, 16 Apr 2010)

Log Message:
-----------
Render Branch: Fix some alpha premul problems with mipmap files by moving
the premul code to imbuf, still a small difference that needs to be fixed,
but no very bright pixels anymore hopefully.

Modified Paths:
--------------
    branches/render25/source/blender/blenkernel/BKE_image.h
    branches/render25/source/blender/blenkernel/intern/image.c
    branches/render25/source/blender/blenkernel/intern/sequencer.c
    branches/render25/source/blender/imbuf/IMB_imbuf.h
    branches/render25/source/blender/imbuf/IMB_imbuf_types.h
    branches/render25/source/blender/imbuf/intern/filter.c
    branches/render25/source/blender/imbuf/intern/readimage.c
    branches/render25/source/blender/imbuf/intern/tiff.c

Modified: branches/render25/source/blender/blenkernel/BKE_image.h
===================================================================
--- branches/render25/source/blender/blenkernel/BKE_image.h     2010-04-16 
15:24:01 UTC (rev 28235)
+++ branches/render25/source/blender/blenkernel/BKE_image.h     2010-04-16 
15:25:43 UTC (rev 28236)
@@ -55,7 +55,6 @@
 
 struct anim *openanim(char * name, int flags);
 
-void   converttopremul(struct ImBuf *ibuf);
 void   image_de_interlace(struct Image *ima, int odd);
        
 void   tag_image_time(struct Image *ima);

Modified: branches/render25/source/blender/blenkernel/intern/image.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/image.c  2010-04-16 
15:24:01 UTC (rev 28235)
+++ branches/render25/source/blender/blenkernel/intern/image.c  2010-04-16 
15:25:43 UTC (rev 28236)
@@ -92,58 +92,6 @@
 
 /* ******** IMAGE PROCESSING ************* */
 
-/* used by sequencer and image premul option - IMA_DO_PREMUL */
-void converttopremul(struct ImBuf *ibuf)
-{
-       int x, y;
-       
-       if(ibuf==0) return;
-       if (ibuf->rect) {
-               int val;
-               char *cp;
-               if(ibuf->depth==24) {   /* put alpha at 255 */
-                       cp= (char *)(ibuf->rect);
-                       for(y=0; y<ibuf->y; y++) {
-                               for(x=0; x<ibuf->x; x++, cp+=4) {
-                                       cp[3]= 255;
-                               }
-                       }
-               } else {
-                       cp= (char *)(ibuf->rect);
-                       for(y=0; y<ibuf->y; y++) {
-                               for(x=0; x<ibuf->x; x++, cp+=4) {
-                                       val= cp[3];
-                                       cp[0]= (cp[0]*val)>>8;
-                                       cp[1]= (cp[1]*val)>>8;
-                                       cp[2]= (cp[2]*val)>>8;
-                               }
-                       }
-               }
-       }
-       if (ibuf->rect_float) {
-               float val;
-               float *cp;
-               if(ibuf->depth==24) {   /* put alpha at 1.0 */
-                       cp= ibuf->rect_float;;
-                       for(y=0; y<ibuf->y; y++) {
-                               for(x=0; x<ibuf->x; x++, cp+=4) {
-                                       cp[3]= 1.0;
-                               }
-                       }
-               } else {
-                       cp= ibuf->rect_float;
-                       for(y=0; y<ibuf->y; y++) {
-                               for(x=0; x<ibuf->x; x++, cp+=4) {
-                                       val= cp[3];
-                                       cp[0]= cp[0]*val;
-                                       cp[1]= cp[1]*val;
-                                       cp[2]= cp[2]*val;
-                               }
-                       }
-               }
-       }
-}
-
 static void de_interlace_ng(struct ImBuf *ibuf)        /* neogeo fields */
 {
        struct ImBuf * tbuf1, * tbuf2;
@@ -1588,6 +1536,7 @@
        struct ImBuf *ibuf;
        unsigned short numlen;
        char name[FILE_MAX], head[FILE_MAX], tail[FILE_MAX];
+       int flag;
        
        /* XXX temp stuff? */
        if(ima->lastframe != frame)
@@ -1604,8 +1553,14 @@
        else
                BLI_path_abs(name, G.sce);
        
+       flag= IB_rect|IB_multilayer;
+       if(iuser && iuser->flag & IMA_USECACHE)
+               flag |= IB_usecache;
+       if(ima->flag & IMA_DO_PREMUL)
+               flag |= IB_premul;
+
        /* read ibuf */
-       ibuf = IMB_loadiffname(name, IB_rect|IB_multilayer);
+       ibuf = IMB_loadiffname(name, flag);
        if(G.f & G_DEBUG) printf("loaded %s\n", name);
        
        if (ibuf) {
@@ -1625,10 +1580,6 @@
                image_initialize_after_load(ima, ibuf);
                image_assign_ibuf(ima, ibuf, 0, frame);
 #endif
-               
-               if(ima->flag & IMA_DO_PREMUL)
-                       converttopremul(ibuf);
-               
        }
        else
                ima->ok= 0;
@@ -1761,6 +1712,8 @@
                flag= IB_rect|IB_multilayer|IB_metadata;
                if(iuser && iuser->flag & IMA_USECACHE)
                        flag |= IB_usecache;
+               if(ima->flag & IMA_DO_PREMUL)
+                       flag |= IB_premul;
                        
                /* get the right string */
                BLI_strncpy(str, ima->name, sizeof(str));
@@ -1794,9 +1747,6 @@
                        if ((ima->packedfile == NULL) && (G.fileflags & 
G_AUTOPACK))
                                ima->packedfile = newPackedFile(NULL, str);
                }
-               
-               if(ima->flag & IMA_DO_PREMUL)
-                       converttopremul(ibuf);
        }
        else
                ima->ok= 0;

Modified: branches/render25/source/blender/blenkernel/intern/sequencer.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/sequencer.c      
2010-04-16 15:24:01 UTC (rev 28235)
+++ branches/render25/source/blender/blenkernel/intern/sequencer.c      
2010-04-16 15:25:43 UTC (rev 28236)
@@ -1772,7 +1772,7 @@
 
        if(seq->flag & SEQ_MAKE_PREMUL) {
                if(se->ibuf->depth == 32 && se->ibuf->zbuf == 0) {
-                       converttopremul(se->ibuf);
+                       IMB_premultiply_alpha(se->ibuf);
                }
        }
 

Modified: branches/render25/source/blender/imbuf/IMB_imbuf.h
===================================================================
--- branches/render25/source/blender/imbuf/IMB_imbuf.h  2010-04-16 15:24:01 UTC 
(rev 28235)
+++ branches/render25/source/blender/imbuf/IMB_imbuf.h  2010-04-16 15:25:43 UTC 
(rev 28236)
@@ -402,6 +402,10 @@
 void IMB_flipx(struct ImBuf *ibuf);
 void IMB_flipy(struct ImBuf * ibuf);
 
+/* Premultiply alpha */
+
+void IMB_premultiply_alpha(struct ImBuf *ibuf);
+
 /**
  *
  * @attention Defined in allocimbuf.c

Modified: branches/render25/source/blender/imbuf/IMB_imbuf_types.h
===================================================================
--- branches/render25/source/blender/imbuf/IMB_imbuf_types.h    2010-04-16 
15:24:01 UTC (rev 28235)
+++ branches/render25/source/blender/imbuf/IMB_imbuf_types.h    2010-04-16 
15:25:43 UTC (rev 28236)
@@ -141,6 +141,7 @@
 #define IB_metadata                    (1 << 8)
 #define IB_animdeinterlace     (1 << 9)
 #define IB_usecache                    (1 << 10)
+#define IB_premul                      (1 << 11)
 
 /*
  * The bit flag is stored in the ImBuf.ftype variable.

Modified: branches/render25/source/blender/imbuf/intern/filter.c
===================================================================
--- branches/render25/source/blender/imbuf/intern/filter.c      2010-04-16 
15:24:01 UTC (rev 28235)
+++ branches/render25/source/blender/imbuf/intern/filter.c      2010-04-16 
15:25:43 UTC (rev 28236)
@@ -451,3 +451,59 @@
        return levels;
 }
 
+void IMB_premultiply_alpha(ImBuf *ibuf)
+{
+       int x, y;
+       
+       if(ibuf==NULL)
+               return;
+
+       if(ibuf->rect) {
+               int val;
+               char *cp;
+
+               if(ibuf->depth==24) {   /* put alpha at 255 */
+                       cp= (char *)(ibuf->rect);
+
+                       for(y=0; y<ibuf->y; y++)
+                               for(x=0; x<ibuf->x; x++, cp+=4)
+                                       cp[3]= 255;
+               }
+               else {
+                       cp= (char *)(ibuf->rect);
+                       for(y=0; y<ibuf->y; y++) {
+                               for(x=0; x<ibuf->x; x++, cp+=4) {
+                                       val= cp[3];
+                                       cp[0]= (cp[0]*val)>>8;
+                                       cp[1]= (cp[1]*val)>>8;
+                                       cp[2]= (cp[2]*val)>>8;
+                               }
+                       }
+               }
+       }
+
+       if(ibuf->rect_float) {
+               float val;
+               float *cp;
+
+               if(ibuf->depth==24) {   /* put alpha at 1.0 */
+                       cp= ibuf->rect_float;
+
+                       for(y=0; y<ibuf->y; y++)
+                               for(x=0; x<ibuf->x; x++, cp+=4)
+                                       cp[3]= 1.0;
+               }
+               else {
+                       cp= ibuf->rect_float;
+                       for(y=0; y<ibuf->y; y++) {
+                               for(x=0; x<ibuf->x; x++, cp+=4) {
+                                       val= cp[3];
+                                       cp[0]= cp[0]*val;
+                                       cp[1]= cp[1]*val;
+                                       cp[2]= cp[2]*val;
+                               }
+                       }
+               }
+       }
+}
+

Modified: branches/render25/source/blender/imbuf/intern/readimage.c
===================================================================
--- branches/render25/source/blender/imbuf/intern/readimage.c   2010-04-16 
15:24:01 UTC (rev 28235)
+++ branches/render25/source/blender/imbuf/intern/readimage.c   2010-04-16 
15:25:43 UTC (rev 28236)
@@ -62,6 +62,12 @@
                        if(ibuf) {
                                if(!(ibuf->flags & IB_usecache))
                                        ibuf->miplevels= 
IMB_getmipmaplevel_num(ibuf);
+
+                               if(flags & IB_premul) {
+                                       IMB_premultiply_alpha(ibuf);
+                                       ibuf->flags |= IB_premul;
+                               }
+
                                return ibuf;
                        }
                }

Modified: branches/render25/source/blender/imbuf/intern/tiff.c
===================================================================
--- branches/render25/source/blender/imbuf/intern/tiff.c        2010-04-16 
15:24:01 UTC (rev 28235)
+++ branches/render25/source/blender/imbuf/intern/tiff.c        2010-04-16 
15:25:43 UTC (rev 28236)
@@ -282,7 +282,7 @@
                 (memcmp(lil_endian, mem, IMB_TIFF_NCB) == 0) );
 }
 
-static int imb_read_tiff_pixels(ImBuf *ibuf, TIFF *image)
+static int imb_read_tiff_pixels(ImBuf *ibuf, TIFF *image, int premul)
 {
        ImBuf *tmpibuf;
        int success;
@@ -290,7 +290,12 @@
        tmpibuf= IMB_allocImBuf(ibuf->x, ibuf->y, 32, IB_rect, 0);
        success = libtiff_TIFFReadRGBAImage(image, ibuf->x, ibuf->y, 
tmpibuf->rect, 0);
 
-       if (ENDIAN_ORDER == B_ENDIAN) IMB_convert_rgba_to_abgr(tmpibuf);
+       if(ENDIAN_ORDER == B_ENDIAN)
+               IMB_convert_rgba_to_abgr(tmpibuf);
+       if(premul) {
+               IMB_premultiply_alpha(tmpibuf);
+               ibuf->flags |= IB_premul;
+       }
 
        /* assign rect last */
        ibuf->rect= tmpibuf->rect;
@@ -386,7 +391,7 @@
        }
 
        /* read pixels */
-       if(!(ibuf->flags & IB_usecache) && !imb_read_tiff_pixels(ibuf, image)) {
+       if(!(ibuf->flags & IB_usecache) && !imb_read_tiff_pixels(ibuf, image, 
0)) {
                fprintf(stderr, "imb_loadtiff: Failed to read tiff image.\n");
                libtiff_TIFFClose(image);
                return NULL;
@@ -431,11 +436,11 @@
 
                if(width == mipx && height == mipy) {
                        if(level == 0) {
-                               imb_read_tiff_pixels(ibuf, image);
+                               imb_read_tiff_pixels(ibuf, image, (ibuf->flags 
& IB_premul));
                        }
                        else {
                                ibuf->mipmap[level-1] = IMB_allocImBuf(width, 
height, 32, 0, 0);
-                               imb_read_tiff_pixels(ibuf->mipmap[level-1], 
image);
+                               imb_read_tiff_pixels(ibuf->mipmap[level-1], 
image, (ibuf->flags & IB_premul));
                        }
                }
                else


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to