Шрифты на канву.

Assembler programming questions
  • Когда-то я использовал следующий код:

    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.
  • halyavin
    Спасибо за помощь, но я уже сам разобрался. Я думал 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 фиксированный шрифт выводится нормально
    большой не правильно но это не важно, я думаю надо все это передать ядру т.к. это не дело...
  • Халявин, пытался разобраться в твоем коде, а можно было бы с коментариями?
    и желательно вместо (структуры img - кстати где описание этой структуры) подставлять адрес буфера напрямую?...
  • А что он хочет достать из V-GUI-?

    описание структуры все просто типа:

    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...

    если у кого есть более оптимальный алгоритм с подробно описанной реализайией, я был бы рад прочитать и попробовать...
  • 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
  • спвсибо, щас попробуем
  • вроде получилось, хотя я так понимаю размер символа не 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 возниает ошибка , почему не знаю :(
    во время отладки причину не нашёл.. скажите как быть?
  • попробуй вместо shr использовать rol

    типа

    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