gdiplus: Implement GdipSetLineSigmaBlend.

This commit is contained in:
Vincent Povirk 2009-05-04 17:53:48 -05:00 committed by Alexandre Julliard
parent a31e9a1bfa
commit 1860b32618
1 changed files with 46 additions and 4 deletions

View File

@ -1193,15 +1193,57 @@ GpStatus WINGDIPAPI GdipSetLineGammaCorrection(GpLineGradient *line,
GpStatus WINGDIPAPI GdipSetLineSigmaBlend(GpLineGradient *line, REAL focus, GpStatus WINGDIPAPI GdipSetLineSigmaBlend(GpLineGradient *line, REAL focus,
REAL scale) REAL scale)
{ {
static int calls; REAL factors[33];
REAL positions[33];
int num_points = 0;
int i;
const int precision = 16;
REAL erf_range; /* we use values erf(-erf_range) through erf(+erf_range) */
REAL min_erf;
REAL scale_erf;
TRACE("(%p, %0.2f, %0.2f)\n", line, focus, scale);
if(!line || focus < 0.0 || focus > 1.0 || scale < 0.0 || scale > 1.0) if(!line || focus < 0.0 || focus > 1.0 || scale < 0.0 || scale > 1.0)
return InvalidParameter; return InvalidParameter;
if(!(calls++)) /* we want 2 standard deviations */
FIXME("not implemented\n"); erf_range = 2.0 / sqrt(2);
return NotImplemented; /* calculate the constants we need to normalize the error function to be
between 0.0 and scale over the range we need */
min_erf = erf(-erf_range);
scale_erf = scale / (-2.0 * min_erf);
if (focus != 0.0)
{
positions[0] = 0.0;
factors[0] = 0.0;
for (i=1; i<precision; i++)
{
positions[i] = focus * i / precision;
factors[i] = scale_erf * (erf(2 * erf_range * i / precision - erf_range) - min_erf);
}
num_points += precision;
}
positions[num_points] = focus;
factors[num_points] = scale;
num_points += 1;
if (focus != 1.0)
{
for (i=1; i<precision; i++)
{
positions[i+num_points-1] = (focus + ((1.0-focus) * i / precision));
factors[i+num_points-1] = scale_erf * (erf(erf_range - 2 * erf_range * i / precision) - min_erf);
}
num_points += precision;
positions[num_points-1] = 1.0;
factors[num_points-1] = 0.0;
}
return GdipSetLineBlend(line, factors, positions, num_points);
} }
GpStatus WINGDIPAPI GdipSetLineWrapMode(GpLineGradient *line, GpStatus WINGDIPAPI GdipSetLineWrapMode(GpLineGradient *line,