mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-24 07:36:48 +03:00
441 lines
14 KiB
PHP
441 lines
14 KiB
PHP
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
;; ;
|
|||
|
;; Scroll.inc ;
|
|||
|
;; ;
|
|||
|
;; Vertical Scroll Bar Example for MenuetOS ;
|
|||
|
;; ;
|
|||
|
;; Version 0.2 27 February 2005 ;
|
|||
|
;; ;
|
|||
|
;; ;
|
|||
|
;; GNU GENERAL PUBLIC LICENSE ;
|
|||
|
;; Version 2, June 1991 ;
|
|||
|
;; ;
|
|||
|
;; Copyright 2005 Jason Delozier, ;
|
|||
|
;; cordata51@hotmail.com ;
|
|||
|
;; ;
|
|||
|
;; See file COPYING for details ;
|
|||
|
;; ;
|
|||
|
;; Updates: ;
|
|||
|
;; - FPU not longer used for calculations -Feb 27, 2005 ;
|
|||
|
;; ;
|
|||
|
;; ;
|
|||
|
;; TODO: ;
|
|||
|
;; - Create Message Handler and only allow runtime arguments ;
|
|||
|
;; to be processed through the message handler ;
|
|||
|
;; - Remove all local varibles and only allow working varible to ;
|
|||
|
;; reside in scroll bar structure. ;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
;*****************************************************************************
|
|||
|
;*
|
|||
|
;* VScroll Structure Equates
|
|||
|
;*
|
|||
|
;*****************************************************************************
|
|||
|
|
|||
|
VScroll_width equ 0
|
|||
|
VScroll_x equ 2
|
|||
|
VScroll_height equ 4
|
|||
|
VScroll_y equ 6
|
|||
|
VScroll_min equ 8
|
|||
|
VScroll_max equ 12
|
|||
|
VScroll_current equ 16
|
|||
|
VScroll_s_change equ 20
|
|||
|
VScroll_b_change equ 24
|
|||
|
|
|||
|
;Example VScroll Structure
|
|||
|
;VScroll_1:
|
|||
|
; dw 16 ;width +0
|
|||
|
; dw 100 ;x +2
|
|||
|
; dw 200 ;height +4
|
|||
|
; dw 40 ;y +6
|
|||
|
; dd 0 ;min +8
|
|||
|
; dd 1000;max +12
|
|||
|
; dd 1 ;current +16
|
|||
|
; dd 1 ;small change +20
|
|||
|
; dd 10 ;big change +24
|
|||
|
|
|||
|
VScroll_Min_Height dw 16 ;scroll box
|
|||
|
Vscroll_Fixed_Height dw 16 ;height of scroll buttons (up and down)
|
|||
|
|
|||
|
;**************************************
|
|||
|
;*
|
|||
|
;* Mouse Over VScroll
|
|||
|
;*
|
|||
|
;**************************************
|
|||
|
vsm1 dd 0
|
|||
|
vstoff dd 0
|
|||
|
|
|||
|
VScroll_mouse_over:
|
|||
|
cmp [mouseb], 1
|
|||
|
je VScroll_Mouse_Has_Mouse
|
|||
|
cmp [mouseb], 0
|
|||
|
jne VScroll_mouse_over_done2
|
|||
|
mov [vsm1], 0
|
|||
|
jmp VScroll_mouse_over_done2
|
|||
|
VScroll_Mouse_Has_Mouse:
|
|||
|
push ecx
|
|||
|
mov ecx, [vsm1]
|
|||
|
shl ecx,2
|
|||
|
call dword [VScroll_Mouse_Jumptable+ecx]
|
|||
|
VScroll_mouse_over_done:
|
|||
|
pop ecx
|
|||
|
VScroll_mouse_over_done2:
|
|||
|
ret
|
|||
|
|
|||
|
VScroll_Mouse_Jumptable:
|
|||
|
dd VScroll_Mouse_Find
|
|||
|
dd VScroll_Mouse_On_Up
|
|||
|
dd VScroll_Mouse_On_Down
|
|||
|
dd VScroll_Mouse_Above_Thumb
|
|||
|
dd VScroll_Mouse_Below_Thumb
|
|||
|
dd VScroll_Mouse_On_Thumb
|
|||
|
|
|||
|
VScroll_Mouse_Find:
|
|||
|
inc ecx
|
|||
|
call dword [VScroll_Mouse_Jumptable+ecx*4]
|
|||
|
cmp [vsm1], 0
|
|||
|
jne VScroll_mouse_over_done2
|
|||
|
cmp ecx, 5
|
|||
|
je VScroll_mouse_over_done2
|
|||
|
jmp VScroll_Mouse_Find
|
|||
|
|
|||
|
|
|||
|
;**************************************
|
|||
|
;Is Mouse at Up button
|
|||
|
VScroll_Mouse_On_Up:
|
|||
|
push eax
|
|||
|
movzx eax, word [ebp+VScroll_y]
|
|||
|
add ax, word [Vscroll_Fixed_Height]
|
|||
|
cmp [mousey], ax
|
|||
|
pop eax
|
|||
|
ja VScroll_Mouse_On_Up2
|
|||
|
mov [vsm1], 1
|
|||
|
call VScroll_Small_Up
|
|||
|
VScroll_Mouse_On_Up2:
|
|||
|
ret
|
|||
|
|
|||
|
;**************************************
|
|||
|
;Is Mouse at Down button
|
|||
|
VScroll_Mouse_On_Down:
|
|||
|
push eax
|
|||
|
movzx eax,word [ebp+VScroll_y]
|
|||
|
add ax, word [ebp+VScroll_height]
|
|||
|
sub ax, word [Vscroll_Fixed_Height]
|
|||
|
cmp [mousey], ax
|
|||
|
pop eax
|
|||
|
jb VScroll_Mouse_On_Down2
|
|||
|
mov [vsm1], 2
|
|||
|
call VScroll_Small_Down
|
|||
|
VScroll_Mouse_On_Down2:
|
|||
|
ret
|
|||
|
|
|||
|
;**************************************
|
|||
|
;Is Mouse above Scroll Thumb
|
|||
|
VScroll_Mouse_Above_Thumb:
|
|||
|
push eax
|
|||
|
push ecx
|
|||
|
push edx
|
|||
|
call Vscroll_SBox_Area
|
|||
|
add cx, word [ebp+VScroll_y]
|
|||
|
add cx, word [Vscroll_Fixed_Height] ;plus height of scroll button
|
|||
|
cmp cx, [mousey]
|
|||
|
pop edx
|
|||
|
pop ecx
|
|||
|
pop eax
|
|||
|
jb VScroll_Mouse_Above_Thumb2
|
|||
|
mov [vsm1], 3
|
|||
|
call VScroll_Big_Up
|
|||
|
VScroll_Mouse_Above_Thumb2:
|
|||
|
ret
|
|||
|
|
|||
|
;**************************************
|
|||
|
;Is Mouse below scroll thumb
|
|||
|
VScroll_Mouse_Below_Thumb:
|
|||
|
push eax
|
|||
|
push ecx
|
|||
|
push edx
|
|||
|
call Vscroll_SBox_Area
|
|||
|
add cx, word [ebp+VScroll_y]
|
|||
|
add cx, word [Vscroll_Fixed_Height] ;plus height of scroll button
|
|||
|
add cx, ax
|
|||
|
cmp cx, [mousey]
|
|||
|
pop edx
|
|||
|
pop ecx
|
|||
|
pop eax
|
|||
|
ja VScroll_Mouse_Below_Thumb2
|
|||
|
mov [vsm1], 4
|
|||
|
call VScroll_Big_Down
|
|||
|
VScroll_Mouse_Below_Thumb2:
|
|||
|
ret
|
|||
|
|
|||
|
;**************************************
|
|||
|
;Mouse is on Scroll Thumb
|
|||
|
VScroll_Mouse_On_Thumb:
|
|||
|
|
|||
|
pusha
|
|||
|
cmp [vsm1], 5 ;first time moving since we clicked?
|
|||
|
je VScroll_Mouse_On_Thumb1 ;if not jump.. we already have offset
|
|||
|
mov [vsm1], 5 ;determine offset between mouse pointer and top of thumb
|
|||
|
call Vscroll_SBox_Area ;get top of thumb coordinate
|
|||
|
add cx, word [ebp+VScroll_y] ;make screen coordinate
|
|||
|
add cx, word [Vscroll_Fixed_Height] ;plus height of scroll button and top
|
|||
|
movzx esi,word [mousey] ;get mouse position
|
|||
|
sub esi, ecx ;make offset between top of thumb
|
|||
|
mov [vstoff], esi ;and mouse pointer then save it
|
|||
|
VScroll_Mouse_On_Thumb1: ;
|
|||
|
movzx esi, [mousey] ;get mouse y value
|
|||
|
sub si, word [ebp+VScroll_y] ;get y starting value of scroll bar
|
|||
|
sub si, [Vscroll_Fixed_Height]
|
|||
|
sub esi, [vstoff] ;
|
|||
|
call Vscroll_SBox_Area ;
|
|||
|
VScroll_Mouse_On_Thumb2: ;
|
|||
|
cmp [ebp+VScroll_current], edx ;only redraw if change occured
|
|||
|
je VScroll_Mouse_On_Thumb3 ;
|
|||
|
mov [ebp+VScroll_current], edx ;new current value
|
|||
|
call drawvscrolla ;redraw scroll background and thumb
|
|||
|
VScroll_Mouse_On_Thumb3: ;
|
|||
|
popa ;
|
|||
|
ret
|
|||
|
;**************************************
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
;*****************************************************************************
|
|||
|
;*
|
|||
|
;* Vscroll_SBox_Area
|
|||
|
;*
|
|||
|
;* Purpose: To determine the area of the Scroll Bar Thumb and the current
|
|||
|
;* value of scroll based on top pixel of thumb.
|
|||
|
;*
|
|||
|
;* Inputs:
|
|||
|
;* EBP - Structure of scroll bar
|
|||
|
;* ESI - Top of Thumb - optional
|
|||
|
;*
|
|||
|
;* Outputs:
|
|||
|
;* EAX - Thumb Height
|
|||
|
;* ECX - Top of thumb
|
|||
|
;* EDX - Current Value based on top pixel of thumb. Valid when ESI
|
|||
|
;* is given as input.
|
|||
|
;*
|
|||
|
;* This procedure is divided up into 5 specific functions.
|
|||
|
;* 1. ((Vmax-VMin)/Small Change)= Total Changes
|
|||
|
;* 2. Height - (2* Fixed Button Height) = Total Pixels
|
|||
|
;* 3. Total Pixels - Total Changes = Thumb Height (must be >= 16)
|
|||
|
;* Minimum Height of 16 is varible [VScroll_Min_Height]
|
|||
|
;* 4. (((Tot Pixels - Thumb Height)* Current)/Max-min)=Top Pixel of Thumb
|
|||
|
;* 5. ((Mouse Top * (max-Min))/(Total Pix - Thumb Height)) = Current
|
|||
|
;* Step 5 is only valid if ESI is supplied as an input.
|
|||
|
;*
|
|||
|
;*
|
|||
|
;*****************************************************************************
|
|||
|
|
|||
|
Vscroll_SBox_Area:
|
|||
|
push ebx
|
|||
|
push esi
|
|||
|
push edi
|
|||
|
;Step 1. Determine Total Changes
|
|||
|
mov eax, dword [ebp+VScroll_max] ;get max scroll
|
|||
|
sub eax, dword [ebp+VScroll_min] ;sub minmum scroll for total scro
|
|||
|
xor edx,edx
|
|||
|
push eax
|
|||
|
div dword [ebp+VScroll_s_change] ;
|
|||
|
;eax = total changes ((max-min)/Small Change)
|
|||
|
|
|||
|
;Step 2. Determine Total Pixels
|
|||
|
movzx ecx, word [ebp+VScroll_height] ;height of entire scroll bar
|
|||
|
mov bx, word [Vscroll_Fixed_Height] ;minus height of both scroll button
|
|||
|
shl bx, 1
|
|||
|
sub cx, bx
|
|||
|
push ecx
|
|||
|
;ecx = total pixels (Total Height - (2*Fixed Button Height)
|
|||
|
|
|||
|
;Step 3. Determine Thumb Height
|
|||
|
cmp ecx, eax
|
|||
|
jbe vs1
|
|||
|
sub ecx, eax
|
|||
|
cmp cx, word [VScroll_Min_Height]
|
|||
|
jb vs1
|
|||
|
jmp vs2
|
|||
|
vs1:
|
|||
|
movzx ecx, word [VScroll_Min_Height]
|
|||
|
vs2:
|
|||
|
;ecx = Thumb Height (Total Pixels - Total Changes) >=16
|
|||
|
|
|||
|
;Step 4. Determine Top Pixel of Thumb
|
|||
|
pop edi ;Total Pixels
|
|||
|
sub edi, ecx ;
|
|||
|
;edi = Total Pixels - thumb Height
|
|||
|
mov eax, edi ;
|
|||
|
mul dword [ebp+VScroll_current] ;get current scroll value
|
|||
|
pop ebx ;max scroll
|
|||
|
push ecx ;
|
|||
|
div ebx ;
|
|||
|
mov ecx, eax ;
|
|||
|
;ecx = top pixel of thumb
|
|||
|
|
|||
|
;Step 5. Determine Current Value based on Mouse Position
|
|||
|
cmp si,0
|
|||
|
jge vss4
|
|||
|
mov eax, dword [ebp+VScroll_min]
|
|||
|
jmp vsdone1
|
|||
|
vss4:
|
|||
|
cmp esi, edi
|
|||
|
jbe vss3
|
|||
|
mov eax, dword [ebp+VScroll_max]
|
|||
|
jmp vsdone1
|
|||
|
vss3:
|
|||
|
mov eax,ebx ;max scroll
|
|||
|
mul esi ;Top Pixel of mouse
|
|||
|
div edi ;Total Pixels - Thumb Height
|
|||
|
;eax = Current Value
|
|||
|
|
|||
|
vsdone1:
|
|||
|
mov edx, eax ;Current Value
|
|||
|
pop eax ;Thumb Height
|
|||
|
pop edi
|
|||
|
pop esi
|
|||
|
pop ebx
|
|||
|
ret
|
|||
|
|
|||
|
;*****************************************************************************
|
|||
|
;*
|
|||
|
;*****************************************************************************
|
|||
|
;ebp is structure
|
|||
|
drawvscroll:
|
|||
|
pusha
|
|||
|
;up button
|
|||
|
mov eax, 13 ;button system function
|
|||
|
mov edx,0x00777777 ;0x6677cc ;color
|
|||
|
mov ebx, [ebp+VScroll_width] ;x-start/width
|
|||
|
mov cx, word [ebp+VScroll_y] ;get bottom of scroll bar
|
|||
|
shl ecx, 16
|
|||
|
mov cx, [Vscroll_Fixed_Height] ;fixed height
|
|||
|
int 0x40
|
|||
|
|
|||
|
;down button
|
|||
|
mov ebx, [ebp+VScroll_width] ;x-start/width
|
|||
|
mov cx, word [ebp+VScroll_y] ;get bottom of scroll bar
|
|||
|
add cx, word [ebp+VScroll_height] ;
|
|||
|
sub cx, [Vscroll_Fixed_Height] ;y-start is 12 pixel from bottom
|
|||
|
shl ecx, 16 ;
|
|||
|
mov cx, [Vscroll_Fixed_Height] ;fixed height
|
|||
|
int 0x40
|
|||
|
;------- 'ASCL.INC' needs to be included to use this --
|
|||
|
putlabel 493,46,'',cl_Black
|
|||
|
putlabel 493,372,'',cl_Black
|
|||
|
;------------------------------------------------------
|
|||
|
|
|||
|
popa
|
|||
|
drawvscrolla:
|
|||
|
pusha
|
|||
|
|
|||
|
mov eax, 13 ;Draw Scroll Box Background
|
|||
|
mov edx, 0x00999999;0 ;color
|
|||
|
push edx
|
|||
|
movzx edx, word [Vscroll_Fixed_Height]
|
|||
|
mov ebx, [ebp+VScroll_width] ;x-start/width
|
|||
|
movzx ecx,word [ebp+VScroll_y] ;y-start
|
|||
|
add ecx, edx ;add fixed height button
|
|||
|
shl ecx, 16 ;do height next
|
|||
|
mov cx,word [ebp+VScroll_height] ;y-start
|
|||
|
sub cx, dx ;subtract fixed height of up button
|
|||
|
sub cx, dx ;subtract fixed height of down button
|
|||
|
pop edx
|
|||
|
int 0x40 ;tell system to draw it
|
|||
|
|
|||
|
;determine height of scroll box (thumb)
|
|||
|
|
|||
|
call Vscroll_SBox_Area
|
|||
|
add cx, [ebp+VScroll_y]
|
|||
|
add cx, 16
|
|||
|
shl ecx, 16
|
|||
|
mov cx, ax
|
|||
|
|
|||
|
mov eax, 13 ;draw scroll box
|
|||
|
mov ebx, [ebp+VScroll_width] ;x-start/width
|
|||
|
mov edx, 0x00bbbbbb ;0x999999
|
|||
|
int 0x40
|
|||
|
;call Draw_Scroll_info
|
|||
|
popa
|
|||
|
ret
|
|||
|
;*****************************************************************************
|
|||
|
|
|||
|
;*****************************************************************************
|
|||
|
;* VScroll_Big_Up
|
|||
|
;* VScroll_Small_Up
|
|||
|
;*****************************************************************************
|
|||
|
;need to update for signed values
|
|||
|
VScroll_Big_Up:
|
|||
|
push eax
|
|||
|
push ebx
|
|||
|
mov eax, dword [ebp+VScroll_b_change]
|
|||
|
jmp VScroll_Up
|
|||
|
VScroll_Small_Up:
|
|||
|
push eax
|
|||
|
push ebx
|
|||
|
mov eax, dword [ebp+VScroll_s_change]
|
|||
|
VScroll_Up:
|
|||
|
mov ebx, dword [ebp+VScroll_min] ;get minimum value
|
|||
|
cmp [ebp+VScroll_current], ebx ;are we at minimum already?
|
|||
|
je VScroll_Up_exit ;if so leave
|
|||
|
sub [ebp+VScroll_current], eax ;
|
|||
|
jnc VScroll_Up_done
|
|||
|
mov [ebp+VScroll_current], ebx
|
|||
|
VScroll_Up_done:
|
|||
|
cmp [ebp+VScroll_current], ebx ;if current is greater then max
|
|||
|
jae VScroll_Up_done2
|
|||
|
mov [ebp+VScroll_current], ebx
|
|||
|
VScroll_Up_done2:
|
|||
|
;redraw
|
|||
|
call drawvscroll ;temp?
|
|||
|
VScroll_Up_exit:
|
|||
|
pop ebx
|
|||
|
pop eax
|
|||
|
|
|||
|
ret
|
|||
|
;*****************************************************************************
|
|||
|
|
|||
|
|
|||
|
;*****************************************************************************
|
|||
|
;* VScroll_Big_Down
|
|||
|
;* VScroll_Small_Down
|
|||
|
;*****************************************************************************
|
|||
|
;need to update for signed values
|
|||
|
VScroll_Big_Down:
|
|||
|
push eax
|
|||
|
push ebx
|
|||
|
mov eax, dword [ebp+VScroll_b_change];get big change value
|
|||
|
jmp VScroll_Down
|
|||
|
VScroll_Small_Down:
|
|||
|
push eax
|
|||
|
push ebx
|
|||
|
mov eax, dword [ebp+VScroll_s_change];get small change value
|
|||
|
VScroll_Down:
|
|||
|
mov ebx, dword [ebp+VScroll_max] ;get maximum scroll value
|
|||
|
cmp [ebp+VScroll_current], ebx ;are we at max already?
|
|||
|
je VScroll_Down_exit ;if so leave
|
|||
|
add [ebp+VScroll_current], eax ;add change to current
|
|||
|
jno VScroll_Down_done ;dont go beyond bounds of register
|
|||
|
mov [ebp+VScroll_current], ebx ;if we did then we at max
|
|||
|
VScroll_Down_done: ;
|
|||
|
cmp [ebp+VScroll_current], ebx ;if current is greater then max
|
|||
|
jbe VScroll_Down_done2 ;
|
|||
|
mov [ebp+VScroll_current], ebx ;then we at max
|
|||
|
VScroll_Down_done2: ;
|
|||
|
;redraw
|
|||
|
call drawvscroll ;temp?
|
|||
|
VScroll_Down_exit:
|
|||
|
pop ebx
|
|||
|
pop eax
|
|||
|
ret
|
|||
|
;*****************************************************************************
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|