gdiplus: Implement GdipInitializePalette.

Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
Signed-off-by: Vincent Povirk <vincent@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Dmitry Timoshkov 2019-01-31 09:56:03 +08:00 committed by Alexandre Julliard
parent d102d6e9f7
commit cbc486aca1
3 changed files with 110 additions and 1 deletions

View File

@ -615,7 +615,7 @@
615 stub GdipGetEffectParameterSize
616 stub GdipGetEffectParameters
617 stdcall GdipSetEffectParameters(ptr ptr long)
618 stub GdipInitializePalette
618 stdcall GdipInitializePalette(ptr long long long ptr)
619 stdcall GdipBitmapCreateApplyEffect(ptr long ptr ptr ptr ptr long ptr ptr)
620 stdcall GdipBitmapApplyEffect(ptr ptr ptr long ptr ptr)
621 stdcall GdipBitmapGetHistogram(ptr long long ptr ptr ptr ptr)

View File

@ -5640,3 +5640,111 @@ GpStatus WINGDIPAPI GdipBitmapGetHistogramSize(HistogramFormat format, UINT *num
*num_of_entries = 256;
return Ok;
}
static GpStatus create_optimal_palette(ColorPalette *palette, INT desired,
BOOL transparent, GpBitmap *bitmap)
{
GpStatus status;
BitmapData data;
HRESULT hr;
IWICImagingFactory *factory;
IWICPalette *wic_palette;
if (!bitmap) return InvalidParameter;
if (palette->Count < desired) return GenericError;
status = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead, PixelFormat24bppRGB, &data);
if (status != Ok) return status;
hr = WICCreateImagingFactory_Proxy(WINCODEC_SDK_VERSION, &factory);
if (hr != S_OK)
{
GdipBitmapUnlockBits(bitmap, &data);
return hresult_to_status(hr);
}
hr = IWICImagingFactory_CreatePalette(factory, &wic_palette);
if (hr == S_OK)
{
IWICBitmap *bitmap;
/* PixelFormat24bppRGB actually stores the bitmap bits as BGR. */
hr = IWICImagingFactory_CreateBitmapFromMemory(factory, data.Width, data.Height,
&GUID_WICPixelFormat24bppBGR, data.Stride, data.Stride * data.Width, data.Scan0, &bitmap);
if (hr == S_OK)
{
hr = IWICPalette_InitializeFromBitmap(wic_palette, (IWICBitmapSource *)bitmap, desired, transparent);
if (hr == S_OK)
{
palette->Flags = 0;
IWICPalette_GetColorCount(wic_palette, &palette->Count);
IWICPalette_GetColors(wic_palette, palette->Count, palette->Entries, &palette->Count);
}
IWICBitmap_Release(bitmap);
}
IWICPalette_Release(wic_palette);
}
IWICImagingFactory_Release(factory);
GdipBitmapUnlockBits(bitmap, &data);
return hresult_to_status(hr);
}
/*****************************************************************************
* GdipInitializePalette [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipInitializePalette(ColorPalette *palette,
PaletteType type, INT desired, BOOL transparent, GpBitmap *bitmap)
{
TRACE("(%p,%d,%d,%d,%p)\n", palette, type, desired, transparent, bitmap);
if (!palette) return InvalidParameter;
switch (type)
{
case PaletteTypeCustom:
return Ok;
case PaletteTypeOptimal:
return create_optimal_palette(palette, desired, transparent, bitmap);
/* WIC palette type enumeration matches these gdiplus enums */
case PaletteTypeFixedBW:
case PaletteTypeFixedHalftone8:
case PaletteTypeFixedHalftone27:
case PaletteTypeFixedHalftone64:
case PaletteTypeFixedHalftone125:
case PaletteTypeFixedHalftone216:
case PaletteTypeFixedHalftone252:
case PaletteTypeFixedHalftone256:
{
ColorPalette *wic_palette;
GpStatus status = Ok;
wic_palette = get_palette(NULL, type);
if (!wic_palette) return OutOfMemory;
if (palette->Count >= wic_palette->Count)
{
palette->Flags = wic_palette->Flags;
palette->Count = wic_palette->Count;
memcpy(palette->Entries, wic_palette->Entries, wic_palette->Count * sizeof(wic_palette->Entries[0]));
}
else
status = GenericError;
heap_free(wic_palette);
return status;
}
default:
FIXME("unknown palette type %d\n", type);
break;
}
return InvalidParameter;
}

View File

@ -266,6 +266,7 @@ GpStatus WINGDIPAPI GdipGraphicsClear(GpGraphics*,ARGB);
GpStatus WINGDIPAPI GdipGraphicsSetAbort(GpGraphics*,GdiplusAbort*);
GpStatus WINGDIPAPI GdipGetVisibleClipBounds(GpGraphics*,GpRectF*);
GpStatus WINGDIPAPI GdipGetVisibleClipBoundsI(GpGraphics*,GpRect*);
GpStatus WINGDIPAPI GdipInitializePalette(ColorPalette*,PaletteType,INT,BOOL,GpBitmap*);
GpStatus WINGDIPAPI GdipIsClipEmpty(GpGraphics*, BOOL*);
GpStatus WINGDIPAPI GdipIsVisiblePoint(GpGraphics*,REAL,REAL,BOOL*);
GpStatus WINGDIPAPI GdipIsVisiblePointI(GpGraphics*,INT,INT,BOOL*);