app: in GimpOperationGradient, use sampler for reading the distance buffer
... instead of using gegl_buffer_get() directly. This is slightly faster.
This commit is contained in:
@ -74,7 +74,7 @@ typedef struct
|
|||||||
gdouble dist;
|
gdouble dist;
|
||||||
gdouble vec[2];
|
gdouble vec[2];
|
||||||
GimpRepeatMode repeat;
|
GimpRepeatMode repeat;
|
||||||
GeglBuffer *dist_buffer;
|
GeglSampler *dist_sampler;
|
||||||
} RenderBlendData;
|
} RenderBlendData;
|
||||||
|
|
||||||
|
|
||||||
@ -140,13 +140,13 @@ static gdouble gradient_calc_spiral_factor (gdouble
|
|||||||
gdouble y,
|
gdouble y,
|
||||||
gboolean clockwise);
|
gboolean clockwise);
|
||||||
|
|
||||||
static gdouble gradient_calc_shapeburst_angular_factor (GeglBuffer *dist_buffer,
|
static gdouble gradient_calc_shapeburst_angular_factor (GeglSampler *dist_sampler,
|
||||||
gdouble x,
|
gdouble x,
|
||||||
gdouble y);
|
gdouble y);
|
||||||
static gdouble gradient_calc_shapeburst_spherical_factor (GeglBuffer *dist_buffer,
|
static gdouble gradient_calc_shapeburst_spherical_factor (GeglSampler *dist_sampler,
|
||||||
gdouble x,
|
gdouble x,
|
||||||
gdouble y);
|
gdouble y);
|
||||||
static gdouble gradient_calc_shapeburst_dimpled_factor (GeglBuffer *dist_buffer,
|
static gdouble gradient_calc_shapeburst_dimpled_factor (GeglSampler *dist_sampler,
|
||||||
gdouble x,
|
gdouble x,
|
||||||
gdouble y);
|
gdouble y);
|
||||||
|
|
||||||
@ -794,15 +794,13 @@ gradient_calc_spiral_factor (gdouble dist,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gdouble
|
static gdouble
|
||||||
gradient_calc_shapeburst_angular_factor (GeglBuffer *dist_buffer,
|
gradient_calc_shapeburst_angular_factor (GeglSampler *dist_sampler,
|
||||||
gdouble x,
|
gdouble x,
|
||||||
gdouble y)
|
gdouble y)
|
||||||
{
|
{
|
||||||
gfloat value;
|
gfloat value;
|
||||||
|
|
||||||
gegl_buffer_get (dist_buffer, GEGL_RECTANGLE (x, y, 1, 1), 1.0,
|
gegl_sampler_get (dist_sampler, x, y, NULL, &value, GEGL_ABYSS_NONE);
|
||||||
NULL, &value,
|
|
||||||
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
|
|
||||||
|
|
||||||
value = 1.0 - value;
|
value = 1.0 - value;
|
||||||
|
|
||||||
@ -811,15 +809,13 @@ gradient_calc_shapeburst_angular_factor (GeglBuffer *dist_buffer,
|
|||||||
|
|
||||||
|
|
||||||
static gdouble
|
static gdouble
|
||||||
gradient_calc_shapeburst_spherical_factor (GeglBuffer *dist_buffer,
|
gradient_calc_shapeburst_spherical_factor (GeglSampler *dist_sampler,
|
||||||
gdouble x,
|
gdouble x,
|
||||||
gdouble y)
|
gdouble y)
|
||||||
{
|
{
|
||||||
gfloat value;
|
gfloat value;
|
||||||
|
|
||||||
gegl_buffer_get (dist_buffer, GEGL_RECTANGLE (x, y, 1, 1), 1.0,
|
gegl_sampler_get (dist_sampler, x, y, NULL, &value, GEGL_ABYSS_NONE);
|
||||||
NULL, &value,
|
|
||||||
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
|
|
||||||
|
|
||||||
value = 1.0 - sin (0.5 * G_PI * value);
|
value = 1.0 - sin (0.5 * G_PI * value);
|
||||||
|
|
||||||
@ -828,15 +824,13 @@ gradient_calc_shapeburst_spherical_factor (GeglBuffer *dist_buffer,
|
|||||||
|
|
||||||
|
|
||||||
static gdouble
|
static gdouble
|
||||||
gradient_calc_shapeburst_dimpled_factor (GeglBuffer *dist_buffer,
|
gradient_calc_shapeburst_dimpled_factor (GeglSampler *dist_sampler,
|
||||||
gdouble x,
|
gdouble x,
|
||||||
gdouble y)
|
gdouble y)
|
||||||
{
|
{
|
||||||
gfloat value;
|
gfloat value;
|
||||||
|
|
||||||
gegl_buffer_get (dist_buffer, GEGL_RECTANGLE (x, y, 1, 1), 1.0,
|
gegl_sampler_get (dist_sampler, x, y, NULL, &value, GEGL_ABYSS_NONE);
|
||||||
NULL, &value,
|
|
||||||
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
|
|
||||||
|
|
||||||
value = cos (0.5 * G_PI * value);
|
value = cos (0.5 * G_PI * value);
|
||||||
|
|
||||||
@ -896,15 +890,18 @@ gradient_render_pixel (gdouble x,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case GIMP_GRADIENT_SHAPEBURST_ANGULAR:
|
case GIMP_GRADIENT_SHAPEBURST_ANGULAR:
|
||||||
factor = gradient_calc_shapeburst_angular_factor (rbd->dist_buffer, x, y);
|
factor = gradient_calc_shapeburst_angular_factor (rbd->dist_sampler,
|
||||||
|
x, y);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GIMP_GRADIENT_SHAPEBURST_SPHERICAL:
|
case GIMP_GRADIENT_SHAPEBURST_SPHERICAL:
|
||||||
factor = gradient_calc_shapeburst_spherical_factor (rbd->dist_buffer, x, y);
|
factor = gradient_calc_shapeburst_spherical_factor (rbd->dist_sampler,
|
||||||
|
x, y);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GIMP_GRADIENT_SHAPEBURST_DIMPLED:
|
case GIMP_GRADIENT_SHAPEBURST_DIMPLED:
|
||||||
factor = gradient_calc_shapeburst_dimpled_factor (rbd->dist_buffer, x, y);
|
factor = gradient_calc_shapeburst_dimpled_factor (rbd->dist_sampler,
|
||||||
|
x, y);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GIMP_GRADIENT_SPIRAL_CLOCKWISE:
|
case GIMP_GRADIENT_SPIRAL_CLOCKWISE:
|
||||||
@ -1081,7 +1078,8 @@ gimp_operation_gradient_process (GeglOperation *operation,
|
|||||||
case GIMP_GRADIENT_SHAPEBURST_SPHERICAL:
|
case GIMP_GRADIENT_SHAPEBURST_SPHERICAL:
|
||||||
case GIMP_GRADIENT_SHAPEBURST_DIMPLED:
|
case GIMP_GRADIENT_SHAPEBURST_DIMPLED:
|
||||||
rbd.dist = sqrt (SQR (ex - sx) + SQR (ey - sy));
|
rbd.dist = sqrt (SQR (ex - sx) + SQR (ey - sy));
|
||||||
rbd.dist_buffer = input;
|
rbd.dist_sampler = gegl_buffer_sampler_new_at_level (
|
||||||
|
input, babl_format ("Y float"), GEGL_SAMPLER_NEAREST, level);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1196,6 +1194,8 @@ gimp_operation_gradient_process (GeglOperation *operation,
|
|||||||
g_rand_free (seed);
|
g_rand_free (seed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_clear_object (&rbd.dist_sampler);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user