[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49693] trunk/blender/source/blender/imbuf /intern: Fix logic error in mipmap filter and refactor scaling routine to lower self cost by ~30%

Sv. Lockal lockalsash at gmail.com
Wed Aug 8 14:15:27 CEST 2012


Revision: 49693
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49693
Author:   lockal
Date:     2012-08-08 12:15:26 +0000 (Wed, 08 Aug 2012)
Log Message:
-----------
Fix logic error in mipmap filter and refactor scaling routine to lower self cost by ~30%

Modified Paths:
--------------
    trunk/blender/source/blender/imbuf/intern/filter.c
    trunk/blender/source/blender/imbuf/intern/scaling.c

Modified: trunk/blender/source/blender/imbuf/intern/filter.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/filter.c	2012-08-08 11:56:58 UTC (rev 49692)
+++ trunk/blender/source/blender/imbuf/intern/filter.c	2012-08-08 12:15:26 UTC (rev 49693)
@@ -226,24 +226,24 @@
 		for (x = 0; x < rowlen; x++) {
 			if (x == 0) {
 				r11 = row1;
-				r21 = row1;
-				r31 = row1;
+				r21 = row2;
+				r31 = row3;
 			}
 			else {
 				r11 = row1 - 4;
-				r21 = row1 - 4;
-				r31 = row1 - 4;
+				r21 = row2 - 4;
+				r31 = row3 - 4;
 			}
 
 			if (x == rowlen - 1) {
 				r13 = row1;
-				r23 = row1;
-				r33 = row1;
+				r23 = row2;
+				r33 = row3;
 			}
 			else {
 				r13 = row1 + 4;
-				r23 = row1 + 4;
-				r33 = row1 + 4;
+				r23 = row2 + 4;
+				r33 = row3 + 4;
 			}
 
 			cp[0] = (r11[0] + 2 * row1[0] + r13[0] + 2 * r21[0] + 4 * row2[0] + 2 * r23[0] + r31[0] + 2 * row3[0] + r33[0]) >> 4;

Modified: trunk/blender/source/blender/imbuf/intern/scaling.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/scaling.c	2012-08-08 11:56:58 UTC (rev 49692)
+++ trunk/blender/source/blender/imbuf/intern/scaling.c	2012-08-08 12:15:26 UTC (rev 49693)
@@ -295,9 +295,7 @@
 /* result in ibuf2, scaling should be done correctly */
 void imb_onehalf_no_alloc(struct ImBuf *ibuf2, struct ImBuf *ibuf1)
 {
-	uchar *p1, *p2 = NULL, *dest;
-	float *p1f, *destf, *p2f = NULL;
-	int x, y;
+    int x, y;
 	const short do_rect = (ibuf1->rect != NULL);
 	const short do_float = (ibuf1->rect_float != NULL) && (ibuf2->rect_float != NULL);
 
@@ -305,16 +303,14 @@
 		imb_addrectImBuf(ibuf2);
 	}
 
-	p1f = ibuf1->rect_float;
-	destf = ibuf2->rect_float;
-	p1 = (uchar *) ibuf1->rect;
-	dest = (uchar *) ibuf2->rect;
-
-	for (y = ibuf2->y; y > 0; y--) {
-		if (do_rect) p2 = p1 + (ibuf1->x << 2);
-		if (do_float) p2f = p1f + (ibuf1->x << 2);
-		for (x = ibuf2->x; x > 0; x--) {
-			if (do_rect) {
+	if (do_rect) {
+		char *p1, *p2, *dest;
+		
+		p1 = (char *) ibuf1->rect;
+		dest = (char *) ibuf2->rect;
+		for (y = ibuf2->y; y > 0; y--) {
+			p2 = p1 + (ibuf1->x << 2);
+			for (x = ibuf2->x; x > 0; x--) {
 				dest[0] = (p1[0] + p2[0] + p1[4] + p2[4]) >> 2;
 				dest[1] = (p1[1] + p2[1] + p1[5] + p2[5]) >> 2;
 				dest[2] = (p1[2] + p2[2] + p1[6] + p2[6]) >> 2;
@@ -323,24 +319,31 @@
 				p2 += 8; 
 				dest += 4;
 			}
-			if (do_float) {
-				destf[0] = 0.25f * (p1f[0] + p2f[0] + p1f[4] + p2f[4]);
-				destf[1] = 0.25f * (p1f[1] + p2f[1] + p1f[5] + p2f[5]);
-				destf[2] = 0.25f * (p1f[2] + p2f[2] + p1f[6] + p2f[6]);
-				destf[3] = 0.25f * (p1f[3] + p2f[3] + p1f[7] + p2f[7]);
-				p1f += 8; 
-				p2f += 8; 
-				destf += 4;
+			p1 = p2;
+			if (ibuf1->x & 1) p1 += 4;
+		}
+	}
+	
+	if (do_float) {
+		float *p1f, *p2f, *destf;
+		
+		p1f = ibuf1->rect_float;
+		destf = ibuf2->rect_float;
+		for (y = ibuf2->y; y > 0; y--) {
+			p2f = p1f + (ibuf1->x << 2);
+			for (x = ibuf2->x; x > 0; x--) {
+					destf[0] = 0.25f * (p1f[0] + p2f[0] + p1f[4] + p2f[4]);
+					destf[1] = 0.25f * (p1f[1] + p2f[1] + p1f[5] + p2f[5]);
+					destf[2] = 0.25f * (p1f[2] + p2f[2] + p1f[6] + p2f[6]);
+					destf[3] = 0.25f * (p1f[3] + p2f[3] + p1f[7] + p2f[7]);
+					p1f += 8; 
+					p2f += 8; 
+					destf += 4;
 			}
+			p1f = p2f;
+			if (ibuf1->x & 1) p1f += 4;
 		}
-		if (do_rect) p1 = p2;
-		if (do_float) p1f = p2f;
-		if (ibuf1->x & 1) {
-			if (do_rect) p1 += 4;
-			if (do_float) p1f += 4;
-		}
 	}
-	
 }
 
 ImBuf *IMB_onehalf(struct ImBuf *ibuf1)




More information about the Bf-blender-cvs mailing list