Чтение онлайн

на главную - закладки

Жанры

Графика для Windows средствами DirectDraw

Трухильо Стэн

Шрифт:

DDPIXELFORMAT format;

ZeroMemory(&format, sizeof(format));

format.dwSize=sizeof(format);

surf->GetPixelFormat(&format);

Структура DDPIXELFORMAT содержит четыре поля, представляющих для нас интерес:

• dwRGBBitCount

• dwRBitMask

• dwGBitMask

• dwBBitMask

Поле dwRGBBitCount показывает глубину пикселей поверхности. Три оставшихся поля являются масками, определяющими, в каких битах пикселя хранятся данные красной, зеленой и синей составляющих. Например, типичные значения полей для поверхности High Color

формата 5-6-5 приведены в табл. 5.1.

Три маски показывают, в каких позициях пикселя хранятся данные отдельных цветовых составляющих. С помощью этих масок можно корректно читать и записывать данные пикселя независимо от его формата.

 Таблица 5.1. Типичные данные формата для 16-битных пикселей

Поле Значение Двоичное значение
dwRGBBitCount 16 (неважно)
dwRBitMask 63488 1111100000000000
dwGBitMask 2016 0000011111100000
dwBBitMask 31 0000000000011111

В приведенном ниже коде маски используются для вычисления двух величин: начальной позиции каждой цветовой составляющей внутри пикселя (бит, с которого начинается составляющая, или стартовый бит), и количества бит для представления каждой цветовой составляющей. Значения этих величин приведены в табл. 5.2. Обратите внимание на то, что стартовый бит отсчитывается справа налево (старшие биты в двоичных величинах находятся слева).

Рассчитанные значения облегчают операции с пикселями. Стартовый бит показывает, на сколько позиций сдвигаются данные цветовой составляющей, а количество — сколько бит занимает составляющая в двоичной величине.

Таблица 5.2. Типичные данные формата для 16-битных пикселей

Поле Значение Двоичное значение Стартовый бит Количество бит
dwRBitMask 63488 1111100000000000 11 5
dwGBitMask 2016 0000011111100000 5 6
dwBBitMask 31 0000000000011111 0 5

Однако до сих пор мы рассматривали лишь 16-битные пиксели. 8-битные пиксели нас не интересуют, но перед тем, как идти дальше, необходимо уделить внимание пикселям формата True Color. В табл. 5.3 приведены данные формата пикселей (в том числе две вычисленные величины для каждой цветовой составляющей) для типичного 24-битного формата.

Таблица 5.3. Типичные данные формата для 24-битных пикселей

Поле Значение Двоичное значение Стартовый бит Количество бит
dwRBitMask 16711680 111111110000000000000000 16 8
dwGBitMask 65280 000000001111111110000000 8 8
dwBBitMask 255 000000000000000011111111 0 8

Помните —

данные в этих таблицах относятся к конкретной аппаратуре. Они представлены лишь для примера того, как могут выглядеть такие данные, а не как исчерпывающее руководство по форматам пикселей.

Переменные формата пикселей в классе DirectDrawWin

При описании класса DirectDrawWin в главе 3 мы видели, что функция DirectDrawWin::ActivateDisplayMode после активизации нового видеорежима, но до создания вспомогательных поверхностей приложения, вызывает функцию StorePixelFormatData. Описание этой функции было отложено до настоящего момента.

Функция StorePixelFormatData присваивает значения шести переменным класса DirectDrawWin в соответствии с форматом пикселей текущего активного видеорежима; эти переменные определяют стартовый бит и количество бит для каждой цветовой составляющей пикселя. В следующем разделе мы увидим, как эти переменные используются при манипуляциях с памятью поверхности. Функция StorePixelFormatData выглядит так:

BOOL DirectDrawWin::StorePixelFormatData {

 DDPIXELFORMAT format;

 ZeroMemory(&format, sizeof(format));

 format.dwSize=sizeof(format);

 if (primsurf->GetPixelFormat(&format)!=DD_OK) {

TRACE("StorePixelFormatData failed\n");

return FALSE;

 }

 loREDbit = LowBitPos(format.dwRBitMask);

 WORD hiREDbit = HighBitPos(format.dwRBitMask);

 numREDbits=(WORD)(hiREDbit-loREDbit+1);

 loGREENbit = LowBitPos(format.dwGBitMask);

 WORD hiGREENbit = HighBitPos(format.dwGBitMask);

 numGREENbits=(WORD)(hiGREENbit-loGREENbit+1);

 loBLUEbit = LowBitPos(format.dwBBitMask);

 WORD hiBLUEbit = HighBitPos(format.dwBBitMask);

 numBLUEbits=(WORD)(hiBLUEbit-loBLUEbit+1);

 return TRUE;

}

Функция StorePixelFormatData присваивает значения шести переменным формата с помощью масок, полученных функцией GetPixelFormat интерфейса DirectDrawSurface. Это следующие переменные:

• loREDbit

• numREDbits

• loGREENbit

• numGREENbits

• loBLUEbit

• numBLUEbits

Как вы убедитесь при изучении кода для работы с беспалитровыми поверхностями, эти переменные оказываются очень удобными.

Блокировка поверхностей

Для прямого доступа к поверхности необходимо предварительно вызвать функцию Lock интерфейса DirectDrawSurface. Lock получает экземпляр структуры DDSURFACEDESC и возвращает указатель на левый верхний пиксель поверхности, шаг поверхности, ее размеры и даже формат пикселей (структура DDSURFACEDESC содержит экземпляр DDPIXELFORMAT, поэтому вызов GetPixelFormat интерфейса DirectDrawSurface оказывается необязательным). Прототип функции Lock выглядит так:

Поделиться:
Популярные книги

Я не Монте-Кристо

Тоцка Тала
Любовные романы:
современные любовные романы
5.57
рейтинг книги
Я не Монте-Кристо

Офицер-разведки

Поселягин Владимир Геннадьевич
2. Красноармеец
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Офицер-разведки

На границе империй. Том 9. Часть 5

INDIGO
18. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 5

Мастер Разума VII

Кронос Александр
7. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума VII

Вперед в прошлое 8

Ратманов Денис
8. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 8

Хозяйка Проклятой Пустоши. Книга 2

Белецкая Наталья
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2

Экономка тайного советника

Семина Дия
Фантастика:
фэнтези
5.00
рейтинг книги
Экономка тайного советника

Газлайтер. Том 2

Володин Григорий
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 2

Идеальный мир для Лекаря 15

Сапфир Олег
15. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 15

Хозяйка забытой усадьбы

Воронцова Александра
5. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка забытой усадьбы

Зубных дел мастер

Дроздов Анатолий Федорович
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Зубных дел мастер

Крепость над бездной

Лисина Александра
4. Гибрид
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Крепость над бездной

Вперед в прошлое 3

Ратманов Денис
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 3

Правильный попаданец

Дашко Дмитрий Николаевич
1. Мент
Фантастика:
альтернативная история
5.75
рейтинг книги
Правильный попаданец