diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index 24df3dd3f00..3b82b08b0f5 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -326,7 +326,7 @@ struct color_matrix{ struct color_remap_table{ BOOL enabled; INT mapsize; - GDIPCONST ColorMap *colormap; + ColorMap *colormap; }; struct GpImageAttributes{ diff --git a/dlls/gdiplus/imageattributes.c b/dlls/gdiplus/imageattributes.c index c157af3a393..bd5c0826cec 100644 --- a/dlls/gdiplus/imageattributes.c +++ b/dlls/gdiplus/imageattributes.c @@ -62,11 +62,16 @@ GpStatus WINGDIPAPI GdipCreateImageAttributes(GpImageAttributes **imageattr) GpStatus WINGDIPAPI GdipDisposeImageAttributes(GpImageAttributes *imageattr) { + int i; + TRACE("(%p)\n", imageattr); if(!imageattr) return InvalidParameter; + for (i=0; icolorremaptables[i].colormap); + GdipFree(imageattr); return Ok; @@ -205,6 +210,8 @@ GpStatus WINGDIPAPI GdipSetImageAttributesRemapTable(GpImageAttributes *imageAtt ColorAdjustType type, BOOL enableFlag, UINT mapSize, GDIPCONST ColorMap *map) { + ColorMap *new_map; + TRACE("(%p,%u,%i,%u,%p)\n", imageAttr, type, enableFlag, mapSize, map); if(!imageAttr || type >= ColorAdjustTypeCount) @@ -215,8 +222,22 @@ GpStatus WINGDIPAPI GdipSetImageAttributesRemapTable(GpImageAttributes *imageAtt if(!map || !mapSize) return InvalidParameter; + new_map = GdipAlloc(sizeof(*map) * mapSize); + + if (!new_map) + return OutOfMemory; + + memcpy(new_map, map, sizeof(*map) * mapSize); + + GdipFree(imageAttr->colorremaptables[type].colormap); + imageAttr->colorremaptables[type].mapsize = mapSize; - imageAttr->colorremaptables[type].colormap = map; + imageAttr->colorremaptables[type].colormap = new_map; + } + else + { + GdipFree(imageAttr->colorremaptables[type].colormap); + imageAttr->colorremaptables[type].colormap = NULL; } imageAttr->colorremaptables[type].enabled = enableFlag;