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;
В программе также нужно написать

Code: Select all

font:
file "char.mt"
Где файл 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
хех, спасибо! сдается моя слабая подготовка в асме :(
зато сегодня таки наваял програмулину на С--, в которой уже реализован принцып виртуальных канв, и отображение на них символов...
кому интересно пишите, вышлю исходнечки...
буду работать в этом направдении, теперь есть возможность реализации двойной реализации и плавного скроллинга