Commit 733d6335 authored by Michael Natterer's avatar Michael Natterer 😴 Committed by Michael Natterer

Made the interpolation type configurable in the scale and transform

2002-02-12  Michael Natterer  <mitch@gimp.org>

	Made the interpolation type configurable in the scale and
	transform options dialogs (#69251):

	* app/base/base-config.[ch]
	* app/config/gimpbaseconfig.[ch]: removed interpolation_type here...

	* app/core/gimpcoreconfig.[ch]
	* app/config/gimpcoreconfig.[ch]: ...and added it here.

	* app/gimprc.c
	* app/gui/preferences-dialog.c: changed accordingly.

	* app/paint-funcs/paint-funcs.[ch]: scale_region: take an
	interpolation_type parameter.

	* app/core/gimpchannel.[ch]
	* app/core/gimpdrawable-transform.[ch]
	* app/core/gimpimage-scale.[ch]
	* app/core/gimplayer.[ch]: pass interpolation_type parameters to all
	scale and transform functions.

	* tools/pdbgen/pdb/image.pdb
	* tools/pdbgen/pdb/layer.pdb
	* tools/pdbgen/pdb/transform_tools.pdb: changed accordingly.

	* app/gui/resize-dialog.[ch]
	* app/tools/transform_options.[ch]: added an interpolation_type menu.

	* app/gui/image-commands.c
	* app/gui/layers-commands.c
	* app/tools/gimptransformtool.c: changed accordingly.

	* app/pdb/image_cmds.c
	* app/pdb/layer_cmds.c
	* app/pdb/transform_tools_cmds.c: regenerated.
parent 912dc07c
2002-02-12 Michael Natterer <mitch@gimp.org>
Made the interpolation type configurable in the scale and
transform options dialogs (#69251):
* app/base/base-config.[ch]
* app/config/gimpbaseconfig.[ch]: removed interpolation_type here...
* app/core/gimpcoreconfig.[ch]
* app/config/gimpcoreconfig.[ch]: ...and added it here.
* app/gimprc.c
* app/gui/preferences-dialog.c: changed accordingly.
* app/paint-funcs/paint-funcs.[ch]: scale_region: take an
interpolation_type parameter.
* app/core/gimpchannel.[ch]
* app/core/gimpdrawable-transform.[ch]
* app/core/gimpimage-scale.[ch]
* app/core/gimplayer.[ch]: pass interpolation_type parameters to all
scale and transform functions.
* tools/pdbgen/pdb/image.pdb
* tools/pdbgen/pdb/layer.pdb
* tools/pdbgen/pdb/transform_tools.pdb: changed accordingly.
* app/gui/resize-dialog.[ch]
* app/tools/transform_options.[ch]: added an interpolation_type menu.
* app/gui/image-commands.c
* app/gui/layers-commands.c
* app/tools/gimptransformtool.c: changed accordingly.
* app/pdb/image_cmds.c
* app/pdb/layer_cmds.c
* app/pdb/transform_tools_cmds.c: regenerated.
2002-02-12 Sven Neumann <sven@gimp.org>
* plug-ins/MapObject/mapobject_preview.c:
......
......@@ -349,6 +349,7 @@ image_scale_implement (ImageResize *image_scale)
gimp_image_scale (gimage,
image_scale->resize->width,
image_scale->resize->height,
image_scale->resize->interpolation,
progress_update_and_flush, progress);
progress_end (progress);
......
......@@ -1021,7 +1021,9 @@ scale_layer_query_ok_callback (GtkWidget *widget,
floating_sel_relax (layer, TRUE);
gimp_layer_scale (layer,
options->resize->width, options->resize->height,
options->resize->width,
options->resize->height,
options->resize->interpolation,
TRUE);
if (gimp_layer_is_floating_sel (layer))
......
......@@ -37,8 +37,7 @@ static GimpBaseConfig static_base_config =
INIT_MEMBER(swap_path , NULL),
INIT_MEMBER(tile_cache_size , 33554432),
INIT_MEMBER(stingy_memory_use , FALSE),
INIT_MEMBER(interpolation_type , GIMP_LINEAR_INTERPOLATION),
INIT_MEMBER(stingy_memory_use, FALSE),
INIT_MEMBER(num_processors , 1)
};
......
......@@ -28,7 +28,6 @@ struct _GimpBaseConfig
gchar *swap_path;
guint tile_cache_size;
gboolean stingy_memory_use;
GimpInterpolationType interpolation_type;
gint num_processors;
};
......
......@@ -51,7 +51,6 @@ enum
PROP_STINGY_MEMORY_USE,
PROP_NUM_PROCESSORS,
PROP_TILE_CACHE_SIZE,
PROP_INTERPOLATION_TYPE,
};
static GObjectClass *parent_class = NULL;
......@@ -114,10 +113,6 @@ gimp_base_config_class_init (GimpBaseConfigClass *klass)
GIMP_CONFIG_INSTALL_PROP_MEMSIZE (object_class, PROP_TILE_CACHE_SIZE,
"tile-cache-size",
0, G_MAXUINT, 1 << 25);
GIMP_CONFIG_INSTALL_PROP_ENUM (object_class, PROP_INTERPOLATION_TYPE,
"interpolation-type",
GIMP_TYPE_INTERPOLATION_TYPE,
GIMP_LINEAR_INTERPOLATION);
}
static void
......@@ -162,9 +157,6 @@ gimp_base_config_set_property (GObject *object,
case PROP_TILE_CACHE_SIZE:
base_config->tile_cache_size = g_value_get_uint (value);
break;
case PROP_INTERPOLATION_TYPE:
base_config->interpolation_type = g_value_get_enum (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
......@@ -198,9 +190,6 @@ gimp_base_config_get_property (GObject *object,
case PROP_TILE_CACHE_SIZE:
g_value_set_uint (value, base_config->tile_cache_size);
break;
case PROP_INTERPOLATION_TYPE:
g_value_set_enum (value, base_config->interpolation_type);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
......
......@@ -44,7 +44,6 @@ struct _GimpBaseConfig
gboolean stingy_memory_use;
guint num_processors;
guint tile_cache_size;
GimpInterpolationType interpolation_type;
};
struct _GimpBaseConfigClass
......
......@@ -46,6 +46,7 @@ static void gimp_core_config_get_property (GObject *object,
enum
{
PROP_0,
PROP_INTERPOLATION_TYPE,
PROP_PLUG_IN_PATH,
PROP_TOOL_PLUG_IN_PATH,
PROP_MODULE_PATH,
......@@ -119,6 +120,10 @@ gimp_core_config_class_init (GimpCoreConfigClass *klass)
object_class->set_property = gimp_core_config_set_property;
object_class->get_property = gimp_core_config_get_property;
GIMP_CONFIG_INSTALL_PROP_ENUM (object_class, PROP_INTERPOLATION_TYPE,
"interpolation-type",
GIMP_TYPE_INTERPOLATION_TYPE,
GIMP_LINEAR_INTERPOLATION);
GIMP_CONFIG_INSTALL_PROP_PATH (object_class, PROP_PLUG_IN_PATH,
"plug-in-path",
gimp_config_build_plug_in_path ("plug-ins"));
......@@ -240,6 +245,9 @@ gimp_core_config_set_property (GObject *object,
switch (property_id)
{
case PROP_INTERPOLATION_TYPE:
core_config->interpolation_type = g_value_get_enum (value);
break;
case PROP_PLUG_IN_PATH:
g_free (core_config->plug_in_path);
core_config->plug_in_path = g_value_dup_string (value);
......@@ -354,6 +362,9 @@ gimp_core_config_get_property (GObject *object,
switch (property_id)
{
case PROP_INTERPOLATION_TYPE:
g_value_set_enum (value, core_config->interpolation_type);
break;
case PROP_PLUG_IN_PATH:
g_value_set_string (value, core_config->plug_in_path);
break;
......
......@@ -41,6 +41,7 @@ struct _GimpCoreConfig
{
GimpBaseConfig parent_instance;
GimpInterpolationType interpolation_type;
gchar *plug_in_path;
gchar *tool_plug_in_path;
gchar *module_path;
......
......@@ -79,7 +79,7 @@ static gdouble gimp_drawable_transform_cubic (gdouble dx,
TileManager *
gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
TileManager *float_tiles,
gboolean interpolation,
GimpInterpolationType interpolation_type,
gboolean clip_result,
GimpMatrix3 matrix,
GimpTransformDirection direction,
......@@ -123,9 +123,10 @@ gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
alpha = 0;
/* turn interpolation off for simple transformations (e.g. rot90) */
if (gimp_matrix3_is_simple (matrix) ||
base_config->interpolation_type == GIMP_NEAREST_NEIGHBOR_INTERPOLATION)
interpolation = FALSE;
if (gimp_matrix3_is_simple (matrix))
{
interpolation_type = GIMP_NEAREST_NEIGHBOR_INTERPOLATION;
}
/* Get the background color */
gimp_image_get_background (gimage, drawable, bg_col);
......@@ -144,7 +145,7 @@ gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
bg_col[ALPHA_I_PIX] = TRANSPARENT_OPACITY;
alpha = ALPHA_I_PIX;
/* If the gimage is indexed color, ignore smoothing value */
interpolation = FALSE;
interpolation_type = GIMP_NEAREST_NEIGHBOR_INTERPOLATION;
break;
default:
g_assert_not_reached ();
......@@ -230,21 +231,20 @@ gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
tile_manager_set_offsets (tiles, tx1, ty1);
/* initialise the pixel_surround accessor */
if (interpolation)
{
if (base_config->interpolation_type == GIMP_CUBIC_INTERPOLATION)
switch (interpolation_type)
{
case GIMP_CUBIC_INTERPOLATION:
pixel_surround_init (&surround, float_tiles, 4, 4, bg_col);
}
else
{
break;
case GIMP_LINEAR_INTERPOLATION:
pixel_surround_init (&surround, float_tiles, 2, 2, bg_col);
}
}
else
{
break;
case GIMP_NEAREST_NEIGHBOR_INTERPOLATION:
/* not actually useful, keeps the code cleaner */
pixel_surround_init (&surround, float_tiles, 1, 1, bg_col);
break;
}
width = tile_manager_width (tiles);
......@@ -292,10 +292,9 @@ gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
/* Set the destination pixels */
if (interpolation)
{
if (base_config->interpolation_type == GIMP_CUBIC_INTERPOLATION)
switch (interpolation_type)
{
case GIMP_CUBIC_INTERPOLATION:
/* ttx & tty are the subpixel coordinates of the point in
* the original selection's floating buffer.
* We need the four integer pixel coords around them:
......@@ -390,10 +389,9 @@ gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
for (b = 0; b < bytes; b++)
*d++ = bg_col[b];
}
}
break;
else /* linear */
{
case GIMP_LINEAR_INTERPOLATION:
itx = floor (ttx);
ity = floor (tty);
......@@ -477,10 +475,9 @@ gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
for (b = 0; b < bytes; b++)
*d++ = bg_col[b];
}
}
}
else /* no interpolation */
{
break;
case GIMP_NEAREST_NEIGHBOR_INTERPOLATION:
itx = floor (ttx);
ity = floor (tty);
......@@ -504,6 +501,7 @@ gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
for (b = 0; b < bytes; b++)
*d++ = bg_col[b];
}
break;
}
/* increment the transformed coordinates */
......@@ -587,7 +585,7 @@ gimp_drawable_transform_tiles_flip (GimpDrawable *drawable,
gboolean
gimp_drawable_transform_affine (GimpDrawable *drawable,
gboolean interpolation,
GimpInterpolationType interpolation_type,
gboolean clip_result,
GimpMatrix3 matrix,
GimpTransformDirection direction)
......@@ -616,7 +614,7 @@ gimp_drawable_transform_affine (GimpDrawable *drawable,
/* transform the buffer */
new_tiles = gimp_drawable_transform_tiles_affine (drawable,
float_tiles,
interpolation,
interpolation_type,
FALSE,
matrix,
GIMP_TRANSFORM_FORWARD,
......
......@@ -280,7 +280,8 @@ gimp_channel_set_opacity (GimpChannel *channel,
void
gimp_channel_scale (GimpChannel *channel,
gint new_width,
gint new_height)
gint new_height,
GimpInterpolationType interpolation_type)
{
PixelRegion srcPR, destPR;
TileManager *new_tiles;
......@@ -312,7 +313,7 @@ gimp_channel_scale (GimpChannel *channel,
TRUE);
/* Sclae the channel */
scale_region (&srcPR, &destPR);
scale_region (&srcPR, &destPR, interpolation_type);
/* Push the channel on the undo stack */
undo_push_channel_mod (GIMP_DRAWABLE (channel)->gimage, channel);
......
......@@ -105,7 +105,8 @@ void gimp_channel_set_color (GimpChannel *channel,
void gimp_channel_scale (GimpChannel *channel,
gint new_width,
gint new_height);
gint new_height,
GimpInterpolationType interpolation_type);
void gimp_channel_resize (GimpChannel *channel,
gint new_width,
gint new_height,
......
......@@ -280,7 +280,8 @@ gimp_channel_set_opacity (GimpChannel *channel,
void
gimp_channel_scale (GimpChannel *channel,
gint new_width,
gint new_height)
gint new_height,
GimpInterpolationType interpolation_type)
{
PixelRegion srcPR, destPR;
TileManager *new_tiles;
......@@ -312,7 +313,7 @@ gimp_channel_scale (GimpChannel *channel,
TRUE);
/* Sclae the channel */
scale_region (&srcPR, &destPR);
scale_region (&srcPR, &destPR, interpolation_type);
/* Push the channel on the undo stack */
undo_push_channel_mod (GIMP_DRAWABLE (channel)->gimage, channel);
......
......@@ -105,7 +105,8 @@ void gimp_channel_set_color (GimpChannel *channel,
void gimp_channel_scale (GimpChannel *channel,
gint new_width,
gint new_height);
gint new_height,
GimpInterpolationType interpolation_type);
void gimp_channel_resize (GimpChannel *channel,
gint new_width,
gint new_height,
......
......@@ -29,11 +29,12 @@
void
gimp_core_config_init (Gimp *gimp)
{
g_return_if_fail (gimp != NULL);
g_return_if_fail (GIMP_IS_GIMP (gimp));
gimp->config = g_new0 (GimpCoreConfig, 1);
gimp->config->interpolation_type = GIMP_LINEAR_INTERPOLATION;
gimp->config->tool_plug_in_path = NULL;
gimp->config->plug_in_path = NULL;
gimp->config->module_path = NULL;
......
......@@ -22,6 +22,8 @@
struct _GimpCoreConfig
{
GimpInterpolationType interpolation_type;
gchar *plug_in_path;
gchar *tool_plug_in_path;
gchar *module_path;
......
......@@ -79,7 +79,7 @@ static gdouble gimp_drawable_transform_cubic (gdouble dx,
TileManager *
gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
TileManager *float_tiles,
gboolean interpolation,
GimpInterpolationType interpolation_type,
gboolean clip_result,
GimpMatrix3 matrix,
GimpTransformDirection direction,
......@@ -123,9 +123,10 @@ gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
alpha = 0;
/* turn interpolation off for simple transformations (e.g. rot90) */
if (gimp_matrix3_is_simple (matrix) ||
base_config->interpolation_type == GIMP_NEAREST_NEIGHBOR_INTERPOLATION)
interpolation = FALSE;
if (gimp_matrix3_is_simple (matrix))
{
interpolation_type = GIMP_NEAREST_NEIGHBOR_INTERPOLATION;
}
/* Get the background color */
gimp_image_get_background (gimage, drawable, bg_col);
......@@ -144,7 +145,7 @@ gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
bg_col[ALPHA_I_PIX] = TRANSPARENT_OPACITY;
alpha = ALPHA_I_PIX;
/* If the gimage is indexed color, ignore smoothing value */
interpolation = FALSE;
interpolation_type = GIMP_NEAREST_NEIGHBOR_INTERPOLATION;
break;
default:
g_assert_not_reached ();
......@@ -230,21 +231,20 @@ gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
tile_manager_set_offsets (tiles, tx1, ty1);
/* initialise the pixel_surround accessor */
if (interpolation)
{
if (base_config->interpolation_type == GIMP_CUBIC_INTERPOLATION)
switch (interpolation_type)
{
case GIMP_CUBIC_INTERPOLATION:
pixel_surround_init (&surround, float_tiles, 4, 4, bg_col);
}
else
{
break;
case GIMP_LINEAR_INTERPOLATION:
pixel_surround_init (&surround, float_tiles, 2, 2, bg_col);
}
}
else
{
break;
case GIMP_NEAREST_NEIGHBOR_INTERPOLATION:
/* not actually useful, keeps the code cleaner */
pixel_surround_init (&surround, float_tiles, 1, 1, bg_col);
break;
}
width = tile_manager_width (tiles);
......@@ -292,10 +292,9 @@ gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
/* Set the destination pixels */
if (interpolation)
{
if (base_config->interpolation_type == GIMP_CUBIC_INTERPOLATION)
switch (interpolation_type)
{
case GIMP_CUBIC_INTERPOLATION:
/* ttx & tty are the subpixel coordinates of the point in
* the original selection's floating buffer.
* We need the four integer pixel coords around them:
......@@ -390,10 +389,9 @@ gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
for (b = 0; b < bytes; b++)
*d++ = bg_col[b];
}
}
break;
else /* linear */
{
case GIMP_LINEAR_INTERPOLATION:
itx = floor (ttx);
ity = floor (tty);
......@@ -477,10 +475,9 @@ gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
for (b = 0; b < bytes; b++)
*d++ = bg_col[b];
}
}
}
else /* no interpolation */
{
break;
case GIMP_NEAREST_NEIGHBOR_INTERPOLATION:
itx = floor (ttx);
ity = floor (tty);
......@@ -504,6 +501,7 @@ gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
for (b = 0; b < bytes; b++)
*d++ = bg_col[b];
}
break;
}
/* increment the transformed coordinates */
......@@ -587,7 +585,7 @@ gimp_drawable_transform_tiles_flip (GimpDrawable *drawable,
gboolean
gimp_drawable_transform_affine (GimpDrawable *drawable,
gboolean interpolation,
GimpInterpolationType interpolation_type,
gboolean clip_result,
GimpMatrix3 matrix,
GimpTransformDirection direction)
......@@ -616,7 +614,7 @@ gimp_drawable_transform_affine (GimpDrawable *drawable,
/* transform the buffer */
new_tiles = gimp_drawable_transform_tiles_affine (drawable,
float_tiles,
interpolation,
interpolation_type,
FALSE,
matrix,
GIMP_TRANSFORM_FORWARD,
......
......@@ -35,7 +35,7 @@ typedef enum
TileManager * gimp_drawable_transform_tiles_affine (GimpDrawable *drawable,
TileManager *float_tiles,
gboolean interpolation,
GimpInterpolationType interpolation_type,
gboolean clip_result,
GimpMatrix3 matrix,
GimpTransformDirection direction,
......@@ -46,7 +46,7 @@ TileManager * gimp_drawable_transform_tiles_flip (GimpDrawable *drawable,
InternalOrientationType flip_type);
gboolean gimp_drawable_transform_affine (GimpDrawable *drawable,
gboolean interpolation,
GimpInterpolationType interpolation_type,
gboolean clip_result,
GimpMatrix3 matrix,
GimpTransformDirection direction);
......
......@@ -39,6 +39,7 @@ void
gimp_image_scale (GimpImage *gimage,
gint new_width,
gint new_height,
GimpInterpolationType interpolation_type,
GimpProgressFunc progress_func,
gpointer progress_data)
{
......@@ -93,7 +94,7 @@ gimp_image_scale (GimpImage *gimage,
{
channel = (GimpChannel *) list->data;
gimp_channel_scale (channel, new_width, new_height);
gimp_channel_scale (channel, new_width, new_height, interpolation_type);
if (progress_func)
{
......@@ -109,7 +110,8 @@ gimp_image_scale (GimpImage *gimage,
else
*/
gimp_channel_scale (gimage->selection_mask, new_width, new_height);
gimp_channel_scale (gimage->selection_mask, new_width, new_height,
interpolation_type);
gimp_image_mask_invalidate (gimage);
/* Scale all layers */
......@@ -119,7 +121,8 @@ gimp_image_scale (GimpImage *gimage,
{
layer = (GimpLayer *) list->data;
if (! gimp_layer_scale_by_factors (layer, img_scale_w, img_scale_h))
if (! gimp_layer_scale_by_factors (layer, img_scale_w, img_scale_h,
interpolation_type))
{
/* Since 0 < img_scale_w, img_scale_h, failure due to one or more
* vanishing scaled layer dimensions. Implicit delete implemented
......
......@@ -23,6 +23,7 @@
void gimp_image_scale (GimpImage *gimage,
gint new_width,
gint new_height,
GimpInterpolationType interpolation_type,
GimpProgressFunc progress_func,
gpointer progress_data);
......
......@@ -884,7 +884,8 @@ gimp_layer_scale_lowlevel (GimpLayer *layer,
gint new_width,
gint new_height,
gint new_offset_x,
gint new_offset_y)
gint new_offset_y,
GimpInterpolationType interpolation_type)
{
PixelRegion srcPR, destPR;
TileManager *new_tiles;
......@@ -915,11 +916,14 @@ gimp_layer_scale_lowlevel (GimpLayer *layer,
* resampling because that doesn't necessarily make sense for INDEXED
* images.
*/
if ((GIMP_DRAWABLE (layer)->type == GIMP_INDEXED_IMAGE) ||
(GIMP_DRAWABLE (layer)->type == GIMP_INDEXEDA_IMAGE))
scale_region_no_resample (&srcPR, &destPR);
if (GIMP_IMAGE_TYPE_IS_INDEXED (GIMP_DRAWABLE (layer)->type))
{
scale_region (&srcPR, &destPR, GIMP_NEAREST_NEIGHBOR_INTERPOLATION);
}
else
scale_region (&srcPR, &destPR);
{
scale_region (&srcPR, &destPR, interpolation_type);
}
/* Push the layer on the undo stack */
undo_push_layer_mod (GIMP_DRAWABLE (layer)->gimage, layer);
......@@ -937,7 +941,9 @@ gimp_layer_scale_lowlevel (GimpLayer *layer,
{
GIMP_DRAWABLE (layer->mask)->offset_x = GIMP_DRAWABLE (layer)->offset_x;
GIMP_DRAWABLE (layer->mask)->offset_y = GIMP_DRAWABLE (layer)->offset_y;
gimp_channel_scale (GIMP_CHANNEL (layer->mask), new_width, new_height);
gimp_channel_scale (GIMP_CHANNEL (layer->mask), new_width, new_height,
interpolation_type);
}
/* Make sure we're not caching any old selection info */
......@@ -1014,7 +1020,8 @@ gimp_layer_check_scaling (const GimpLayer *layer,
gboolean
gimp_layer_scale_by_factors (GimpLayer *layer,
gdouble w_factor,
gdouble h_factor)
gdouble h_factor,
GimpInterpolationType interpolation_type)
{
gint new_width, new_height;
gint new_offset_x, new_offset_y;
......@@ -1034,7 +1041,8 @@ gimp_layer_scale_by_factors (GimpLayer *layer,
{
gimp_layer_scale_lowlevel (layer,
new_width, new_height,
new_offset_x, new_offset_y);
new_offset_x, new_offset_y,
interpolation_type);
return TRUE;
}
......@@ -1072,6 +1080,7 @@ void
gimp_layer_scale (GimpLayer *layer,
gint new_width,
gint new_height,
GimpInterpolationType interpolation_type,
gboolean local_origin)
{
gint new_offset_x, new_offset_y;
......@@ -1103,7 +1112,8 @@ gimp_layer_scale (GimpLayer *layer,
gimp_layer_scale_lowlevel (layer,
new_width, new_height,
new_offset_x, new_offset_y);
new_offset_x, new_offset_y,
interpolation_type);
}
void
......