Module: wine Branch: master Commit: bec58b5e9c250cd337fc6c694e1c14531bdaa372 URL: https://source.winehq.org/git/wine.git/?a=commit;h=bec58b5e9c250cd337fc6c694...
Author: Ziqing Hui zhui@codeweavers.com Date: Mon Aug 17 10:23:14 2020 +0800
windowscodecs: Introduce get_pixel_format_bpp().
Signed-off-by: Ziqing Hui zhui@codeweavers.com Signed-off-by: Esme Povirk esme@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/windowscodecs/ddsformat.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
diff --git a/dlls/windowscodecs/ddsformat.c b/dlls/windowscodecs/ddsformat.c index 87cbf4df91..9f6aab4e91 100644 --- a/dlls/windowscodecs/ddsformat.c +++ b/dlls/windowscodecs/ddsformat.c @@ -131,6 +131,7 @@ typedef struct dds_frame_info { UINT width_in_blocks; UINT height_in_blocks; const GUID *pixel_format; + UINT pixel_format_bpp; } dds_frame_info;
typedef struct DdsDecoder { @@ -446,6 +447,27 @@ static void get_dds_info(dds_info* info, DDS_HEADER *header, DDS_HEADER_DXT10 *h if (info->dimension == WICDdsTextureCube) info->frame_count *= 6; }
+static UINT get_pixel_format_bpp(const GUID *pixel_format) +{ + HRESULT hr; + UINT bpp = 0; + IWICComponentInfo *info = NULL; + IWICPixelFormatInfo* format_info = NULL; + + hr = CreateComponentInfo(pixel_format, &info); + if (hr != S_OK) goto end; + hr = IWICComponentInfo_QueryInterface(info, &IID_IWICPixelFormatInfo, (void **)&format_info); + if (hr != S_OK) goto end; + + IWICPixelFormatInfo_GetBitsPerPixel(format_info, &bpp); + +end: + if (format_info) IWICPixelFormatInfo_Release(format_info); + if (info) IWICComponentInfo_Release(info); + + return bpp; +} + static inline DdsDecoder *impl_from_IWICBitmapDecoder(IWICBitmapDecoder *iface) { return CONTAINING_RECORD(iface, DdsDecoder, IWICBitmapDecoder_iface); @@ -1090,6 +1112,7 @@ static HRESULT WINAPI DdsDecoder_Dds_GetFrame(IWICDdsDecoder *iface, frame_decode->info.width_in_blocks = frame_width_in_blocks; frame_decode->info.height_in_blocks = frame_height_in_blocks; frame_decode->info.pixel_format = This->info.pixel_format; + frame_decode->info.pixel_format_bpp = get_pixel_format_bpp(This->info.pixel_format); frame_decode->data = HeapAlloc(GetProcessHeap(), 0, frame_size); hr = IStream_Seek(This->stream, seek, SEEK_SET, NULL); if (hr != S_OK) goto end;