Трухильо Стэн
Шрифт:
Если изображение является палитровым, мы загружаем палитру. Количество элементов палитры в файле определяется полем biClrUsed, но это поле также может быть равно нулю. В этом случае предполагается, что присутствуют все 256 элементов палитры. Палитра загружается лишь в том случае, если параметр installpalette равен TRUE; тогда вызывается функция CreatePalette. Вскоре мы рассмотрим код этой функции.
Следующий этап — чтение графических данных, которое в нашем случае выполняется одним вызовом функции ifstream::read. Графические данные передаются функции Copy_Bmp_Surface, отвечающей за пересылку данных новой поверхности. После возврата из функции Copy_Bmp_Surface буфер с графическими данными освобождается. BMP-файл автоматически закрывается при возвращении из функции CreateSurface (поскольку локальный объект ifstream выходит из области видимости).
Если второй аргумент функции CreateSurface равен TRUE, CreatePalette создает и заполняет объект DirectDrawPalette данными, полученными из BMP-файла. Функция CreatePalette выглядит так:
Палитры DirectDraw создаются функцией CreatePalette интерфейса DirectDraw, которой передается массив структур PALETTEENTRY. Чтобы выполнить это требование, приходится преобразовывать массив структур RGBQUAD, извлеченный из BMP-файла, во временный массив (структуры PALETTEENTRY и RGBQUAD очень похожи, поэтому такое преобразование оказывается тривиальным). Затем созданный массив передается функции CreatePalette. Флаг DDPCAPS_ALLOW256 сообщает, что мы намерены задать значения всех 256 элементов палитры. Если вы пропустили главу 4 (конечно же, нет!), вернитесь к ней и ознакомьтесь с возможными аспектами использования этого флага.
Наконец, функция SetPalette интерфейса DirectDrawSurface присоединяет палитру к поверхности. Обратите внимание на то, что палитра присоединяется к первичной поверхности. Хотя палитры можно присоединять и к другим поверхностям, на системную палитру влияет только палитра, присоединенная к первичной поверхности.
Как видно из функции CreateSurface, передача графических данных BMP-файла на поверхность осуществляется функцией Copy_Bmp_Surface. Функция Copy_Bmp_Surface пользуется услугами четырех вспомогательных функций, каждая из которых специализируется на пикселях определенной глубины. Код Copy_Bmp_Surface выглядит так:
Вспомогательные функции предназначены для передачи графических данных в зависимости от глубины пикселей BMP-файла и текущего видеорежима. Все четыре функции получают одни и те же четыре аргумента: указатель на поверхность-приемник, буфер с графическими данными из BMP-файла, ширину и высоту изображения. Каждая функция копирует графические данные BMP-файла на поверхность-приемник.
Начнем с самой простой из четырех функций, Copy_Bmp08_Surface08. Она выглядит так: