Commit 181c6698 authored by Sven Neumann's avatar Sven Neumann

Sorry for breaking the freeze, but I had these almost ready for weeks now...


--Sven
parent 7af9b466
Thu Sep 9 03:45:39 MEST 1999 Sven Neumann <sven@gimp.org>
* app/airbrush.c
* app/clone.c
* app/convolve.c
* app/dodgeburn.c
* app/eraser.c
* app/gimage_mask.c
* app/paint_core.c
* app/paint_core.h
* app/paint_options.h
* app/paintbrush.c
* app/pencil.c
* app/smudge.c
* app/tool_options.c: Enhanced pressure sensitivity for all paint
tools. I could have checked this in yesterday, but you wouldn't have
liked it...
Users without a tablet shouldn't notice a different behaviour (despite
the options, that I'm planning to hide for non-xinput devices).
This still needs some work, especially the brush spacing sucks for
scaled brushes ...
Thu Sep 9 00:56:42 CEST 1999 Marc Lehmann <pcg@goof.com>
* configure.in: Fixed typoe (fasle => false).
......
......@@ -19,6 +19,7 @@
#include "appenv.h"
#include "gimpbrushlist.h"
#include "gimpbrushpipe.h"
#include "gradient.h"
#include "drawable.h"
#include "errors.h"
#include "gdisplay.h"
......@@ -80,7 +81,8 @@ static double non_gui_pressure;
static gboolean non_gui_incremental;
/* forward function declarations */
static void airbrush_motion (PaintCore *, GimpDrawable *, double, PaintApplicationMode);
static void airbrush_motion (PaintCore *, GimpDrawable *, PaintPressureOptions *,
double, PaintApplicationMode);
static gint airbrush_time_out (gpointer);
......@@ -217,7 +219,9 @@ airbrush_paint_func (PaintCore *paint_core,
gtk_timeout_remove (timer);
timer_state = OFF;
airbrush_motion (paint_core, drawable, airbrush_options->pressure,
airbrush_motion (paint_core, drawable,
airbrush_options->paint_options.pressure_options,
airbrush_options->pressure,
airbrush_options->paint_options.incremental ?
INCREMENTAL : CONSTANT);
......@@ -262,6 +266,7 @@ airbrush_time_out (gpointer client_data)
/* service the timer */
airbrush_motion (airbrush_timeout.paint_core,
airbrush_timeout.drawable,
airbrush_options->paint_options.pressure_options,
airbrush_options->pressure,
airbrush_options->paint_options.incremental ?
INCREMENTAL : CONSTANT);
......@@ -276,15 +281,16 @@ airbrush_time_out (gpointer client_data)
static void
airbrush_motion (PaintCore *paint_core,
GimpDrawable *drawable,
double pressure,
PaintApplicationMode mode)
airbrush_motion (PaintCore *paint_core,
GimpDrawable *drawable,
PaintPressureOptions *pressure_options,
double pressure,
PaintApplicationMode mode)
{
gint opacity;
GImage *gimage;
TempBuf * area;
unsigned char col[MAX_CHANNELS];
gdouble scale;
if (!drawable)
return;
......@@ -292,7 +298,12 @@ airbrush_motion (PaintCore *paint_core,
if (! (gimage = drawable_gimage (drawable)))
return;
if (! (area = paint_core_get_paint_area (paint_core, drawable)))
if (pressure_options->size)
scale = paint_core->curpressure;
else
scale = 1.0;
if (! (area = paint_core_get_paint_area (paint_core, drawable, scale)))
return;
if (GIMP_IS_BRUSH_PIXMAP (paint_core->brush))
......@@ -303,31 +314,44 @@ airbrush_motion (PaintCore *paint_core,
else
{
/* color the pixels */
gimage_get_foreground (gimage, drawable, col);
col[area->bytes - 1] = OPAQUE_OPACITY;
if (pressure_options->color)
{
gdouble r, g, b, a;
grad_get_color_at (paint_core->curpressure, &r, &g, &b, &a);
col[0] = r * 255.0;
col[1] = g * 255.0;
col[2] = b * 255.0;
col[3] = a * 255.0;
mode = INCREMENTAL;
}
else
{
gimage_get_foreground (gimage, drawable, col);
col[area->bytes - 1] = OPAQUE_OPACITY;
}
color_pixels (temp_buf_data (area), col,
area->width * area->height, area->bytes);
}
opacity = pressure * (paint_core->curpressure / 0.5);
if (opacity > 255)
opacity = 255;
if (pressure_options->pressure)
pressure = pressure * 2.0 * paint_core->curpressure;
/* paste the newly painted area to the image */
paint_core_paste_canvas (paint_core, drawable,
opacity,
MIN (pressure, 255),
(gint) (gimp_context_get_opacity (NULL) * 255),
gimp_context_get_paint_mode (NULL),
SOFT, mode);
SOFT, scale, mode);
}
static void *
airbrush_non_gui_paint_func (PaintCore *paint_core,
GimpDrawable *drawable,
int state)
{
airbrush_motion (paint_core, drawable, non_gui_pressure, non_gui_incremental);
airbrush_motion (paint_core, drawable, &non_gui_pressure_options,
non_gui_pressure, non_gui_incremental);
return NULL;
}
......@@ -343,7 +367,7 @@ airbrush_non_gui_default (GimpDrawable *drawable,
if(options)
pressure = options->pressure;
return airbrush_non_gui(drawable,pressure,num_strokes,stroke_array);
return airbrush_non_gui (drawable, pressure, num_strokes, stroke_array);
}
gboolean
......
......@@ -90,7 +90,7 @@ static CloneType non_gui_type;
static void clone_draw (Tool *);
static void clone_motion (PaintCore *, GimpDrawable *, GimpDrawable *,
CloneType, int, int);
PaintPressureOptions *, CloneType, int, int);
static void clone_line_image (GImage *, GImage *, GimpDrawable *,
GimpDrawable *, unsigned char *,
unsigned char *, int, int, int, int);
......@@ -294,7 +294,9 @@ clone_paint_func (PaintCore *paint_core,
src_x = dest_x + offset_x;
src_y = dest_y + offset_y;
clone_motion (paint_core, drawable, src_drawable_, clone_options->type, offset_x, offset_y);
clone_motion (paint_core, drawable, src_drawable_,
clone_options->paint_options.pressure_options,
clone_options->type, offset_x, offset_y);
}
draw_core_pause (paint_core->core, active_tool);
......@@ -455,12 +457,13 @@ clone_draw (Tool *tool)
}
static void
clone_motion (PaintCore *paint_core,
GimpDrawable *drawable,
GimpDrawable *src_drawable,
CloneType type,
int offset_x,
int offset_y)
clone_motion (PaintCore *paint_core,
GimpDrawable *drawable,
GimpDrawable *src_drawable,
PaintPressureOptions *pressure_options,
CloneType type,
int offset_x,
int offset_y)
{
GImage *gimage;
GImage *src_gimage = NULL;
......@@ -475,6 +478,7 @@ clone_motion (PaintCore *paint_core,
PixelRegion srcPR, destPR;
GPatternP pattern;
gint opacity;
gdouble scale;
pr = NULL;
pattern = NULL;
......@@ -494,8 +498,13 @@ clone_motion (PaintCore *paint_core,
if (! (gimage = drawable_gimage (drawable)))
return;
if (pressure_options->size)
scale = paint_core->curpressure;
else
scale = 1.0;
/* Get a region which can be used to paint to */
if (! (area = paint_core_get_paint_area (paint_core, drawable)))
if (! (area = paint_core_get_paint_area (paint_core, drawable, scale)))
return;
switch (type)
......@@ -603,19 +612,17 @@ clone_motion (PaintCore *paint_core,
}
}
/*Make the clone tool pressure sencitive */
opacity = 255 * gimp_context_get_opacity (NULL) * (paint_core->curpressure / 0.5);
if (opacity > 255)
opacity = 255;
opacity = 255.0 * gimp_context_get_opacity (NULL);
if (pressure_options->opacity)
opacity = opacity * 2.0 * paint_core->curpressure;
/* paste the newly painted canvas to the gimage which is being worked on */
paint_core_paste_canvas (paint_core, drawable, opacity,
paint_core_paste_canvas (paint_core, drawable,
MIN (opacity, 255),
(int) (gimp_context_get_opacity (NULL) * 255),
gimp_context_get_paint_mode (NULL),
SOFT, CONSTANT);
pressure_options->pressure ? PRESSURE : SOFT,
scale, CONSTANT);
}
......@@ -696,7 +703,7 @@ clone_non_gui_paint_func (PaintCore *paint_core,
GimpDrawable *drawable,
int state)
{
clone_motion (paint_core, drawable, non_gui_src_drawable,
clone_motion (paint_core, drawable, non_gui_src_drawable, &non_gui_pressure_options,
non_gui_type, non_gui_offset_x, non_gui_offset_y);
return NULL;
......
......@@ -105,7 +105,8 @@ static void integer_matrix (float *, int *, int);
static void copy_matrix (float *, float *, int);
static int sum_matrix (int *, int);
static void convolve_motion (PaintCore *, GimpDrawable *, ConvolveType, double);
static void convolve_motion (PaintCore *, GimpDrawable *, PaintPressureOptions *,
ConvolveType, double);
/* functions */
......@@ -188,7 +189,9 @@ convolve_paint_func (PaintCore *paint_core,
switch (state)
{
case MOTION_PAINT:
convolve_motion (paint_core, drawable,convolve_options->type, convolve_options->pressure);
convolve_motion (paint_core, drawable,
convolve_options->paint_options.pressure_options,
convolve_options->type, convolve_options->pressure);
break;
}
......@@ -254,15 +257,17 @@ tools_free_convolve (Tool *tool)
}
static void
convolve_motion (PaintCore *paint_core,
GimpDrawable *drawable,
ConvolveType type,
double pressure)
convolve_motion (PaintCore *paint_core,
GimpDrawable *drawable,
PaintPressureOptions *pressure_options,
ConvolveType type,
double pressure)
{
GImage *gimage;
TempBuf * area;
unsigned char *temp_data;
PixelRegion srcPR, destPR, tempPR;
gdouble scale;
if (! (gimage = drawable_gimage (drawable)))
return;
......@@ -272,8 +277,13 @@ convolve_motion (PaintCore *paint_core,
(drawable_type (drawable) == INDEXEDA_GIMAGE))
return;
if (pressure_options->size)
scale = paint_core->curpressure;
else
scale = 1.0;
/* Get a region which can be used to paint to */
if (! (area = paint_core_get_paint_area (paint_core, drawable)))
if (! (area = paint_core_get_paint_area (paint_core, drawable, scale)))
return;
/* configure the pixel regions correctly */
......@@ -357,7 +367,7 @@ convolve_motion (PaintCore *paint_core,
/* paste the newly painted canvas to the gimage which is being worked on */
paint_core_replace_canvas (paint_core, drawable, OPAQUE_OPACITY,
(int) (gimp_context_get_opacity (NULL) * 255),
SOFT, INCREMENTAL);
SOFT, scale, INCREMENTAL);
}
static void
......@@ -441,7 +451,8 @@ convolve_non_gui_paint_func (PaintCore *paint_core,
GimpDrawable *drawable,
int state)
{
convolve_motion (paint_core, drawable,non_gui_type,non_gui_pressure);
convolve_motion (paint_core, drawable, &non_gui_pressure_options,
non_gui_type, non_gui_pressure);
return NULL;
}
......
......@@ -629,7 +629,7 @@ gimage_mask_stroke_paint_func (PaintCore *paint_core,
gimage_get_foreground (gimage, drawable, col);
/* Get a region which can be used to paint to */
if (! (area = paint_core_get_paint_area (paint_core, drawable)))
if (! (area = paint_core_get_paint_area (paint_core, drawable, 1.0)))
return NULL;
/* set the alpha channel */
......@@ -649,7 +649,7 @@ gimage_mask_stroke_paint_func (PaintCore *paint_core,
paint_core_paste_canvas (paint_core, drawable, OPAQUE_OPACITY,
(int) (gimp_context_get_opacity (context) * 255),
gimp_context_get_paint_mode (context),
SOFT, CONSTANT);
SOFT, 1.0, CONSTANT);
return NULL;
}
......@@ -30,6 +30,9 @@
/* a list of all PaintOptions */
static GSList *paint_options_list = NULL;
static PaintPressureOptions * paint_pressure_options_new (ToolType);
static void paint_pressure_options_reset (PaintPressureOptions *);
/* ui helper functions ******************************************************/
......@@ -577,12 +580,13 @@ paint_options_init (PaintOptions *options,
reset_func);
/* initialize the paint options structure */
options->incremental = options->incremental_d = FALSE;
options->global = NULL;
options->opacity_w = NULL;
options->paint_mode_w = NULL;
options->incremental_w = NULL;
options->incremental = options->incremental_d = FALSE;
options->pressure_options = paint_pressure_options_new (tool_type);
/* the main vbox */
vbox = gtk_vbox_new (FALSE, 2);
......@@ -706,15 +710,6 @@ paint_options_init (PaintOptions *options,
options->incremental_d);
gtk_widget_show (options->incremental_w);
/* a separator after the common paint options which can't be global */
if (tool_type != PENCIL)
{
separator = gtk_hseparator_new ();
gtk_box_pack_start (GTK_BOX (options->tool_options.main_vbox),
separator, FALSE, FALSE, 0);
gtk_widget_show (separator);
}
break;
case BUCKET_FILL:
case BLEND:
case CLONE:
......@@ -726,6 +721,14 @@ paint_options_init (PaintOptions *options,
break;
}
options->pressure_options = paint_pressure_options_new (tool_type);
if (options->pressure_options->frame)
{
gtk_box_pack_start (GTK_BOX (options->tool_options.main_vbox),
options->pressure_options->frame, FALSE, FALSE, 0);
gtk_widget_show (options->pressure_options->frame);
}
/* register this Paintoptions structure */
paint_options_list = g_slist_prepend (paint_options_list, options);
}
......@@ -773,8 +776,165 @@ paint_options_reset (PaintOptions *options)
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(options->incremental_w),
options->incremental_d);
}
paint_pressure_options_reset (options->pressure_options);
}
static PaintPressureOptions *
paint_pressure_options_new (ToolType tool_type)
{
PaintPressureOptions *pressure;
GtkWidget *frame = NULL;
GtkWidget *hbox = NULL;
pressure = g_new (PaintPressureOptions, 1);
pressure->opacity_w = NULL;
pressure->opacity = pressure->opacity_d =TRUE;
pressure->pressure_w = NULL;
pressure->pressure = pressure->pressure_d = TRUE;
pressure->size_w = NULL;
pressure->size = pressure->size_d = FALSE;
pressure->color_w = NULL;
pressure->color = pressure->color_d = FALSE;
switch (tool_type)
{
case CLONE:
case CONVOLVE:
case DODGEBURN:
case SMUDGE:
case AIRBRUSH:
case ERASER:
case PAINTBRUSH:
case PENCIL:
frame = gtk_frame_new (_("Pressure sensitivity"));
hbox = gtk_hbox_new (FALSE, 2);
gtk_container_add (GTK_CONTAINER (frame), hbox);
gtk_widget_show (hbox);
break;
default:
break;
}
/* the opacity toggle */
switch (tool_type)
{
case AIRBRUSH:
case CLONE:
case ERASER:
case PAINTBRUSH:
case PENCIL:
pressure->opacity_w =
gtk_check_button_new_with_label (_("Opacity"));
gtk_container_add (GTK_CONTAINER (hbox), pressure->opacity_w);
gtk_signal_connect (GTK_OBJECT (pressure->opacity_w), "toggled",
(GtkSignalFunc) tool_options_toggle_update,
&pressure->opacity);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pressure->opacity_w),
pressure->opacity_d);
gtk_widget_show (pressure->opacity_w);
break;
default:
break;
}
/* the pressure toggle */
switch (tool_type)
{
case CLONE:
case DODGEBURN:
case SMUDGE:
case ERASER:
case PAINTBRUSH:
pressure->pressure_w =
gtk_check_button_new_with_label (_("Pressure"));
gtk_container_add (GTK_CONTAINER (hbox), pressure->pressure_w);
gtk_signal_connect (GTK_OBJECT (pressure->pressure_w), "toggled",
(GtkSignalFunc) tool_options_toggle_update,
&pressure->pressure);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pressure->pressure_w),
pressure->pressure_d);
gtk_widget_show (pressure->pressure_w);
break;
default:
break;
}
/* the size toggle */
switch (tool_type)
{
case AIRBRUSH:
case CLONE:
case CONVOLVE:
case DODGEBURN:
case ERASER:
case PAINTBRUSH:
case PENCIL:
pressure->size_w =
gtk_check_button_new_with_label (_("Size"));
gtk_container_add (GTK_CONTAINER (hbox), pressure->size_w);
gtk_signal_connect (GTK_OBJECT (pressure->size_w), "toggled",
(GtkSignalFunc) tool_options_toggle_update,
&pressure->size);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pressure->size_w),
pressure->size_d);
gtk_widget_show (pressure->size_w);
break;
default:
break;
}
/* the color toggle */
switch (tool_type)
{
case AIRBRUSH:
case PAINTBRUSH:
case PENCIL:
pressure->color_w =
gtk_check_button_new_with_label (_("Color"));
gtk_container_add (GTK_CONTAINER (hbox), pressure->color_w);
gtk_signal_connect (GTK_OBJECT (pressure->color_w), "toggled",
(GtkSignalFunc) tool_options_toggle_update,
&pressure->color);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pressure->color_w),
pressure->color_d);
gtk_widget_show (pressure->color_w);
break;
default:
break;
}
pressure->frame = frame;
return (pressure);
}
static void
paint_pressure_options_reset (PaintPressureOptions *pressure)
{
if (pressure->opacity_w)
{
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pressure->opacity_w),
pressure->opacity_d);
}
if (pressure->pressure_w)
{
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pressure->pressure_w),
pressure->pressure_d);
}
if (pressure->size_w)
{
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pressure->size_w),
pressure->size_d);
}
if (pressure->color_w)
{
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pressure->color_w),
pressure->color_d);
}
}
/* global paint options functions *******************************************/
......
......@@ -44,29 +44,30 @@
typedef struct _DodgeBurnOptions DodgeBurnOptions;
struct _DodgeBurnOptions
{
PaintOptions paint_options;
PaintOptions paint_options;
DodgeBurnType type;
DodgeBurnType type_d;
GtkWidget *type_w[2];
GtkWidget *type_w[2];
DodgeBurnMode mode; /*highlights,midtones,shadows*/
DodgeBurnMode mode_d;
GtkWidget *mode_w[3];
GtkWidget *mode_w[3];
double exposure;
double exposure_d;
GtkObject *exposure_w;
double exposure;
double exposure_d;
GtkObject *exposure_w;
GimpLut *lut;
GimpLut *lut;
};
static void
dodgeburn_make_luts ( PaintCore *, double, DodgeBurnType, DodgeBurnMode, GimpLut *, GimpDrawable *);
dodgeburn_make_luts (PaintCore *, double, DodgeBurnType, DodgeBurnMode,
GimpLut *, GimpDrawable *);
static gfloat dodgeburn_highlights_lut_func(void *, int, int, gfloat);
static gfloat dodgeburn_midtones_lut_func(void *, int, int, gfloat);
static gfloat dodgeburn_shadows_lut_func(void *, int, int, gfloat);
static gfloat dodgeburn_highlights_lut_func (void *, int, int, gfloat);
static gfloat dodgeburn_midtones_lut_func (void *, int, int, gfloat);
static gfloat dodgeburn_shadows_lut_func (void *, int, int, gfloat);
/* The dodge burn lookup tables */
gfloat dodgeburn_highlights(void *, int, int, gfloat);
......@@ -85,7 +86,9 @@ static GimpLut *non_gui_lut;
#define DODGEBURN_DEFAULT_EXPOSURE 50.0
#define DODGEBURN_DEFAULT_MODE DODGEBURN_HIGHLIGHTS
static void dodgeburn_motion (PaintCore *, double, GimpLut *, GimpDrawable *);
static void dodgeburn_motion (PaintCore *,
PaintPressureOptions *,
double, GimpLut *, GimpDrawable *);
static void dodgeburn_init (PaintCore *, GimpDrawable *);
static void dodgeburn_finish (PaintCore *, GimpDrawable *);
......@@ -200,7 +203,9 @@ dodgeburn_paint_func (PaintCore *paint_core,
dodgeburn_init (paint_core, drawable);
break;
case MOTION_PAINT:
dodgeburn_motion (paint_core, dodgeburn_options->exposure, dodgeburn_options->lut, drawable);
dodgeburn_motion (paint_core,
dodgeburn_options->paint_options.pressure_options,
dodgeburn_options->exposure, dodgeburn_options->lut, drawable);
break;
case FINISH_PAINT:
dodgeburn_finish (paint_core, drawable);
......@@ -337,10 +342,11 @@ tools_free_dodgeburn (Tool *tool)
}
static void
dodgeburn_motion (PaintCore *paint_core,
double dodgeburn_exposure,
GimpLut *lut,
GimpDrawable *drawable)
dodgeburn_motion (PaintCore *paint_core,
PaintPressureOptions *pressure_options,
double dodgeburn_exposure,
GimpLut *lut,
GimpDrawable *drawable)
{
GImage *gimage;
TempBuf * area;
......@@ -348,7 +354,8 @@ dodgeburn_motion (PaintCore *paint_core,
PixelRegion srcPR, destPR, tempPR;
guchar *temp_data;
gfloat exposure;
gfloat brush_opacity;
gint opacity;
gdouble scale;
if (! (gimage = drawable_gimage (drawable)))
return;
......@@ -358,8 +365,13 @@ dodgeburn_motion (PaintCore *paint_core,
(drawable_type (drawable) == INDEXEDA_GIMAGE))
return;
if (pressure_options->size)
scale = paint_core->curpressure;
else
scale = 1.0;
/* Get a region which can be used to paint to */
if (! (area = paint_core_get_paint_area (paint_core, drawable)))
if (! (area = paint_core_get_paint_area (paint_core, drawable, scale)))
return;
/* Constant painting --get a copy of the orig drawable (with
......@@ -396,8 +408,6 @@ dodgeburn_motion (PaintCore *paint_core,
temp_data = g_malloc (tempPR.h * tempPR.rowstride);
tempPR.data = temp_data;
brush_opacity = gimp_context_get_opacity (NULL);
/* Enable pressure sensitive exposure */
exposure = ((dodgeburn_exposure)/100.0 * (paint_core->curpressure)/0.5);
......@@ -419,10 +429,16 @@ dodgeburn_motion (PaintCore *paint_core,
else
copy_region(&tempPR, &destPR);
/*Replace the newly dodgedburned area (canvas_buf) to the gimage*/
paint_core_replace_canvas (paint_core, drawable, ROUND(brush_opacity * 255.0),
OPAQUE_OPACITY, PRESSURE, CONSTANT);
opacity = 255 * gimp_context_get_opacity (NULL);
if (pressure_options->opacity)
opacity = opacity * 2.0 * paint_core->curpressure;
/*Replace the newly dodgedburned area (canvas_buf) to the gimage*/
paint_core_replace_canvas (paint_core, drawable,
MIN (opacity, 255),
OPAQUE_OPACITY,
pressure_options->pressure ? PRESSURE : SOFT,
scale, CONSTANT);
g_free (temp_data);
}
......@@ -432,7 +448,8 @@ dodgeburn_non_gui_paint_func (PaintCore *paint_core,
GimpDrawable *drawable,
int state)
{
dodgeburn_motion (paint_core, non_gui_exposure, non_gui_lut, drawable);
dodgeburn_motion (paint_core, &non_gui_pressure_options,
non_gui_exposure, non_gui_lut, drawable);
return NULL;
}
......@@ -454,7 +471,7 @@ dodgeburn_non_gui_default (GimpDrawable *drawable,
mode = dodgeburn_options->mode;
}
return dodgeburn_non_gui(drawable,exposure,type,mode,num_strokes,stroke_array);
return dodgeburn_non_gui (drawable, exposure, type, mode, num_strokes, stroke_array);
}
gboolean
......
......@@ -66,6 +66,7 @@ static gboolean non_gui_anti_erase;
/* forward function declarations */
static void eraser_motion (PaintCore *, GimpDrawable *,
PaintPressureOptions *,
gboolean, gboolean, gboolean);
......@@ -156,6 +157,7 @@ eraser_paint_func (PaintCore *paint_core,
case MOTION_PAINT :
eraser_motion (paint_core,
drawable,
eraser_options->paint_options.pressure_options,
eraser_options->hard,
eraser_options->paint_options.incremental,
eraser_options->anti_erase);
...