Hi Owen, I think I found the reason for the recent problems with pixbuf scaling: Your correction to force the weights to sum to 65536 can make the last weight negative, which is not well received by the line functions which operate on unsigned variables. I have appended an impressive demonstration of the problem ( gtk+/demos/testpixbuf-scale gtk+/gtk/stock-icons/dialog_warning.png ) and a possible fix. Matthias
Attachment:
2002_02_14_224730_shot.png
Description: current cvs
Attachment:
2002_02_14_224936_shot.png
Description: with the patch
Index: pixops.c
===================================================================
RCS file: /cvs/gnome/gtk+/gdk-pixbuf/pixops/pixops.c,v
retrieving revision 1.25
diff -u -b -B -p -r1.25 pixops.c
--- pixops.c 2002/02/11 19:36:12 1.25
+++ pixops.c 2002/02/14 21:52:33
@@ -1193,6 +1193,7 @@ bilinear_make_fast_weights (PixopsFilter
double y = (double)i_offset / SUBSAMPLE;
int i,j;
int total = 0;
+ int correction;
if (x_scale > 1.0) /* Bilinear */
{
@@ -1266,7 +1267,13 @@ bilinear_make_fast_weights (PixopsFilter
total += weight;
}
- *(pixel_weights + n_x * n_y - 1) += (int)(0.5 + 65536 * overall_alpha) - total;
+ correction = (int)(0.5 + 65536 * overall_alpha) - total;
+ for (i = n_x * n_y - 1; i >= 0; i--) {
+ if (*(pixel_weights + i) + correction >= 0) {
+ *(pixel_weights + i) += correction;
+ break;
+ }
+ }
}
g_free (x_weights);
@@ -1352,6 +1359,7 @@ bilinear_make_weights (PixopsFilter *fil
double y = (double)i_offset / SUBSAMPLE;
int i,j;
int total = 0;
+ int correction;
for (i = 0; i < n_y; i++)
for (j = 0; j < n_x; j++)
@@ -1368,7 +1376,13 @@ bilinear_make_weights (PixopsFilter *fil
total += weight;
}
- *(pixel_weights + n_x * n_y - 1) += (int)(0.5 + 65536 * overall_alpha) - total;
+ correction = (int)(0.5 + 65536 * overall_alpha) - total;
+ for (i = n_x * n_y - 1; i >= 0; i--) {
+ if (*(pixel_weights + i) + correction >= 0) {
+ *(pixel_weights + i) += correction;
+ break;
+ }
+ }
}
}