Files
kolibrios/programs/develop/libraries/box_lib/checkbox.asm
T
ace-dent 2cda4a9682 libraries/box_lib: Post-SVN tidy (#433)
- Move source code from `trunk` into root directory.
- Update build files and ASM include paths. Add SPDX license header where appropriate.
- Note: Line endings standardised from `CRLF` > `LF`, so best to view diffs with whitespace changes hidden.

(Work towards [#75](KolibriOS/kolibrios#75), point 3)

Reviewed-on: KolibriOS/kolibrios#433
Reviewed-by: Burer <burer@kolibrios.org>
Reviewed-by: Ivan B <1+dunkaist@noreply.localhost>
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Co-authored-by: Andrew <dent.ace@gmail.com>
Co-committed-by: Andrew <dent.ace@gmail.com>
2026-04-23 11:50:10 +00:00

151 lines
6.6 KiB
FASM

;╧юёыхфэр  ьюфшЇшърЎш  02.02.2021
;Їрщы ёючфрэ 13.02.2009 <Lrz> ═р ъюф яЁшьхэхэр GPL2 ышЎхэчш 
;Checkbox
;╚эшЎшрышчрЎш  checkbox
align 16
init_checkbox:
;яюфёўшЄрхь ъюы-тю ёшьтюыют т фышээх т√тюфшьющ ёЄЁюъш.
pushad
mov ebp,dword [esp+36] ;чруЁєцрхь єърчрЄхы№ эр ёЄЁєъЄєЁє, єърчрЄхы№ ь√ яхЁхфрхь т ёЄхъх
mov ebx,dword ch_text_margin ;eax=0
mov esi,dword ch_text_ptr ;єърчрЄхы№ эр ёЄЁюўъє
lodsb ;т al яхЁт√щ ёшьтюы шч ёЄЁюъш
test al,al
jz .ex_loop
@@:
add ebx,6 ;°шЁшэр ёшьтюыр
lodsb
test al,al
jnz @b
.ex_loop:
mov dword ch_sz_str,ebx ;чряш°хь фышээє ёЄЁюъш ё єўхЄюь юЄёЄєяр юЄ ътрфЁрЄшър
or dword ch_text_color,0x80000000 ;фюсрты хь сшЄ фы  т√тюфр ASCIIZ-ёЄЁюъш
;эр ёыєўрщ хёыш яюы№чютрЄхы№ чрс√ы хую ёрьюёЄю Єхы№эю яюёЄртшЄ№ т ёЄЁєъЄєЁх
popad
ret 4
align 16
check_box_draw:
pushad ;ёюїЁрэшь тёх ЁхушёЄЁ√
mov ebp,dword [esp+36] ;чруЁєцрхь єърчрЄхы№ эр ёЄЁєъЄєЁє, єърчрЄхы№ ь√ яхЁхфрхь т ёЄхъх
mcall SF_DRAW_RECT,ch_left_s,ch_top_s,ch_border_color ;Ёшёєхь Ёрьъє ўхъ сюъёр, ЇръЄшўхёъш Ёшёєхь яЁ ьюєуюы№эшъ ш чръЁр°штрхь Їюэ тэєЄЁш ЎтхЄюь Ёрьъш сюъёр
mov edx,dword ch_color ;чруЁєцрхь ЎтхЄ Їюэр
add ebx,1 shl 16 - 2
add ecx,1 shl 16 - 2
mcall ;чръЁр°штрхь тэєЄЁхээюёЄш ўхъсюъёр Їюэюь
test dword ch_flags,2 ;фюёЄрЄ№ чэрўхэшх сшЄр шч яхЁхьхээющ ш яюьхёЄшЄ№ т Їыру CF
jz @f ;т хёыш CF=1, Єю т√яюыэшь ёыхфє■∙є■ яЁюЎхфєЁє шэрўх яхЁхщЄш эр эшцэ■■ @@
call check_box_draw_ch ;эрЁшёютрЄ№ тъы■ўхээ√щ ўхъ сюъё
@@:
;----------------------------
;ЁрёўхЄ ъєфр сєфхЄ яЁюшчтхфхэ т√тюф ЄхъёЄр
;----------------------------
; mov ebx,dword ch_left_s ;чруЁєчшЄ№ чэрўхэшх (ї shl 16 + фышээр) фы  ўхъ сюъёр
; add ebx,dword ch_text_margin ;фюсртшь ЁрчьхЁ ёЄюЁюэ√ ш ЁрёёЄю эшх эр ъюЄюЁюь эрўэхЄё  т√тюф ЄхъёЄр
; shl ebx,16 ;ёфтшэхь эр 16 ЁрчЁ фют т ыхтю (єьэюцшь эр 65536)
; add ebx,dword ch_left_s ;cъюЁЁхъЄшЁєхь яючшЎш■ ╒. ╥.х. ёхщўрё т тхЁїэхщ ўрёЄш ebx є эрё Єюўър эрўрыр т√тюфр ЄхъёЄр яю ╒
; mov eax,word ch_top_s ;чруЁєчшь чэрўхэшх яю (y shl 16 + фышээр) фы  ўхъ сюъёр
; shr eax,16 ;ёфтшэхь эр 16 ЁрчЁ фют т ыхтю (єьэюцшь эр 65536)
; add eax,dword ch_top_s ;cъюЁЁхъЄшЁєхь яючшЎш■ ╒. ╥.х. ёхщўрё т тхЁїэхщ ўрёЄш ebx є эрё Єюўър эрўрыр т√тюфр ЄхъёЄр яю Y
; ╬яЄшьшчрЎш  фы  ╓╧
mov ebx,dword ch_left_s ;чруЁєчшЄ№ чэрўхэшх (ї shl 16 + фышээр) фы  ўхъ сюъёр
mov eax,dword ch_top_s ;чруЁєчшь чэрўхэшх яю (y shl 16 + фышээр) фы  ўхъ сюъёр
mov ecx,eax
add ebx,dword ch_text_margin ;фюсртшь ЁрчьхЁ ёЄюЁюэ√ ш ЁрёёЄю эшх эр ъюЄюЁюь эрўэхЄё  т√тюф ЄхъёЄр
shr eax,16 ;ёфтшэхь эр 16 ЁрчЁ фют т яЁртю (Ёрчфхышь эр 65536) т ax тхЁїэр  Єюўър
shl ebx,16 ;ёфтшэхь эр 16 ЁрчЁ фют т ыхтю (єьэюцшь эр 65536)
sub ecx,8 ;ъюЁЁхЄшЁютър єўшЄ√трхь т√ёюЄє °ЁшЇЄр
test dword ch_flags,ch_flag_bottom ;яЁютхЁшь, эєцэю ыш т√тюфшЄ№ ттхЁїє эрфяшё№
jnz .bottom
test dword ch_flags,ch_flag_middle ;яЁютхЁшь, эєцэю ыш т√тюфшЄ№ т ЎхэЄЁ эрфяшё№
jz .top ;юёЄрыё  Єюы№ъю top
shr cx,1 ;Ёрчфхышь эр 2
.bottom:
add ax,cx
.top:
add ebx,dword ch_left_s ;cъюЁЁхъЄшЁєхь яючшЎш■ ╒. ╥.х. ёхщўрё т тхЁїэхщ ўрёЄш ebx є эрё Єюўър эрўрыр т√тюфр ЄхъёЄр яю ╒
mov bx,ax
;ebx ї shl 16 +y ъююЁфшэрЄ√ т√тюфр ёЄЁюўъш
mov ecx,dword ch_text_color ;чруЁєчшь ЎтхЄ эрфяшёш + flags
mov edx,dword ch_text_ptr ;єърцхь рфЁхё юЄ ъєфр эєцэю т√тюфшЄ№ ёЄЁюъє
mcall SF_DRAW_TEXT
popad ;тюёёЄрэютшЄ№ чэрўхэш  ЁхушёЄЁют шч ёЄхър
ret 4 ;т√щфхь шч яЁюЎхфєЁ√ ш єфрышь шч ёЄхър єърчрЄхы№ эр ёЄЁєъЄєЁє (4 срщЄр)
check_box_clear_ch: ;юўшёЄър ўхъ сюъёр
mov edx,dword ch_color ;ЎтхЄ тэєЄЁш ўхъ сюъёр
jmp @f ;схчєёыютэ√щ яЁ√цюъ эр эшцэ■■ ьхЄъє @@
check_box_draw_ch: ;эрЁшёютрЄ№ тъы■ўхээ√щ ўхъ сюъё
mov edx,dword ch_border_color ;чруЁєчшЄ№ ЎтхЄ
@@:
;╬ЄюсЁрчшЄ№ тъы■ўхэ√щ checkbox
mov ebx,dword ch_left_s ;чруЁєцрхь ї shl 16 + фышээр яю ╒
mov ecx,dword ch_top_s ;чруЁєцрхь Y shl 16 + фышээр яю Y
add ebx,2 shl 16 - 4 ;яюёых ¤Єшї шчьхэхэшщ (X+2) shl 16 +фышээр яю (╒-2)
add ecx,2 shl 16 - 4 ;яюёых ¤Єшї шчьхэхэшщ (Y+2) shl 16 +фышээр яю (Y-2)
mcall SF_DRAW_RECT ;юЄюсЁрчшЄ№ ътрфЁрЄ тэєЄЁш checkbox
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;╬сЁрсюЄўшъ mouse
;╧Ёш яюярфрэшш ь√°ъш + эрцрЄр ъыртш°р т юсырёЄ№ checkbox ёюёЄю эшх сюъёр фюыцэю ьхэ Єё  ръЄштэ√щ - эх ръЄштэ√щ.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
align 16
check_box_mouse: ;юсЁрсюЄър ь√°ш
pushad
mov ebp,dword [esp+36] ;чруЁєцрхь єърчрЄхы№ эр ёЄЁєъЄєЁє, єърчрЄхы№ ь√ яхЁхфрхь т ёЄхъх
mcall SF_MOUSE_GET,SSF_BUTTON_EXT ;яЁютхЁ хь ёюёЄю эшх ъыртш° ь√°ъш. ┴√ыю ыш ёюс√Єшх эрцрЄр  ъыртш°р эр ь√°ъх.
and eax, 3 shl 8 ;яЁютхЁ хь ыхтє■ ш яЁртє■ ъэюяъш
jz .end ;юсЁрсюЄър чръюэўшырё№
; ─р ёюс√Єшх: эрцрЄшх ъыртш°ш ь√°ъш яЁюшчю°ыю.
@@:
mcall SF_MOUSE_GET,SSF_WINDOW_POSITION ;яюыєўшЄ№ ъююЁфшэрЄ√ ъєЁёюЁр юЄэюёшЄхы№эю юъэр
;эр т√їюфх т eax x shl 16 + y
;ёЁртэхэшх тхЁїэхщ Єюўъш яю Y
mov ecx,dword ch_top_s ;y shl 16 +фышээр яю y
mov ebx,ecx
shr ebx,16 ;bx = ъююЁфшэрЄр яю y
cmp ax,bx
jb .end ;єърчрЄхы№ ь√°ъш ьхэ№°х эрўры№эющ ъююЁфшэрЄ√ яю y ўхь ъююЁфшэрЄр яю Y є сюъёр
;ёЁртэхэшх эшцэхщ Єюўъш яю Y
add cx,bx ;ёыюцшь фышээє яю y ш ъююЁфшэрЄє тхЁїэхщ Єюўъш яю y яюышўшь ъююЁфшэрЄє эшцэхщ Єюўъш яю Y
cmp ax,cx
ja .end ;єърчрЄхы№ ь√°ъш сюы№°х ъюэхўэющ ъююЁфшэрЄ√ яю y ўхь ъююЁфшэрЄр яю Y є сюъёр
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
shr eax,16 ;ёьхёЄшь ъююЁфшэрЄє яю ╒ т эшцэє■ ўрёЄ№ ЁхушёЄЁр Є.х. т ax
;ёЁртэхэшх яю эрўры№эющ Єюўъх ╒
mov ecx,dword ch_left_s ;чруЁєчшЄ№ чэрўхэшх (ї shl 16 + фышээр) фы  ўхъ сюъёр
mov ebx,ecx
shr ebx,16 ;bx = ъююЁфшэрЄр яю X
cmp ax,bx
jb .end ;єърчрЄхы№ ь√°ъш ьхэ№°х эрўры№эющ ъююЁфшэрЄ√ яю X ўхь ъююЁфшэрЄр яю X є сюъёр
;ёЁртэхэшх ъюэхўэющ Єюўъш яю X
add bx,cx ;ёыюцшь фышээє яю x ш ъююЁфшэрЄє Єюўъш яю ї яюыєўшь ъююЁфшэрЄє ъюэхўэющ Єюўъш яю ╒
add bx,word ch_sz_str ;фюсртшь фышээє ёЄЁюъш ЄхъёЄр ё юЄёЄєяюь яЁхфтрЁЄшхы№эю чряшёрт шї т ьюьхэЄ шэшЎшрышчрЎшш
cmp ax,bx
ja .end ;єърчрЄхы№ ь√°ъш сюы№°х ъюэхўэющ ъююЁфшэрЄ√ яю ї ўхь ъююЁфшэрЄр яю ╒ є сюъёр
;хёыш тёх яЁютхЁъш с√ыш єёях°эю яЁющфхэ√ ь√ юс чрэ√ яюьхэ Є№ ёюёЄю эшх сюъёр
btc dword ch_flags,1 ;яхЁхэюё 2-ую сшЄр т cf ш шэтхЁёш  хую
jnc .enable_box ;хёыш CF=1 Єю юЄюсЁрчшь тъы■ўхээ√щ сюъё ш т√щфхь
push dword .end ;Їюъєё-яюъєё, тхЁэхьё  яюёых т√чютр check_box_clear_ch эр ьхЄъє check_box_mouse.end
jmp check_box_clear_ch ;т√ъы■ўшЄ№ ўхъ сюъё Є.х. эр ьхёЄх чръЁр°хээюую яЁ ьюєуюы№эшър юЄюсЁрчшЄ№ ЎтхЄ Їюэр.
.enable_box:
call check_box_draw_ch ;юЄюсЁрчшЄ№ тъы■ўхээ√щ ўхъ сюъё
.end:
popad ;тюёёЄрэютшЄ№ ЁхушёЄЁ√ шч ёЄхър
ret 4 ;т√щЄш ш тюёёЄрэютшь ёЄхъ