From 6990e91c856d35a3ea6eb8845cccb9ad27360d44 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Mon, 4 May 2009 17:53:48 -0500 Subject: [PATCH] gdiplus: implement GdipSetLineSigmaBlend --- dlls/gdiplus/brush.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 46 insertions(+), 4 deletions(-) diff --git a/dlls/gdiplus/brush.c b/dlls/gdiplus/brush.c index 74e7764..60d5970 100644 --- a/dlls/gdiplus/brush.c +++ b/dlls/gdiplus/brush.c @@ -1193,15 +1193,57 @@ GpStatus WINGDIPAPI GdipSetLineGammaCorrection(GpLineGradient *line, GpStatus WINGDIPAPI GdipSetLineSigmaBlend(GpLineGradient *line, REAL focus, 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) return InvalidParameter; - if(!(calls++)) - FIXME("not implemented\n"); + /* we want 2 standard deviations */ + 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