forked from KolibriOS/kolibrios
065b8d32b2
git-svn-id: svn://kolibrios.org@31 a494cfbc-eb01-0410-851d-a64ba20cac60
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
|
||
;*****************************************************************************
|
||
|
||
|
||
|
||
|