[Rawstudio-commit] r2199 - trunk/plugins/resample
Anders Brander
anders at brander.dk
Sun Feb 8 15:50:44 CET 2009
Author: abrander
Date: 2009-02-08 15:50:44 +0100 (Sun, 08 Feb 2009)
New Revision: 2199
Modified:
trunk/plugins/resample/resample.c
Log:
Corrected wrong FIR size in resampler and implemented faster clamping (Patch by Klaus Post).
Modified: trunk/plugins/resample/resample.c
===================================================================
--- trunk/plugins/resample/resample.c 2009-02-02 15:53:23 UTC (rev 2198)
+++ trunk/plugins/resample/resample.c 2009-02-08 14:50:44 UTC (rev 2199)
@@ -58,6 +58,7 @@
static RS_IMAGE16 *ResizeV(RS_IMAGE16 *input, guint old_size, guint new_size, guint insize_x);
static RSFilterClass *rs_resample_parent_class = NULL;
+inline guint clampbits(gint x, guint n) { guint32 _y_temp; if( (_y_temp=x>>n) ) x = ~_y_temp >> (32-n); return x;}
G_MODULE_EXPORT void
rs_plugin_load(RSPlugin *plugin)
@@ -215,7 +216,7 @@
ResizeH(RS_IMAGE16 *input, guint old_size, guint new_size, guint insize_y)
{
gdouble pos_step = ((gdouble) old_size) / ((gdouble)new_size);
- gdouble filter_step = MIN(pos_step, 1.0);
+ gdouble filter_step = MIN(1.0 / pos_step, 1.0);
gdouble filter_support = (gdouble) lanczos_taps() / filter_step;
gint fir_filter_size = (gint) (ceil(filter_support*2));
gint *weights = g_new(gint, new_size * fir_filter_size);
@@ -292,9 +293,9 @@
acc2 += in[i*4+1]*w;
acc3 += in[i*4+2]*w;
}
- out[x*4] = CLAMP((acc1 + (FPScale/2))>>FPScaleShift, 0, 65535);
- out[x*4+1] = CLAMP((acc2 + (FPScale/2))>>FPScaleShift, 0, 65535);
- out[x*4+2] = CLAMP((acc3 + (FPScale/2))>>FPScaleShift, 0, 65535);
+ out[x*4] = clampbits((acc1 + (FPScale/2))>>FPScaleShift, 16);
+ out[x*4+1] = clampbits((acc2 + (FPScale/2))>>FPScaleShift, 16);
+ out[x*4+2] = clampbits((acc3 + (FPScale/2))>>FPScaleShift, 16);
}
}
@@ -308,7 +309,7 @@
ResizeV(RS_IMAGE16 *input, guint old_size, guint new_size, guint insize_x)
{
gdouble pos_step = ((gdouble) old_size) / ((gdouble)new_size);
- gdouble filter_step = MIN(pos_step, 1.0);
+ gdouble filter_step = MIN(1.0 / pos_step, 1.0);
gdouble filter_support = (gdouble) lanczos_taps() / filter_step;
gint fir_filter_size = (gint) (ceil(filter_support*2));
gint *weights = g_new(gint, new_size * fir_filter_size);
@@ -381,9 +382,9 @@
acc2 += in[i*input->rowstride+1] * wg[i];
acc3 += in[i*input->rowstride+2] * wg[i];
}
- out[x*4] = CLAMP((acc1 + (FPScale/2))>>FPScaleShift, 0, 65535);
- out[x*4+1] = CLAMP((acc2 + (FPScale/2))>>FPScaleShift, 0, 65535);
- out[x*4+2] = CLAMP((acc3 + (FPScale/2))>>FPScaleShift, 0, 65535);
+ out[x*4] = clampbits((acc1 + (FPScale/2))>>FPScaleShift, 16);
+ out[x*4+1] = clampbits((acc2 + (FPScale/2))>>FPScaleShift, 16);
+ out[x*4+2] = clampbits((acc3 + (FPScale/2))>>FPScaleShift, 16);
in+=4;
}
wg+=fir_filter_size;
More information about the Rawstudio-commit
mailing list