From: Vijay Kiran Kamuju infyquest@gmail.com
--- dlls/gdiplus/gdiplus.spec | 2 +- dlls/gdiplus/gdiplus_private.h | 1 + dlls/gdiplus/image.c | 37 ++++++++++++++++++++++++ dlls/gdiplus/tests/image.c | 53 ++++++++++++++++++++++++++++++++++ include/gdipluseffects.h | 1 + 5 files changed, 93 insertions(+), 1 deletion(-)
diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec index 178592e35d9..0f17bb02d4d 100644 --- a/dlls/gdiplus/gdiplus.spec +++ b/dlls/gdiplus/gdiplus.spec @@ -612,7 +612,7 @@ 612 stdcall GdipGetImageItemData(ptr ptr) 613 stdcall GdipCreateEffect(int128 ptr) 614 stdcall GdipDeleteEffect(ptr) -615 stub GdipGetEffectParameterSize +615 stdcall GdipGetEffectParameterSize(ptr ptr) 616 stub GdipGetEffectParameters 617 stdcall GdipSetEffectParameters(ptr ptr long) 618 stdcall GdipInitializePalette(ptr long long long ptr) diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index e225203337c..c3bdbad8416 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -387,6 +387,7 @@ typedef struct GpEffect{ INT auxdatasize; void *auxdata; BOOL useauxdata; + UINT paramsize; EffectType type; } GpEffect;
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index e9258eab65a..e32b7932073 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -5654,6 +5654,43 @@ GpStatus WINGDIPAPI GdipDeleteEffect(CGpEffect *effect) return Ok; }
+/***************************************************************************** + * GdipGetEffectParameterSize [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipGetEffectParameterSize(CGpEffect *effect, UINT *size) +{ + GpEffect *ef; + GpStatus status = InvalidParameter; + + TRACE("(%p %p)\n", effect, size); + + if (!effect || !size) + return status; + + ef = (GpEffect *)effect; + *size = ef->paramsize; + switch (ef->type) + { + case BlurEffect: + case SharpenEffect: + case TintEffect: + case RedEyeCorrectionEffect: + case ColorMatrixEffect: + case ColorLUTEffect: + case BrightnessContrastEffect: + case HueSaturationLightnessEffect: + case ColorBalanceEffect: + case LevelsEffect: + case ColorCurveEffect: + status = Ok; + break; + default: + break; + } + + return status; +} + /***************************************************************************** * GdipSetEffectParameters [GDIPLUS.@] */ diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index c4a194c14de..bc0b825f9f1 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -5407,8 +5407,10 @@ static void test_createeffect(void) static const GUID noneffect = { 0xcd0c3d4b, 0xe15e, 0x4cf2, { 0x9e, 0xa8, 0x6e, 0x1d, 0x65, 0x48, 0xc5, 0xa5 } }; GpStatus (WINAPI *pGdipCreateEffect)( const GUID guid, CGpEffect **effect); GpStatus (WINAPI *pGdipDeleteEffect)( CGpEffect *effect); + GpStatus (WINAPI *pGdipGetEffectParameterSize)( CGpEffect *effect, UINT *size); GpStatus stat; CGpEffect *effect; + UINT size; HMODULE mod = GetModuleHandleA("gdiplus.dll"); int i; const GUID * const effectlist[] = @@ -5418,6 +5420,7 @@ static void test_createeffect(void)
pGdipCreateEffect = (void*)GetProcAddress( mod, "GdipCreateEffect"); pGdipDeleteEffect = (void*)GetProcAddress( mod, "GdipDeleteEffect"); + pGdipGetEffectParameterSize = (void*)GetProcAddress( mod, "GdipGetEffectParameterSize"); if(!pGdipCreateEffect || !pGdipDeleteEffect) { /* GdipCreateEffect/GdipDeleteEffect was introduced in Windows Vista. */ @@ -5428,13 +5431,63 @@ static void test_createeffect(void) stat = pGdipCreateEffect(BlurEffectGuid, NULL); expect(InvalidParameter, stat);
+ stat = pGdipGetEffectParameterSize(NULL, NULL); + expect(InvalidParameter, stat); + + stat = pGdipGetEffectParameterSize(effect, NULL); + expect(InvalidParameter, stat); + stat = pGdipCreateEffect(noneffect, &effect); expect(Win32Error, stat);
+ stat = pGdipGetEffectParameterSize(effect, &size); + expect(InvalidParameter, stat); + expect(0, size); + for(i=0; i < ARRAY_SIZE(effectlist); i++) { stat = pGdipCreateEffect(*effectlist[i], &effect); expect(Ok, stat); + + 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; + } + if(stat == Ok) { stat = pGdipDeleteEffect(effect); diff --git a/include/gdipluseffects.h b/include/gdipluseffects.h index 4100647f7a1..a58d25cb0e3 100644 --- a/include/gdipluseffects.h +++ b/include/gdipluseffects.h @@ -111,6 +111,7 @@ extern "C" {
GpStatus WINGDIPAPI GdipCreateEffect(const GUID guid, CGpEffect **effect); GpStatus WINGDIPAPI GdipDeleteEffect(CGpEffect *effect); +GpStatus WINGDIPAPI GdipGetEffectParameterSize(CGpEffect *effect, UINT *size);
#ifdef __cplusplus }