Скачать Формат представления GETIMAGE в памяти

15.03.1994
Скачать файл (2,12 Кб)

MAlex@jvd.simbirsk.su (Malinovskiy Alex) 15 Mar 1994 wrote:
>   Subject: Help ! Фоpмат пpедставления GetImage в памяти.
>
> Я тут немного pешил заняться гpафикой на PASCALе и
>может кто подскажет фоpмат пpедставления GetImage в
>памяти и адpес видеопамяти.
Oleg Ponomarev отвечал:
>   На сколько я помню, формат такой :
> 1. первые два слова - размер по X и по Y
> 2. Собственно имидж (величина его по X д.б. выравнена на границу байта,
>    т. е., например, если мы берем имидж с X=4, Y=1, то не используемые
>    биты в байте будут забиты нулями ->   ****0000
> 3. Два ахинейских байта. Для чего они нужны я, в свое время, так и не
>    разобрался. Паскаль сует туда что-то непохожее на случайное, но это
>    что-то не оказывает, IMHO, не какого влияния на PutImage.
>
>   Содержание собственно имиджа зависит от типа видеоадаптора и видеорежима,
> с Геркулесом и CGA все просто, *по-моему*, просто берется соответсвующий
> кусок видеопамяти, с EGA (640x350x16) и VGA (640x480x16) немного сложней,
> имидж храниться по слоям, а что получится с VGA 320x200 при 256 цветах я
> даже не знаю.
>
>>    адpес видеопамяти.
>               Кажись $A000:$0000
>
>  Надеюся, что чем-то помог
>                                           Олег Пономарев
>
>(848-2) 39-07-60 (work),    (848-2) 37-10-30 (home)


Известно, что размер структуры требуемой для сохранения участка экрана
процедурой GetIMage равен

     Число_точек* Log (Число цветов) /8 +6 (Проблема округления см. ниже)
                     2

Как используются лишние 6 байт:
  4 из них - заголовок структуры
  XSize:Integer;
  YSize:Integer;

При этом для большинства BGI -драйверов XSize=X2-X1 , т.е. на 1 меньше, чем
реальный размер сохраненной области.

Единственное известное мне исключение - VGA256.BGI у которого XSize=X2-X1+1

YSize по-моему у всех драйверов Y2-Y1, во всяком случае это нетрудно проверить,
а мне в исходники своих процедур, генерирующих данные для PutImage лезть лень.

Далее идут n байтов данных, организованных в соответствии со структурой
видеопамяти данного режима

Hercules и Cga 640x200 - 1 бит на пиксел, каждая строка начинается с нового
байта, а в конце последнего - ряд неиспользуемых бит (от 0 до 7)

CGA 320x200 - 2 бита на пиксел, неисп. бит в конце строки не более 6

EGA,VGA   16 цветов (EGAVGA.VGA, VESA16.BGI)

1 бит на пиксел, каждой строке экрана соответствуют 4 строки в образе, по
одной на битовую плоскость. В каком порядке расположены битовые плоскости -
не помню, но в PCX формате они строго наоборот.

 то есть
   последовательно записываются байты
   первой плоскости первой строки
   .........
   четвертой плоскости первой строки
   первой плоскости второй строки
   .....
   четвертой плоскости последней строки

256-цветные режимы (VGA256.BGI, VESA256.BGI)
 Самое простое - байт на пиксел. Неиспользуемых бит egro нет.

Внутри каждой строки первый байт  - самый левый, внутри байта самый
левый - старший бит.

Как устроен Image в режиме EGA 640x350x4  не знаю, но думаю, что так же,
как и в 640х350х16, только битовых плоскостей две.

В конце структуры есть еще два байта. Зачем они нужны  - не знаю.
Раньше думал, что контрольная сумма, но многолетний опыт показал,
что от их значения работа PutImage никак не зависит.

                  Надеюсь, что мои скромные советы Вам пригодятся.
                           Vitus Wagner.