Программирование графики с использованием Direct3D



         

Функции работы с палитрой - часть 3


Структуры RGBQUAD и PALETTEENTRY очень похожи. Их определение выглядит так:

typedef struct tagRGBQUAD { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; } RGBQUAD;

typedef struct tagPALETTEENTRY { BYTE peRed; BYTE peGreen; BYTE peBlue; BYTE peFlags; } PALETTEENTRY;

Главное различие — порядок следования красной, зеленой и синей цветовых составляющих. Для копирования содержимого массива RGBQUAD в массив PALETTEENTRY будет использован цикл.

Сначала функция InstallPalette() проверяет строку palettefile:

if (palettefile.GetLength() <= 0) return FALSE;

Вспомните, что значение строки palettefile устанавливается в функции UsePalette(). Если класс, производный от RMWin не использует UsePalette() для объявления имени файла BMP, палитра не создается и функция InstallPalette() возвращает FALSE. Это не так плохо, как может показаться, поскольку палитра требуется только для 8-разрядных видеорежимов. Приложения, использующие только 16-, 24- и 32-разрядные видеорежимы будут правильно выполняться и без использования функции UsePalette().

Затем проверяется глубина цвета в текущем видеорежиме:

if (modedepth != 8) return FALSE;

Палитра не требуется для тех видеорежимов, глубина цвета которых отличается от восьми, и в этом случае функция InstallPalette() завершает работу.

Потом функция InstallPalette() освобождает любые существующие палитры:

if (palette) { palette->Release(); palette = 0; }

Далее открывается файл BMP и загружаются структуры, содержащие параметры файла и изображения:

ifstream bmp(palettefile, ios::binary | ios::nocreate);

bmp.read((char*)&bmpfilehdr, sizeof(bmpfilehdr)); bmp.read((char*)&bmpinfohdr, sizeof(bmpinfohdr));

Загруженные данные используются при проверке сигнатуры файла BMP и глубине цвета изображения, содержащегося в файле:

char* ptr = (char*)&bmpfilehdr.bfType; if (*ptr != 'B' || *++ptr != 'M') { TRACE("invalid bitmap\n"); return FALSE; }

if (bmpinfohdr.biBitCount != 8) { TRACE("not 8 bit file!\n"); return FALSE; }




Содержание  Назад  Вперед