gdiplus: Implement GdipSetLineSigmaBlend.
This commit is contained in:
parent
a31e9a1bfa
commit
1860b32618
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue