mirror of https://github.com/GNOME/gimp.git
applied a patch from Geert Jordaens that seems to fix drawable
2005-01-21 Sven Neumann <sven@gimp.org> * app/core/gimpdrawable-transform.c: applied a patch from Geert Jordaens that seems to fix drawable transformation using the new Lanczos interpolation routine :)
This commit is contained in:
parent
e0a6c25548
commit
f6801672a8
|
@ -1,3 +1,9 @@
|
||||||
|
2005-01-21 Sven Neumann <sven@gimp.org>
|
||||||
|
|
||||||
|
* app/core/gimpdrawable-transform.c: applied a patch from Geert
|
||||||
|
Jordaens that seems to fix drawable transformation using the new
|
||||||
|
Lanczos interpolation routine :)
|
||||||
|
|
||||||
2005-01-20 Sven Neumann <sven@gimp.org>
|
2005-01-20 Sven Neumann <sven@gimp.org>
|
||||||
|
|
||||||
* HACKING
|
* HACKING
|
||||||
|
|
|
@ -1245,7 +1245,7 @@ sample_linear (PixelSurround *surround,
|
||||||
/* calculate alpha value of result pixel */
|
/* calculate alpha value of result pixel */
|
||||||
alphachan = &data[alpha];
|
alphachan = &data[alpha];
|
||||||
a_val = BILINEAR (alphachan[0], alphachan[bytes],
|
a_val = BILINEAR (alphachan[0], alphachan[bytes],
|
||||||
alphachan[row], alphachan[row+bytes], du, dv);
|
alphachan[row], alphachan[row + bytes], du, dv);
|
||||||
if (a_val <= 0.0)
|
if (a_val <= 0.0)
|
||||||
{
|
{
|
||||||
a_recip = 0.0;
|
a_recip = 0.0;
|
||||||
|
@ -1270,10 +1270,10 @@ sample_linear (PixelSurround *surround,
|
||||||
for (i = 0; i < alpha; i++)
|
for (i = 0; i < alpha; i++)
|
||||||
{
|
{
|
||||||
gint newval = (a_recip *
|
gint newval = (a_recip *
|
||||||
BILINEAR (alphachan[0] * data[i],
|
BILINEAR (alphachan[0] * data[i],
|
||||||
alphachan[bytes] * data[bytes+i],
|
alphachan[bytes] * data[bytes + i],
|
||||||
alphachan[row] * data[row+i],
|
alphachan[row] * data[row + i],
|
||||||
alphachan[row+bytes] * data[row+bytes+i],
|
alphachan[row + bytes] * data[row + bytes + i],
|
||||||
du, dv));
|
du, dv));
|
||||||
|
|
||||||
color[i] = CLAMP (newval, 0, 255);
|
color[i] = CLAMP (newval, 0, 255);
|
||||||
|
@ -1645,10 +1645,22 @@ sample_cubic (PixelSurround *surround,
|
||||||
gint newval = (a_recip *
|
gint newval = (a_recip *
|
||||||
gimp_drawable_transform_cubic
|
gimp_drawable_transform_cubic
|
||||||
(dv,
|
(dv,
|
||||||
CUBIC_SCALED_ROW (du, i + data + row * 0, data + alpha + row * 0, bytes),
|
CUBIC_SCALED_ROW (du,
|
||||||
CUBIC_SCALED_ROW (du, i + data + row * 1, data + alpha + row * 1, bytes),
|
i + data + row * 0,
|
||||||
CUBIC_SCALED_ROW (du, i + data + row * 2, data + alpha + row * 2, bytes),
|
data + alpha + row * 0,
|
||||||
CUBIC_SCALED_ROW (du, i + data + row * 3, data + alpha + row * 3, bytes)));
|
bytes),
|
||||||
|
CUBIC_SCALED_ROW (du,
|
||||||
|
i + data + row * 1,
|
||||||
|
data + alpha + row * 1,
|
||||||
|
bytes),
|
||||||
|
CUBIC_SCALED_ROW (du,
|
||||||
|
i + data + row * 2,
|
||||||
|
data + alpha + row * 2,
|
||||||
|
bytes),
|
||||||
|
CUBIC_SCALED_ROW (du,
|
||||||
|
i + data + row * 3,
|
||||||
|
data + alpha + row * 3,
|
||||||
|
bytes)));
|
||||||
|
|
||||||
color[i] = CLAMP (newval, 0, 255);
|
color[i] = CLAMP (newval, 0, 255);
|
||||||
}
|
}
|
||||||
|
@ -1680,8 +1692,8 @@ lanczos_sum (const guchar *data,
|
||||||
gdouble sum = 0;
|
gdouble sum = 0;
|
||||||
gint j, k;
|
gint j, k;
|
||||||
|
|
||||||
for (k = 0, j = 0; j < LANCZOS_WIDTH2; j++, k+=bytes)
|
for (k = 0, j = 0; j < LANCZOS_WIDTH2; j++, k += bytes)
|
||||||
sum += (l[j] * data[row+k]);
|
sum += (l[j] * data[row + k + byte]);
|
||||||
|
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
@ -1697,10 +1709,10 @@ lanczos_sum_mul (const guchar *data,
|
||||||
gdouble sum = 0;
|
gdouble sum = 0;
|
||||||
gint j, k;
|
gint j, k;
|
||||||
|
|
||||||
for (k = 0, j = 0; j < LANCZOS_WIDTH2; j++, k+=bytes)
|
for (k = 0, j = 0; j < LANCZOS_WIDTH2; j++, k += bytes)
|
||||||
sum += (l[j] *
|
sum += (l[j] *
|
||||||
data[row+k+byte] *
|
data[row + k + byte] *
|
||||||
data[row+k+alpha]);
|
data[row + k + alpha]);
|
||||||
|
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
@ -1749,7 +1761,8 @@ sample_lanczos (PixelSurround *surround,
|
||||||
gint iv = floor(v);
|
gint iv = floor(v);
|
||||||
|
|
||||||
/* lock the pixel surround */
|
/* lock the pixel surround */
|
||||||
data = pixel_surround_lock (surround, iu - 1 , iv - 1 );
|
data = pixel_surround_lock (surround,
|
||||||
|
iu - LANCZOS_WIDTH, iv - LANCZOS_WIDTH);
|
||||||
|
|
||||||
row = pixel_surround_rowstride (surround);
|
row = pixel_surround_rowstride (surround);
|
||||||
|
|
||||||
|
@ -1767,53 +1780,36 @@ sample_lanczos (PixelSurround *surround,
|
||||||
|
|
||||||
weight = lusum * lvsum;
|
weight = lusum * lvsum;
|
||||||
|
|
||||||
if (alpha != 0)
|
for ( aval = 0, i = 0 ; i < LANCZOS_WIDTH2 ; i ++ )
|
||||||
|
aval += lv[i] * lanczos_sum (data, lu, i * row, bytes, alpha);
|
||||||
|
|
||||||
|
/* calculate alpha of result */
|
||||||
|
aval /= weight;
|
||||||
|
|
||||||
|
if ( aval <= 0.0 )
|
||||||
{
|
{
|
||||||
for ( aval = 0, i = 0 ; i < LANCZOS_WIDTH2 ; i ++ )
|
arecip = 0.0;
|
||||||
aval += lv[i] * lanczos_sum (data, lu,
|
color[alpha] = 0;
|
||||||
i * LANCZOS_WIDTH2 * bytes,
|
}
|
||||||
bytes, alpha);
|
else if ( aval > 255.0 )
|
||||||
|
{
|
||||||
/* calculate alpha of result */
|
arecip = 1.0 / aval;
|
||||||
aval /= weight;
|
color[alpha] = 255;
|
||||||
|
|
||||||
if ( aval <= 0.0 )
|
|
||||||
{
|
|
||||||
arecip = 0.0;
|
|
||||||
color[alpha] = 0;
|
|
||||||
}
|
|
||||||
else if ( aval > 255.0 )
|
|
||||||
{
|
|
||||||
arecip = 1.0 / aval;
|
|
||||||
color[alpha] = 255;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
arecip = 1.0 / aval;
|
|
||||||
color[alpha] = RINT (aval);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (byte = 0; byte < alpha; byte++)
|
|
||||||
{
|
|
||||||
for (newval = 0, i = 0; i < LANCZOS_WIDTH2; i ++)
|
|
||||||
newval += lv[i] * lanczos_sum_mul (data, lu,
|
|
||||||
i * LANCZOS_WIDTH2 * bytes,
|
|
||||||
bytes, byte, alpha);
|
|
||||||
newval *= arecip;
|
|
||||||
color[byte] = CLAMP (newval, 0, 255);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (byte = 0; byte < bytes; byte++)
|
arecip = 1.0 / aval;
|
||||||
{
|
color[alpha] = RINT (aval);
|
||||||
for (newval = 0, i = 0 ; i < LANCZOS_WIDTH2 ; i++ )
|
|
||||||
newval += lv[i] * lanczos_sum (data, lu,
|
|
||||||
i * LANCZOS_WIDTH2 * bytes,
|
|
||||||
bytes, byte);
|
|
||||||
|
|
||||||
newval /= weight;
|
|
||||||
color[byte] = CLAMP ((gint) newval, 0, 255);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (byte = 0; byte < alpha; byte++)
|
||||||
|
{
|
||||||
|
for (newval = 0, i = 0; i < LANCZOS_WIDTH2; i ++)
|
||||||
|
newval += lv[i] * lanczos_sum_mul (data, lu,
|
||||||
|
i * row, bytes, byte, alpha);
|
||||||
|
newval *= arecip;
|
||||||
|
color[byte] = CLAMP (newval, 0, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
pixel_surround_release (surround);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1245,7 +1245,7 @@ sample_linear (PixelSurround *surround,
|
||||||
/* calculate alpha value of result pixel */
|
/* calculate alpha value of result pixel */
|
||||||
alphachan = &data[alpha];
|
alphachan = &data[alpha];
|
||||||
a_val = BILINEAR (alphachan[0], alphachan[bytes],
|
a_val = BILINEAR (alphachan[0], alphachan[bytes],
|
||||||
alphachan[row], alphachan[row+bytes], du, dv);
|
alphachan[row], alphachan[row + bytes], du, dv);
|
||||||
if (a_val <= 0.0)
|
if (a_val <= 0.0)
|
||||||
{
|
{
|
||||||
a_recip = 0.0;
|
a_recip = 0.0;
|
||||||
|
@ -1270,10 +1270,10 @@ sample_linear (PixelSurround *surround,
|
||||||
for (i = 0; i < alpha; i++)
|
for (i = 0; i < alpha; i++)
|
||||||
{
|
{
|
||||||
gint newval = (a_recip *
|
gint newval = (a_recip *
|
||||||
BILINEAR (alphachan[0] * data[i],
|
BILINEAR (alphachan[0] * data[i],
|
||||||
alphachan[bytes] * data[bytes+i],
|
alphachan[bytes] * data[bytes + i],
|
||||||
alphachan[row] * data[row+i],
|
alphachan[row] * data[row + i],
|
||||||
alphachan[row+bytes] * data[row+bytes+i],
|
alphachan[row + bytes] * data[row + bytes + i],
|
||||||
du, dv));
|
du, dv));
|
||||||
|
|
||||||
color[i] = CLAMP (newval, 0, 255);
|
color[i] = CLAMP (newval, 0, 255);
|
||||||
|
@ -1645,10 +1645,22 @@ sample_cubic (PixelSurround *surround,
|
||||||
gint newval = (a_recip *
|
gint newval = (a_recip *
|
||||||
gimp_drawable_transform_cubic
|
gimp_drawable_transform_cubic
|
||||||
(dv,
|
(dv,
|
||||||
CUBIC_SCALED_ROW (du, i + data + row * 0, data + alpha + row * 0, bytes),
|
CUBIC_SCALED_ROW (du,
|
||||||
CUBIC_SCALED_ROW (du, i + data + row * 1, data + alpha + row * 1, bytes),
|
i + data + row * 0,
|
||||||
CUBIC_SCALED_ROW (du, i + data + row * 2, data + alpha + row * 2, bytes),
|
data + alpha + row * 0,
|
||||||
CUBIC_SCALED_ROW (du, i + data + row * 3, data + alpha + row * 3, bytes)));
|
bytes),
|
||||||
|
CUBIC_SCALED_ROW (du,
|
||||||
|
i + data + row * 1,
|
||||||
|
data + alpha + row * 1,
|
||||||
|
bytes),
|
||||||
|
CUBIC_SCALED_ROW (du,
|
||||||
|
i + data + row * 2,
|
||||||
|
data + alpha + row * 2,
|
||||||
|
bytes),
|
||||||
|
CUBIC_SCALED_ROW (du,
|
||||||
|
i + data + row * 3,
|
||||||
|
data + alpha + row * 3,
|
||||||
|
bytes)));
|
||||||
|
|
||||||
color[i] = CLAMP (newval, 0, 255);
|
color[i] = CLAMP (newval, 0, 255);
|
||||||
}
|
}
|
||||||
|
@ -1680,8 +1692,8 @@ lanczos_sum (const guchar *data,
|
||||||
gdouble sum = 0;
|
gdouble sum = 0;
|
||||||
gint j, k;
|
gint j, k;
|
||||||
|
|
||||||
for (k = 0, j = 0; j < LANCZOS_WIDTH2; j++, k+=bytes)
|
for (k = 0, j = 0; j < LANCZOS_WIDTH2; j++, k += bytes)
|
||||||
sum += (l[j] * data[row+k]);
|
sum += (l[j] * data[row + k + byte]);
|
||||||
|
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
@ -1697,10 +1709,10 @@ lanczos_sum_mul (const guchar *data,
|
||||||
gdouble sum = 0;
|
gdouble sum = 0;
|
||||||
gint j, k;
|
gint j, k;
|
||||||
|
|
||||||
for (k = 0, j = 0; j < LANCZOS_WIDTH2; j++, k+=bytes)
|
for (k = 0, j = 0; j < LANCZOS_WIDTH2; j++, k += bytes)
|
||||||
sum += (l[j] *
|
sum += (l[j] *
|
||||||
data[row+k+byte] *
|
data[row + k + byte] *
|
||||||
data[row+k+alpha]);
|
data[row + k + alpha]);
|
||||||
|
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
@ -1749,7 +1761,8 @@ sample_lanczos (PixelSurround *surround,
|
||||||
gint iv = floor(v);
|
gint iv = floor(v);
|
||||||
|
|
||||||
/* lock the pixel surround */
|
/* lock the pixel surround */
|
||||||
data = pixel_surround_lock (surround, iu - 1 , iv - 1 );
|
data = pixel_surround_lock (surround,
|
||||||
|
iu - LANCZOS_WIDTH, iv - LANCZOS_WIDTH);
|
||||||
|
|
||||||
row = pixel_surround_rowstride (surround);
|
row = pixel_surround_rowstride (surround);
|
||||||
|
|
||||||
|
@ -1767,53 +1780,36 @@ sample_lanczos (PixelSurround *surround,
|
||||||
|
|
||||||
weight = lusum * lvsum;
|
weight = lusum * lvsum;
|
||||||
|
|
||||||
if (alpha != 0)
|
for ( aval = 0, i = 0 ; i < LANCZOS_WIDTH2 ; i ++ )
|
||||||
|
aval += lv[i] * lanczos_sum (data, lu, i * row, bytes, alpha);
|
||||||
|
|
||||||
|
/* calculate alpha of result */
|
||||||
|
aval /= weight;
|
||||||
|
|
||||||
|
if ( aval <= 0.0 )
|
||||||
{
|
{
|
||||||
for ( aval = 0, i = 0 ; i < LANCZOS_WIDTH2 ; i ++ )
|
arecip = 0.0;
|
||||||
aval += lv[i] * lanczos_sum (data, lu,
|
color[alpha] = 0;
|
||||||
i * LANCZOS_WIDTH2 * bytes,
|
}
|
||||||
bytes, alpha);
|
else if ( aval > 255.0 )
|
||||||
|
{
|
||||||
/* calculate alpha of result */
|
arecip = 1.0 / aval;
|
||||||
aval /= weight;
|
color[alpha] = 255;
|
||||||
|
|
||||||
if ( aval <= 0.0 )
|
|
||||||
{
|
|
||||||
arecip = 0.0;
|
|
||||||
color[alpha] = 0;
|
|
||||||
}
|
|
||||||
else if ( aval > 255.0 )
|
|
||||||
{
|
|
||||||
arecip = 1.0 / aval;
|
|
||||||
color[alpha] = 255;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
arecip = 1.0 / aval;
|
|
||||||
color[alpha] = RINT (aval);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (byte = 0; byte < alpha; byte++)
|
|
||||||
{
|
|
||||||
for (newval = 0, i = 0; i < LANCZOS_WIDTH2; i ++)
|
|
||||||
newval += lv[i] * lanczos_sum_mul (data, lu,
|
|
||||||
i * LANCZOS_WIDTH2 * bytes,
|
|
||||||
bytes, byte, alpha);
|
|
||||||
newval *= arecip;
|
|
||||||
color[byte] = CLAMP (newval, 0, 255);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (byte = 0; byte < bytes; byte++)
|
arecip = 1.0 / aval;
|
||||||
{
|
color[alpha] = RINT (aval);
|
||||||
for (newval = 0, i = 0 ; i < LANCZOS_WIDTH2 ; i++ )
|
|
||||||
newval += lv[i] * lanczos_sum (data, lu,
|
|
||||||
i * LANCZOS_WIDTH2 * bytes,
|
|
||||||
bytes, byte);
|
|
||||||
|
|
||||||
newval /= weight;
|
|
||||||
color[byte] = CLAMP ((gint) newval, 0, 255);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (byte = 0; byte < alpha; byte++)
|
||||||
|
{
|
||||||
|
for (newval = 0, i = 0; i < LANCZOS_WIDTH2; i ++)
|
||||||
|
newval += lv[i] * lanczos_sum_mul (data, lu,
|
||||||
|
i * row, bytes, byte, alpha);
|
||||||
|
newval *= arecip;
|
||||||
|
color[byte] = CLAMP (newval, 0, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
pixel_surround_release (surround);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue