Fade dynamics. Add fade as one more dynamics driving factor on GUI. Implement fading dynamics calculation. Let fade work with all driven factors. Add pixel_dist parameter to get_dynamic_x. Adjusted function calls for get_dynamic_x.

* app/paint/gimppaintoptions.c: Add initialization for fading dynamics. Add fading related variables similar to Random. Adjust get_dynamics_mix function. Add fading calculation in get_dynamics_x functions. Adjust get_dynamic_x functions for fade dynamics.

	* app/paint/gimppaintoptions.h: Add fading_options in GimpDynamicOptions.

	* app/tools/gimppaintoptions-gui.c: Add the function fading_options_gui.

	* app/paint/gimpclone.c
	* app/paint/gimpdodgeburn.c
	* app/paint/gimperaser.c
	* app/paint/gimpheal.c
	* app/paint/gimppaintbrush.c
	* app/paint/gimpsmudge.c
	* app/paint/gimpairbrush.c
	* app/paint/gimpbrushcore.c
	* app/paint/gimpconvolve.c: Adjust function calls. get_dynamic_opacity function calls were adjusted to have one more parameter, paint_core->pixel_dist.

some key words:
get_dynamic_
pixel_dist
paint_core->pixel_dist
This commit is contained in:
zhenfeng zhao 2009-07-02 14:45:32 -03:00
parent fe09f320f8
commit 96baac783f
13 changed files with 448 additions and 62 deletions

9
.gitignore vendored
View File

@ -1,3 +1,12 @@
/.anjuta/
/.anjuta_sym_db.db
/TODO.tasks
*.anjuta
*.c~
*.h~
*.patch
/app/
/Makefile
/Makefile.in
/aclocal.m4

View File

@ -146,7 +146,8 @@ gimp_airbrush_paint (GimpPaintCore *paint_core,
airbrush->paint_options = paint_options;
dynamic_rate = gimp_paint_options_get_dynamic_rate (paint_options,
coords);
coords,
paint_core->pixel_dist);
timeout = 10000 / (options->rate * dynamic_rate);

View File

@ -374,12 +374,15 @@ gimp_brush_core_start (GimpPaintCore *paint_core,
if (GIMP_BRUSH_CORE_GET_CLASS (core)->handles_transforming_brush)
{
core->scale = gimp_paint_options_get_dynamic_size (paint_options, coords,
TRUE);
TRUE,
paint_core->pixel_dist);
core->angle = gimp_paint_options_get_dynamic_angle (paint_options, coords);
core->angle = gimp_paint_options_get_dynamic_angle (paint_options, coords,
paint_core->pixel_dist);
core->aspect_ratio =
gimp_paint_options_get_dynamic_aspect_ratio (paint_options, coords);
gimp_paint_options_get_dynamic_aspect_ratio (paint_options, coords,
paint_core->pixel_dist);
}
core->spacing = (gdouble) gimp_brush_get_spacing (core->main_brush) / 100.0;
@ -722,12 +725,15 @@ gimp_brush_core_get_paint_area (GimpPaintCore *paint_core,
if (GIMP_BRUSH_CORE_GET_CLASS (core)->handles_transforming_brush)
{
core->scale = gimp_paint_options_get_dynamic_size (paint_options, coords,
TRUE);
TRUE,
paint_core->pixel_dist);
core->angle = gimp_paint_options_get_dynamic_angle (paint_options, coords);
core->angle = gimp_paint_options_get_dynamic_angle (paint_options, coords,
paint_core->pixel_dist);
core->aspect_ratio =
gimp_paint_options_get_dynamic_aspect_ratio (paint_options, coords);
gimp_paint_options_get_dynamic_aspect_ratio (paint_options, coords,
paint_core->pixel_dist);
}
core->scale = gimp_brush_core_clamp_brush_scale (core, core->scale);

View File

@ -238,9 +238,11 @@ gimp_clone_motion (GimpSourceCore *source_core,
}
}
opacity *= gimp_paint_options_get_dynamic_opacity (paint_options, coords);
opacity *= gimp_paint_options_get_dynamic_opacity (paint_options, coords,
paint_core->pixel_dist);
hardness = gimp_paint_options_get_dynamic_hardness (paint_options, coords);
hardness = gimp_paint_options_get_dynamic_hardness (paint_options, coords,
paint_core->pixel_dist);
gimp_brush_core_paste_canvas (GIMP_BRUSH_CORE (paint_core), drawable,
coords,

View File

@ -154,7 +154,8 @@ gimp_convolve_motion (GimpPaintCore *paint_core,
rate = options->rate;
rate *= gimp_paint_options_get_dynamic_rate (paint_options, coords);
rate *= gimp_paint_options_get_dynamic_rate (paint_options, coords,
paint_core->pixel_dist);
gimp_convolve_calculate_matrix (convolve, options->type,
brush_core->brush->mask->width / 2,

View File

@ -246,9 +246,11 @@ gimp_dodge_burn_motion (GimpPaintCore *paint_core,
g_free (temp_data);
opacity *= gimp_paint_options_get_dynamic_opacity (paint_options, coords);
opacity *= gimp_paint_options_get_dynamic_opacity (paint_options, coords,
paint_core->pixel_dist);
hardness = gimp_paint_options_get_dynamic_hardness (paint_options, coords);
hardness = gimp_paint_options_get_dynamic_hardness (paint_options, coords,
paint_core->pixel_dist);
/* Replace the newly dodgedburned area (canvas_buf) to the image */
gimp_brush_core_replace_canvas (GIMP_BRUSH_CORE (paint_core), drawable,

View File

@ -135,9 +135,11 @@ gimp_eraser_motion (GimpPaintCore *paint_core,
color_pixels (temp_buf_get_data (area), col,
area->width * area->height, area->bytes);
opacity *= gimp_paint_options_get_dynamic_opacity (paint_options, coords);
opacity *= gimp_paint_options_get_dynamic_opacity (paint_options, coords,
paint_core->pixel_dist);
hardness = gimp_paint_options_get_dynamic_hardness (paint_options, coords);
hardness = gimp_paint_options_get_dynamic_hardness (paint_options, coords,
paint_core->pixel_dist);
gimp_brush_core_paste_canvas (GIMP_BRUSH_CORE (paint_core), drawable,
coords,

View File

@ -439,7 +439,8 @@ gimp_heal_motion (GimpSourceCore *source_core,
TempBuf *mask_buf;
gdouble hardness;
hardness = gimp_paint_options_get_dynamic_hardness (paint_options, coords);
hardness = gimp_paint_options_get_dynamic_hardness (paint_options, coords,
paint_core->pixel_dist);
mask_buf = gimp_brush_core_get_brush_mask (GIMP_BRUSH_CORE (source_core),
coords,
@ -547,7 +548,8 @@ gimp_heal_motion (GimpSourceCore *source_core,
temp_buf_free (temp);
opacity *= gimp_paint_options_get_dynamic_opacity (paint_options, coords);
opacity *= gimp_paint_options_get_dynamic_opacity (paint_options, coords,
paint_core->pixel_dist);
/* replace the canvas with our healed data */
gimp_brush_core_replace_canvas (GIMP_BRUSH_CORE (paint_core), drawable,

View File

@ -131,7 +131,8 @@ _gimp_paintbrush_motion (GimpPaintCore *paint_core,
paint_appl_mode = paint_options->application_mode;
grad_point = gimp_paint_options_get_dynamic_color (paint_options, coords);
grad_point = gimp_paint_options_get_dynamic_color (paint_options, coords,
paint_core->pixel_dist);
/* optionally take the color from the current gradient */
if (gimp_paint_options_get_gradient_color (paint_options, image,
@ -176,9 +177,11 @@ _gimp_paintbrush_motion (GimpPaintCore *paint_core,
area->bytes);
}
opacity *= gimp_paint_options_get_dynamic_opacity (paint_options, coords);
opacity *= gimp_paint_options_get_dynamic_opacity (paint_options, coords,
paint_core->pixel_dist);
hardness = gimp_paint_options_get_dynamic_hardness (paint_options, coords);
hardness = gimp_paint_options_get_dynamic_hardness (paint_options, coords,
paint_core->pixel_dist);
/* finally, let the brush core paste the colored area on the canvas */
gimp_brush_core_paste_canvas (brush_core, drawable,

View File

@ -34,6 +34,7 @@
#include "gimp-intl.h"
#include "core/gimpcoords.h"
#define DEFAULT_BRUSH_SCALE 1.0
#define DEFAULT_BRUSH_ASPECT_RATIO 1.0
@ -94,6 +95,16 @@
#define DEFAULT_RANDOM_ANGLE FALSE
#define DEFAULT_RANDOM_PRESCALE 1.0
#define DEFAULT_FADING_OPACITY FALSE
#define DEFAULT_FADING_HARDNESS FALSE
#define DEFAULT_FADING_RATE FALSE
#define DEFAULT_FADING_SIZE FALSE
#define DEFAULT_FADING_INVERSE_SIZE FALSE
#define DEFAULT_FADING_ASPECT_RATIO FALSE
#define DEFAULT_FADING_COLOR FALSE
#define DEFAULT_FADING_ANGLE FALSE
#define DEFAULT_FADING_PRESCALE 1.0
#define DEFAULT_USE_FADE FALSE
#define DEFAULT_FADE_LENGTH 100.0
#define DEFAULT_FADE_UNIT GIMP_UNIT_PIXEL
@ -173,6 +184,16 @@ enum
PROP_RANDOM_ANGLE,
PROP_RANDOM_PRESCALE,
PROP_FADING_OPACITY,
PROP_FADING_HARDNESS,
PROP_FADING_RATE,
PROP_FADING_SIZE,
PROP_FADING_INVERSE_SIZE,
PROP_FADING_ASPECT_RATIO,
PROP_FADING_COLOR,
PROP_FADING_ANGLE,
PROP_FADING_PRESCALE,
PROP_USE_FADE,
PROP_FADE_LENGTH,
PROP_FADE_UNIT,
@ -216,7 +237,9 @@ static gdouble gimp_paint_options_get_dynamics_mix (gdouble mix1,
gdouble mix4,
gdouble mix4_scale,
gdouble mix5,
gdouble mix5_scale);
gdouble mix5_scale,
gdouble mix6,
gdouble mix6_scale);
G_DEFINE_TYPE (GimpPaintOptions, gimp_paint_options, GIMP_TYPE_TOOL_OPTIONS)
@ -451,6 +474,39 @@ gimp_paint_options_class_init (GimpPaintOptionsClass *klass)
0.0, 1.0, DEFAULT_RANDOM_PRESCALE,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_FADING_OPACITY,
"fading-opacity", NULL,
DEFAULT_FADING_OPACITY,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_FADING_HARDNESS,
"fading-hardness", NULL,
DEFAULT_FADING_HARDNESS,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_FADING_RATE,
"fading-rate", NULL,
DEFAULT_FADING_RATE,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_FADING_SIZE,
"fading-size", NULL,
DEFAULT_FADING_SIZE,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_FADING_COLOR,
"fading-color", NULL,
DEFAULT_FADING_COLOR,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_FADING_ANGLE,
"fading-angle", NULL,
DEFAULT_FADING_ANGLE,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_FADING_INVERSE_SIZE,
"fading-inverse-size", NULL,
DEFAULT_FADING_INVERSE_SIZE,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_FADING_PRESCALE,
"fading-prescale", NULL,
0.0, 1.0, DEFAULT_FADING_PRESCALE,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_USE_FADE,
"use-fade", NULL,
DEFAULT_USE_FADE,
@ -476,6 +532,10 @@ gimp_paint_options_class_init (GimpPaintOptionsClass *klass)
"random-aspect-ratio", NULL,
DEFAULT_RANDOM_ASPECT_RATIO,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_FADING_ASPECT_RATIO,
"fading-aspect-ratio", NULL,
DEFAULT_FADING_ASPECT_RATIO,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_USE_GRADIENT,
"use-gradient", NULL,
DEFAULT_USE_GRADIENT,
@ -545,6 +605,7 @@ gimp_paint_options_init (GimpPaintOptions *options)
options->direction_options = g_slice_new0 (GimpDynamicOptions);
options->tilt_options = g_slice_new0 (GimpDynamicOptions);
options->random_options = g_slice_new0 (GimpDynamicOptions);
options->fading_options = g_slice_new0 (GimpDynamicOptions);
options->fade_options = g_slice_new0 (GimpFadeOptions);
options->jitter_options = g_slice_new0 (GimpJitterOptions);
options->gradient_options = g_slice_new0 (GimpGradientOptions);
@ -563,6 +624,7 @@ gimp_paint_options_finalize (GObject *object)
g_slice_free (GimpDynamicOptions, options->direction_options);
g_slice_free (GimpDynamicOptions, options->tilt_options);
g_slice_free (GimpDynamicOptions, options->random_options);
g_slice_free (GimpDynamicOptions, options->fading_options);
g_slice_free (GimpFadeOptions, options->fade_options);
g_slice_free (GimpJitterOptions, options->jitter_options);
g_slice_free (GimpGradientOptions, options->gradient_options);
@ -582,6 +644,7 @@ gimp_paint_options_set_property (GObject *object,
GimpDynamicOptions *direction_options = options->direction_options;
GimpDynamicOptions *tilt_options = options->tilt_options;
GimpDynamicOptions *random_options = options->random_options;
GimpDynamicOptions *fading_options = options->fading_options;
GimpFadeOptions *fade_options = options->fade_options;
GimpJitterOptions *jitter_options = options->jitter_options;
GimpGradientOptions *gradient_options = options->gradient_options;
@ -795,6 +858,42 @@ gimp_paint_options_set_property (GObject *object,
case PROP_RANDOM_PRESCALE:
random_options->prescale = g_value_get_double (value);
break;
/*Fading*/
case PROP_FADING_OPACITY:
fading_options->opacity = g_value_get_boolean (value);
break;
case PROP_FADING_HARDNESS:
fading_options->hardness = g_value_get_boolean (value);
break;
case PROP_FADING_RATE:
fading_options->rate = g_value_get_boolean (value);
break;
case PROP_FADING_SIZE:
fading_options->size = g_value_get_boolean (value);
break;
case PROP_FADING_INVERSE_SIZE:
fading_options->inverse_size = g_value_get_boolean (value);
break;
case PROP_FADING_ASPECT_RATIO:
fading_options->aspect_ratio = g_value_get_boolean (value);
break;
case PROP_FADING_COLOR:
fading_options->color = g_value_get_boolean (value);
break;
case PROP_FADING_ANGLE:
fading_options->angle = g_value_get_boolean (value);
break;
case PROP_FADING_PRESCALE:
fading_options->prescale = g_value_get_double (value);
break;
case PROP_USE_FADE:
fade_options->use_fade = g_value_get_boolean (value);
@ -878,6 +977,7 @@ gimp_paint_options_get_property (GObject *object,
GimpDynamicOptions *direction_options = options->direction_options;
GimpDynamicOptions *tilt_options = options->tilt_options;
GimpDynamicOptions *random_options = options->random_options;
GimpDynamicOptions *fading_options = options->fading_options;
GimpFadeOptions *fade_options = options->fade_options;
GimpJitterOptions *jitter_options = options->jitter_options;
GimpGradientOptions *gradient_options = options->gradient_options;
@ -1093,6 +1193,44 @@ gimp_paint_options_get_property (GObject *object,
g_value_set_double (value, random_options->prescale);
break;
/*fading*/
case PROP_FADING_OPACITY:
g_value_set_boolean (value, fading_options->opacity);
break;
case PROP_FADING_HARDNESS:
g_value_set_boolean (value, fading_options->hardness);
break;
case PROP_FADING_RATE:
g_value_set_boolean (value, fading_options->rate);
break;
case PROP_FADING_SIZE:
g_value_set_boolean (value, fading_options->size);
break;
case PROP_FADING_INVERSE_SIZE:
g_value_set_boolean (value, fading_options->inverse_size);
break;
case PROP_FADING_ASPECT_RATIO:
g_value_set_boolean (value, fading_options->aspect_ratio);
break;
case PROP_FADING_COLOR:
g_value_set_boolean (value, fading_options->color);
break;
case PROP_FADING_ANGLE:
g_value_set_boolean (value, fading_options->angle);
break;
case PROP_FADING_PRESCALE:
g_value_set_double (value, fading_options->prescale);
break;
case PROP_USE_FADE:
g_value_set_boolean (value, fade_options->use_fade);
break;
@ -1210,6 +1348,8 @@ gimp_paint_options_get_fade (GimpPaintOptions *paint_options,
gdouble pixel_dist)
{
GimpFadeOptions *fade_options;
gdouble z = -1.0;
g_return_val_if_fail (GIMP_IS_PAINT_OPTIONS (paint_options),
GIMP_OPACITY_OPAQUE);
@ -1244,7 +1384,13 @@ gimp_paint_options_get_fade (GimpPaintOptions *paint_options,
MAX (xres, yres) / unit_factor);
}
break;
//printf("fade_out: %f", fade_out);
//printf("pixel_dist: %f", pixel_dist);
}
//printf("fade_out: %f", fade_out);
//printf("pixel_dist: %f", pixel_dist);
/* factor in the fade out value */
if (fade_out > 0.0)
@ -1253,8 +1399,9 @@ gimp_paint_options_get_fade (GimpPaintOptions *paint_options,
/* Model the amount of paint left as a gaussian curve */
x = pixel_dist / fade_out;
z = exp (- x * x * 5.541);
return z; /* ln (1/255) */
return exp (- x * x * 5.541); /* ln (1/255) */
}
return GIMP_OPACITY_TRANSPARENT;
@ -1301,7 +1448,8 @@ gimp_paint_options_get_gradient_color (GimpPaintOptions *paint_options,
paint_options->velocity_options->color ||
paint_options->direction_options->color ||
paint_options->tilt_options->color ||
paint_options->random_options->color)
paint_options->random_options->color ||
paint_options->fading_options->color)
{
gimp_gradient_get_color_at (gradient, GIMP_CONTEXT (paint_options),
NULL, grad_point,
@ -1385,6 +1533,9 @@ gimp_paint_options_get_brush_mode (GimpPaintOptions *paint_options)
/* Calculates dynamics mix to be used for same parameter
* (velocity/pressure/direction/tilt/random) mix Needed in may places and tools.
*
* Added one parameter: fading, the 6th driving factor.
* (velocity/pressure/direction/tilt/random/fading)
*/
static gdouble
gimp_paint_options_get_dynamics_mix (gdouble mix1,
@ -1396,7 +1547,9 @@ gimp_paint_options_get_dynamics_mix (gdouble mix1,
gdouble mix4,
gdouble mix4_scale,
gdouble mix5,
gdouble mix5_scale)
gdouble mix5_scale,
gdouble mix6,
gdouble mix6_scale)
{
gdouble scale_sum = 0.0;
gdouble result = 1.0;
@ -1431,13 +1584,20 @@ gimp_paint_options_get_dynamics_mix (gdouble mix1,
}
else mix5 = 0.0;
if (mix6 > -1.0)
{
scale_sum += fabs (mix6_scale);
}
else mix6 = 0.0;
if (scale_sum > 0.0)
{
result = (mix1 * mix1_scale) / scale_sum +
(mix2 * mix2_scale) / scale_sum +
(mix3 * mix3_scale) / scale_sum +
(mix4 * mix4_scale) / scale_sum +
(mix5 * mix5_scale) / scale_sum;
(mix5 * mix5_scale) / scale_sum +
(mix6 * mix6_scale) / scale_sum;
}
if (result < 0.0)
@ -1448,7 +1608,8 @@ gimp_paint_options_get_dynamics_mix (gdouble mix1,
gdouble
gimp_paint_options_get_dynamic_opacity (GimpPaintOptions *paint_options,
const GimpCoords *coords)
const GimpCoords *coords,
gdouble pixel_dist)
{
gdouble opacity = 1.0;
@ -1459,13 +1620,15 @@ gimp_paint_options_get_dynamic_opacity (GimpPaintOptions *paint_options,
paint_options->velocity_options->opacity ||
paint_options->direction_options->opacity ||
paint_options->tilt_options->opacity ||
paint_options->random_options->opacity)
paint_options->random_options->opacity||
paint_options->fading_options->opacity)
{
gdouble pressure = -1.0;
gdouble velocity = -1.0;
gdouble direction = -1.0;
gdouble tilt = -1.0;
gdouble random = -1.0;
gdouble fading = -1.0;
if (paint_options->pressure_options->opacity)
@ -1473,17 +1636,36 @@ gimp_paint_options_get_dynamic_opacity (GimpPaintOptions *paint_options,
if (paint_options->velocity_options->opacity)
velocity = GIMP_PAINT_VELOCITY_SCALE * (1 - coords->velocity);
//printf("velocity: %f", velocity);
if (paint_options->random_options->opacity)
random = g_random_double_range (0.0, 1.0);
//printf("%f", random);
if (paint_options->tilt_options->opacity)
if (paint_options->tilt_options->opacity)
tilt = 1.0 - sqrt (SQR (coords->xtilt) + SQR (coords->ytilt));
if (paint_options->direction_options->opacity)
direction = coords->direction + 0.5; /* mixer does not mix negative angles right so we shift */
opacity = gimp_paint_options_get_dynamics_mix (pressure,
if (paint_options->fading_options->opacity)
{
gdouble p;
gdouble fade_out;
fade_out = DEFAULT_FADE_LENGTH;
p = pixel_dist / fade_out;
fading = exp (- p * p * 5.541);
/*
printf("fade_out: %f", fade_out);
printf("pixel_dist: %f", pixel_dist);
printf("fading value: %f", fading);
*/
//printf("fading-cor: %f", coords->fading);
}
opacity = gimp_paint_options_get_dynamics_mix (pressure,
paint_options->pressure_options->prescale,
velocity,
paint_options->velocity_options->prescale,
@ -1492,7 +1674,9 @@ gimp_paint_options_get_dynamic_opacity (GimpPaintOptions *paint_options,
tilt,
paint_options->tilt_options->prescale,
direction,
paint_options->direction_options->prescale);
paint_options->direction_options->prescale,
fading,
paint_options->fading_options->prescale);
}
return opacity;
@ -1501,7 +1685,8 @@ gimp_paint_options_get_dynamic_opacity (GimpPaintOptions *paint_options,
gdouble
gimp_paint_options_get_dynamic_size (GimpPaintOptions *paint_options,
const GimpCoords *coords,
gboolean use_dynamics)
gboolean use_dynamics,
gdouble pixel_dist)
{
gdouble scale = 1.0;
@ -1512,6 +1697,7 @@ gimp_paint_options_get_dynamic_size (GimpPaintOptions *paint_options,
gdouble direction = -1.0;
gdouble random = -1.0;
gdouble tilt = -1.0;
gdouble fading = -1.0;
if (paint_options->pressure_options->size)
{
@ -1552,6 +1738,18 @@ gimp_paint_options_get_dynamic_size (GimpPaintOptions *paint_options,
if (paint_options->direction_options->size)
direction = coords->direction + 0.5; /* mixer does not mix negative angles right so we shift */
if (paint_options->fading_options->size ||
paint_options->fading_options->inverse_size)
{
gdouble p;
gdouble fade_out;
fade_out = DEFAULT_FADE_LENGTH;
p = pixel_dist / fade_out;
fading = exp (- p * p * 5.541);
}
scale = gimp_paint_options_get_dynamics_mix (pressure,
paint_options->pressure_options->prescale,
velocity,
@ -1561,7 +1759,9 @@ gimp_paint_options_get_dynamic_size (GimpPaintOptions *paint_options,
tilt,
paint_options->tilt_options->prescale,
direction,
paint_options->direction_options->prescale);
paint_options->direction_options->prescale,
fading,
paint_options->fading_options->prescale);
if (scale < 1 / 64.0)
scale = 1 / 8.0;
@ -1576,7 +1776,8 @@ gimp_paint_options_get_dynamic_size (GimpPaintOptions *paint_options,
gdouble
gimp_paint_options_get_dynamic_aspect_ratio (GimpPaintOptions *paint_options,
const GimpCoords *coords)
const GimpCoords *coords,
gdouble pixel_dist)
{
gdouble aspect_ratio = 1.0;
@ -1587,13 +1788,15 @@ gimp_paint_options_get_dynamic_aspect_ratio (GimpPaintOptions *paint_options,
paint_options->velocity_options->aspect_ratio ||
paint_options->direction_options->aspect_ratio ||
paint_options->tilt_options->aspect_ratio ||
paint_options->random_options->aspect_ratio)
paint_options->random_options->aspect_ratio ||
paint_options->fading_options->aspect_ratio)
{
gdouble pressure = -1.0;
gdouble velocity = -1.0;
gdouble direction = -1.0;
gdouble tilt = -1.0;
gdouble random = -1.0;
gdouble fading = -1.0;
if (paint_options->pressure_options->aspect_ratio)
@ -1628,6 +1831,16 @@ gimp_paint_options_get_dynamic_aspect_ratio (GimpPaintOptions *paint_options,
direction = 1 / direction;
}
if (paint_options->fading_options->aspect_ratio)
{
gdouble p;
gdouble fade_out;
fade_out = DEFAULT_FADE_LENGTH;
p = pixel_dist / fade_out;
fading = exp (- p * p * 5.541);
}
aspect_ratio = gimp_paint_options_get_dynamics_mix (pressure,
paint_options->pressure_options->prescale,
velocity,
@ -1637,7 +1850,9 @@ gimp_paint_options_get_dynamic_aspect_ratio (GimpPaintOptions *paint_options,
tilt,
paint_options->tilt_options->prescale,
direction,
paint_options->direction_options->prescale);
paint_options->direction_options->prescale,
fading,
paint_options->fading_options->prescale);
}
return paint_options->brush_aspect_ratio * aspect_ratio;
@ -1645,7 +1860,8 @@ gimp_paint_options_get_dynamic_aspect_ratio (GimpPaintOptions *paint_options,
gdouble
gimp_paint_options_get_dynamic_rate (GimpPaintOptions *paint_options,
const GimpCoords *coords)
const GimpCoords *coords,
gdouble pixel_dist)
{
gdouble rate = 1.0;
@ -1663,6 +1879,7 @@ gimp_paint_options_get_dynamic_rate (GimpPaintOptions *paint_options,
gdouble direction = -1.0;
gdouble random = -1.0;
gdouble tilt = -1.0;
gdouble fading = -1.0;
if (paint_options->pressure_options->rate)
pressure = GIMP_PAINT_PRESSURE_SCALE * coords->pressure;
@ -1679,6 +1896,16 @@ gimp_paint_options_get_dynamic_rate (GimpPaintOptions *paint_options,
if (paint_options->direction_options->rate)
direction = coords->direction + 0.5; /* mixer does not mix negative angles right so we shift */
if (paint_options->fading_options->rate)
{
gdouble p;
gdouble fade_out;
fade_out = DEFAULT_FADE_LENGTH;
p = pixel_dist / fade_out;
fading = exp (- p * p * 5.541);
}
rate = gimp_paint_options_get_dynamics_mix (pressure,
paint_options->pressure_options->prescale,
velocity,
@ -1688,7 +1915,9 @@ gimp_paint_options_get_dynamic_rate (GimpPaintOptions *paint_options,
tilt,
paint_options->tilt_options->prescale,
direction,
paint_options->direction_options->prescale);
paint_options->direction_options->prescale,
fading,
paint_options->fading_options->prescale);
}
return rate;
@ -1697,7 +1926,8 @@ gimp_paint_options_get_dynamic_rate (GimpPaintOptions *paint_options,
gdouble
gimp_paint_options_get_dynamic_color (GimpPaintOptions *paint_options,
const GimpCoords *coords)
const GimpCoords *coords,
gdouble pixel_dist)
{
gdouble color = 1.0;
@ -1708,13 +1938,15 @@ gimp_paint_options_get_dynamic_color (GimpPaintOptions *paint_options,
paint_options->velocity_options->color ||
paint_options->direction_options->color ||
paint_options->tilt_options->color ||
paint_options->random_options->color)
paint_options->random_options->color ||
paint_options->fading_options->color)
{
gdouble pressure = -1.0;
gdouble velocity = -1.0;
gdouble direction = -1.0;
gdouble random = -1.0;
gdouble tilt = -1.0;
gdouble fading = -1.0;
if (paint_options->pressure_options->color)
pressure = GIMP_PAINT_PRESSURE_SCALE * coords->pressure;
@ -1731,6 +1963,16 @@ gimp_paint_options_get_dynamic_color (GimpPaintOptions *paint_options,
if (paint_options->direction_options->color)
direction = coords->direction + 0.5; /* mixer does not mix negative angles right so we shift */
if (paint_options->fading_options->color)
{
gdouble p;
gdouble fade_out;
fade_out = DEFAULT_FADE_LENGTH;
p = pixel_dist / fade_out;
fading = exp (- p * p * 5.541);
}
color = gimp_paint_options_get_dynamics_mix (pressure,
paint_options->pressure_options->prescale,
velocity,
@ -1740,7 +1982,9 @@ gimp_paint_options_get_dynamic_color (GimpPaintOptions *paint_options,
tilt,
paint_options->tilt_options->prescale,
direction,
paint_options->direction_options->prescale);
paint_options->direction_options->prescale,
fading,
paint_options->fading_options->prescale);
}
return color;
@ -1748,7 +1992,8 @@ gimp_paint_options_get_dynamic_color (GimpPaintOptions *paint_options,
gdouble
gimp_paint_options_get_dynamic_hardness (GimpPaintOptions *paint_options,
const GimpCoords *coords)
const GimpCoords *coords,
gdouble pixel_dist)
{
gdouble hardness = 1.0;
@ -1759,13 +2004,15 @@ gimp_paint_options_get_dynamic_hardness (GimpPaintOptions *paint_options,
paint_options->velocity_options->hardness ||
paint_options->direction_options->hardness ||
paint_options->tilt_options->hardness ||
paint_options->random_options->hardness)
paint_options->random_options->hardness ||
paint_options->fading_options->hardness)
{
gdouble pressure = -1.0;
gdouble velocity = -1.0;
gdouble direction = -1.0;
gdouble random = -1.0;
gdouble tilt = -1.0;
gdouble fading = -1.0;
if (paint_options->pressure_options->hardness)
pressure = GIMP_PAINT_PRESSURE_SCALE * coords->pressure;
@ -1782,6 +2029,16 @@ gimp_paint_options_get_dynamic_hardness (GimpPaintOptions *paint_options,
if (paint_options->direction_options->hardness)
direction = coords->direction + 0.5; /* mixer does not mix negative angles right so we shift */
if (paint_options->fading_options->hardness)
{
gdouble p;
gdouble fade_out;
fade_out = DEFAULT_FADE_LENGTH;
p = pixel_dist / fade_out;
fading = exp (- p * p * 5.541);
}
hardness = gimp_paint_options_get_dynamics_mix (pressure,
paint_options->pressure_options->prescale,
velocity,
@ -1791,7 +2048,9 @@ gimp_paint_options_get_dynamic_hardness (GimpPaintOptions *paint_options,
tilt,
paint_options->tilt_options->prescale,
direction,
paint_options->direction_options->prescale);
paint_options->direction_options->prescale,
fading,
paint_options->fading_options->prescale);
}
return hardness;
@ -1799,7 +2058,8 @@ gimp_paint_options_get_dynamic_hardness (GimpPaintOptions *paint_options,
gdouble
gimp_paint_options_get_dynamic_angle (GimpPaintOptions *paint_options,
const GimpCoords *coords)
const GimpCoords *coords,
gdouble pixel_dist)
{
gdouble angle = 1.0;
@ -1810,14 +2070,15 @@ gimp_paint_options_get_dynamic_angle (GimpPaintOptions *paint_options,
paint_options->velocity_options->angle ||
paint_options->direction_options->angle ||
paint_options->tilt_options->angle ||
paint_options->random_options->angle)
paint_options->random_options->angle ||
paint_options->fading_options->angle)
{
gdouble pressure = -1.0;
gdouble velocity = -1.0;
gdouble direction = -1.0;
gdouble random = -1.0;
gdouble tilt = -1.0;
gdouble fading = -1.0;
if (paint_options->pressure_options->angle)
pressure = GIMP_PAINT_PRESSURE_SCALE * coords->pressure;
@ -1862,6 +2123,15 @@ gimp_paint_options_get_dynamic_angle (GimpPaintOptions *paint_options,
if (paint_options->direction_options->angle)
direction = coords->direction + 0.5; /* mixer does not mix negative angles right so we shift */
if (paint_options->fading_options->rate)
{
gdouble p;
gdouble fade_out;
fade_out = DEFAULT_FADE_LENGTH;
p = pixel_dist / fade_out;
fading = exp (- p * p * 5.541);
}
angle = gimp_paint_options_get_dynamics_mix (pressure,
paint_options->pressure_options->prescale,
@ -1872,7 +2142,9 @@ gimp_paint_options_get_dynamic_angle (GimpPaintOptions *paint_options,
tilt,
paint_options->tilt_options->prescale,
direction,
paint_options->direction_options->prescale);
paint_options->direction_options->prescale,
fading,
paint_options->fading_options->prescale);
angle = angle - 0.5;
}

View File

@ -103,6 +103,7 @@ struct _GimpPaintOptions
GimpDynamicOptions *direction_options;
GimpDynamicOptions *tilt_options;
GimpDynamicOptions *random_options;
GimpDynamicOptions *fading_options;
GimpFadeOptions *fade_options;
GimpJitterOptions *jitter_options;
@ -144,27 +145,34 @@ GimpBrushApplicationMode
gdouble gimp_paint_options_get_dynamic_opacity (GimpPaintOptions *paint_options,
const GimpCoords *coords);
const GimpCoords *coords,
gdouble pixel_dist);
gdouble gimp_paint_options_get_dynamic_size (GimpPaintOptions *paint_options,
const GimpCoords *coords,
gboolean use_dynamics);
gboolean use_dynamics,
gdouble pixel_dist);
gdouble gimp_paint_options_get_dynamic_aspect_ratio
(GimpPaintOptions *paint_options,
const GimpCoords *coords);
const GimpCoords *coords,
gdouble pixel_dist);
gdouble gimp_paint_options_get_dynamic_rate (GimpPaintOptions *paint_options,
const GimpCoords *coords);
const GimpCoords *coords,
gdouble pixel_dist);
gdouble gimp_paint_options_get_dynamic_color (GimpPaintOptions *paint_options,
const GimpCoords *coords);
const GimpCoords *coords,
gdouble pixel_dist);
gdouble gimp_paint_options_get_dynamic_angle (GimpPaintOptions *paint_options,
const GimpCoords *coords);
const GimpCoords *coords,
gdouble pixel_dist);
gdouble gimp_paint_options_get_dynamic_hardness(GimpPaintOptions *paint_options,
const GimpCoords *coords);
const GimpCoords *coords,
gdouble pixel_dist);
#endif /* __GIMP_PAINT_OPTIONS_H__ */

View File

@ -271,7 +271,8 @@ gimp_smudge_motion (GimpPaintCore *paint_core,
area->x, area->y, area->width, area->height, FALSE);
/* Enable dynamic rate */
dynamic_rate = gimp_paint_options_get_dynamic_rate (paint_options, coords);
dynamic_rate = gimp_paint_options_get_dynamic_rate (paint_options, coords,
paint_core->pixel_dist);
rate = (options->rate / 100.0) * dynamic_rate;
/* The tempPR will be the built up buffer (for smudge) */
@ -311,9 +312,11 @@ gimp_smudge_motion (GimpPaintCore *paint_core,
else
copy_region (&tempPR, &destPR);
opacity *= gimp_paint_options_get_dynamic_opacity (paint_options, coords);
opacity *= gimp_paint_options_get_dynamic_opacity (paint_options, coords,
paint_core->pixel_dist);
hardness = gimp_paint_options_get_dynamic_hardness (paint_options, coords);
hardness = gimp_paint_options_get_dynamic_hardness (paint_options, coords,
paint_core->pixel_dist);
gimp_brush_core_replace_canvas (GIMP_BRUSH_CORE (paint_core), drawable,
coords,

View File

@ -76,6 +76,12 @@ static void random_options_gui (GimpPaintOptions *paint_options,
GType tool_type,
GtkTable *table,
gint row);
/**/
static void fading_options_gui (GimpPaintOptions *paint_options,
GType tool_type,
GtkTable *table,
gint row);
/**/
static GtkWidget * fade_options_gui (GimpPaintOptions *paint_options,
GType tool_type);
static GtkWidget * gradient_options_gui (GimpPaintOptions *paint_options,
@ -234,7 +240,7 @@ gimp_paint_options_gui (GimpToolOptions *tool_options)
gtk_container_add (GTK_CONTAINER (frame), inner_frame);
gtk_widget_show (inner_frame);
table = gtk_table_new (5, n_dynamics + 2, FALSE);
table = gtk_table_new (7, n_dynamics + 2, FALSE);
gtk_container_add (GTK_CONTAINER (inner_frame), table);
gtk_widget_show (table);
@ -268,6 +274,14 @@ gimp_paint_options_gui (GimpToolOptions *tool_options)
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (label);
//@@Nicolas
label = gtk_label_new (_("Fading - new:"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 6, 7,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (label);
pressure_options_gui (options, tool_type,
GTK_TABLE (table), 1,
dynamics_labels);
@ -284,6 +298,9 @@ gimp_paint_options_gui (GimpToolOptions *tool_options)
random_options_gui (options, tool_type,
GTK_TABLE (table), 5);
fading_options_gui (options, tool_type,
GTK_TABLE (table), 6);
/* EEK: pack the fixed *after* the buttons so the table calls
* size-allocates on it *before* it places the toggles. Fixes
* label positions in RTL mode.
@ -790,6 +807,64 @@ random_options_gui (GimpPaintOptions *paint_options,
gtk_widget_show (scalebutton);
}
static void
fading_options_gui (GimpPaintOptions *paint_options,
GType tool_type,
GtkTable *table,
gint row)
{
GObject *config = G_OBJECT (paint_options);
gint column = 1;
GtkWidget *scalebutton;
if (tool_has_opacity_dynamics (tool_type))
{
dynamics_check_button_new (config, "fading-opacity",
table, column++, row);
}
if (tool_has_hardness_dynamics (tool_type))
{
dynamics_check_button_new (config, "fading-hardness",
table, column++, row);
}
if (tool_has_rate_dynamics (tool_type))
{
dynamics_check_button_new (config, "fading-rate",
table, column++, row);
}
if (tool_has_size_dynamics (tool_type))
{
dynamics_check_button_new (config, "fading-size",
table, column++, row);
}
if (tool_has_aspect_ratio_dynamics (tool_type))
{
dynamics_check_button_new (config, "fading-aspect-ratio",
table, column++, row);
}
if (tool_has_angle_dynamics (tool_type))
{
dynamics_check_button_new (config, "fading-angle",
table, column++, row);
}
if (tool_has_color_dynamics (tool_type))
{
dynamics_check_button_new (config, "fading-color",
table, column++, row);
}
scalebutton = gimp_prop_scale_button_new (config, "fading-prescale");
gtk_table_attach (table, scalebutton, column, column + 1, row, row + 1,
GTK_SHRINK, GTK_SHRINK, 0, 0);
gtk_widget_show (scalebutton);
}
static GtkWidget *
fade_options_gui (GimpPaintOptions *paint_options,
GType tool_type)