Імя поля «bV4V4Compression» з падвоеным «V4» паказана ў дакументацыях і аб’яве структуры ў файле WinGDI.h (глядзіце, напрыклад, «BITMAPV4HEADER structure» на MSDN.).
См. раздел «Remarks» в статье BITMAPINFOHEADER (рубрика «Windows Mobile 6.5») на MSDN.
В MSDN в самом начале раздела «Remarks» страницы структуры BITMAPV5HEADER есть предложение «If bV5Height is negative, indicating a top-down DIB, bV5Compression must be either BI_RGB or BI_BITFIELDS.» (перевод: «Если bV5Height отрицательный, обозначая DIB вида сверху-вниз, то bV5Compression должен быть либо BI_RGB, либо BI_BITFIELDS»). Здесь возможно не уточнили, что это касается только RLE-кодирования, так как в одном из примеров прорисовки JPEG-растра указывается именно отрицательная высота (ищите строку «bmi.bmiHeader.biHeight» в статье «Testing a Printer for JPEG or PNG Support» на MSDN).
Будьте внимательны.
В MSDN в статье «BITMAPINFOHEADER»
для Windows Mobile 6.5 в описании к полю biClrUsed есть предложение
«If biBitCount equals 16 or 32, the optimal color palette starts immediately following the three DWORD masks.»
(перевод: «Если biBitCount равно 16 или 32, то оптимальная цветовая палитра начинается следуя сразу за тремя DWORD-масками»).
В этой же статье выше, в описании к полю biCompression сказано «Specifies that the bitmap is not compressed and that the color table consists of three DWORD color masks…»
и ниже аналогичное с «consists of four DWORD color masks» (переводы: «Указывает, что битмап не сжат и что таблица цветов состоит из трёх цветовых DWORD-масок»
и «состоит из четырёх цветовых DWORD-масок»).
Аналогичная информация содержится в статье «BITMAPINFOHEADER structure» для Windows 9x/NT.
Всё это можно интерпретировать так, что в битности 16 и 32 за информационными полями (структурой BITMAPINFOHEADER) обязательно присутствуют три 32-битных маски для извлечения значений цветовых каналов.
При этом если Compression содержит 3 (BI_BITFIELDS) или 6 (BI_ALPHABITFIELDS), то за ними добавляется ещё три или четыре аналогичных маски,
которые в свою очередь занимают таблицу цветов делая невозможным использование 16-битных индексов оптимальных цветов в логической палитре
(возможно при этом в поле biClrUsed нужно записать значение 6 или 8, а в biClrImportant обязательно 0, чтобы дополнительные маски случайно не обработались как индексы в палитре).
В действительно всё несколько иначе.
В документации MSDN на странице «Bitmap Header Types» есть предложение
«Bitmaps that are 1, 4, or 8 bpp must have a color table with a maximum size based on the bpp.»
(перевод: «Битмапы с битностью 1, 4 или 8 должны содержать таблицу цветов с максимальным соответствующим битности размером.»).
Это явно ошибка и писавший применил условия структуры CORE, у которой действительно должен быть максимум
(см. раздел «Remarks» в статье «BITMAPCOREINFO structure»),
ко всем остальным версиям структур.
В другой статье «BITMAPINFO structure» про таблицу цветов сказано
«The number of entries in the array depends on the values of the biBitCount and biClrUsed members of the BITMAPINFOHEADER structure.»
(перевод: «количество элементов в массиве зависит от значений полей biBitCount и biClrUsed структуры BITMAPINFOHEADER»),
а в статьях структур версий 3, 4, 5
(см., например, «BITMAPV5HEADER structure»)
в описании поля BitCount везде написано
«the bmiColors member of BITMAPINFO contains up to 256 entries»
(аналогично про другие битности; перевод фразы: «член bmiColors BITMAPINFO содержит до 256 элементов»).
См., например, описания к битностям 16 и 32 у поля bV5BitCount в статье «BITMAPV5HEADER structure» на MSDN.
На MSDN и справке Microsoft Windows SDK в статье «BITMAPINFOHEADER structure» в описании значения 16 поля biBitCount есть сбивающее с толку предложение «All the bits in the pixel do not have to be used.» (перевод: «Не задействовать все биты в пикселе»). Это опечатка (написали «have» вместо «need»), которая отсутствует в аналогичном блоке в статье про пятую версию (в четвёртой это предложение отсутствует).
См. раздел «Remarks» в статье «BITMAPINFO» на MSDN.
В документации (например, в статье «BITMAPV5HEADER structure» на MSDN) сказано, что нулевой размер можно указывать при значении 0 (BI_RGB) поля Compression. Очевидно, что это применимо и к значениям 3 (BI_BITFIELDS) и 6 (BI_ALPHABITFIELDS), так как они вносят различие лишь во внутреннюю структуру пикселей, а не в их размер.
На MSDN в статье «BITMAPV4HEADER structure» упоминается только одно значение поля CSType (LCS_CALIBRATED_RGB).
Полный список доступных значений для версий 4 и 5 можно посмотреть в статье «Using Structures in WCS 1.0».