Revision: 37492
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37492
Author:   campbellbarton
Date:     2011-06-15 01:56:49 +0000 (Wed, 15 Jun 2011)
Log Message:
-----------
fix [#27662] Storing png/tga images ignore Alpha settings
- don't clear alpha when baking RGB images
- when baking results in partial alpha. set the depth to 32.

Modified Paths:
--------------
    trunk/blender/source/blender/blenpluginapi/iff.h
    trunk/blender/source/blender/editors/object/object_bake.c
    trunk/blender/source/blender/imbuf/IMB_imbuf.h
    trunk/blender/source/blender/imbuf/intern/rectop.c
    trunk/blender/source/blender/render/intern/source/rendercore.c

Modified: trunk/blender/source/blender/blenpluginapi/iff.h
===================================================================
--- trunk/blender/source/blender/blenpluginapi/iff.h    2011-06-15 00:16:30 UTC 
(rev 37491)
+++ trunk/blender/source/blender/blenpluginapi/iff.h    2011-06-15 01:56:49 UTC 
(rev 37492)
@@ -113,9 +113,10 @@
 LIBIMPORT void IMB_rectcpy(struct ImBuf *dbuf, struct ImBuf *sbuf, 
        int destx, int desty, int srcx, int srcy, int width, int height);
 
-LIBIMPORT void IMB_rectfill(struct ImBuf *drect, float col[4]);
+LIBIMPORT void IMB_rectfill(struct ImBuf *drect, const float col[4]);
 LIBIMPORT void IMB_rectfill_area(struct ImBuf *ibuf, float *col, int x1, int 
y1, int x2, int y2);
 LIBIMPORT void buf_rectfill_area(unsigned char *rect, float *rectf, int width, 
int height, float *col, int x1, int y1, int x2, int y2);
+LIBIMPORT void IMB_rectfill_alpha(struct ImBuf *drect, const float value);
 
 #endif /* IFF_H */
 

Modified: trunk/blender/source/blender/editors/object/object_bake.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_bake.c   2011-06-15 
00:16:30 UTC (rev 37491)
+++ trunk/blender/source/blender/editors/object/object_bake.c   2011-06-15 
01:56:49 UTC (rev 37492)
@@ -854,10 +854,14 @@
                Image *ima= (Image*)link->data;
                int i;
                ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
+               short is_new_alpha;
 
                if(ibuf->x<=0 || ibuf->y<=0)
                        continue;
 
+               /* must check before filtering */
+               is_new_alpha= (ibuf->depth != 32) && BKE_alphatest_ibuf(ibuf);
+
                /* Margin */
                if(bkr->bake_filter) {
                        char *temprect;
@@ -882,6 +886,18 @@
                                IMB_filter_extend(ibuf, (char *)ibuf->userdata);
                }
 
+               /* if the bake results in new alpha then change the image 
setting */
+               if(is_new_alpha) {
+                       ibuf->depth= 32;
+               }
+               else {
+                       if(bkr->bake_filter) {
+                               /* clear alpha added by filtering */
+                               IMB_rectfill_alpha(ibuf, 1.0f);
+                       }
+               }
+
+
                ibuf->userflags|= IB_BITMAPDIRTY;
                if(ibuf->mipmap[0]) {
                        ibuf->userflags|= IB_MIPMAP_INVALID;
@@ -1028,7 +1044,8 @@
 static void clear_images(MTFace *mtface, int totface)
 {
        int a;
-       float vec[4]= {0.0f, 0.0f, 0.0f, 0.0f};
+       const float vec_alpha[4]= {0.0f, 0.0f, 0.0f, 0.0f};
+       const float vec_solid[4]= {0.0f, 0.0f, 0.0f, 1.0f};
 
        for(a= 0; a<totface; a++)
                mtface[a].tpage->id.flag&= ~LIB_DOIT;
@@ -1039,7 +1056,7 @@
                if((ima->id.flag&LIB_DOIT)==0) {
                        ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
 
-                       IMB_rectfill(ibuf, vec);
+                       IMB_rectfill(ibuf, (ibuf->depth == 32) ? vec_alpha : 
vec_solid);
                        ima->id.flag|= LIB_DOIT;
                }
        }

Modified: trunk/blender/source/blender/imbuf/IMB_imbuf.h
===================================================================
--- trunk/blender/source/blender/imbuf/IMB_imbuf.h      2011-06-15 00:16:30 UTC 
(rev 37491)
+++ trunk/blender/source/blender/imbuf/IMB_imbuf.h      2011-06-15 01:56:49 UTC 
(rev 37492)
@@ -442,8 +442,9 @@
  *
  * @attention Defined in rectop.c
  */
-void IMB_rectfill(struct ImBuf *drect, float col[4]);
+void IMB_rectfill(struct ImBuf *drect, const float col[4]);
 void IMB_rectfill_area(struct ImBuf *ibuf, float *col, int x1, int y1, int x2, 
int y2);
+void IMB_rectfill_alpha(struct ImBuf *ibuf, const float value);
 
 /* this should not be here, really, we needed it for operating on render data, 
IMB_rectfill_area calls it */
 void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int 
height, float *col, int x1, int y1, int x2, int y2);

Modified: trunk/blender/source/blender/imbuf/intern/rectop.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/rectop.c  2011-06-15 00:16:30 UTC 
(rev 37491)
+++ trunk/blender/source/blender/imbuf/intern/rectop.c  2011-06-15 01:56:49 UTC 
(rev 37492)
@@ -450,7 +450,7 @@
 
 /* fill */
 
-void IMB_rectfill(struct ImBuf *drect, float col[4])
+void IMB_rectfill(struct ImBuf *drect, const float col[4])
 {
        int num;
 
@@ -561,3 +561,18 @@
        if (!ibuf) return;
        buf_rectfill_area((unsigned char *) ibuf->rect, ibuf->rect_float, 
ibuf->x, ibuf->y, col, x1, y1, x2, y2);
 }
+
+
+void IMB_rectfill_alpha(ImBuf *ibuf, const float value)
+{
+       int i;
+       if (ibuf->rect_float) {
+               float *fbuf= ibuf->rect_float + 3;
+               for (i = ibuf->x * ibuf->y; i > 0; i--, fbuf+= 4) { *fbuf = 
value; }
+       }
+       else {
+               const unsigned char cvalue= value * 255;
+               unsigned char *cbuf= ((unsigned char *)ibuf->rect) + 3;
+               for (i = ibuf->x * ibuf->y; i > 0; i--, cbuf+= 4) { *cbuf = 
cvalue; }
+       }
+}

Modified: trunk/blender/source/blender/render/intern/source/rendercore.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/rendercore.c      
2011-06-15 00:16:30 UTC (rev 37491)
+++ trunk/blender/source/blender/render/intern/source/rendercore.c      
2011-06-15 01:56:49 UTC (rev 37492)
@@ -2464,7 +2464,8 @@
                                if(tface && tface->tpage) {
                                        Image *ima= tface->tpage;
                                        ImBuf *ibuf= BKE_image_get_ibuf(ima, 
NULL);
-                                       float vec[4]= {0.0f, 0.0f, 0.0f, 0.0f};
+                                       const float vec_alpha[4]= {0.0f, 0.0f, 
0.0f, 0.0f};
+                                       const float vec_solid[4]= {0.0f, 0.0f, 
0.0f, 1.0f};
                                        
                                        if(ibuf==NULL)
                                                continue;
@@ -2484,7 +2485,7 @@
                                                        imb_freerectImBuf(ibuf);
                                                /* clear image */
                                                if(R.r.bake_flag & R_BAKE_CLEAR)
-                                                       IMB_rectfill(ibuf, vec);
+                                                       IMB_rectfill(ibuf, 
(ibuf->depth == 32) ? vec_alpha : vec_solid);
                                        
                                                /* might be read by UI to set 
active image for display */
                                                R.bakebuf= ima;
@@ -2671,10 +2672,14 @@
        for(ima= G.main->image.first; ima; ima= ima->id.next) {
                if((ima->id.flag & LIB_DOIT)==0) {
                        ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
+                       short is_new_alpha;
 
                        if(!ibuf)
                                continue;
 
+                       /* must check before filtering */
+                       is_new_alpha= (ibuf->depth != 32) && 
BKE_alphatest_ibuf(ibuf);
+
                        if(re->r.bake_filter) {
                                if (usemask) {
                                        /* extend the mask +2 pixels from the 
image,
@@ -2706,6 +2711,17 @@
                                }
                        }
 
+                       /* if the bake results in new alpha then change the 
image setting */
+                       if(is_new_alpha) {
+                               ibuf->depth= 32;
+                       }
+                       else {
+                               if(re->r.bake_filter) {
+                                       /* clear alpha added by filtering */
+                                       IMB_rectfill_alpha(ibuf, 1.0f);
+                               }
+                       }
+
                        ibuf->userflags |= IB_BITMAPDIRTY;
                        if (ibuf->rect_float) IMB_rect_from_float(ibuf);
                }

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

Reply via email to