Page 1 of 2
61 = ПРЯМОЙ ДОСТУП К ГРАФИКЕ
Posted: Wed Aug 10, 2005 6:37 am
by DoomEd Archangel
Кто работал напрямую с видео памятью? ПЛЗ покажите в какой программе реализованна эта ф-я. а то в огоньках и в других граф. приложениях всё это делается с 7ой ф-ей.
Posted: Wed Aug 10, 2005 1:06 pm
by FreGL
ДА, а заодно как :
-скопировать часть изображения (например часть формы) в буфер
-как сделать вывод в буфер (например написать текст в буфере а не наэкране)?
Меня интересует реализация скроллинга изображения в выделенной области в частности!
Posted: Wed Aug 10, 2005 10:01 pm
by Mario79
DoomEd Archangel
Есть функция 61, но я с ней не разбирался.
FreGL
1) Расписывай подробней, а то нихрена непонятно.
2) Ты про это уже спрашивал, и тебе сказали, что штатных средств в системе для этого нет. Могу предложить метод, реализации, раз ты сам не ничего не можешь придумать. Ты должен иметь файл со шрифтами, в принципе шрифт в МеОС это набор двухцветных спрайтов, которые выводятся методом наложения через AND или OR, час уже точно не помню. Так вот накладываешь по кускам спрайты букв в нужное место буфера, поверх изображения и потом выводишь буфер на экран. Ничего особо сложного в процедуре нет.
3) Скроллинг изображения в буфере делается тоже просто. Размер буфера должен быть больше размера выводимого окошка. А ты просто изменяешь координаты этого самого окошка в буфере при передаче вывода на экран. И все. Телемаркет!
Блин для меня написание приложений это как ерунда после ковыряния ядра. Подолбались бы вы с ядром вам бы приложения показались фигней. Действительно я теперь вижу окно приложения не как приложение и даже не как набор элементов управления. Я вижу просто куски кодов связанных между собой. Поневоле матрица вспоминается.

