From: Vijay Kiran Kamuju infyquest@gmail.com
--- dlls/gdiplus/gdiplus.spec | 2 +- dlls/gdiplus/gdiplus_private.h | 1 + dlls/gdiplus/image.c | 49 ++++++++++++++++++++++++++++++ dlls/gdiplus/tests/image.c | 55 ++++++++++++++++++++++++++++++++++ include/gdipluseffects.h | 1 + 5 files changed, 107 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 56269e13123..71d175c5935 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -5588,50 +5588,62 @@ GpStatus WINGDIPAPI GdipCreateEffect(const GUID guid, CGpEffect **effect) ef->auxdatasize = 0; ef->auxdata = NULL; ef->useauxdata = FALSE; + ef->paramsize = 0;
if (IsEqualGUID(&guid, &BlurEffectGuid)) { ef->type = BlurEffect; + ef->paramsize = sizeof(struct BlurParams); } else if (IsEqualGUID(&guid, &SharpenEffectGuid)) { ef->type = SharpenEffect; + ef->paramsize = sizeof(struct SharpenParams); } else if (IsEqualGUID(&guid, &TintEffectGuid)) { ef->type = TintEffect; + ef->paramsize = sizeof(struct TintParams); } else if (IsEqualGUID(&guid, &RedEyeCorrectionEffectGuid)) { ef->type = RedEyeCorrectionEffect; + ef->paramsize = sizeof(struct RedEyeCorrectionParams); } else if (IsEqualGUID(&guid, &ColorMatrixEffectGuid)) { ef->type = ColorMatrixEffect; + ef->paramsize = sizeof(ColorMatrix); } else if (IsEqualGUID(&guid, &ColorLUTEffectGuid)) { ef->type = ColorLUTEffect; + ef->paramsize = sizeof(struct ColorLUTParams); } else if (IsEqualGUID(&guid, &BrightnessContrastEffectGuid)) { ef->type = BrightnessContrastEffect; + ef->paramsize = sizeof(struct BrightnessContrastParams); } else if (IsEqualGUID(&guid, &HueSaturationLightnessEffectGuid)) { ef->type = HueSaturationLightnessEffect; + ef->paramsize = sizeof(struct HueSaturationLightnessParams); } else if (IsEqualGUID(&guid, &ColorBalanceEffectGuid)) { ef->type = ColorBalanceEffect; + ef->paramsize = sizeof(struct ColorBalanceParams); } else if (IsEqualGUID(&guid, &LevelsEffectGuid)) { ef->type = LevelsEffect; + ef->paramsize = sizeof(struct LevelsParams); } else if (IsEqualGUID(&guid, &ColorCurveEffectGuid)) { ef->type = ColorCurveEffect; + ef->paramsize = sizeof(struct ColorCurveParams); } else { @@ -5654,6 +5666,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..abf8fd98625 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, paramsize = 0; 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,15 +5431,67 @@ 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); + if(stat == Ok) { + size = 0; + stat = pGdipGetEffectParameterSize(effect, &size); + expect(Ok, stat); + switch(i) + { + case 0: + paramsize = sizeof(struct BlurParams); + break; + case 1: + paramsize = sizeof(struct SharpenParams); + break; + case 2: + paramsize = sizeof(ColorMatrix); + break; + case 3: + paramsize = sizeof(struct ColorLUTParams); + break; + case 4: + paramsize = sizeof(struct BrightnessContrastParams); + break; + case 5: + paramsize = sizeof(struct HueSaturationLightnessParams); + break; + case 6: + paramsize = sizeof(struct LevelsParams); + break; + case 7: + paramsize = sizeof(struct TintParams); + break; + case 8: + paramsize = sizeof(struct ColorBalanceParams); + break; + case 9: + paramsize = sizeof(struct RedEyeCorrectionParams); + break; + case 10: + paramsize = sizeof(struct ColorCurveParams); + break; + } + expect(paramsize, size); + stat = pGdipDeleteEffect(effect); expect(Ok, stat); } 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 }