Программирование игр для Windows. Советы профессионала


Графический формат PCX - часть 4


Например, если требуется поместить в файл значение 200, то сначала нужно записать число 193 (192-1) как количество повторений, а потом — 200. Посмотрим на рисунок 5.8, чтобы увидеть пример декомпрессии.

Теперь настало время написать программу, реализующую чтение файл формата PCX. Она получилась весьма неплохой. Листинг 5.10 даст вам возможность убедиться в этом самостоятельно.

Листинг 5.10. Программа чтения файла формата PCX.

// размеры

экрана

#define SCREEN_WIDTH 320

#define SCREEN_HEIGHT 200

// структура для хранения данных PCX

файла

typedef struct pcx_picture_typ

{

pcx_header header; // заголовок файла (длина 128 байт)

RGB_color palette[256]; // палитра

char far *buffer; // буфер для размещения изображения

// после

декомпрессии

} pcx_picture, *pcx_picture_ptr;

void PCX Load(char *filename,

pcx_picture_ptr image,int enable_palette)

{

// функция загружает данные из PCX-файла в структуру pcx picture

// после декомпрессии байты изображения помещаются в буфер.

// Отдельные элементы изображения выделяются позднее. Также

// загружается палитра и заголовок

FILE *fp;

int num_bytes,index;

long count;

unsigned char data;

char far *temp_buffer;

// открыть

файл

fp = fopen(filename,"rb");

// загрузить

заголовок

temp_buffer = (char far*)image;

for (index=0; index<l28; index++)

{

temp_buffer[index] = getc(fp);

} // конец цикла for

// загрузить данные и декодировать их в буфере

count=0;

while (count<=SCREEN_WIDTH * SCREEN_HEIGHT}

{

// получить первую часть данных

data = getc(fp);

//это  RLE?

if (data>=192 &&data<=255)

{

// подсчитываем, сколько байт сжато

num_bytes = data-192;

//читаем байт цвета

data = getc(fp);

// повторяем байты в буфере num_bytes раз

while(num_bytes-->0)

{

image->buffer[count++] = data;

} // конец цикла while

} // конец оператора if

else

{

// помещаем данные в следующую позицию буфера

image->buffer[count++] = data;

} // конец оператора else

} // конец чтения байт изображения




Начало  Назад  Вперед