Posted: Thu Aug 11, 2005 11:05 am
by DoomEd Archangel
т.к. видимо никто ещё не касался этой темы, был сделан научный тык в ф-ю 61.
Для не сведующих в этом деле (как я) вот пример.
Code: Select all
include 'macros.inc'
;application start
; for 800x600x32
; 1st byte is blue
; 2nd byte is green
; 3rd byte is red
; example:
; mov [gs:offset],0x00
; [offset] is an offset from the beginning of the screen
; for 800x600x32 the maximal offset (right low corner of the screen)
; is <1 920 000> = 800(pix)*600(pix)*4(bytes)
meos_app_start
code
mov [offset],0 ;320400
mov esi,[offset]
jmp aaa111
graphics_test:
inc esi
aaa111:
mov dword [gs:esi],0x00 ;blue
inc esi
mov dword [gs:esi],0x00 ;green
inc esi
mov dword [gs:esi],0xff ;red
inc esi
;other
cmp esi, 1920000;1860000 ;[offset], 1860000
jb graphics_test
mov eax,61
int 0x40
mov eax,5 ;delay
mov ebx,400 ;4 sec
int 0x40
mov eax,61
int 0x40
mov eax,-1
int 0x40
still:
mov eax,10
int 0x40
cmp eax,2
je key
jmp still
key:
mov eax,2
int 0x40
jmp still
offset dd 0
;;;;;;;;;;;;;;;;;;
;;;;;;;DATA;;;;;;;
;;;;;;;;;;;;;;;;;;
data
;;;;;;;;;;;;;;;;;;
;;;;;;UDATA;;;;;;;
;;;;;;;;;;;;;;;;;;
udata
;application end
meos_app_end
кто разбирается в этом -
почему возможно записывать только побайтно? зачем нужен 4-ый байт в 32х битном цвете? почему цвета располагаются не по установленному порядку?
Posted: Thu Aug 11, 2005 1:11 pm
by DoomEd Archangel
и ещё
не совсем понял что выдала мне ф-я 61 при ebx=1 при разрешении 1024х768х32
вобщем в переменных было:
scr_x = 2097920
scr_y = 50332672
Posted: Thu Aug 11, 2005 3:09 pm
by DoomEd Archangel
хех .. есть же 14 ф-я...
я почти победил эту 61-ю... завтра если получится попробую вывести изображение...
вообще весч прикольная, одно достаёт - каждый байт записывать отдельно.. двордами удобнее было бы, и быстрее..
кстати, если выводить рисунок напрямую в память, это будет быстрее чем вывод через putimage??? учитывая что надо будет побайтно брать цвет и прописывать в память...
Posted: Fri Aug 12, 2005 10:12 am
by mike.dld
Надо учитывать, что система может работать не только с разным разрешением экрана, но и с разным количеством бит на пиксел (32, 24; [крутые режимы] 8 и 4; [с моим драйвером] 16 и 15). Ты же не хочешь заставлять пользователя устанавливать нужный тебе видеорежим? К тому же, нужный режим может быть недоступен пользователю (не поддерживается). Не думаю, что вручную писать в видеопамять будет быстрее. В моём драйвере используется оптимизация под каждый битовый режим.
Удачи.
Posted: Fri Aug 12, 2005 12:07 pm
by DoomEd Archangel
mike.dld
да, я знаю на счёт битовых режимов. я пока проверяю только на 32х битном цвете.
на счёт скорости - есть ли возможность ускорить запись\чтение? а с драйвером?
ведь надо что нибудь придумать на счёт "мерцания" при прокрутке, быстром наборе, и тд ..???
картинка выводится, и даже с прозрачным фоном (я с видео памятью до этого никогда не работал, так что для меня это щас так дико

.. теперь надо поработать над шрифтами... кстати тут понадобится сильная оптимизация, потому что построчный вывод шрифтов в буфер будет занимать много расчётов, а потом ещё и из буфера выводить!..
FreGL есть какие нить задумки на счёт этого???
опять не пойму - при чтении из видеопамяти, начальным (нулевым) смещением почему-то считается левый верхний угол окна, запустившего графическое приложение(то есть если запускаете из sysxtree, и сохраняете данные из видеопамяти, начиная с 0-го смещения, а затем выводите это изображение куда-нить на экран, то выводится окно sysxtree, при том в очень интересном виде... тоже самое и с запуском из тинипада).
и ещё - допустив небольшую ошибку в программке весь экран сделал в оттенках серого (как в ХР

) правда панель сразу перерисовалась, но всё равно было прикольно!!! надо будет доработать END

Posted: Fri Aug 12, 2005 3:08 pm
by FreGL
Идей много, а знаний мало

Posted: Fri Aug 12, 2005 4:09 pm
by DoomEd Archangel
FreGL
знаний много не бывает

пусть в меня кинут помидорами те, кто считает что он знает всё! (слышны хлопки помидоров о лицо DoomEd'a)
вобщем я пока буду пробовать сделать что нить с этой функцией. если будут какие наработки - пиши.
Posted: Sat Aug 13, 2005 4:42 pm
by halyavin
Работа со шрифтами - дело полезное, но сложное. Во-первых нужно разработать формат растрового шрифта. Во-вторых нужно перевести стандартные шрифты (с помощью программы в windows, например, отображающей, а потом обратно считывающей символы) в этот формат. В-третих нужно договориться об алгоритме поиска подходящего шрифта, когда запрошеного шрифта нет и о месте хранения шрифтов. А сам вывод шрифта после всего этого покажется несущественной мелочью.
(Дальше пункта 1 еще никто не доходил.)
На счет глюков чтения из видеопамяти. Такого не должно быть. Напиши программу, которая записывает и тут же читает из видеопамяти (по нулевому адресу), и в случае не совпадения выдает сообщение на доску отладки. Если глюк в ней подтвердиться, то она станет неплохим тестом, когда кто-нибудь будет этот глюк исправлять.
Posted: Sat Aug 13, 2005 7:09 pm
by DoomEd Archangel
halyavin
кстати, я пробовал написать подобную программу под Меос, но у меня тогда получилось только выводить шрифт на экран.. можно было бы её доработать. а на счёт разработки растрового шрифта - можно было бы просто записывать в файле шрифта номера закрашиваемых точек, если ты меня поймёшь

такой шрифт действительно быстрее бы обрабатывался, но стоит ли оно того? ведь растровые шрифты в ОС с интегрированным в ядро ГУИ проживут не долго... ладно, я могу трепаться бесконечно! а надо что то делать...
кста, програмку я напишу и проверю, а то я сам не уверен в присутствии этого глюка (скорее у меня в проге чем в ядре)...
Posted: Sat Aug 13, 2005 9:49 pm
by halyavin
ведь растровые шрифты в ОС с интегрированным в ядро ГУИ проживут не долго
Мне кажется, что перед использованием любого шрифта он растеризуется. Просто более интеллектуальные форматы позволяют хранить в небольшом объеме кучу вариантов шрифта, а в памяти, соотвественно, хранятся растеризованными только нужные варианты. Кто-нибудь разбирается в GDI настолько, чтобы подтвердить/опровергнуть это утверждение? (а то мне самому интересно)
Posted: Sun Aug 14, 2005 2:48 pm
by DoomEd Archangel
halyavin
запись/чтение видеопамяти производится правильно (по крайней мере на ядре колибри 4).
это в той программке были глюки - я учитывал 4ый байт, но не перепрыгивал через него...
кстати, для чего он всё таки нужен???
ещё нашёл свою ошибку - я думал что запись производится не напрямую в видеопамять, а в некий буфер. а при вызове ф-ии 61 буфера меняютяс местами... оказалось что всё не так, и запись производится напрямую в память и 61ю ф-ю можно не вызывать...
НО! приходится использовать свой буфер, что ЗНАЧИТЕЛЬНО замедляет работу...
Представьте что надо почти 3,5 мега побайтно сначала просчитывать и записывать в ВП.
Posted: Sat Aug 20, 2005 6:03 pm
by Guest
а можно ли добавить использование z-buffer'a ??? и насколько это сложно?
Майк, если есть ссылки на инфу о графике, в частности о битности (а то надо делать и для других режимов тоже) плз скинь

это я DoomEd.