Page 1 of 1
Шрифты на канву.
Posted: Tue Aug 30, 2005 11:23 am
by EXIS
Уважаемые разработчики кто-нибудь из вас пробовал вывести системный шрифт на канву? Системной функции для такого вывода нет так как ядро совсем "не дружит с канвой". Но эмулировать можно, может быть кто-нибудь пытался это делать? Если да то поделитесь пожалуйста исходниками, даже сырыми.
Posted: Tue Aug 30, 2005 7:20 pm
by halyavin
Когда-то я использовал следующий код:
Code: Select all
{free pascal uses ebp-based frame}
procedure drawchar(sym:byte;x,y:integer;color:integer);pascal;assembler;
label drawchar_l1,drawchar_l2,drawchar_l3;
asm
pushad
mov eax,[currentbuffer]
mov esi,[eax]
mov edx,[ebp+8]
mov edi,[ebp+12]
imul edi,esi
add edi,[ebp+16]
shl edi,4
shl esi,4
lea edi,[edi+eax+8]
mov ecx,8
drawchar_l1:
xor eax,eax
mov al,[ebp+20]
lea eax,[eax+8*eax]
add eax,ecx
mov eax,dword [font+eax]
mov ebx,8
drawchar_l3:
test eax,1
jz drawchar_l2
mov [edi],edx
drawchar_l2:
add edi,16
shr eax,1
dec ebx
jnz drawchar_l3
sub edi,16*8
add edi,esi
dec ecx
jns drawchar_l1
popad
end;
В программе также нужно написать
Где файл char.mt нужно брать из эмулятора meosemul или meosdebug.
[current_buffer] - указатель на структуру img.
Posted: Wed Aug 31, 2005 12:20 pm
by EXIS
halyavin
Спасибо за помощь, но я уже сам разобрался. Я думал char.mt и char2.mt хоть както запакованны )) открыл их с помощью
QVIEW и ужаснулся 1 байт на пиксел, естественно это сделанно для
упращения редактирования фонтов. Я тут сегодня
на коленке сделал два перепаковщика шрифтов выходные фаилы и
крупного и мелкого шрифта имею одинаковый размер 2560 байт
т.е. 10 байт на символ. Просто я немогу позволить в своем маленком
ГУИ присутствие фаилов CHAR.mt и
CHAR2.mt )) Уж очень жирные. Остатолько сделать функции правильного отображения на канву. Когда все сделаю
выложу сдесь для других девелоперов. Вообще это не дело надо бы
доверить ядру.
Posted: Thu Sep 01, 2005 7:32 pm
by FreGL
да да, было бы не плохо сделать концепцию вывода изображений и шрифтов на виртуальные дивайс как виндах
Posted: Fri Sep 02, 2005 4:50 pm
by EXIS
Последняя версия ГУИ
http://www.deck4.narod.ru/-V-GUI.rar
Сейчас небольшой напряг из-за начала учебы. Поэтому пока архив обновлятся не будет
В архиве в папкем CHAREMU перепаковщики шрифтов. Процедура вывода шрифтов на канву
находится в -v-gui.inc называется draw_text фиксированный шрифт выводится нормально
большой не правильно но это не важно, я думаю надо все это передать ядру т.к. это не дело...
Posted: Tue Dec 06, 2005 4:12 pm
by FreGL
Халявин, пытался разобраться в твоем коде, а можно было бы с коментариями?
и желательно вместо (структуры img - кстати где описание этой структуры) подставлять адрес буфера напрямую?...
Posted: Tue Dec 06, 2005 7:02 pm
by EXIS
А что он хочет достать из V-GUI-?
описание структуры все просто типа:
img_struc:
xsize dd 10
ysize dd 10
rgb db R,G,B,R,G,B ; матрица рисунка 3 байта на пиксел!
Posted: Wed Dec 07, 2005 12:43 pm
by FreGL
Вот пытаюсь разобраться шо шрифтами char.mt.
Я так понимаю на каждый символ отводится по 8 байт?
К примеру символ под кодом 0х90 (указатель влево) состоит из следующих байт
01 03 07 0F 07 03 01 00 - если представить их в двоичном виде и наложив на сетку получится символ..
вроде бы ничего сложного.
Но теперь возникает вопрос, как это все дело перенести на канву...
в голове что то крутится но ничего конкретного прити не может, а разобраться в чужих исходниках не так уж и легко.
подскажите какой выход из данной ситуации..
обьявляю видео-буфер для символа размером 8*3*8 (8*8 пикселов)
также обьявляю буфер для прорисовки одной линии символа... т.е.
алгоритм таков
очистка видеобуфера
i:=1;
y:=1;
цикл1: (пока i<=8 ):
очитска линиейного буфера
считывание байта i символа;
его отображение в двоичном виде на линейный буфер (учитывая что RRGGBB вид) {вот сдесь я застопорился}
копировании линии y в буфер
i++;
y++;
goto цикл1:
отображение символа функцией 7...
если у кого есть более оптимальный алгоритм с подробно описанной реализайией, я был бы рад прочитать и попробовать...
Posted: Wed Dec 07, 2005 8:59 pm
by EXIS
FreGL
Я так понял 1 байт одна строка, 1 строка - 8 пикселей (1 байт - 8 бит)
Допустим у тебя в al 8 бит от очередной строки символа тогда делаешь следующее
shr al,1
jc tochka_est
jnc tochki_net
Когда ты сдвигаешь al в право на 1 последний бит al переносится в флаг cf
можно сделать цикл:
mov al,ocherednaya_stroka
mov ecx,8
loo:
shr al,1
jnc net
est:
; код который ставит точку
net:
dec ecx
jnz loo
Posted: Thu Dec 08, 2005 12:05 pm
by FreGL
спвсибо, щас попробуем
Posted: Thu Dec 08, 2005 12:47 pm
by FreGL
вроде получилось, хотя я так понимаю размер символа не 8*8? а сколько 8*10? ибо у меня идёт сдвиг если переходить по 8 байт от символа к символу..
вот мой код, как его можно оптимизировать?
Code: Select all
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; program start
dd I_END ; program image size
dd I_END ; memory
dd I_END ; stack
dd 0,0 ; param,icon
START: ; start of execution
mov eax,40
mov ebx,0000111b
int 0x40
call WindowDraw
;call PutImage
call ClearImage
call PutChar
call PutImage
STILL:
mov eax,10
int 0x40
cmp eax,1
je _WND
cmp eax,3
je _BTN
jmp STILL
_BTN:
mov eax,17
int 0x40
cmp al,0
jne STILL
cmp ah,1
jne STILL
call ApplicationClose
jmp STILL
_WND:
call WindowDraw
jmp STILL
I_END:
img_buffer rb 8*3*8;
line_buffer rb 8*3
ApplicationClose:
mov eax,-1
int 0x40
ret
WindowDraw:
mov eax,12
mov ebx,1
int 0x40
xor eax,eax
mov ebx,100*0x10000+400
mov ecx,100*0x10000+300
mov edx,0x03CCCCCC
mov esi,0x40F000FF
mov edi,0x0
int 0x40
mov eax,12
mov ebx,2
int 0x40
retn
ClearImage:
mov edi,img_buffer
mov al,0xFF
mov ecx,8*3*8
cld
rep stosb
retn
PutImage:
mov eax,7
mov ebx,img_buffer
mov ecx,8*0x10000+8
mov edx,100*0x10000+50
int 0x40
retn
PutChar:
xor ebx,ebx
@NextLine:
mov edi,line_buffer очищаем буфер линии (рисую символ полиненйно)
mov al,0xFF
mov ecx,8*3
cld
rep stosb
mov dl,byte [Font+0x480+ebx] ; загружаем к примеру символ 0x480 'А'
mov al,dl
mov ecx,8
loo: ;рисуем
shr al,1
jnc net
est:
mov byte [line_buffer+ecx*3-2],0x0 ;черным
mov byte [line_buffer+ecx*3-1],0x0
mov byte [line_buffer+ecx*3],0x0
net:
dec ecx
jnz loo
mov eax,ebx
mov edx,24
mul edx
mov esi,line_buffer
mov edi,img_buffer;+ebx*8*3
add edi,eax
mov ecx,8*3
rep movsb ;копируем линию в буфер+смещение линии
inc ebx
cmp ebx,8
jl @NextLine
retn
Font:
file "Char.mt"
Posted: Thu Dec 08, 2005 4:34 pm
by halyavin
В char.mt ширина символа - 6 пикселей. В char2.mt первый байт определяет ширину. (таким образом в char2.mt символ занимает 10 байт)
Posted: Fri Dec 09, 2005 11:09 am
by FreGL
в выше изложенном коде есть один недостаток (первый по крайней мере) - символы рисуются зеркально
...
при попытке переслать линию в изображение при std вместо cld возниает ошибка , почему не знаю
во время отладки причину не нашёл.. скажите как быть?
Posted: Fri Dec 09, 2005 3:04 pm
by EXIS
попробуй вместо shr использовать rol
типа
mov al,ocherednaya_stroka
mov ecx,8
loo:
rol al,1
jnc net
est:
; код который ставит точку
net:
dec ecx
jnz loo
Posted: Fri Dec 09, 2005 5:45 pm
by FreGL
хех, спасибо! сдается моя слабая подготовка в асме
зато сегодня таки наваял програмулину на С--, в которой уже реализован принцып виртуальных канв, и отображение на них символов...
кому интересно пишите, вышлю исходнечки...
буду работать в этом направдении, теперь есть возможность реализации двойной реализации и плавного скроллинга