Subversion Repositories Kolibri OS

Rev

Rev 205 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; BGI Font Test
  2. ;
  3. ; Written in pure assembler by Ivushkin Andrey aka Willow
  4. ;
  5. ; Created: December 20, 2004
  6. ;
  7. ; Last changed: February 2, 2005
  8. ;
  9.  
  10. BGIFONT_PATH equ '/RD/1/FONTS/'
  11. _X equ 340
  12. _Y equ 240
  13.  
  14. BGI_WINDOW_CLIP equ 1
  15. BGI_PRC_INFO equ pinfo
  16.  
  17. macro ListFonts
  18. {
  19.    mov  eax,lf_head
  20.    call PixelPrint
  21.    mov  ebx,20 shl 16+60
  22.    mov  ecx,(BGIfont_names_end-BGIfont_names)/4
  23.    mov  esi,BGIfont_names
  24.  .l1:
  25.    pusha
  26.    pusha
  27.    mcall 4,,0x10777fac,esi,4
  28.    popa
  29.    mov  edx,[esi]
  30.    BGIfont_GetID
  31.    mov  dword[_BGIfont_Prepare.font],edx
  32.    mov  ecx,eax
  33.    add  ebx,140 shl 16
  34.    mov  edx,ebx
  35.    mcall 47,0x80100,,,0x10ffffff
  36.    jecxz .nofont
  37.    lea  ebx,[edx+80 shl 16+12]
  38.    mov  edx,_BGIfont_Prepare.fontfullname
  39.    mov  esi,_BGIfont_Prepare.fontattr-1
  40.    sub  esi,edx
  41.    add  ecx,0x3b800b8
  42.    BGIfont_Outtext
  43.    sub  ebx,155 shl 16+12
  44.    mcall 4,,0x1000f000,load_ok,load_fail-load_ok
  45.    jmp  .pop
  46.  .nofont:
  47.    lea  ebx,[edx-80 shl 16]
  48.    mcall 4,,0x10f00010,load_fail,font_msg-load_fail
  49.  .pop:
  50.    popa
  51.    add  esi,4
  52.    add  ebx,39
  53.    loop .l2
  54.    jmp  .ex
  55.  .l2:
  56.    jmp  .l1
  57. .ex:
  58. }
  59. use32
  60.   org    0x0
  61.  
  62.   db     'MENUET01'
  63.   dd     0x01
  64.   dd     START
  65.   dd     I_END
  66.   dd     0x100000
  67.   dd     0x100000
  68.   dd     0x0
  69. not1strun  dd    0x0
  70.  
  71. include 'lang.inc'
  72. include  'macros.inc'
  73. ;include   'debug.inc'
  74. include  'bgifont.inc'
  75.  
  76. START:
  77.     mov  [help],0
  78.     mov  ecx,(BGIfont_names_end-BGIfont_names)/4
  79.     mov  esi,BGIfont_names
  80.     mov  edi,I_END
  81.     BGIfont_Init
  82. reset:
  83.     mov  esi,[BGIfont_Ptr]
  84.     inc  esi
  85.     mov  edi,freeconst
  86.     movsd
  87.     mov  esi,freeconst
  88.     mov  edi,freetest
  89.     mov  ecx,36
  90.     rep  movsb
  91. red:
  92.     mov  eax,[freetest]
  93.     mov  dword[title+19],eax
  94.     call draw_window
  95.     cmp  [not1strun],0
  96.     jnz  still
  97.     mcall 5,300
  98.     not  [not1strun]
  99.     inc  [help]
  100.     jmp  red
  101. still:
  102.  
  103.     mov  eax,10
  104.     int  0x40
  105.  
  106.     cmp  eax,1
  107.     je   red
  108.     cmp  eax,2
  109.     je   key
  110.     cmp  eax,3
  111.     je   button
  112.  
  113.     jmp  still
  114.  
  115. button:
  116.     mov  eax,17
  117.     int  0x40
  118.     cmp  ah,1
  119.     jnz  noclose
  120. close:
  121.     xor  eax,eax
  122.     dec  eax
  123.     int  0x40
  124.   noclose:
  125.     jmp  still
  126.  
  127. key:
  128.     mov  eax,2
  129.     int  0x40
  130.     shr  eax,8
  131.     cmp  al,27 ; esc - close
  132.     je   close
  133.     cmp  al,32 ; Space - help
  134.     jne  .noh
  135.     inc  [help]
  136.     cmp  [help],3
  137.     jne  red
  138.     and  [help],0
  139.     jmp  red
  140.   .noh:
  141.     cmp  [help],2
  142.     jne   still
  143.     cmp  al,50
  144.     jb   .noff
  145.     cmp  al,57
  146.     ja   .noff
  147.     sub  al,46
  148.   .gn:
  149.     movzx ecx,al
  150.     shl  ecx,28
  151.     call BGIfont_GetName
  152.     mov  [freetest],edx
  153.     jmp  red
  154.   .noff:
  155.     mov  ecx,4
  156.     mov  edi,Fkeys
  157.   .fkey:
  158.     cmp  al,[edi]
  159.     je   .fndkey
  160.     inc  edi
  161.     loop .fkey
  162.     jmp  .notfnd
  163.   .fndkey:
  164.     lea  eax,[edi-Fkeys+0xc]
  165.     jmp  .gn
  166.   .notfnd:
  167.     cmp  al,114 ; r - reset
  168.     je   reset
  169.     cmp  al,176
  170.     jne  .nol  ; left
  171.     sub  dword[freetest+8],5
  172.     jmp  red
  173.   .nol:
  174.     cmp  al,179
  175.     jne  .nor  ; right
  176.     add  dword[freetest+8],5
  177.     jmp  red
  178.   .nor:
  179.     cmp  al,105 ; i -italic
  180.     jne  .noi
  181.     xor  dword[freetest+32],BGI_ITALIC
  182.     jmp  red
  183.   .noi:
  184.     cmp  al,98 ; b -bold
  185.     jne  .nob
  186.     xor  dword[freetest+32],BGI_BOLD
  187.     jmp  red
  188.   .nob:
  189.     mov  ecx,2
  190.     mov  esi,ali
  191.   .ol2:
  192.     cmp  al,[esi]
  193.     jne  .othl2
  194.     mov  ax,[freetest+32]
  195.     add  ax,[esi+3]
  196.     mov  bx,ax
  197.     mov  dx,[esi+1]
  198.     and  bx,dx
  199.     cmp  bx,dx
  200.     jne  .ok
  201.     not  dx
  202.     and  ax,dx
  203.   .ok:
  204.     mov  [freetest+32],ax
  205.     jmp  red
  206.   .othl2:
  207.     add  esi,5
  208.     loop .ol2
  209.   .other:
  210.     mov  esi,delt
  211.     mov  ecx,4
  212.   .ol:
  213.     cmp  al,[esi]
  214.     jne  .othl
  215.     fld  dword[esi+1]
  216.     movzx eax,byte[esi+5]
  217.     fadd dword[freetest+eax]
  218.     fstp dword[freetest+eax]
  219.     jmp  red
  220.   .othl:
  221.     add  esi,6
  222.     loop .ol
  223.     jmp  still
  224.  
  225. draw_window:
  226.  
  227.     mov  eax,48
  228.     mov  ebx,3
  229.     mov  ecx,sc
  230.     mov  edx,sizeof.system_colors
  231.     int  0x40
  232.  
  233.     mov  eax,12
  234.     mov  ebx,1
  235.     int  0x40
  236.  
  237.     xor  eax,eax
  238.     mov  ebx,10*65536+_X*2+30
  239.     mov  ecx,100*65536+_Y*2
  240.     mov  edx,0x03261212
  241.     mov  esi,0x805080d0
  242.     mov  edi,0x005080d0
  243.     int  0x40
  244.  
  245.     mov  eax,4
  246.     mov  ebx,8*65536+8
  247.     mov  ecx,[sc.grab_text]
  248.     or   ecx,0x10000000
  249.     mov  edx,title
  250.     mov  esi,title_end-title
  251.     cmp  [help],2
  252.     je   .int
  253.     sub  esi,12
  254.   .int:
  255.     int  0x40
  256.  
  257.     cmp  [help],0
  258.     jnz  .help
  259.     cmp  byte[I_END],0
  260.     jnz  .fontsok
  261.     mov  eax,font_msg
  262.     call PixelPrint
  263.   .fontsok:
  264.     ListFonts
  265.     jmp  .eod
  266.   .help:
  267.     cmp  [help],1
  268.     jne  .nohelp
  269.     mov  eax,helptxt
  270.     cmp  byte[I_END],0
  271.     jnz  .fontsok2
  272.     mov  word[eax+2],_X-80
  273.     call PixelPrint
  274.     jmp  .eod
  275.   .fontsok2:
  276.     mov  word[eax+2],_X
  277.     call Print
  278.     jmp  .eod
  279.   .nohelp:
  280.     mov  edi,cross
  281.     mov  eax,38
  282.     mov  edx,0x4b331a
  283.     mov  ebx,[edi]
  284.     mov  ecx,[edi+4]
  285.     int  0x40
  286.     mov  ebx,[edi+8]
  287.     mov  ecx,[edi+12]
  288.     int  0x40
  289.     mov  ebx,freetest
  290.     BGIfont_Freetext
  291.   .eod:
  292.     mov  eax,12
  293.     mov  ebx,2
  294.     int  0x40
  295.     ret
  296.  
  297. Print:  ; eax-pointer to _txt struc
  298.    pusha
  299.    mov  ebx,[eax]
  300.    movzx ecx,byte[eax+12]
  301.    lea  edx,[eax+13]
  302.    mov  edi,eax
  303.  .nextstr:
  304.    mov esi,[edx]
  305.    add  edx,4
  306.    push ecx
  307.    mov  ecx,[edi+8]
  308.    BGIfont_Outtext
  309.    add   ebx,[edi+4]
  310.    pop   ecx
  311.    and  esi,0xfff
  312.    add   edx,esi
  313.    loop .nextstr
  314.    popa
  315.    ret
  316.  
  317. PixelPrint: ; eax-pointer to _txt struc, but used differently
  318.    pusha
  319.    mov  ebp,eax
  320.    mov  ebx,[ebp]
  321.    movzx ecx,byte[ebp+12]
  322.    mov  eax,4
  323.    lea  edx,[ebp+17]
  324.  .l:
  325.    mov  esi,[edx-4]
  326.    and  esi,0xfff
  327.    push ecx
  328.    mov  ecx,[ebp+8]
  329.    int  0x40
  330.    pop  ecx
  331.    lea  edx,[esi+edx+4]
  332.    add  ebx,[ebp+4]
  333.    loop .l
  334.    popa
  335.    ret
  336.  
  337. macro _txt _xy,_vert,_color,_opt,[_str]
  338. {
  339. common
  340.    _counter=0
  341. forward
  342.    _counter=_counter+1
  343. common
  344.    dd  _xy            ; 0
  345.    dd  _vert        ; 4
  346.    dd  _color       ; 8
  347.    db  _counter   ;_str_count   ; 12
  348. forward
  349.    local .str_beg,.str_end
  350.    dd  (.str_end-.str_beg) or _opt  ; 13
  351.  .str_beg:
  352.    db  _str                 ;17
  353.  .str_end:
  354. }
  355.  
  356. title db 'BGIFONT.INC demo - FONT font'
  357. title_end:
  358. _M equ 30
  359. cross dd _M shl 16+_X*2-_M,_Y shl 16+_Y,_X shl 16+_X,_M shl 16+_Y*2-_M
  360. helptxt:
  361. if  lang eq ru
  362. _txt _X shl 16+60,40,0x434ba010,BGI_HACENTER,\
  363.      "ГОРЯЧИЕ КЛАВИШИ:",\
  364.      "Пробел - шрифты/этот текст/демка;",\
  365.      "<-> стрелки - вращение строки;",\
  366.      "V - выравнивание по вертикали;",\
  367.      "H - выравнивание по горизонтали;",\
  368.      "[,] - масштаб по оси X;",\
  369.      "A,Z - масштаб по оси Y;",\
  370.      "B,I - полужирный шрифт и курсив;",\
  371.      "R - сброс параметров шрифта;",\
  372.      "F1..F12 - выбор шрифта;",\
  373.      "Esc - закрыть прогу :-("
  374. alpha:
  375.    db "Вот пример текста!"
  376. lf_head:
  377. _txt 10 shl 16+30,85 shl 16,0x6e00f7,0,"Имя шрифта","Статус","ID",\
  378.      "Путь к файлу"
  379. load_ok:
  380.    db "загружен"
  381. load_fail:
  382.    db "не найден"
  383. font_msg:
  384.    _txt (_X+20) shl 16+180,25,0x10ff0000,0,\
  385.    "К сожалению, не найдено ни одного",\
  386.    "векторного шрифта *.CHR. Возможно,",\
  387.    "вам следует исправить константу",\
  388.    "BGIFONT_PATH в начале файла BGITEST.ASM",\
  389.    "и перекомпилировать его :-("
  390. else
  391. _txt _X shl 16+60,40,0x434ba010, BGI_HACENTER,\
  392.      "HOT KEYS:",\
  393.      "Space - font list/this message/demo;",\
  394.      "<-> arrows - rotate text string;",\
  395.      "V - toggle vertical alignment;",\
  396.      "H - toggle horizontal alignment;",\
  397.      "[,] - scale on X axis;",\
  398.      "A,Z - scale on Y axis;",\
  399.      "B,I - toggle bold & italic mode;",\
  400.      "R - reset font options;",\
  401.      "F1..F12 - select font;",\
  402.      "Esc - close demo :-("
  403. alpha:
  404.    db 'This is a Sample text!'
  405. ;    db 'ABCDEFGHIGKLMNOPQRSTUVWXWZ'
  406. lf_head:
  407. _txt 10 shl 16+30,85 shl 16,0x6e00f7,0,"Font name","Status","ID",\
  408.      "Filename"
  409. load_ok:
  410.    db "loaded"
  411. load_fail:
  412.    db "not found"
  413. font_msg:
  414.    _txt (_X+20) shl 16+180,25,0x10ff0000,0,\
  415.    "Sorry, no vector font *.CHR found.",\
  416.    "Maybe you should correct BGIFONT_PATH",\
  417.    "constant at the beginning of file",\
  418.    "BGITEST.ASM and recompile it :-("
  419. end if
  420.  
  421. macro Deltas _key,_scale,_ofs
  422. {
  423.    db _key
  424.    dd _scale
  425.    db _ofs
  426. }
  427.  
  428. delt:
  429. Deltas  91, -0.15,12
  430. Deltas  93, 0.15,12
  431. Deltas  97, 0.15,16
  432. Deltas  122,-0.15,16
  433. Fkeys db 48,49,68,255
  434.  
  435. macro Aligns _key,_mask,_add
  436. {
  437.    db _key
  438.    dw _mask,_add
  439. }
  440. ali:
  441. Aligns 118,BGI_VAMASK,BGI_VATOP
  442. Aligns 104,BGI_HAMASK,BGI_HARIGHT
  443. freeconst BGIfree 'FONT',_X shl 16+_Y,0, 1.0, 1.0, alpha,\
  444.     lf_head-alpha,0xb800e7,\
  445.     BGI_VACENTER or BGI_HACENTER
  446. freetest BGIfree ?,?,?,?,?,?,?,?,?
  447. help db ?
  448. pinfo:
  449.     times 1024 db ?
  450. sc     system_colors
  451. I_END:
  452.