Subversion Repositories Kolibri OS

Rev

Rev 1639 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;Ïîñëåäíàÿ ìîäèôèêàöèÿ 03.10.2010
  2. ;ôàéë ñîçäàí 13.02.2009 <Lrz> Íà êîä ïðèìåíåíà GPL2 ëèöåíçèÿ
  3. ;Ìàêðîñ äëÿ ñèñòåìíîé áèáëèîòåêè box_lib.obj
  4. ;Checkbox
  5.  
  6. macro use_checkbox_draw
  7. {
  8. check_box_draw:
  9.         pushad   ;ñîõðàíèì âñå ðåãèñòðû
  10.         mov     ebp,dword [esp+36]      ;çàãðóæàåì óêàçàòåëü íà ñòðóêòóðó, óêàçàòåëü ìû ïåðåäàåì â ñòåêå
  11. ;       mov     ebx,ch_left_s
  12. ;       mov     ecx,ch_top_s
  13. ;       mov     edx,dword ch_border_color
  14. ;       mov     eax,13
  15. ;       mcall   ;ðèñóåì ðàìêó
  16.         mcall   13,ch_left_s,ch_top_s,ch_border_color           ;ðèñóåì ðàìêó ÷åê áîêñà, ôàêòè÷åñêè ðèñóåì ïðÿìîóãîëüíèê è çàêðàøèâàåì ôîí âíóòðè öâåòîì ðàìêè áîêñà
  17.  
  18.         mov     edx,dword ch_color      ;çàãðóæàåì öâåò ôîíà
  19.         add     ebx,1 shl 16 - 2
  20.         add     ecx,1 shl 16 - 2
  21.         mcall   ;çàêðàøèâàåì âíóòðåííîñòè ÷åêáîêñà ôîíîì
  22.  
  23.         test dword ch_flags,2  ;äîñòàòü çíà÷åíèå áèòà èç ïåðåìåííîé è ïîìåñòèòü â  ôëàã CF
  24.         jz   @f                ;â åñëè CF=1, òî âûïîëíèì ñëåäóþùóþ ïðîöåäóðó èíà÷å ïåðåéòè íà íèæíþþ @@
  25.         call check_box_draw_ch ;íàðèñîâàòü âêëþ÷åííûé ÷åê áîêñ
  26. @@:
  27. ;----------------------------
  28. ;ðàñ÷åò êóäà áóäåò ïðîèçâåäåí âûâîä òåêñòà
  29. ;----------------------------
  30. ;        mov    ebx,dword ch_left_s             ;çàãðóçèòü çíà÷åíèå (õ shl 16 + äëèííà)  äëÿ ÷åê áîêñà
  31. ;        add    ebx,dword ch_text_margin        ;äîáàâèì ðàçìåð ñòîðîíû è ðàññòîÿíèå íà êîòîðîì íà÷íåòñÿ âûâîä òåêñòà
  32. ;        shl    ebx,16                          ;ñäâèíåì íà 16 ðàçðÿäîâ â ëåâî (óìíîæèì íà 65536)
  33. ;        add    ebx,dword ch_left_s             ;cêîððåêòèðóåì ïîçèöèþ Õ. Ò.å. ñåé÷àñ â âåðõíåé ÷àñòè ebx ó íàñ òî÷êà íà÷àëà âûâîäà òåêñòà ïî Õ
  34.  
  35. ;        mov    eax,word ch_top_s               ;çàãðóçèì çíà÷åíèå ïî (y shl 16 + äëèííà) äëÿ ÷åê áîêñà
  36. ;        shl    eax,16                          ;ñäâèíåì íà 16 ðàçðÿäîâ â ëåâî (óìíîæèì íà 65536)
  37. ;        add    eax,dword ch_top_s              ;cêîððåêòèðóåì ïîçèöèþ Õ. Ò.å. ñåé÷àñ â âåðõíåé ÷àñòè ebx ó íàñ òî÷êà íà÷àëà âûâîäà òåêñòà ïî Y
  38.        
  39. ; Îïòèìèçàöèÿ äëÿ ÖÏ
  40.         mov     ebx,dword ch_left_s             ;çàãðóçèòü çíà÷åíèå (õ shl 16 + äëèííà)  äëÿ ÷åê áîêñà
  41.         mov     eax,dword ch_top_s              ;çàãðóçèì çíà÷åíèå ïî (y shl 16 + äëèííà) äëÿ ÷åê áîêñà
  42.         add     ebx,dword ch_text_margin        ;äîáàâèì ðàçìåð ñòîðîíû è ðàññòîÿíèå íà êîòîðîì íà÷íåòñÿ âûâîä òåêñòà
  43.         shl     eax,16                          ;ñäâèíåì íà 16 ðàçðÿäîâ â ëåâî (óìíîæèì íà 65536)
  44.         shl     ebx,16                          ;ñäâèíåì íà 16 ðàçðÿäîâ â ëåâî (óìíîæèì íà 65536)
  45.         add     eax,dword ch_top_s              ;cêîððåêòèðóåì ïîçèöèþ Õ. Ò.å. ñåé÷àñ â âåðõíåé ÷àñòè ebx ó íàñ òî÷êà íà÷àëà âûâîäà òåêñòà ïî Y
  46.         add     ebx,dword ch_left_s             ;cêîððåêòèðóåì ïîçèöèþ Õ. Ò.å. ñåé÷àñ â âåðõíåé ÷àñòè ebx ó íàñ òî÷êà íà÷àëà âûâîäà òåêñòà ïî Õ
  47.         shr     eax,16                          ;äëÿ y ïîìåñòèì â ìëàäøóþ ÷àñòü
  48.         mov     bx,ax                           ;âíåñåì ñìåùåíèå äëÿ y
  49.  
  50.         mov     ecx,dword ch_text_color         ;çàãðóçèì öâåò íàäïèñè + flags
  51.         mov     edx,dword ch_text_ptr           ;óêàæåì àäðåñ îò êóäà íóæíî âûâîäèòü ñòðîêó
  52.         mov     eax,4                           ;âíåñåì â eax çíà÷åíèå âûâîäà íàäïèñè íà êàíâó
  53.         mcall                                   ;Âûâîä
  54.         popad                                   ;âîññòàíîâèòü çíà÷åíèÿ ðåãèñòðîâ èç ñòåêà
  55.         ret 4                                   ;âûéäåì èç ïðîöåäóðû è óäàëèì èç ñòåêà óêàçàòåëü íà ñòðóêòóðó (4 áàéòà)
  56.  
  57. check_box_clear_ch:                             ;î÷èñòêà ÷åê áîêñà
  58.         mov     edx,dword ch_color              ;öâåò âíóòðè ÷åê áîêñà
  59.         jmp     @f                              ;áåçóñëîâíûé ïðûæîê íà íèæíþþ ìåòêó @@
  60. check_box_draw_ch:                              ;íàðèñîâàòü âêëþ÷åííûé ÷åê áîêñ
  61.         mov     edx,dword ch_border_color       ;çàãðóçèòü öâåò
  62. @@:
  63. ;        movzx ebx,word ch_left  ;çàãðóçèòü êîîðäèíàòó ïî õ
  64. ;        mov   eax,dword ch_size
  65. ;        mov   di,ax
  66. ;        shr   eax,2
  67. ;        push  ax
  68. ;
  69. ;        push  ax
  70. ;        add   ebx,eax          
  71. ;        shl   ebx,16            ;ñäâèíåì íà 16 ðàçðÿäîâ â ëåâî (óìíîæèì íà 65536)
  72. ;        pop   ax
  73. ;        lea   eax,[eax*2]
  74. ;        sub   bp,ax             ;ñîõðàíèì ðåãèñòð bx â ðåãèñòðå óêàçàòåëÿ áàçû
  75. ;        mov   bx,bp
  76.  
  77. ;        movzx ecx,word ch_top ;çàãðóçèòü êîîðäèíàòó ïî ó
  78. ;        pop   ax
  79. ;        add   cx,ax        
  80. ;        shl   ecx,16          ;ñäâèíåì íà 16 ðàçðÿäîâ â ëåâî (óìíîæèì íà 65536)
  81. ;        mov   cx,bp           ;çàãðóçèì çíà÷åíèÿ ðåãèñòðà óêàçàòåëÿ áàçû â cx
  82. ;        mov   eax,13          ;â eax - çíà÷åíèÿ ôóíêöèè äëÿ âûâîäà ïîëîñû ò.å. ïî ñóòè ïðÿìîóãîëüíèêà, êîòîðûé îòîáðàæàåò âêëþ÷åííûé êîìïîíåíò ÷åê áîêñ
  83. ;        mcall            ;âûâîä
  84.  
  85.         mov     ebx,dword ch_left_s
  86.         mov     ecx,dword ch_top_s
  87.         add     ebx,1 shl 16 - 4
  88.         add     ecx,1 shl 16 - 4
  89.         mcall   13
  90.         ret
  91. }
  92.  
  93.  
  94. macro use_checkbox_mouse
  95. {
  96.  
  97. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  98. ;Îáðàáîò÷èê mouse
  99. ; Ïðè ïîïàäàíèè ìûøêè + íàæàòà êëàâèøà â îáëàñòü checkbox ñîñòîÿíèå áîêñà äîëæíî ìåíÿòñÿ àêòèâíûé - íå àêòèâíûé.
  100. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  101. check_box_mouse:      ;îáðàáîòêà ìûøè
  102. pushad
  103.         mov     ebp,dword [esp+36]      ;çàãðóæàåì óêàçàòåëü íà ñòðóêòóðó, óêàçàòåëü ìû ïåðåäàåì â ñòåêå
  104.         mcall   37,2                    ;ïðîâåðÿåì ñîñòîÿíèå êëàâèø ìûøêè. Áûëî ëè ñîáûòèå íàæàòàÿ êëàâèøà íà ìûøêå.
  105.         test    eax,eax                 ;ïðîâåðêà åñëè ó íàñ â eax=0, òî óñòàíîâèì ôëàã è âûéäåì
  106.         jnz     @f                      ;ïåðåéòè íà íèæíþþ ìåòêó @@, åñëè â eax íå 0.
  107. ;        and     dword ch_flags,eax     ;èçâëå÷åíèå çíà÷åíèÿ çàäàííîãî áèòà â ôëàã cf è èçìåíåíèå åãî çíà÷åíèÿ íà íóëåâîå.
  108.         jmp     .check_box_mouse_end     ;îáðàáîòêà çàêîí÷èëàñü
  109. ; Äà ñîáûòèå: íàæàòèå êëàâèøè ìûøêè ïðîèçîøëî.        
  110. @@:
  111.         mcall   37,1                    ;ïîëó÷èòü êîîðäèíàòû êóðñîðà îòíîñèòåëüíî îêíà
  112.                                         ;íà âûõîäå â eax x shl 16 + y
  113. ;ñðàâíåíèå âåðõíåé òî÷êè ïî Y
  114.         mov     ecx,dword ch_top_s      ;y shl 16 +äëèííà ïî y
  115.         mov     ebx,ecx
  116.         shr     ebx,16                  ;bx = êîîðäèíàòà ïî y
  117.         cmp     ax,bx
  118.         jb      .check_box_mouse_end    ;óêàçàòåëü ìûøêè ìåíüøå íà÷àëüíîé êîîðäèíàòû ïî y ÷åì êîîðäèíàòà ïî Y ó áîêñà
  119. ;ñðàâíåíèå íèæíåé òî÷êè ïî Y
  120.         add     cx,bx                   ;ñëîæèì äëèííó ïî y è êîîðäèíàòó âåðõíåé òî÷êè ïî y ïîëè÷èì êîîðäèíàòó íèæíåé òî÷êè ïî Y
  121.         cmp     ax,cx
  122.         ja      .check_box_mouse_end    ;óêàçàòåëü ìûøêè áîëüøå êîíå÷íîé êîîðäèíàòû ïî y ÷åì êîîðäèíàòà ïî Y ó áîêñà
  123. ;ñðàâíåíèå ïî íà÷àëüíîé òî÷êå Õ
  124.         mov     ecx,dword ch_left_s     ;çàãðóçèòü çíà÷åíèå (õ shl 16 + äëèííà)  äëÿ ÷åê áîêñà
  125.         mov     ebx,ecx
  126.         shr     ebx,16                  ;bx = êîîðäèíàòà ïî X
  127.         cmp     ax,bx
  128.         jb      .check_box_mouse_end    ;óêàçàòåëü ìûøêè ìåíüøå íà÷àëüíîé êîîðäèíàòû ïî X ÷åì êîîðäèíàòà ïî X ó áîêñà
  129. ;ñðàâíåíèå êîíå÷íîé òî÷êè ïî X
  130.         add     bx,cx                   ;ñëîæèì äëèííó ïî y è êîîðäèíàòó âåðõíåé òî÷êè ïî y ïîëè÷èì êîîðäèíàòó íèæíåé òî÷êè ïî Y
  131.         add     ebx,dword ch_text_margin        ;äîáàâèì ðàçìåð ñòîðîíû è ðàññòîÿíèå íà êîòîðîì íà÷íåòñÿ âûâîä òåêñòà
  132.         mov     ecx,dword ch_text_ptr   ;óêàæåì àäðåñ ñòðîêè ñ òåðìèíèðóåùèì 0
  133.         push    eax
  134.  
  135. ;ïîäñ÷åò äëèííû ñòðîêè è óâåëè÷åíèå ïðÿìîãîëüíèêà â êîòîðîì ñðàáàòûâàåò ùåë÷îê ìûøêè
  136.         lodsb  
  137.         test    al,al
  138.         jz      .ex_loop
  139. @@:    
  140.         add     bx,6                    ;øèðèíà ñèìâîëà
  141.         lodsb
  142.         test    al,al
  143.         jnz     @b
  144. .ex_loop:
  145.         pop     eax    
  146.         cmp     ax,bx
  147.         ja      .check_box_mouse_end    ;óêàçàòåëü ìûøêè áîëüøå êîíå÷íîé êîîðäèíàòû ïî y ÷åì êîîðäèíàòà ïî Y ó áîêñà
  148. ;åñëè âñå ïðîâåðêè áûëè óñïåøíî ïðîéäåíû ìû îáÿçàíû ïîìåíÿòü ñîñòîÿíèå áîêñà
  149.         btc     dword   ch_flags,2      ;ïåðåíîñ 2-ãî áèòà â cf è èíâåðñèÿ åãî
  150.         jc      .enable_box             ;åñëè CF=1 òî îòîáðàçèì âêëþ÷åííûé áîêñ è âûéäåì
  151.         push    dword .check_box_mouse_end      ;ôîêóñ -ïîêóñ, âåðíåìñÿ ïîñëå âûçîâà check_box_clear_ch íà ìåòêó check_box_mouse_end
  152.         jmp     check_box_clear_ch         ;âûêëþ÷èòü ÷åê áîêñ ò.å. íà ìåñòå çàêðàøåííîãî ïðÿìîóãîëüíèêà îòîáðàçèòü öâåò ôîíà. 
  153.  
  154. .enable_box:
  155.         call    check_box_draw_ch        ;îòîáðàçèòü âêëþ÷åííûé ÷åê áîêñ
  156.  
  157.  
  158.  
  159. ;       bts  dword ch_flags,2   ;ïðîâåðêà ôëàãà ò.å. ïåðåíîñ â cf çíà÷åíèå áèòà è óñòàíîâêà áèòà â ñîñòîÿíèå âêëþ÷åíî
  160. ;        jc   check_box_mouse_end         ;åñëè CF=1 òî ïåðåéòè  â êîíåö ò.å. ýòî âûõîä
  161. ;        mov  esi,dword ch_text_length ;çàãðóçèòü êîë-âî ñèìâîëîâ â òåêñòîâîé ñòðîêå
  162.         ;Óìíîæåíèå íà 6 Áûñòðîå óìíîæåíèå ìîæíî âîñïîëüçîâàòüñÿ ëþáûì ìç ìåòîäîâ, íî íà ñòàðûõ Ïðîöåññîðàõ (386,486,P1)áûñòðåå áóäåò ñ èíñòðóêöèåé Lea
  163. ;        lea esi,[eax*3]  
  164. ;        shl esi,1
  165. ;        imul esi,6             ; èëè ìîæíî è òàê óìíîæèòü íà 6
  166. ;        add  esi,dword ch_text_margin ;äîáàâèòü 3 - ðàññòîÿíèå îò ÷åê áîêñà äî íàäïèñè
  167.  
  168. ;        mov  eax,37             ;ïîëó÷èì êîîðäèíàòû ìûøêè
  169. ;        mov  ebx,1              ;äîáàâèòü 1
  170. ;        mcall               ;ïîëó÷èòü êîîðäèíàòû êóðñîðà îòíîñèòåëüíî îêíà
  171.        
  172. ;        movzx ebx,word ch_top  ;çàãðóçèòü â bx çíà÷åíèå êîîðäèíàòû ó
  173. ;        cmp   ax,bx              ;ñðàâíèòü ñ ñ êîîðäèíàòîé êóðñîðà
  174. ;        jl   check_box_mouse_end          ;SF <> OF åñëè ìåíüøå
  175. ;        add   ebx,dword ch_size        ;äîáàâèòü ðàçìåð
  176. ;        cmp   ax,bx              ;ñðàâíèòü
  177. ;        jg   check_box_mouse_end          ;ZF = 0 è SF = OF åñëè áîëüøå
  178.              
  179. ;        shr   eax,16              ;ðàçäåëèì íà 65536 èëè ïðîñòî ñäâèíåì áèòû íà 16 çíà÷åíèé
  180. ;        movzx ebx,word ch_left  ;ïðîèçâåäåì àíàëîãè÷íîå ñðàâíåíèå
  181. ;        cmp   ax,bx            ;ñðàâíèòü ðåãèñòðû
  182. ;        jl   check_box_mouse_end        ;åñëè ìåíüøå
  183. ;        add   ebx,dword ch_size      ;äîáàâèòü äëèíó ñòîðîíû ïðÿìîóãîëüíèêà
  184. ;        add   ebx,esi          ;Ó÷åñòü â çíà÷åíèè ïî õ åùå è äëèíó íàäïèñè ê ÷åêáîêñó
  185. ;        cmp   ax,bx            ;ñòðàâíèòü ðåãèñòðû
  186. ;        jg   check_box_mouse_end        ;åñëè áîëüøå
  187.  
  188. ;        bts  dword ch_flags,1  ;èçâëå÷åíèå çíà÷åíèÿ çàäàííîãî áèòà â ôëàã cf è èçìåíåíèå åãî çíà÷åíèÿ íà 1.
  189. ;        jc   @f                ;CF=1 òî ïåðåéòè íà íèæíþþ @@
  190.        
  191. ;        call check_box_draw_ch        ;îòîáðàçèòü âêëþ÷åííûé ÷åê áîêñ
  192. ;        mov   dword [esp+24],1 ;äàëüíåéøàÿ ïðîâåðêà ÷åê áîêñîâ áåñìûñëåíà, ïî ýòîìó â ñòåê, ãäå ðàñïîëàãàåòñÿ ecx ïîìåñòèòì 0
  193. ;        jmp  check_box_mouse_end       ;âûéòè
  194. ;@@:
  195. ;        btr   word ch_flags,1  ;èçâëå÷åíèå çíà÷åíèÿ çàäàííîãî áèòà â ôëàã cf è èçìåíåíèå åãî çíà÷åíèÿ íà íóëåâîå.
  196. ;        call check_box_clear_ch         ;âûêëþ÷èòü ÷åê áîêñ ò.å. íà ìåñòå çàêðàøåííîãî ïðÿìîóãîëüíèêà îòîáðàçèòü öâåò ôîíà.
  197. .check_box_mouse_end:
  198. popad                                ;âîññòàíîâèòü ðåãèñòðû èç ñòåêà
  199. ret  4                              ;âûéòè
  200. }