Revision: 39814
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39814
Author:   campbellbarton
Date:     2011-08-31 01:05:40 +0000 (Wed, 31 Aug 2011)
Log Message:
-----------
fix [#28430] Image with Stampinfo does not get saved correctly with alpha

Modified Paths:
--------------
    trunk/blender/source/blender/blenfont/intern/blf_font.c
    trunk/blender/source/blender/blenpluginapi/iff.h
    trunk/blender/source/blender/imbuf/IMB_imbuf.h
    trunk/blender/source/blender/imbuf/intern/rectop.c

Modified: trunk/blender/source/blender/blenfont/intern/blf_font.c
===================================================================
--- trunk/blender/source/blender/blenfont/intern/blf_font.c     2011-08-30 
23:52:12 UTC (rev 39813)
+++ trunk/blender/source/blender/blenfont/intern/blf_font.c     2011-08-31 
01:05:40 UTC (rev 39814)
@@ -213,7 +213,7 @@
 {
        unsigned char *cbuf;
        unsigned int c;
-       unsigned char b_col_char[3];
+       unsigned char b_col_char[4];
        GlyphBLF *g, *g_prev;
        FT_Vector delta;
        FT_UInt glyph_index;
@@ -232,6 +232,7 @@
        b_col_char[0]= font->b_col[0] * 255;
        b_col_char[1]= font->b_col[1] * 255;
        b_col_char[2]= font->b_col[2] * 255;
+       b_col_char[3]= font->b_col[3] * 255;
 
        while (str[i]) {
                int pen_y;
@@ -296,16 +297,19 @@
                                                a= *(g->bitmap + x + (yb * 
g->pitch)) / 255.0f;
 
                                                if(a > 0.0f) {
+                                                       float alphatest;
                                                        fbuf= font->b_fbuf + 
font->bch * ((chx + x) + ((pen_y + y)*font->bw));
                                                        if (a >= 1.0f) {
                                                                fbuf[0]= 
font->b_col[0];
                                                                fbuf[1]= 
font->b_col[1];
                                                                fbuf[2]= 
font->b_col[2];
+                                                               fbuf[3]= 
(alphatest= (fbuf[3] + (font->b_col[3]))) < 1.0f ? alphatest : 1.0f;
                                                        }
                                                        else {
                                                                fbuf[0]= 
(font->b_col[0]*a) + (fbuf[0] * (1-a));
                                                                fbuf[1]= 
(font->b_col[1]*a) + (fbuf[1] * (1-a));
                                                                fbuf[2]= 
(font->b_col[2]*a) + (fbuf[2] * (1-a));
+                                                               fbuf[3]= 
(alphatest= (fbuf[3] + (font->b_col[3]*a))) < 1.0f ? alphatest : 1.0f;
                                                        }
                                                }
                                        }
@@ -324,16 +328,19 @@
                                                a= *(g->bitmap + x + (yb * 
g->pitch)) / 255.0f;
 
                                                if(a > 0.0f) {
+                                                       int alphatest;
                                                        cbuf= font->b_cbuf + 
font->bch * ((chx + x) + ((pen_y + y)*font->bw));
                                                        if (a >= 1.0f) {
                                                                cbuf[0]= 
b_col_char[0];
                                                                cbuf[1]= 
b_col_char[1];
                                                                cbuf[2]= 
b_col_char[2];
+                                                               cbuf[3]= 
(alphatest= ((int)cbuf[3] + (int)b_col_char[3])) < 255 ? alphatest : 255;
                                                        }
                                                        else {
                                                                cbuf[0]= 
(b_col_char[0]*a) + (cbuf[0] * (1-a));
                                                                cbuf[1]= 
(b_col_char[1]*a) + (cbuf[1] * (1-a));
                                                                cbuf[2]= 
(b_col_char[2]*a) + (cbuf[2] * (1-a));
+                                                               cbuf[3]= 
(alphatest= ((int)cbuf[3] + (int)((font->b_col[3]*a)*255.0f))) < 255 ? 
alphatest : 255;
                                                        }
                                                }
                                        }

Modified: trunk/blender/source/blender/blenpluginapi/iff.h
===================================================================
--- trunk/blender/source/blender/blenpluginapi/iff.h    2011-08-30 23:52:12 UTC 
(rev 39813)
+++ trunk/blender/source/blender/blenpluginapi/iff.h    2011-08-31 01:05:40 UTC 
(rev 39814)
@@ -115,7 +115,7 @@
 
 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 buf_rectfill_area(unsigned char *rect, float *rectf, int width, 
int height, const float col[4], 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/imbuf/IMB_imbuf.h
===================================================================
--- trunk/blender/source/blender/imbuf/IMB_imbuf.h      2011-08-30 23:52:12 UTC 
(rev 39813)
+++ trunk/blender/source/blender/imbuf/IMB_imbuf.h      2011-08-31 01:05:40 UTC 
(rev 39814)
@@ -499,7 +499,7 @@
 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);
+void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int 
height, const float col[4], int x1, int y1, int x2, int y2);
 
 /* defined in metadata.c */
 int IMB_metadata_change_field(struct ImBuf *img, const char *key, const char 
*field);

Modified: trunk/blender/source/blender/imbuf/intern/rectop.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/rectop.c  2011-08-30 23:52:12 UTC 
(rev 39813)
+++ trunk/blender/source/blender/imbuf/intern/rectop.c  2011-08-31 01:05:40 UTC 
(rev 39814)
@@ -482,7 +482,7 @@
 }
 
 
-void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int 
height, float *col, int x1, int y1, int x2, int y2)
+void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int 
height, const float col[4], int x1, int y1, int x2, int y2)
 {
        int i, j;
        float a; /* alpha */
@@ -509,6 +509,8 @@
                unsigned char *pixel; 
                unsigned char chr=0, chg=0, chb=0;
                float fr=0, fg=0, fb=0;
+
+               const int alphaint= FTOCHAR(a);
                
                if (a == 1.0f) {
                        chr = FTOCHAR(col[0]);
@@ -527,10 +529,13 @@
                                                pixel[0] = chr;
                                                pixel[1] = chg;
                                                pixel[2] = chb;
+                                               pixel[3] = 255;
                                        } else {
+                                               int alphatest;
                                                pixel[0] = (char)((fr + 
((float)pixel[0]*aich))*255.0f);
                                                pixel[1] = (char)((fg + 
((float)pixel[1]*aich))*255.0f);
                                                pixel[2] = (char)((fb + 
((float)pixel[2]*aich))*255.0f);
+                                               pixel[3] = (char)((alphatest= 
((int)pixel[3] + alphaint)) < 255 ? alphatest : 255);
                                        }
                                }
                        }
@@ -546,10 +551,13 @@
                                        pixel[0] = col[0];
                                        pixel[1] = col[1];
                                        pixel[2] = col[2];
+                                       pixel[3] = 1.0f;
                                } else {
+                                       float alphatest;
                                        pixel[0] = (col[0]*a) + (pixel[0]*ai);
                                        pixel[1] = (col[1]*a) + (pixel[1]*ai);
                                        pixel[2] = (col[2]*a) + (pixel[2]*ai);
+                                       pixel[3] = (alphatest= (pixel[3] + a)) 
< 1.0f ? alphatest : 1.0f;
                                }
                        }
                }

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

Reply via email to