[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44743] trunk/blender/source/blender/imbuf /intern/imageprocess.c: Fix #30485: TRANSFORM / STABILIZE 2D: First row / column blackness.
Sergey Sharybin
sergey.vfx at gmail.com
Thu Mar 8 15:23:39 CET 2012
Revision: 44743
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44743
Author: nazgul
Date: 2012-03-08 14:23:34 +0000 (Thu, 08 Mar 2012)
Log Message:
-----------
Fix #30485: TRANSFORM / STABILIZE 2D: First row / column blackness.
Clamp source coordinates to boundaries so it'll be kind of correct weight
calculated for the pixel.
Modified Paths:
--------------
trunk/blender/source/blender/imbuf/intern/imageprocess.c
Modified: trunk/blender/source/blender/imbuf/intern/imageprocess.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/imageprocess.c 2012-03-08 14:04:06 UTC (rev 44742)
+++ trunk/blender/source/blender/imbuf/intern/imageprocess.c 2012-03-08 14:23:34 UTC (rev 44743)
@@ -42,6 +42,8 @@
#include <stdlib.h>
+#include "BLI_utildefines.h"
+
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
#include "math.h"
@@ -134,6 +136,10 @@
unsigned char *dataI;
float a,b,w,wx,wy[4], outR,outG,outB,outA,*dataF;
+ /* sample area entirely outside image? */
+ if (ceil(u)<0 || floor(u)>in->x-1 || ceil(v)<0 || floor(v)>in->y-1)
+ return;
+
/* ImBuf in must have a valid rect or rect_float, assume this is already checked */
i= (int)floor(u);
@@ -153,32 +159,30 @@
for(n= -1; n<= 2; n++){
x1= i+n;
- if (x1>0 && x1 < in->x) {
- wx = P(n-a);
- for(m= -1; m<= 2; m++){
- y1= j+m;
- if (y1>0 && y1<in->y) {
- /* normally we could do this */
- /* w = P(n-a) * P(b-m); */
- /* except that would call P() 16 times per pixel therefor pow() 64 times, better precalc these */
- w = wx * wy[m+1];
-
- if (outF) {
- dataF= in->rect_float + in->x * y1 * 4 + 4*x1;
- outR+= dataF[0] * w;
- outG+= dataF[1] * w;
- outB+= dataF[2] * w;
- outA+= dataF[3] * w;
- }
- if (outI) {
- dataI= (unsigned char*)in->rect + in->x * y1 * 4 + 4*x1;
- outR+= dataI[0] * w;
- outG+= dataI[1] * w;
- outB+= dataI[2] * w;
- outA+= dataI[3] * w;
- }
- }
+ CLAMP(x1, 0, in->x-1);
+ wx = P(n-a);
+ for(m= -1; m<= 2; m++){
+ y1= j+m;
+ CLAMP(y1, 0, in->y-1);
+ /* normally we could do this */
+ /* w = P(n-a) * P(b-m); */
+ /* except that would call P() 16 times per pixel therefor pow() 64 times, better precalc these */
+ w = wx * wy[m+1];
+
+ if (outF) {
+ dataF= in->rect_float + in->x * y1 * 4 + 4*x1;
+ outR+= dataF[0] * w;
+ outG+= dataF[1] * w;
+ outB+= dataF[2] * w;
+ outA+= dataF[3] * w;
}
+ if (outI) {
+ dataI= (unsigned char*)in->rect + in->x * y1 * 4 + 4*x1;
+ outR+= dataI[0] * w;
+ outG+= dataI[1] * w;
+ outB+= dataI[2] * w;
+ outA+= dataI[3] * w;
+ }
}
}
More information about the Bf-blender-cvs
mailing list