gimp r26534 - in trunk: . app/paint-funcs
- From: neo svn gnome org
- To: svn-commits-list gnome org
- Subject: gimp r26534 - in trunk: . app/paint-funcs
- Date: Wed, 13 Aug 2008 19:02:24 +0000 (UTC)
Author: neo
Date: Wed Aug 13 19:02:23 2008
New Revision: 26534
URL: http://svn.gnome.org/viewvc/gimp?rev=26534&view=rev
Log:
2008-08-13 Sven Neumann <sven gimp org>
* app/paint-funcs/scale-region.c: applied patch from Geert
Jordaens to fix scaling artifacts in top row (bug #464466).
Modified:
trunk/ChangeLog
trunk/app/paint-funcs/scale-region.c
Modified: trunk/app/paint-funcs/scale-region.c
==============================================================================
--- trunk/app/paint-funcs/scale-region.c (original)
+++ trunk/app/paint-funcs/scale-region.c Wed Aug 13 19:02:23 2008
@@ -54,123 +54,105 @@
static void scale_pr (PixelRegion *srcPR,
PixelRegion *dstPR,
GimpInterpolationType interpolation);
-static void interpolate_bilinear (TileManager *srcTM,
- gint x0,
- gint y0,
- gint x1,
- gint y1,
- gdouble xfrac,
- gdouble yfrac,
- guchar *pixel,
- const gfloat *kernel_lookup);
-static void interpolate_nearest (TileManager *srcTM,
- gint x0,
- gint y0,
- gint x1,
- gint y1,
- gdouble xfrac,
- gdouble yfrac,
- guchar *pixel,
- const gfloat *kernel_lookup);
-static void interpolate_cubic (TileManager *srcTM,
- gint x0,
- gint y0,
- gint x1,
- gint y1,
- gdouble xfrac,
- gdouble yfrac,
- guchar *pixel,
- const gfloat *kernel_lookup);
-static void decimate_gauss (TileManager *srcTM,
- gint x0,
- gint y0,
- gint x1,
- gint y1,
- gdouble xfrac,
- gdouble yfrac,
- guchar *pixel,
- const gfloat *kernel_lookup);
-static void decimate_average (TileManager *srcTM,
- gint x0,
- gint y0,
- gint x1,
- gint y1,
- gdouble xfrac,
- gdouble yfrac,
- guchar *pixel,
- const gfloat *kernel_lookup);
+static void interpolate_bilinear (TileManager *srcTM,
+ const gint x0,
+ const gint y0,
+ const gint x1,
+ const gint y1,
+ const gdouble xfrac,
+ const gdouble yfrac,
+ guchar *pixel);
+static void interpolate_nearest (TileManager *srcTM,
+ const gint x0,
+ const gint y0,
+ const gint x1,
+ const gint y1,
+ const gdouble xfrac,
+ const gdouble yfrac,
+ guchar *pixel);
+static void interpolate_cubic (TileManager *srcTM,
+ const gint x0,
+ const gint y0,
+ const gdouble xfrac,
+ const gdouble yfrac,
+ guchar *pixel);
+static void decimate_gauss (TileManager *srcTM,
+ const gint x0,
+ const gint y0,
+ guchar *pixel);
+static void decimate_average (TileManager *srcTM,
+ const gint x0,
+ const gint y0,
+ const gint x1,
+ const gint y1,
+ guchar *pixel);
static gfloat * create_lanczos3_lookup (void);
-static void interpolate_lanczos3 (TileManager *srcTM,
- gint x1,
- gint y1,
- gint x2,
- gint y2,
- gdouble xfrac,
- gdouble yfrac,
- guchar *pixel,
- const gfloat *kernel_lookup);
-static void decimate_average_pr (PixelRegion *srcPR,
- gint x0,
- gint y0,
- gint x1,
- gint y1,
- guchar *pixel);
-static void interpolate_bilinear_pr (PixelRegion *srcPR,
- gint x0,
- gint y0,
- gint x1,
- gint y1,
- gdouble xfrac,
- gdouble yfrac,
- guchar *p);
-static void determine_scale (PixelRegion *srcPR,
- PixelRegion *dstPR,
- gint *levelx,
- gint *levely,
- gint *max_progress);
-static inline void gaussan_lanczos2 (const guchar *pixels,
- gint bytes,
- guchar *pixel);
-static inline void decimate_lanczos2 (TileManager *srcTM,
- gint x0,
- gint y0,
- gint x1,
- gint y1,
- gdouble xfrac,
- gdouble yfrac,
- guchar *pixel,
- const gfloat *kernel_lookup);
-static inline void pixel_average (const guchar *p1,
- const guchar *p2,
- const guchar *p3,
- const guchar *p4,
- guchar *p,
- const gint bytes);
-static inline void gaussan_decimate (const guchar *pixels,
- const gint bytes,
- guchar *pixel);
-static inline gdouble cubic_spline_fit (gdouble dx,
- gint pt0,
- gint pt1,
- gint pt2,
- gint pt3);
-static inline gdouble weighted_sum (gdouble dx,
- gdouble dy,
- gint s00,
- gint s10,
- gint s01,
- gint s11);
-static inline gdouble sinc (gdouble x);
-static inline gdouble lanczos3_mul_alpha (const guchar *pixels,
- const gdouble *x_kernel,
- const gdouble *y_kernel,
- const gint bytes,
- const gint byte);
-static inline gdouble lanczos3_mul (const guchar *pixels,
- const gdouble *x_kernel,
- const gdouble *y_kernel,
- const gint bytes,
- const gint byte);
+static void interpolate_lanczos3 (TileManager *srcTM,
+ const gint x0,
+ const gint y0,
+ const gint x1,
+ const gint y1,
+ const gdouble xfrac,
+ const gdouble yfrac,
+ guchar *pixel,
+ const gfloat *kernel_lookup);
+static void decimate_average_pr (PixelRegion *srcPR,
+ const gint x0,
+ const gint y0,
+ const gint x1,
+ const gint y1,
+ guchar *pixel);
+static void interpolate_bilinear_pr (PixelRegion *srcPR,
+ const gint x0,
+ const gint y0,
+ const gint x1,
+ const gint y1,
+ const gdouble xfrac,
+ const gdouble yfrac,
+ guchar *pixel);
+static void determine_scale (PixelRegion *srcPR,
+ PixelRegion *dstPR,
+ gint *levelx,
+ gint *levely,
+ gint *max_progress);
+static inline void gaussan_lanczos2 (const guchar *pixels,
+ const gint bytes,
+ guchar *pixel);
+static inline void decimate_lanczos2 (TileManager *srcTM,
+ const gint x0,
+ const gint y0,
+ guchar *pixel);
+static inline void pixel_average (const guchar *p1,
+ const guchar *p2,
+ const guchar *p3,
+ const guchar *p4,
+ guchar *pixel,
+ const gint bytes);
+static inline void gaussan_decimate (const guchar *pixels,
+ const gint bytes,
+ guchar *pixel);
+static inline gdouble cubic_spline_fit (const gdouble dx,
+ const gint pt0,
+ const gint pt1,
+ const gint pt2,
+ const gint pt3);
+static inline gdouble weighted_sum (const gdouble dx,
+ const gdouble dy,
+ const gint s00,
+ const gint s10,
+ const gint s01,
+ const gint s11);
+static inline gdouble sinc (const gdouble x);
+static inline gdouble lanczos3_mul_alpha (const guchar *pixels,
+ const gdouble *x_kernel,
+ const gdouble *y_kernel,
+ const gint bytes,
+ const gint byte);
+static inline gdouble lanczos3_mul (const guchar *pixels,
+ const gdouble *x_kernel,
+ const gdouble *y_kernel,
+ const gint bytes,
+ const gint byte);
static void
@@ -514,22 +496,10 @@
{
guint src_width = tile_manager_width (srcTM);
guint src_height = tile_manager_height (srcTM);
- Tile *dst_tile;
- guchar *dst_data;
guint dst_width = tile_manager_width (dstTM);
guint dst_height = tile_manager_height (dstTM);
- guint dst_bpp = tile_manager_bpp (dstTM);
guint dst_tilerows = tile_manager_tiles_per_row(dstTM); /* the number of tiles in each row */
guint dst_tilecols = tile_manager_tiles_per_col(dstTM); /* the number of tiles in each columns */
- guint dst_ewidth;
- guint dst_eheight;
- guint dst_stride;
- gdouble scalex = (gdouble) dst_width / (gdouble) src_width;
- gdouble scaley = (gdouble) dst_height / (gdouble) src_height;
- gdouble xfrac;
- gdouble yfrac;
- gint x, y, x0, y0, x1, y1;
- gint sx0, sy0, sx1, sy1;
gint col, row;
guchar pixel[4];
gfloat *kernel_lookup = NULL;
@@ -556,16 +526,17 @@
{
for (col = 0; col < dst_tilecols; col++)
{
- dst_tile = tile_manager_get_at (dstTM, col, row, TRUE, TRUE);
- dst_data = tile_data_pointer (dst_tile, 0, 0);
- dst_bpp = tile_bpp (dst_tile);
- dst_ewidth = tile_ewidth (dst_tile);
- dst_eheight = tile_eheight (dst_tile);
- dst_stride = dst_ewidth * dst_bpp;
- x0 = col * TILE_WIDTH;
- y0 = row * TILE_HEIGHT;
- x1 = x0 + dst_ewidth - 1;
- y1 = y0 + dst_eheight - 1;
+ Tile *dst_tile = tile_manager_get_at (dstTM,
+ col, row, TRUE, TRUE);
+ guchar *dst_data = tile_data_pointer (dst_tile, 0, 0);
+ guint dst_bpp = tile_bpp (dst_tile);
+ guint dst_ewidth = tile_ewidth (dst_tile);
+ guint dst_eheight = tile_eheight (dst_tile);
+ guint dst_stride = dst_ewidth * dst_bpp;
+ gint x0 = col * TILE_WIDTH;
+ gint y0 = row * TILE_HEIGHT;
+ gint x1 = x0 + dst_ewidth - 1;
+ gint y1 = y0 + dst_eheight - 1;
read_pixel_data (srcTM, x0, y0, x1, y1, dst_data, dst_stride);
@@ -587,86 +558,74 @@
{
for (col = 0; col < dst_tilecols; col++)
{
- dst_tile = tile_manager_get_at (dstTM, col, row, FALSE, FALSE);
- dst_data = tile_data_pointer (dst_tile, 0, 0);
- dst_bpp = tile_bpp (dst_tile);
- dst_ewidth = tile_ewidth (dst_tile);
- dst_eheight = tile_eheight (dst_tile);
- dst_stride = dst_ewidth * dst_bpp;
-
- x0 = col * TILE_WIDTH;
- y0 = row * TILE_HEIGHT;
- x1 = x0 + dst_ewidth - 1;
- y1 = y0 + dst_eheight - 1;
+ Tile *dst_tile = tile_manager_get_at (dstTM,
+ col, row, FALSE, FALSE);
+ guint dst_ewidth = tile_ewidth (dst_tile);
+ guint dst_eheight = tile_eheight (dst_tile);
+ gint x0 = col * TILE_WIDTH;
+ gint y0 = row * TILE_HEIGHT;
+ gint x1 = x0 + dst_ewidth - 1;
+ gint y1 = y0 + dst_eheight - 1;
+ gint x, y;
for (y = y0; y <= y1; y++)
{
- yfrac = y / scaley;
- sy0 = (gint) yfrac;
- sy1 = sy0 + 1;
- sy1 = (sy1 >= src_height) ? src_height - 1 : sy1;
+ gdouble scaley = (gdouble) dst_height / (gdouble) src_height;
+ gdouble yfrac = y / scaley;
+ gint sy0 = (gint) yfrac;
+ gint sy1 = sy0 + 1;
+
+ sy0 = (sy0 > 0) ? sy0 : 0;
+ sy1 = (sy1 > 0) ? sy1 : 0;
+ sy0 = (sy0 < src_height - 1) ? sy0 : src_height - 1;
+ sy1 = (sy1 < src_height - 1) ? sy1 : src_height - 1;
+
yfrac = yfrac - sy0;
for (x = x0; x <= x1; x++)
{
- xfrac = x / scalex;
- sx0 = (gint) xfrac;
- sx1 = sx0 + 1;
- sx1 = (sx1 >= src_width) ? src_width - 1 : sx1;
+ gdouble scalex = (gdouble) dst_width / (gdouble) src_width;
+ gdouble xfrac = x / scalex;
+ gint sx0 = (gint) xfrac;
+ gint sx1 = sx0 + 1;
+
+ sx0 = (sx0 > 0) ? sx0 : 0;
+ sx1 = (sx1 > 0) ? sx1 : 0;
+ sx0 = (sx0 < src_width - 1) ? sx0 : src_width - 1;
+ sx1 = (sx1 < src_width - 1) ? sx1 : src_width - 1;
+
xfrac = xfrac - sx0;
switch (interpolation)
{
case GIMP_INTERPOLATION_NONE:
- interpolate_nearest (srcTM, sx0, sy0,
- sx1, sy1,
- xfrac, yfrac,
- pixel,
- kernel_lookup);
+ interpolate_nearest (srcTM, sx0, sy0, sx1, sy1,
+ xfrac, yfrac, pixel);
break;
case GIMP_INTERPOLATION_LINEAR:
if (scalex == 0.5 || scaley == 0.5)
- decimate_average (srcTM, sx0, sy0,
- sx1, sy1,
- xfrac, yfrac,
- pixel,
- kernel_lookup);
+ decimate_average (srcTM, sx0, sy0, sx1, sy1,
+ pixel);
else
- interpolate_bilinear (srcTM, sx0, sy0,
- sx1, sy1,
- xfrac, yfrac,
- pixel,
- kernel_lookup);
+ interpolate_bilinear (srcTM, sx0, sy0, sx1, sy1,
+ xfrac, yfrac, pixel);
break;
case GIMP_INTERPOLATION_CUBIC:
if (scalex == 0.5 || scaley == 0.5)
- decimate_gauss (srcTM, sx0, sy0,
- sx1, sy1,
- xfrac, yfrac,
- pixel,
- kernel_lookup);
+ decimate_gauss (srcTM, sx0, sy0, pixel);
else
interpolate_cubic (srcTM, sx0, sy0,
- sx1, sy1,
- xfrac, yfrac,
- pixel,
- kernel_lookup);
+ xfrac, yfrac, pixel);
break;
case GIMP_INTERPOLATION_LANCZOS:
if (scalex == 0.5 || scaley == 0.5)
- decimate_lanczos2 (srcTM, sx0, sy0,
- sx1, sy1,
- xfrac, yfrac,
- pixel,
- kernel_lookup);
+ decimate_lanczos2 (srcTM, sx0, sy0, pixel);
else
- interpolate_lanczos3 (srcTM, sx0, sy0,
- sx1, sy1,
- xfrac, yfrac,
- pixel,
+ interpolate_lanczos3 (srcTM, sx0, sy0, sx1, sy1,
+ xfrac, yfrac, pixel,
kernel_lookup);
break;
}
@@ -785,14 +744,9 @@
static void
decimate_gauss (TileManager *srcTM,
- gint x0,
- gint y0,
- gint x1,
- gint y1,
- gdouble xfrac,
- gdouble yfrac,
- guchar *pixel,
- const gfloat *kernel_lookup)
+ const gint x0,
+ const gint y0,
+ guchar *pixel)
{
gint src_bpp = tile_manager_bpp (srcTM);
guint src_width = tile_manager_width (srcTM);
@@ -809,11 +763,12 @@
{
for (x = x0 - 1; x <= x0 + 2; x++, i++)
{
- x1 = ABS(x);
- y1 = ABS(y);
- x1 = (x1 < src_width) ? x1 : 2 * src_width - x1 - 1;
- y1 = (y1 < src_height) ? y1 : 2 * src_height - y1 - 1;
- read_pixel_data_1 (srcTM, x1, y1, pixels + (i * src_bpp));
+ gint u, v;
+ u = (x > 0) ? x : 0;
+ u = (u < src_width - 1) ? u : src_width - 1;
+ v = (y > 0) ? y : 0;
+ v = (v < src_height - 1) ? v : src_height - 1;
+ read_pixel_data_1 (srcTM, u, v, pixels + (i * src_bpp));
}
}
@@ -915,14 +870,9 @@
static inline void
decimate_lanczos2 (TileManager *srcTM,
- gint x0,
- gint y0,
- gint x1,
- gint y1,
- gdouble xfrac,
- gdouble yfrac,
- guchar *pixel,
- const gfloat *kernel_lookup)
+ const gint x0,
+ const gint y0,
+ guchar *pixel)
{
gint src_bpp = tile_manager_bpp (srcTM);
guint src_width = tile_manager_width (srcTM);
@@ -936,16 +886,15 @@
guchar *p;
for (y = y0 - 2, i = 0; y <= y0 + 3; y++)
- {
- for (x = x0 - 2; x <= x0 + 3; x++, i++)
- {
- x1 = ABS(x);
- y1 = ABS(y);
- x1 = (x1 < src_width) ? x1 : 2 * src_width - x1 - 1;
- y1 = (y1 < src_height) ? y1 : 2 * src_height - y1 - 1;
- read_pixel_data_1 (srcTM, x1, y1, pixels + (i * src_bpp));
- }
- }
+ for (x = x0 - 2; x <= x0 + 3; x++, i++)
+ {
+ gint u, v;
+ u = (x > 0) ? x : 0;
+ u = (u < src_width - 1) ? u : src_width - 1;
+ v = (y > 0) ? y : 0;
+ v = (v < src_height - 1) ? v : src_height - 1;
+ read_pixel_data_1 (srcTM, u, v, pixels + (i * src_bpp));
+ }
p = pixels + (0 * src_bpp);
gaussan_lanczos2 (p, src_bpp, pixel1);
@@ -962,7 +911,7 @@
static inline void
gaussan_lanczos2 (const guchar *pixels,
- gint bytes,
+ const gint bytes,
guchar *pixel)
{
/*
@@ -1104,14 +1053,11 @@
static void
decimate_average (TileManager *srcTM,
- gint x0,
- gint y0,
- gint x1,
- gint y1,
- gdouble xfrac,
- gdouble yfrac,
- guchar *pixel,
- const gfloat *kernel_lookup)
+ const gint x0,
+ const gint y0,
+ const gint x1,
+ const gint y1,
+ guchar *pixel)
{
guchar pixel1[4];
guchar pixel2[4];
@@ -1127,7 +1073,7 @@
}
static inline gdouble
-sinc (gdouble x)
+sinc (const gdouble x)
{
gdouble y = x * G_PI;
@@ -1180,15 +1126,14 @@
}
static void
-interpolate_nearest (TileManager *srcTM,
- gint x0,
- gint y0,
- gint x1,
- gint y1,
- gdouble xfrac,
- gdouble yfrac,
- guchar *pixel,
- const gfloat *kernel_lookup)
+interpolate_nearest (TileManager *srcTM,
+ const gint x0,
+ const gint y0,
+ const gint x1,
+ const gint y1,
+ const gdouble xfrac,
+ const gdouble yfrac,
+ guchar *pixel)
{
gint x = (xfrac <= 0.5) ? x0 : x1;
gint y = (yfrac <= 0.5) ? y0 : y1;
@@ -1197,27 +1142,26 @@
}
static inline gdouble
-weighted_sum (gdouble dx,
- gdouble dy,
- gint s00,
- gint s10,
- gint s01,
- gint s11)
+weighted_sum (const gdouble dx,
+ const gdouble dy,
+ const gint s00,
+ const gint s10,
+ const gint s01,
+ const gint s11)
{
return ((1 - dy) *
((1 - dx) * s00 + dx * s10) + dy * ((1 - dx) * s01 + dx * s11));
}
static void
-interpolate_bilinear (TileManager *srcTM,
- gint x0,
- gint y0,
- gint x1,
- gint y1,
- gdouble xfrac,
- gdouble yfrac,
- guchar *p,
- const gfloat *kernel_lookup)
+interpolate_bilinear (TileManager *srcTM,
+ const gint x0,
+ const gint y0,
+ const gint x1,
+ const gint y1,
+ const gdouble xfrac,
+ const gdouble yfrac,
+ guchar *pixel)
{
gint src_bpp = tile_manager_bpp (srcTM);
guchar p1[4];
@@ -1229,7 +1173,7 @@
gdouble sum, alphasum;
for (b=0; b < src_bpp; b++)
- p[b]=0;
+ pixel[b]=0;
read_pixel_data_1 (srcTM, x0, y0, p1);
read_pixel_data_1 (srcTM, x1, y0, p2);
@@ -1240,7 +1184,7 @@
{
case 1:
sum = weighted_sum (xfrac, yfrac, p1[0], p2[0], p3[0], p4[0]);
- p[0] = (guchar) CLAMP (sum, 0, 255);
+ pixel[0] = (guchar) CLAMP (sum, 0, 255);
break;
case 2:
@@ -1251,8 +1195,8 @@
p3[0] * p3[1], p4[0] * p4[1]);
sum /= alphasum;
- p[0] = (guchar) CLAMP (sum, 0, 255);
- p[1] = (guchar) CLAMP (alphasum, 0, 255);
+ pixel[0] = (guchar) CLAMP (sum, 0, 255);
+ pixel[1] = (guchar) CLAMP (alphasum, 0, 255);
}
break;
@@ -1260,7 +1204,7 @@
for (b = 0; b < 3; b++)
{
sum = weighted_sum (xfrac, yfrac, p1[b], p2[b], p3[b], p4[b]);
- p[b] = (guchar) CLAMP (sum, 0, 255);
+ pixel[b] = (guchar) CLAMP (sum, 0, 255);
}
break;
@@ -1273,10 +1217,10 @@
sum = weighted_sum (xfrac, yfrac, p1[b] * p1[3], p2[b] * p2[3],
p3[b] * p3[3], p4[b] * p4[3]);
sum /= alphasum;
- p[b] = (guchar) CLAMP (sum, 0, 255);
+ pixel[b] = (guchar) CLAMP (sum, 0, 255);
}
- p[3] = (guchar) CLAMP (alphasum, 0, 255);
+ pixel[3] = (guchar) CLAMP (alphasum, 0, 255);
}
break;
}
@@ -1289,11 +1233,11 @@
*/
static inline gdouble
-cubic_spline_fit (gdouble dx,
- gint pt0,
- gint pt1,
- gint pt2,
- gint pt3)
+cubic_spline_fit (const gdouble dx,
+ const gint pt0,
+ const gint pt1,
+ const gint pt2,
+ const gint pt3)
{
return (gdouble) ((( ( -pt0 + 3 * pt1 - 3 * pt2 + pt3 ) * dx +
@@ -1303,22 +1247,17 @@
static void
interpolate_cubic (TileManager *srcTM,
- gint x1,
- gint y1,
- gint x2,
- gint y2,
- gdouble xfrac,
- gdouble yfrac,
- guchar *p,
- const gfloat *kernel_lookup)
+ const gint x0,
+ const gint y0,
+ const gdouble xfrac,
+ const gdouble yfrac,
+ guchar *pixel)
{
gint src_bpp = tile_manager_bpp (srcTM);
guint src_width = tile_manager_width (srcTM);
guint src_height = tile_manager_height (srcTM);
gint b, i;
gint x, y;
- gint x0;
- gint y0;
guchar ps[16 * 4];
gdouble p0, p1, p2, p3;
@@ -1326,14 +1265,17 @@
gdouble sum, alphasum;
for (b = 0; b < src_bpp; b++)
- p[b] = 0;
+ pixel[b] = 0;
- for (y = y1 - 1, i = 0; y <= y1 + 2; y++)
- for (x = x1 - 1; x <= x1 + 2; x++, i++)
+ for (y = y0 - 1, i = 0; y <= y0 + 2; y++)
+ for (x = x0 - 1; x <= x0 + 2; x++, i++)
{
- x0 = (x < src_width) ? ABS(x) : 2 * src_width - x - 1;
- y0 = (y < src_height) ? ABS(y) : 2 * src_height - y - 1;
- read_pixel_data_1 (srcTM, x0, y0, ps + (i * src_bpp));
+ gint u,v;
+ u = (x > 0) ? x : 0;
+ u = (u < src_width - 1) ? u : src_width - 1;
+ v = (y > 0) ? y : 0;
+ v = (v < src_height - 1) ? v : src_height - 1;
+ read_pixel_data_1 (srcTM, u, v, ps + (i * src_bpp));
}
switch (src_bpp)
@@ -1346,7 +1288,7 @@
sum = cubic_spline_fit (yfrac, p0, p1, p2, p3);
- p[0]= (guchar) CLAMP (sum, 0, 255);
+ pixel[0]= (guchar) CLAMP (sum, 0, 255);
break;
case 2:
@@ -1371,8 +1313,8 @@
sum = cubic_spline_fit (yfrac, p0, p1, p2, p3);
sum /= alphasum;
- p[0] = (guchar) CLAMP (sum, 0, 255);
- p[1] = (guchar) CLAMP (alphasum, 0, 255);
+ pixel[0] = (guchar) CLAMP (sum, 0, 255);
+ pixel[1] = (guchar) CLAMP (alphasum, 0, 255);
}
break;
case 3:
@@ -1385,7 +1327,7 @@
sum = cubic_spline_fit (yfrac, p0, p1, p2, p3);
- p[b] = (guchar) CLAMP (sum, 0, 255);
+ pixel[b] = (guchar) CLAMP (sum, 0, 255);
}
break;
@@ -1413,10 +1355,10 @@
sum = cubic_spline_fit (yfrac, p0, p1, p2, p3);
sum /= alphasum;
- p[b] = (guchar) CLAMP (sum, 0, 255);
+ pixel[b] = (guchar) CLAMP (sum, 0, 255);
}
- p[3] = (guchar) CLAMP (alphasum, 0, 255);
+ pixel[3] = (guchar) CLAMP (alphasum, 0, 255);
}
break;
}
@@ -1478,14 +1420,14 @@
}
static void
-interpolate_lanczos3 (TileManager *srcTM,
- gint x1,
- gint y1,
- gint x2,
- gint y2,
- gdouble xfrac,
- gdouble yfrac,
- guchar *pixel,
+interpolate_lanczos3 (TileManager *srcTM,
+ const gint x0,
+ const gint y0,
+ const gint x1,
+ const gint y1,
+ const gdouble xfrac,
+ const gdouble yfrac,
+ guchar *pixel,
const gfloat *kernel_lookup)
{
gint src_bpp = tile_manager_bpp (srcTM);
@@ -1493,8 +1435,6 @@
guint src_height = tile_manager_height (srcTM);
gint b, i;
gint x, y;
- gint x0;
- gint y0;
gint x_shift, y_shift;
gdouble kx_sum, ky_sum;
gdouble x_kernel[6], y_kernel[6];
@@ -1504,13 +1444,16 @@
for (b = 0; b < src_bpp; b++)
pixel[b] = 0;
- for (y = y1 - 2, i = 0; y <= y1 + 3; y++)
+ for (y = y0 - 2, i = 0; y <= y0 + 3; y++)
{
- for (x = x1 - 2; x <= x1 + 3; x++, i++)
+ for (x = x0 - 2; x <= x0 + 3; x++, i++)
{
- x0 = (x < src_width) ? ABS(x) : 2 * src_width - x - 1;
- y0 = (y < src_height) ? ABS(y) : 2 * src_height - y - 1;
- read_pixel_data_1 (srcTM, x0, y0, pixels + (i * src_bpp));
+ gint u, v;
+ u = (x > 0) ? x : 0;
+ u = (u < src_width - 1) ? u : src_width - 1;
+ v = (y > 0) ? y : 0;
+ v = (v < src_height - 1) ? v : src_height - 1;
+ read_pixel_data_1 (srcTM, u, v, pixels + (i * src_bpp));
}
}
@@ -1521,7 +1464,6 @@
for (i = 3; i >= -2; i--)
{
gint pos = i * LANCZOS_SPP;
-
kx_sum += x_kernel[2 + i] = kernel_lookup[ABS (x_shift - pos)];
ky_sum += y_kernel[2 + i] = kernel_lookup[ABS (y_shift - pos)];
}
@@ -1592,11 +1534,11 @@
guchar pixel[bytes];
for (y = 0; y < dstPR->h; y++)
- {
+ {
yfrac = (y / scaley);
sy0 = (gint) yfrac;
- sy1 = sy0 + 1;
- sy1 = (sy1 < src_height) ? ABS(sy1) : 2 * src_height - sy1 - 1;
+ sy1 = sy0 + 1;
+ sy1 = (sy1 < src_height - 1) ? sy1 : src_height - 1;
yfrac = yfrac - sy0;
@@ -1605,7 +1547,7 @@
xfrac = (x / scalex);
sx0 = (gint) xfrac;
sx1 = sx0 + 1;
- sx1 = (sx1 < src_width) ? ABS(sx1) : 2 * src_width - sx1 - 1;
+ sx1 = (sx1 < src_width - 1) ? sx1 : src_width - 1;
xfrac = xfrac - sx0;
switch (interpolation)
@@ -1640,11 +1582,11 @@
static void
decimate_average_pr (PixelRegion *srcPR,
- gint x0,
- gint y0,
- gint x1,
- gint y1,
- guchar *p)
+ const gint x0,
+ const gint y0,
+ const gint x1,
+ const gint y1,
+ guchar *pixel)
{
gint bytes = srcPR->bytes;
gint width = srcPR->w;
@@ -1653,18 +1595,18 @@
guchar *p3 = srcPR->data + (y1 * width + x0) * bytes;
guchar *p4 = srcPR->data + (y1 * width + x1) * bytes;
- pixel_average (p1, p2, p3, p4, p, bytes);
+ pixel_average (p1, p2, p3, p4, pixel, bytes);
}
static void
-interpolate_bilinear_pr (PixelRegion *srcPR,
- gint x0,
- gint y0,
- gint x1,
- gint y1,
- gdouble xfrac,
- gdouble yfrac,
- guchar *p)
+interpolate_bilinear_pr (PixelRegion *srcPR,
+ const gint x0,
+ const gint y0,
+ const gint x1,
+ const gint y1,
+ const gdouble xfrac,
+ const gdouble yfrac,
+ guchar *pixel)
{
gint bytes = srcPR->bytes;
gint width = srcPR->w;
@@ -1677,13 +1619,13 @@
gdouble sum, alphasum;
for (b = 0; b < bytes; b++)
- p[b] = 0;
+ pixel[b] = 0;
switch (bytes)
{
case 1:
sum = weighted_sum (xfrac, yfrac, p1[0], p2[0], p3[0], p4[0]);
- p[0] = (guchar) CLAMP (sum, 0, 255);
+ pixel[0] = (guchar) CLAMP (sum, 0, 255);
break;
case 2:
@@ -1693,8 +1635,8 @@
sum = weighted_sum (xfrac, yfrac, p1[0] * p1[1], p2[0] * p2[1],
p3[0] * p3[1], p4[0] * p4[1]);
sum /= alphasum;
- p[0] = (guchar) CLAMP (sum, 0, 255);
- p[1] = (guchar) CLAMP (alphasum, 0, 255);
+ pixel[0] = (guchar) CLAMP (sum, 0, 255);
+ pixel[1] = (guchar) CLAMP (alphasum, 0, 255);
}
break;
@@ -1702,7 +1644,7 @@
for (b = 0; b < 3; b++)
{
sum = weighted_sum (xfrac, yfrac, p1[b], p2[b], p3[b], p4[b]);
- p[b] = (guchar) CLAMP (sum, 0, 255);
+ pixel[b] = (guchar) CLAMP (sum, 0, 255);
}
break;
@@ -1715,10 +1657,10 @@
sum = weighted_sum (xfrac, yfrac, p1[b] * p1[3], p2[b] * p2[3],
p3[b] * p3[3], p4[b] * p4[3]);
sum /= alphasum;
- p[b] = (guchar) CLAMP (sum, 0, 255);
+ pixel[b] = (guchar) CLAMP (sum, 0, 255);
}
- p[3] = (guchar) CLAMP (alphasum, 0, 255);
+ pixel[3] = (guchar) CLAMP (alphasum, 0, 255);
}
break;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]