Получение данных о формате пикселей
Сведения о формате пикселей поверхности можно получить функцией GetPixelFormat() интерфейса DirectDrawSurface, в которой для передачи данных используется структура DDPIXELFORMAT. Функция GetPixelFormat() применяется так:
DDPIXELFORMAT format; ZeroMemory( &format, sizeof(format) ); format.dwSize=sizeof(format); surf->GetPixelFormat( &format ); |
Структура DDPIXELFORMAT содержит четыре поля, представляющих для нас интерес:
- dwRGBBitCount
- dwRBitMask
- dwGBitMask
- dwBBitMask
Три маски показывают, в каких позициях пикселя хранятся данные отдельных цветовых составляющих. С помощью этих масок можно корректно читать и записывать данные пикселя независимо от его формата.
Таблица 5.1. Типичные данные формата для 16-битных пикселей
Поле
|
Значение | Двоичное значение |
dwRGBBitCount dwRBitMask dwGBitMask dwBBitMask |
16 63488 2016 31 |
(неважно) 1111100000000000 0000011111100000 0000000000011111 |
В приведенном ниже коде маски используются для вычисления двух величин: начальной позиции каждой цветовой составляющей внутри пикселя (бит, с которого начинается составляющая, или стартовый бит), и количества бит для представления каждой цветовой составляющей. Значения этих величин приведены в табл. 5.2. Обратите внимание на то, что стартовый бит отсчитывается справа налево (старшие биты в двоичных величинах находятся слева).
Рассчитанные значения облегчают операции с пикселями. Стартовый бит показывает, на сколько позиций сдвигаются данные цветовой составляющей, а количество — сколько бит занимает составляющая в двоичной величине.
Таблица 5.2. Типичные данные формата для 16-битных пикселей
Поле | Значение | Двоичное значение | Стартовый бит | Количество бит |
dwRBitMask dwGBitMask dwBBitMask |
63488 2016 31 |
1111100000000000 0000011111100000 0000000000011111 |
11 5 0 |
5 6 5 |
Таблица 5.3. Типичные данные формата для 24-битных пикселей
Поле | Значение | Двоичное значение | Стартовый бит | Количество бит |
dwRBitMask dwGBitMask dwBBitMask |
16711680 65280 255 |
111111110000000000000000 000000001111111110000000 000000000000000011111111 |
16 8 0 |
8 8 8 |