Стэн Трухильо - Графика для Windows средствами DirectDraw
- Название:Графика для Windows средствами DirectDraw
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стэн Трухильо - Графика для Windows средствами DirectDraw краткое содержание
Графика для Windows средствами DirectDraw - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Таблица 5.3. Типичные данные формата для 24-битных пикселей
Поле | Значение | Двоичное значение | Стартовый бит | Количество бит |
---|---|---|---|---|
dwRBitMask | 16711680 | 111111110000000000000000 | 16 | 8 |
dwGBitMask | 65280 | 000000001111111110000000 | 8 | 8 |
dwBBitMask | 255 | 000000000000000011111111 | 0 | 8 |
Помните — данные в этих таблицах относятся к конкретной аппаратуре. Они представлены лишь для примера того, как могут выглядеть такие данные, а не как исчерпывающее руководство по форматам пикселей.
При описании класса 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()выглядит так:
HRESULT Lock(LPRECT rect, LPDDSURFACEDESC desc, DWORD flags, HANDLE event);
Первый аргумент является указателем на структуру RECT, которая описывает рабочую область поверхности. Если этот аргумент равен нулю, доступ осуществляется ко всей поверхности. Применение этого аргумента для описания рабочих прямоугольников упрощает код, следующий за вызовом Lock(), поскольку вам не нужно вычислять лишние смещения. Тем не менее при задании такого прямоугольника оказывается еще важнее использовать шаг поверхности при доступе к памяти.
Второй аргумент функции Lock() — структура DDSURFACEDESC, которая используется для возвращения указателя на память поверхности (поле lpSurface) и шага поверхности (поле lPitch). Функция Lock()(как и другие функции DirectDraw) требует правильно присвоить значение полю dwSizeструктуры DDSURFACEDESC.
Третий аргумент используется для настройки параметров Lock(). В него могут входить следующие флаги:
• DDLOCK_EVENT
• DDLOCK_READONLY
• DDLOCK_WRITEONLY
• DDLOCK_SURFACEMEMORYPTR
• DDLOCK_WAIT
На момент выхода DirectX 5 флаг DDLOCK_EVENTне поддерживался. Возможно, в будущих версиях DirectDraw он будет использоваться совместно с последним аргументом Lock()для реализации альтернативного метода блокировки поверхностей.
Флаги DDLOCK_READONLYи DDLOCK_WRITEONLYследует использовать в том случае, когда доступ к памяти поверхности осуществляется исключительно для чтения или записи. В большинстве ситуаций эти флаги ни на что не действуют, однако в видеорежимах «Mode X» DirectDraw использует их для оптимизации доступа к поверхности.
Флаг DDLOCK_SURFACEMEMORYPTRнеобязателен, потому что он задает поведение Lock(), которое и так является стандартным. Lock()возвращает указатель на память поверхности как с этим флагом, так и без него, поэтому мы не станем использовать его в своих программах (флаг DDLOCK_SURFACEMEMORYPTRна самом деле определен равным 0, так что я нисколько не преувеличиваю, говоря, что он ни на что не влияет).
Флаг DDLOCK_WAITпоказывает, что функция Lock()должна дождаться завершения блокировки в том случае, если в данный момент поверхность используется для другой цели — например, участвует в операции блиттинга или переключения поверхностей. Если этот флаг задан, Lock()работает в цикле до тех пор, пока поверхность не освободится для блокировки или пока не произойдет ошибка. При отсутствии флага DDLOCK_WAITфункция Lock()для занятой поверхности возвратит код DDERR_SURFACEBUSY, и блокировка не состоится. Для упрощения кода мы будем использовать этот флаг.
BMP-файлы
Теперь мы знаем, как получить прямой доступ к поверхности и что делать с ее памятью, чтобы изменить значения отдельных пикселей. Давайте используем полученные знания на практике. В этой главе мы напишем приложение DirectDraw для просмотра графических файлов формата BMP. Но перед тем как браться за такую программу, необходимо научиться загружать BMP-файлы.
BMP — стандартный формат графических файлов Windows. Подавляющее большинство BMP-файлов хранится без сжатия, что облегчает работу с ними. Даже в сжатых BMP-файлах нет ничего особенно сложного, но мы ограничимся файлами без сжатия.
BMP-файлы состоят из трех основных частей:
• заголовок;
• палитра;
• графические данные (значения пикселей).
Заголовок содержит информацию о файле и находящемся в нем графическом изображении. Здесь хранятся параметры изображения (ширина, высота, глубина пикселей), а также количество цветов в нем.
Палитра присутствует только в BMP-файлах, содержащих палитровые изображения (с глубиной пикселей 8 бит и менее). К 8-битным изображениям прикладывается палитра, состоящая из не более чем 256 элементов.
Читать дальшеИнтервал:
Закладка: