[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39814] trunk/blender/source/blender: fix [#28430] Image with Stampinfo does not get saved correctly with alpha

Campbell Barton ideasman42 at gmail.com
Wed Aug 31 03:05:42 CEST 2011


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;
 				}
 			}
 		}




More information about the Bf-blender-cvs mailing list