Шрифты на канву.
-
Уважаемые разработчики кто-нибудь из вас пробовал вывести системный шрифт на канву? Системной функции для такого вывода нет так как ядро совсем "не дружит с канвой". Но эмулировать можно, может быть кто-нибудь пытался это делать? Если да то поделитесь пожалуйста исходниками, даже сырыми.
Когда-то я использовал следующий код:
В программе также нужно написать
Где файл char.mt нужно брать из эмулятора meosemul или meosdebug.
[current_buffer] - указатель на структуру img.
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;
Code: Select all
font:
file "char.mt"
[current_buffer] - указатель на структуру img.
halyavin
Спасибо за помощь, но я уже сам разобрался. Я думал char.mt и char2.mt хоть както запакованны )) открыл их с помощью
QVIEW и ужаснулся 1 байт на пиксел, естественно это сделанно для
упращения редактирования фонтов. Я тут сегодня
на коленке сделал два перепаковщика шрифтов выходные фаилы и
крупного и мелкого шрифта имею одинаковый размер 2560 байт
т.е. 10 байт на символ. Просто я немогу позволить в своем маленком
ГУИ присутствие фаилов CHAR.mt и
CHAR2.mt )) Уж очень жирные. Остатолько сделать функции правильного отображения на канву. Когда все сделаю
выложу сдесь для других девелоперов. Вообще это не дело надо бы
доверить ядру.
Спасибо за помощь, но я уже сам разобрался. Я думал char.mt и char2.mt хоть както запакованны )) открыл их с помощью
QVIEW и ужаснулся 1 байт на пиксел, естественно это сделанно для
упращения редактирования фонтов. Я тут сегодня
на коленке сделал два перепаковщика шрифтов выходные фаилы и
крупного и мелкого шрифта имею одинаковый размер 2560 байт
т.е. 10 байт на символ. Просто я немогу позволить в своем маленком
ГУИ присутствие фаилов CHAR.mt и
CHAR2.mt )) Уж очень жирные. Остатолько сделать функции правильного отображения на канву. Когда все сделаю
выложу сдесь для других девелоперов. Вообще это не дело надо бы
доверить ядру.
да да, было бы не плохо сделать концепцию вывода изображений и шрифтов на виртуальные дивайс как виндах
Последняя версия ГУИ
http://www.deck4.narod.ru/-V-GUI.rar
Сейчас небольшой напряг из-за начала учебы. Поэтому пока архив обновлятся не будет
В архиве в папкем CHAREMU перепаковщики шрифтов. Процедура вывода шрифтов на канву
находится в -v-gui.inc называется draw_text фиксированный шрифт выводится нормально
большой не правильно но это не важно, я думаю надо все это передать ядру т.к. это не дело...
http://www.deck4.narod.ru/-V-GUI.rar
Сейчас небольшой напряг из-за начала учебы. Поэтому пока архив обновлятся не будет
В архиве в папкем CHAREMU перепаковщики шрифтов. Процедура вывода шрифтов на канву
находится в -v-gui.inc называется draw_text фиксированный шрифт выводится нормально
большой не правильно но это не важно, я думаю надо все это передать ядру т.к. это не дело...
Халявин, пытался разобраться в твоем коде, а можно было бы с коментариями?
и желательно вместо (структуры img - кстати где описание этой структуры) подставлять адрес буфера напрямую?...
и желательно вместо (структуры img - кстати где описание этой структуры) подставлять адрес буфера напрямую?...
А что он хочет достать из V-GUI-?
описание структуры все просто типа:
img_struc:
xsize dd 10
ysize dd 10
rgb db R,G,B,R,G,B ; матрица рисунка 3 байта на пиксел!
описание структуры все просто типа:
img_struc:
xsize dd 10
ysize dd 10
rgb db R,G,B,R,G,B ; матрица рисунка 3 байта на пиксел!
Вот пытаюсь разобраться шо шрифтами 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...
если у кого есть более оптимальный алгоритм с подробно описанной реализайией, я был бы рад прочитать и попробовать...
Я так понимаю на каждый символ отводится по 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...
если у кого есть более оптимальный алгоритм с подробно описанной реализайией, я был бы рад прочитать и попробовать...
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
Я так понял 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
спвсибо, щас попробуем
вроде получилось, хотя я так понимаю размер символа не 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"
В char.mt ширина символа - 6 пикселей. В char2.mt первый байт определяет ширину. (таким образом в char2.mt символ занимает 10 байт)
в выше изложенном коде есть один недостаток (первый по крайней мере) - символы рисуются зеркально ...
при попытке переслать линию в изображение при std вместо cld возниает ошибка , почему не знаю
во время отладки причину не нашёл.. скажите как быть?
при попытке переслать линию в изображение при std вместо cld возниает ошибка , почему не знаю
во время отладки причину не нашёл.. скажите как быть?
попробуй вместо shr использовать rol
типа
mov al,ocherednaya_stroka
mov ecx,8
loo:
rol al,1
jnc net
est:
; код который ставит точку
net:
dec ecx
jnz loo
типа
mov al,ocherednaya_stroka
mov ecx,8
loo:
rol al,1
jnc net
est:
; код который ставит точку
net:
dec ecx
jnz loo
хех, спасибо! сдается моя слабая подготовка в асме
зато сегодня таки наваял програмулину на С--, в которой уже реализован принцып виртуальных канв, и отображение на них символов...
кому интересно пишите, вышлю исходнечки...
буду работать в этом направдении, теперь есть возможность реализации двойной реализации и плавного скроллинга
зато сегодня таки наваял програмулину на С--, в которой уже реализован принцып виртуальных канв, и отображение на них символов...
кому интересно пишите, вышлю исходнечки...
буду работать в этом направдении, теперь есть возможность реализации двойной реализации и плавного скроллинга
Who is online
Users browsing this forum: No registered users and 5 guests