From: Vijay Kiran Kamuju infyquest@gmail.com
--- dlls/gdiplus/gdiplus.spec | 2 +- dlls/gdiplus/gdiplus_private.h | 1 + dlls/gdiplus/image.c | 93 ++++++++++++++++- dlls/gdiplus/tests/image.c | 186 ++++++++++++++++++++++++++------- include/gdipluseffects.h | 2 + 5 files changed, 241 insertions(+), 43 deletions(-)
diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec index 0f17bb02d4d..ff654558b72 100644 --- a/dlls/gdiplus/gdiplus.spec +++ b/dlls/gdiplus/gdiplus.spec @@ -613,7 +613,7 @@ 613 stdcall GdipCreateEffect(int128 ptr) 614 stdcall GdipDeleteEffect(ptr) 615 stdcall GdipGetEffectParameterSize(ptr ptr) -616 stub GdipGetEffectParameters +616 stdcall GdipGetEffectParameters(ptr ptr ptr) 617 stdcall GdipSetEffectParameters(ptr ptr long) 618 stdcall GdipInitializePalette(ptr long long long ptr) 619 stdcall GdipBitmapCreateApplyEffect(ptr long ptr ptr ptr ptr long ptr ptr) diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index c3bdbad8416..328df0dcc80 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -388,6 +388,7 @@ typedef struct GpEffect{ void *auxdata; BOOL useauxdata; UINT paramsize; + void *params; EffectType type; } GpEffect;
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index e32b7932073..205d6ccf37d 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -5691,20 +5691,105 @@ GpStatus WINGDIPAPI GdipGetEffectParameterSize(CGpEffect *effect, UINT *size) return status; }
+/***************************************************************************** + * GdipGetEffectParameters [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipGetEffectParameters(CGpEffect *effect, + UINT *size, VOID *params) +{ + GpEffect *ef; + + TRACE("(%p,%p,%p)\n", effect, size, params); + if (!effect || !params || !size) + return InvalidParameter; + + ef = (GpEffect *)effect; + *size = ef->paramsize; + params = ef->params; + return Ok; +} + /***************************************************************************** * GdipSetEffectParameters [GDIPLUS.@] */ GpStatus WINGDIPAPI GdipSetEffectParameters(CGpEffect *effect, const VOID *params, const UINT size) { - static int calls; + GpEffect *ef; + UINT paramsize = 0;
TRACE("(%p,%p,%u)\n", effect, params, size);
- if(!(calls++)) - FIXME("not implemented\n"); + if (!effect || !params || !size) + return InvalidParameter;
- return NotImplemented; + ef = (GpEffect *)effect; + switch (ef->type) + { + case BlurEffect: + paramsize = sizeof(struct BlurParams); + if (paramsize != size) + return InvalidParameter; + break; + case SharpenEffect: + paramsize = sizeof(struct SharpenParams); + if (paramsize != size) + return InvalidParameter; + break; + case TintEffect: + paramsize = sizeof(struct TintParams); + if (paramsize != size) + return InvalidParameter; + break; + case RedEyeCorrectionEffect: + paramsize = sizeof(struct RedEyeCorrectionParams); + if ((size-paramsize <= 0) || (((size-paramsize)%sizeof(RECT)) != 0)) + return InvalidParameter; + break; + case ColorMatrixEffect: + paramsize = sizeof(ColorMatrix); + if (paramsize != size) + return InvalidParameter; + break; + case ColorLUTEffect: + paramsize = sizeof(struct ColorLUTParams); + if (paramsize != size) + return InvalidParameter; + break; + case BrightnessContrastEffect: + paramsize = sizeof(struct BrightnessContrastParams); + if (paramsize != size) + return InvalidParameter; + break; + case HueSaturationLightnessEffect: + paramsize = sizeof(struct HueSaturationLightnessParams); + if (paramsize != size) + return InvalidParameter; + break; + case ColorBalanceEffect: + paramsize = sizeof(struct ColorBalanceParams); + if (paramsize != size) + return InvalidParameter; + break; + case LevelsEffect: + paramsize = sizeof(struct LevelsParams); + if (paramsize != size) + return InvalidParameter; + break; + case ColorCurveEffect: + paramsize = sizeof(struct ColorCurveParams); + if (paramsize != size) + return InvalidParameter; + break; + default: + return InvalidParameter; + } + + ef->paramsize = size; + ef->params = malloc(size); + memcpy(ef->params, params, size); + + return Ok; }
/***************************************************************************** diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index bc0b825f9f1..f615e1c3726 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -5408,19 +5408,36 @@ static void test_createeffect(void) GpStatus (WINAPI *pGdipCreateEffect)( const GUID guid, CGpEffect **effect); GpStatus (WINAPI *pGdipDeleteEffect)( CGpEffect *effect); GpStatus (WINAPI *pGdipGetEffectParameterSize)( CGpEffect *effect, UINT *size); + GpStatus (WINAPI *pGdipGetEffectParameters)( CGpEffect *effect, UINT *size, VOID *params); + GpStatus (WINAPI *pGdipSetEffectParameters)( CGpEffect *effect, const VOID *params, const UINT size); GpStatus stat; CGpEffect *effect; - UINT size; + UINT size, paramsize = 0; + void *params = NULL; HMODULE mod = GetModuleHandleA("gdiplus.dll"); - int i; + int i, j, k; const GUID * const effectlist[] = {&BlurEffectGuid, &SharpenEffectGuid, &ColorMatrixEffectGuid, &ColorLUTEffectGuid, &BrightnessContrastEffectGuid, &HueSaturationLightnessEffectGuid, &LevelsEffectGuid, &TintEffectGuid, &ColorBalanceEffectGuid, &RedEyeCorrectionEffectGuid, &ColorCurveEffectGuid}; + struct BlurParams blur; + struct SharpenParams sharpen; + ColorMatrix matrix; + struct ColorLUTParams clut; + struct BrightnessContrastParams bc; + struct HueSaturationLightnessParams hsl; + struct LevelsParams lvl; + struct TintParams tint; + struct ColorBalanceParams cbal; + struct RedEyeCorrectionParams redi; + struct ColorCurveParams ccurve; + RECT rects[2];
pGdipCreateEffect = (void*)GetProcAddress( mod, "GdipCreateEffect"); pGdipDeleteEffect = (void*)GetProcAddress( mod, "GdipDeleteEffect"); pGdipGetEffectParameterSize = (void*)GetProcAddress( mod, "GdipGetEffectParameterSize"); + pGdipGetEffectParameters = (void*)GetProcAddress( mod, "GdipGetEffectParameters"); + pGdipSetEffectParameters = (void*)GetProcAddress( mod, "GdipSetEffectParameters"); if(!pGdipCreateEffect || !pGdipDeleteEffect) { /* GdipCreateEffect/GdipDeleteEffect was introduced in Windows Vista. */ @@ -5434,15 +5451,36 @@ static void test_createeffect(void) stat = pGdipGetEffectParameterSize(NULL, NULL); expect(InvalidParameter, stat);
+ stat = pGdipSetEffectParameters(NULL, NULL, 0); + expect(InvalidParameter, stat); + + stat = pGdipGetEffectParameters(NULL, NULL, NULL); + expect(InvalidParameter, stat); + stat = pGdipGetEffectParameterSize(effect, NULL); expect(InvalidParameter, stat);
+ stat = pGdipSetEffectParameters(effect, params, 0); + expect(InvalidParameter, stat); + + stat = pGdipGetEffectParameters(effect, &size, NULL); + expect(InvalidParameter, stat); + + stat = pGdipGetEffectParameters(effect, &size, params); + expect(InvalidParameter, stat); + stat = pGdipCreateEffect(noneffect, &effect); expect(Win32Error, stat);
stat = pGdipGetEffectParameterSize(effect, &size); expect(InvalidParameter, stat); expect(0, size); + stat = pGdipSetEffectParameters(effect, (void *)0xdeadbeef, 0); + expect(InvalidParameter, stat); + stat = pGdipSetEffectParameters(effect, (void *)0xdeadbeef, 8); + expect(InvalidParameter, stat); + stat = pGdipSetEffectParameters(effect, (void *)0xdeadbeef, 5); + expect(InvalidParameter, stat);
for(i=0; i < ARRAY_SIZE(effectlist); i++) { @@ -5451,42 +5489,114 @@ static void test_createeffect(void)
stat = pGdipGetEffectParameterSize(effect, &size); expect(Ok, stat); - switch(i) - { - case 0: - expect(sizeof(struct BlurParams), size); - break; - case 1: - expect(sizeof(struct SharpenParams), size); - break; - case 2: - expect(sizeof(ColorMatrix), size); - break; - case 3: - expect(sizeof(struct ColorLUTParams), size); - break; - case 4: - expect(sizeof(struct BrightnessContrastParams), size); - break; - case 5: - expect(sizeof(struct HueSaturationLightnessParams), size); - break; - case 6: - expect(sizeof(struct LevelsParams), size); - break; - case 7: - expect(sizeof(struct TintParams), size); - break; - case 8: - expect(sizeof(struct ColorBalanceParams), size); - break; - case 9: - expect(sizeof(struct RedEyeCorrectionParams), size); - break; - case 10: - expect(sizeof(struct ColorCurveParams), size); - break; - } + switch(i) + { + case 0: + paramsize = sizeof(struct BlurParams); + expect(paramsize, size); + blur.radius = 2.0; + blur.expandEdge = TRUE; + stat = pGdipSetEffectParameters(effect, (void *)&blur, 5); + expect(InvalidParameter, stat); + stat = pGdipSetEffectParameters(effect, (void *)&blur, paramsize); + break; + case 1: + paramsize = sizeof(struct SharpenParams); + expect(paramsize, size); + sharpen.radius = 5.0; + sharpen.amount = 2; + stat = pGdipSetEffectParameters(effect, (void *)&sharpen, paramsize); + break; + case 2: + paramsize = sizeof(ColorMatrix); + expect(paramsize, size); + for (j = 0; j < 5; j++) { + for (k = 0; k < 5; k++) { + matrix.m[j][k] = (float) j+1; + } + } + stat = pGdipSetEffectParameters(effect, (void *)&matrix, sizeof(ColorMatrix)); + break; + case 3: + paramsize = sizeof(struct ColorLUTParams); + expect(paramsize, size); + for (j = 0; j < sizeof(ColorChannelLUT); j++) + { + clut.lutB[j] = j%8; + clut.lutG[j] = j%16; + clut.lutR[j] = j%4; + clut.lutA[j] = 0; + } + stat = pGdipSetEffectParameters(effect, (void *)&clut, paramsize); + break; + case 4: + paramsize = sizeof(struct BrightnessContrastParams); + expect(paramsize, size); + bc.brightnessLevel = 75; + bc.contrastLevel = 50; + stat = pGdipSetEffectParameters(effect, (void *)&bc, paramsize); + break; + case 5: + paramsize = sizeof(struct HueSaturationLightnessParams); + expect(paramsize, size); + hsl.hueLevel = 50; + hsl.saturationLevel = 50; + hsl.lightnessLevel = 50; + stat = pGdipSetEffectParameters(effect, (void *)&hsl, paramsize); + break; + case 6: + paramsize = sizeof(struct LevelsParams); + expect(paramsize, size); + lvl.highlight = 50; + lvl.midtone = 50; + lvl.shadow = 5; + stat = pGdipSetEffectParameters(effect, (void *)&lvl, paramsize); + break; + case 7: + paramsize = sizeof(struct TintParams); + expect(paramsize, size); + tint.hue = 20; + tint.amount = 5; + stat = pGdipSetEffectParameters(effect, (void *)&tint, paramsize); + break; + case 8: + paramsize = sizeof(struct ColorBalanceParams); + expect(paramsize, size); + cbal.cyanRed = 50; + cbal.magentaGreen = 50; + cbal.yellowBlue = 50; + stat = pGdipSetEffectParameters(effect, (void *)&cbal, paramsize); + break; + case 9: + paramsize = sizeof(struct RedEyeCorrectionParams); + expect(paramsize, size); + SetRect(&rects[0], 0, 0, 75, 75); + SetRect(&rects[1], -32, -32, 32, 32); + redi.numberOfAreas = 2; + redi.areas = rects; + stat = pGdipSetEffectParameters(effect, (void *)&redi, paramsize); + expect(InvalidParameter, stat); + paramsize = paramsize + (2*sizeof(RECT)); + stat = pGdipSetEffectParameters(effect, (void *)&redi, paramsize); + break; + case 10: + paramsize = sizeof(struct ColorCurveParams); + expect(paramsize, size); + ccurve.adjustment = AdjustExposure; + ccurve.channel = CurveChannelAll; + ccurve.adjustValue = 5; + stat = pGdipSetEffectParameters(effect, (void *)&ccurve, paramsize); + break; + } + expect(Ok, stat); + stat = pGdipGetEffectParameterSize(effect, &size); + expect(Ok, stat); + expect(paramsize, size); + params = malloc(paramsize); + size = 0; + stat = pGdipGetEffectParameters(effect, &size, params); + expect(Ok, stat); + expect(paramsize, size);
if(stat == Ok) { diff --git a/include/gdipluseffects.h b/include/gdipluseffects.h index a58d25cb0e3..17a07726f33 100644 --- a/include/gdipluseffects.h +++ b/include/gdipluseffects.h @@ -112,6 +112,8 @@ extern "C" { GpStatus WINGDIPAPI GdipCreateEffect(const GUID guid, CGpEffect **effect); GpStatus WINGDIPAPI GdipDeleteEffect(CGpEffect *effect); GpStatus WINGDIPAPI GdipGetEffectParameterSize(CGpEffect *effect, UINT *size); +GpStatus WINGDIPAPI GdipGetEffectParameters(CGpEffect *effect, UINT *size, VOID *params); +GpStatus WINGDIPAPI GdipSetEffectParameters(CGpEffect *effect, const VOID *params, const UINT size);
#ifdef __cplusplus }