From: Vitus B. Wagner <vitus@agropc.msk.su>
Subj: Формат GetImage (для тех BGI о которых я знаю)
Organization: Agroecological problems Center
MAlex@jvd.simbirsk.su (Malinovskiy Alex) 15 Mar 1994 wrote:
> Subject: Help ! Фоpмат пpедставления GetImage в памяти.
>
> Я тут немного pешил заняться гpафикой на PASCALе и
>может кто подскажет фоpмат пpедставления GetImage в
>памяти и адpес видеопамяти.
Oleg Ponomarev <oleg@msp.vaz.togliatti.su> отвечал:
> На сколько я помню, формат такой :
> 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.
Origin: SoftWeyr
|