Простая установка палитры
При подготовке образов точечных, или как их еще называют "растровых", рисунков либо используется палитра, либо цвет указывается непосредственно в коде каждой точки. В режимах PPG можно работать только с рисунками, подготовленными с применением палитры.
Коды точек образа рисунка, использующего палитру, являются порядковыми номерами содержащихся в ней цветов. Поэтому палитра должна быть установлена (записана в регистры цвета видеокарты) до построения рисунка на экране. Если этого не сделать, то цвета точек построенного рисунка будут соответствовать тем, которые находятся в регистрах цвета видеокарты, и вы можете увидеть совсем не ту картинку, которая должна быть.
Формат и место палитры в файле
Палитра или таблица цветов содержит коды цветов, использованных при создании рисунка. В большинстве стандартов код цвета занимает 3 байта, в которых указана интенсивность базовых цветов – красного, зеленого и синего. Если базовые цвета перечислены именно в такой последовательности, то мы будем говорить, что палитра имеет формат r, а, b. Если в такой палитре описано N цветов, то она занимает в файле зы байтов. Исключением является стандарт BMP (см. Приложение А). В этом случае строка может содержать три или четыре байта, а палитра занимает в файле соответственно SN или 4N байтов. В трех первых байтах хранятся коды синего, зеленого и красного цветов. Если в строке есть четвертый байт, то он очищен. В таких случаях мы будем говорить, что палитра имеет формат b, g, r или b, g, r, 0.
Как правило, код базового цвета содержит восемь разрядов и заполняет весь байт. В технической документации принято говорить, что при таком размере кода цвет хранится в формате, независящем от устройства.
Местонахождение и размер палитры также зависит от стандарта, которому соответствует файл. Палитра может предшествовать образу рисунка или находиться после него. Ее размер может быть фиксированным (максимально возможным) или сокращенным за счет включения только тех цветов, которые реально использованы в рисунке.
Мы опишем установку палитры при работе с файлами, соответствующими стандарту PCX, аналогичные действия при работе с файлами стандарта BMP описаны в приложении А данной книги.
Расположение и варианты палитры PCX
Стандарт PCX создавался в то время, когда ПК поддерживали видеорежимы CGA и EGA. Поэтому в заголовке файла, начиная с адреса 10h, было зарезервировано 48 байтов, что позволяет разместить 16-цветную палитру. С появлением видеорежима VGA возникла необходимость изменения или доработки стандарта PCX, поскольку размер заголовка не позволял разместить 256-цветную палитру. Для сохранения совместимости с уже существующими файлами было решено оставить без изменения все, что касаюсь режимов CGA и EGA, и расположить 256-цветную палитру в конце файла, после образа рисунка. В этом случае место, занимаемое палитрой EGA, не используется.
Первой это сделала фирма Genius Microprogramming в 1988 году. В соответствии с ее версией стандарта PCX сразу после образа рисунка располагается байт, содержащий код ОА, а после него следует палитра формата r, g, b. Коды базовых цветов сокращены до 6-ти разрядов, т. е. формат палитры полностью соответствует стандарту VGA IBM и она может быть установлена с помощью уже описанного запроса 1012h прерывания int 10h.
В том же году разработчик стандарта PCX фирма ZSoft приняла аналогичные дополнения. Однако, в отличие от версии Genius, байт, расположенный перед палитрой, содержит код ос, а коды базовых цветов содержат 8 разрядов (независящие от устройства коды). Такая палитра не полностью соответствует стандарту VGA IBM – перед ее установкой все байты надо сдвинуть на 2 разряда вправо.
Таким образом, на сегодняшний день существуют, по крайней мере, два способа хранения 256-цветной палитры в стандарте PCX. Различить их можно по коду, находящемуся в байте, расположенному после образа рисунка.
Как получить доступ к палитре
Для доступа к палитре файл надо открыть, прочитать его заголовок (первые 80h байтов) и извлечь оттуда данные о размерах рисунка и кода точки. Если последний равен восьми, то палитра находится в конце файла после образа рисунка.
Расположение нужных величин в заголовке файла формата PCX описано в соответствующем разделе.
Перед чтением палитры в оперативную память файл надо принудительно позиционировать так, чтобы сохраняемый DOS указатель находился на расстоянии 769 байтов от конца файла. Затем надо прочитать 769 байтов в буфер обмена. После чтения нулевой байт буфера обмена должен содержать код ОА или OC, в противном случае произошла ошибка, которая означает, что файл не соответствует стандарту PCX, или был неверно позиционирован.
Если нулевой байт буфера обмена содержит код ос, то перед установкой палитры надо сдвинуть содержимое ее байтов на два разряда вправо. В противном случае (если буфер обмена содержит код ОА) сдвиг не требуется. Теперь формат палитры, находящейся в буфере обмена, соответствует стандарту VGA IBM и ее можно устанавливать (копировать в регистры цвета).