Wich DIB types ? Are you referring to BI_BITFIELDS compression ?

I just looked at windows codecs code and there this code to handle color masks:

��� /* if this is a BITMAPINFOHEADER with BI_BITFIELDS compression, we need to
������� read the extra fields */
��� if (This->bih.bV5Size == sizeof(BITMAPINFOHEADER) &&
������� This->bih.bV5Compression == BI_BITFIELDS)
��� {
������� This->palette_offset += 12;
��� }

For the rest it's the same thing:

������� /* In a packed DIB, the image follows the palette. */
������� ULONG palette_count, palette_size;
������� if (This->bih.bV5ClrUsed)
����������� palette_count = This->bih.bV5ClrUsed;
������� else if (This->bih.bV5BitCount <= 8)
����������� palette_count = 1 << This->bih.bV5BitCount;
������� else
����������� palette_count = 0;
������� if (This->bih.bV5Size == sizeof(BITMAPCOREHEADER))
����������� palette_size = sizeof(RGBTRIPLE) * palette_count;
������� else
����������� palette_size = sizeof(RGBQUAD) * palette_count;
������� This->image_offset = This->palette_offset + palette_size;

Albeit windows codecs support also BITMAPCOREHEADER2, BITMAPV4HEADER, BITMAPV5HEADER the same way as BITMAPINFOHEADER.

Is there still anything wrong ?

Christian


2013/4/22 Alexandre Julliard <julliard@winehq.org>
Christian Costa <titan.costa@gmail.com> writes:

> + � �if (header_size == sizeof(BITMAPINFOHEADER))
> + � �{
> + � � � �BITMAPINFOHEADER *header = (BITMAPINFOHEADER*)*data;
> + � � � �ULONG count = header->biClrUsed;
> +
> + � � � �if (!count && header->biBitCount <= 8)
> + � � � � � �count = 1 << header->biBitCount;
> +
> + � � � �offset = sizeof(BITMAPFILEHEADER) + header_size + sizeof(RGBQUAD) * count;

This isn't correct for all DIB types.

--
Alexandre Julliard
julliard@winehq.org