Отправляет email-рассылки с помощью сервиса Sendsay

Одинокий программист

  Все выпуски  

Одинокий программист


Информационный Канал Subscribe.Ru


Одинокий программист

Thanks, www.subscribe.ru

Создаем свой формат графических файлов #5(часть 1)

www.sandsc.narod.ru
e-mail:bigking@mail.ru, Седельников Александр

   Здравствуйте, это снова я!

Вот и пришло время для своих форматов. В своих особенностях, так же как и в самих работах, преобладает, конечно же, творческое начало. Тогда начнем. Будем работать с графическими файлами. Работу надо рассредоточить на несколько этапов. Первое: придумать свою структуру файла. Второе: написать конвертер (преобразователь) стандартных граф. файлов(такие как TGA, PCX, BMP) в свой формат. Третье: обратное конвертирование. Ладно. Назовем граф. файл MGF'ами. MGF - My Graphic File. Нам потребуется структура.

struct MGFHeader{
  char id[3];           // Заголовок
  long version;         // Версия
  long width,height;    // Размеры: горизонталь, вертикаль.
  long options;         // Конфигурации файла. Например: упаковка.
};

Заголовок нам потребуется, понятное дело, для идентификации файла, на случай, если злобные люде попробуют подменить файл. Версия, в принципе, не нужна, но я делаю это, чтобы была совместимость со старыми файлами. Конфигурации файла нам будут нужны для правильной работы(является ли он упакованным(или архивированным), каким методом упакован, и т.д. и т.п.). Теперь переходим непосредственно ксамим данным. Пусть первый пиксел соответствует верхнему левому углу, а то в TGA,BMP в верхнем нижнем углу. Соответственно если у нас будет картина в TGA:

5 4 3 2 1
4 0 0 0 0
3 0 0 0 0
2 0 0 0 0
1 0 0 0 0

то в нашем, мы должны инвертировать:

0 0 0 0 1
0 0 0 0 2
0 0 0 0 3
0 0 0 0 4
1 2 3 4 5

Давайте сделаем упаковку RLE'шным способом. Быстрый, простой. Я предлагаю следущее(предлагаю я, это не значит что вы должны критиковать меня. Не нравится, делайте другой), взять за основу: отступил, взял. Я сам придумал название, хотя способ, понятное дело, уже давно существует. Пусть у нас дана одна строчка:

1 1 1 1 0 0 0 0 1 2 3 4 2 1 0 0 0 0 0 0 0 0 1 2 1 3 1 1 1 1

Тогда Skip and Take, будет иметь такой вид:

0 4 1 1 1 1 4 6 1 2 3 4 2 1 8 8 1 2 1 3 1 1 1

Размер сильно не уменьшился, но распаковка выглядит интересно, и просто:

int cx=0,width,height,skip=0,take=0;

char *packImage;    // Упакованный буфер
char *unPackImage;  // Буфер для распаковки

while(cx< width*height)
{
  fread(&skip,1,1,filePointer);
  unPackImage+=skip;
  cx+=skip;
  fread(&take,1,1,filePointer);
  fread(unPackImage,take,1,filePointer);
  cx+=take;
}

А если на ассемблер переписать выглядит, круто. Сущность заключается в следующем: первых два числа:

1) Пропустить
2) Нарисовать

После чего идут сами данные для "Нарисовать", после данных идут опять те же два числа. Можно его, конечно, модифицировать. Вы спросите, зачем нужен такой способ, если он не дает видимых ощущений. Ответ: этот алгоритм придуман не для упаковки(просто он получается немного меньше оригинала, а иногда и больше), а для вывода спрайта. Те кто не привык пользоваться видеокартой(в полную мощь), а доверяет процессору и видеопамяти, поймут меня. Как бы вы выводили картинку где какой-то цвет рисоватьне надо. Например:

int cx,cy;
char *image;

for(cy=0;cy< height;cy++)
 for(cx=0;cx< width;cx++)
  if(image[cx+cy*width])
   screen[x+cx+(y+cy)*SCREEN_WIDTH]=image[cx+cy*width];

Просто. Но медленно! Если применить предложенный метод, то скорость увеличивается в 6-8 раз! Конечно, если вся распаковка будет написана на асме. Не плохо. Все таки, давайте добьем упаковку. Мне понравился предложенный метод в TGA'шниках.

Пусть у нас имеется последовательность(здесь уже рассматпивается не построчно, а целиком):

1 2 3 4 3 2 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 0 0 0 0 1 2 3 2  -> Размер=40

В TGA будет вот так:

7 1 2 3 4 3 2 1 7 0 0 9 1 0 9 2 0 4 0 0 -> Размер=20

Сжатие в два раза! Это интересно. Какой бы не был RLE, он уступит LZW, LZH, Arithmetic Encode, т.п. Но обо всем этом в следующих выпусках.

Разархивированию и архивированию методом TGA-шников будет посвящен другому выпуску. Так же в #6 выпуске будет уже конвертирование в наш файл. Так же я собираюсь рассказать вам о графических анимационных файлах(AVI, FLI, FLC), мы тоженапишем свой формат, о WAV'ах. После чего начнем писать игршку! Те кто читал о моей рассылке и видел там 3DS Max, не боитесь, дойдем до игрушки и будем там рисовать, заставки, титры, фоны, и т.д. Обо всем этом и многом другом я расскажу в следующих выпусках. Кстати я уезжаю на месяц в одно местечко, так что на месяц я останавливаюсь с рассылкой. Так что, не отписывайтесь! Вот вроде бы все. Желаю всем удачи!


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное