mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-11-25 18:29:36 +03:00
07b6a39a9e
@panel - removed binary file icon - version from latest version kolibri icon_new - movable icons (early development :) cpuspeed - new title git-svn-id: svn://kolibrios.org@872 a494cfbc-eb01-0410-851d-a64ba20cac60
608 lines
11 KiB
NASM
608 lines
11 KiB
NASM
;
|
|
; ICON APPLICATION
|
|
;
|
|
; Compile with FASM for Menuet
|
|
;
|
|
; August 12, 2004 - 32-bit ICO format support (mike.dld)
|
|
; March 14, 2007 - rewriten for KolibriOS (heavyiron)
|
|
|
|
use32
|
|
|
|
org 0x0
|
|
db 'MENUET01' ; 8 byte id
|
|
dd 0x01 ; header version
|
|
dd START ; start of code
|
|
dd I_END ; size of image
|
|
dd 0x8000 ; memory for app
|
|
dd 0x8000 ; esp
|
|
dd I_PARAM , 0x0 ; I_Param , I_Icon
|
|
|
|
; params 4 xpos 4 ypos 30 iconfile 30 startfile 10 label
|
|
; +0 +4 +8 +38 +68
|
|
|
|
include '..\..\..\macros.inc'
|
|
|
|
;__DEBUG__ fix 1
|
|
;__DEBUG_LEVEL__ fix 1
|
|
;include 'debug-fdo.inc'
|
|
|
|
flipdelay = 5
|
|
|
|
START: ; start of execution
|
|
|
|
cmp [I_PARAM],byte 0
|
|
jne nohalt
|
|
mcall -1
|
|
|
|
nohalt:
|
|
mov eax,[I_PARAM+0]
|
|
sub eax,0x01010101
|
|
mov [xpos],eax
|
|
mov eax,[I_PARAM+4]
|
|
sub eax,0x01010101
|
|
mov [ypos],eax
|
|
|
|
mov esi,I_PARAM+8
|
|
mov edi,fname
|
|
mov ecx,30
|
|
cld
|
|
rep movsb
|
|
call fill_paths
|
|
|
|
;DEBUGF 1,"fname: '%s'\n",fname
|
|
|
|
mov esi,I_PARAM+8+30
|
|
mov edi,start_file
|
|
mov ecx,30
|
|
cld
|
|
rep movsb
|
|
call fill_paths
|
|
|
|
mov esi,I_PARAM+8+30+30
|
|
mov edi,labelt
|
|
mov ecx,10
|
|
cld
|
|
rep movsb
|
|
|
|
mcall 40,110001b
|
|
|
|
mcall 37,4,hand,1
|
|
mov ecx,eax
|
|
mcall 37,5
|
|
|
|
red:
|
|
call get_bg
|
|
call draw_window
|
|
|
|
still:
|
|
|
|
mcall 10 ; wait here for event
|
|
|
|
cmp eax,1 ; redraw request ?
|
|
jz red
|
|
cmp eax,6
|
|
jz mouse
|
|
|
|
call get_bg
|
|
call draw_icon
|
|
mcall 5,80
|
|
jmp still
|
|
|
|
|
|
mouse:
|
|
|
|
mcall 9,process,-1
|
|
xor ebx,ebx
|
|
mov bx,[process.window_stack_position]
|
|
cmp eax,ebx ;check is this process is active
|
|
jne still
|
|
|
|
cmp [mouse_pressed],1
|
|
je @f
|
|
|
|
mcall 37,2
|
|
test eax,1
|
|
jz still
|
|
|
|
mov [icon_moved],0
|
|
|
|
mcall 37,0
|
|
mov ebx,eax
|
|
shr eax,16 ; eax= abs x
|
|
and ebx,0xffff ; ebx= abs y
|
|
|
|
mov [xmouse_old],eax ; saving mouse coordinates
|
|
mov [ymouse_old],ebx
|
|
|
|
cmp eax,[process.box.left] ; check is mouse in icon area
|
|
jl still
|
|
sub eax,[process.box.left]
|
|
cmp eax,[process.box.width]
|
|
ja still
|
|
|
|
cmp ebx,[process.box.top]
|
|
jl still
|
|
sub ebx,[process.box.top]
|
|
cmp ebx,[process.box.height]
|
|
ja still
|
|
|
|
mov [xmouse_rel],eax ; saving relative coordinates
|
|
mov [ymouse_rel],ebx
|
|
|
|
mov [mouse_pressed],1
|
|
|
|
jmp still
|
|
|
|
@@:
|
|
mcall 37,2
|
|
test eax,1
|
|
jnz @F
|
|
|
|
mov [mouse_pressed],0
|
|
|
|
@@:
|
|
mcall 37,0
|
|
mov ecx,eax
|
|
shr eax,16 ; eax= abs x
|
|
and ecx,0xffff ; ecx= abs y
|
|
push eax ecx
|
|
|
|
cmp [icon_moved],1
|
|
je move
|
|
|
|
add eax,2
|
|
cmp eax,[xmouse_old]
|
|
jle move
|
|
sub eax,4
|
|
cmp eax,[xmouse_old]
|
|
jae move
|
|
|
|
add ecx,2
|
|
cmp ecx,[ymouse_old]
|
|
jle move
|
|
sub ecx,4
|
|
cmp ecx,[ymouse_old]
|
|
jae move
|
|
|
|
cmp [mouse_pressed],1
|
|
je still
|
|
|
|
mcall 70,finfo_start
|
|
call flip_icon
|
|
jmp still
|
|
|
|
move:
|
|
mov [icon_moved],1
|
|
pop ecx ebx
|
|
sub ebx,[xmouse_rel] ; ebx=new_x
|
|
sub ecx,[ymouse_rel] ; ecx=new_y
|
|
mov [xpos],ebx
|
|
mov [ypos],ecx
|
|
|
|
mcall 67,,,-1,-1 ; move
|
|
|
|
jmp still
|
|
|
|
fill_paths:
|
|
dec edi
|
|
mov ecx,30
|
|
std
|
|
mov al,' '
|
|
repe scasb
|
|
cld
|
|
mov byte[edi+2],0
|
|
ret
|
|
|
|
flip_icon:
|
|
|
|
mov eax,1
|
|
call flip
|
|
inc eax
|
|
call flip
|
|
inc eax
|
|
call flip
|
|
inc eax
|
|
call flip
|
|
inc eax
|
|
call flip
|
|
dec eax
|
|
call flip
|
|
dec eax
|
|
call flip
|
|
dec eax
|
|
call flip
|
|
dec eax
|
|
call flip
|
|
xor eax,eax
|
|
call flip
|
|
|
|
ret
|
|
|
|
flip:
|
|
push eax
|
|
mov [iconstate],eax
|
|
call get_bg
|
|
call draw_icon
|
|
mcall 5,flipdelay
|
|
pop eax
|
|
ret
|
|
|
|
|
|
draw_window:
|
|
|
|
mcall 12,1 ; function 12,1 - tell os about start of draw window
|
|
|
|
xor eax,eax ; function 0 : define and draw window
|
|
mov ebx,[xpos-2]
|
|
add ebx,51 ; [x start] *65536 + [x size]
|
|
mov ecx,[ypos-2]
|
|
add ecx,67 ; [y start] *65536 + [y size]
|
|
mov edx,0x01000000
|
|
mov esi,0x01000000
|
|
mcall
|
|
|
|
call draw_icon
|
|
|
|
mcall 12,2 ; function 12,2 - tell os about end of draw window
|
|
|
|
ret
|
|
|
|
get_bg:
|
|
|
|
mcall 61,1
|
|
mov [scrxy],eax
|
|
|
|
mcall 39,4 ; get background type
|
|
mov [bgrdrawtype],eax
|
|
|
|
mcall 39,1 ; get background size
|
|
mov [bgrxy],eax
|
|
|
|
mcall 70,finfo
|
|
|
|
mov [itype],0
|
|
cmp word[I_END+256],'BM'
|
|
je @f
|
|
inc [itype]
|
|
@@:
|
|
|
|
mov ebx,51
|
|
xor ecx,ecx ; 10608 = 52*68*3 - bg image
|
|
mov esi,I_END+256+9662 ; 9662 - icon file image
|
|
mov edi,51*3
|
|
|
|
newb:
|
|
|
|
push ebx ecx
|
|
|
|
yesbpix:
|
|
|
|
cmp [bgrdrawtype],2
|
|
jne nostretch
|
|
|
|
mov eax,[ypos]
|
|
add eax,ecx
|
|
xor edx,edx
|
|
movzx ebx,word [bgrxy]
|
|
mul ebx
|
|
xor edx,edx
|
|
movzx ebx,word [scrxy]
|
|
div ebx
|
|
xor edx,edx
|
|
movzx ebx,word [bgrxy+2]
|
|
mul ebx
|
|
push eax
|
|
|
|
mov eax,[xpos]
|
|
add eax,[esp+8]
|
|
xor edx,edx
|
|
movzx ebx,word [bgrxy+2]
|
|
mul ebx
|
|
xor edx,edx
|
|
movzx ebx,word [scrxy+2]
|
|
div ebx
|
|
add eax,[esp]
|
|
add esp,4
|
|
|
|
nostretch:
|
|
|
|
cmp [bgrdrawtype],1
|
|
jne notiled
|
|
|
|
mov eax,[ypos]
|
|
add eax,ecx
|
|
xor edx,edx
|
|
movzx ebx,word [bgrxy]
|
|
div ebx
|
|
mov eax,edx
|
|
movzx ebx,word [bgrxy+2]
|
|
xor edx,edx
|
|
mul ebx
|
|
push eax
|
|
|
|
mov eax,[xpos]
|
|
add eax,[esp+8]
|
|
movzx ebx,word [bgrxy+2]
|
|
xor edx,edx
|
|
div ebx
|
|
mov eax,edx
|
|
add eax,[esp]
|
|
add esp,4
|
|
|
|
notiled:
|
|
|
|
lea ecx,[eax+eax*2]
|
|
mcall 39,2
|
|
|
|
nobpix:
|
|
|
|
pop ecx ebx
|
|
|
|
mov [esi+edi+0],al
|
|
mov [esi+edi+1],ah
|
|
shr eax,16
|
|
mov [esi+edi+2],al
|
|
sub edi,3
|
|
|
|
dec ebx
|
|
jge newb
|
|
mov ebx,51
|
|
|
|
add esi,52*3
|
|
mov edi,51*3
|
|
inc ecx
|
|
cmp ecx,68
|
|
jne newb
|
|
|
|
;*****************************************************************************
|
|
|
|
mov esi,I_END+256+9662+10608-17*52*3+3 ;! 54+32*3*33-3
|
|
mov eax,[iconstate]
|
|
mov eax,[add_table0+eax*4]
|
|
add esi,eax
|
|
mov edi,I_END+256+62
|
|
cmp [itype],0
|
|
jne @f
|
|
mov edi,I_END+256+54
|
|
@@:
|
|
xor ebp,ebp
|
|
mov [pixl],0
|
|
newp:
|
|
|
|
virtual at edi
|
|
r db ?
|
|
g db ?
|
|
b db ?
|
|
a db ?
|
|
end virtual
|
|
virtual at esi+ebp
|
|
ar db ?
|
|
ag db ?
|
|
ab db ?
|
|
end virtual
|
|
|
|
movzx ecx,[a]
|
|
|
|
push ebp
|
|
cmp [iconstate],3
|
|
jb @f
|
|
neg ebp
|
|
@@:
|
|
|
|
cmp [itype],0
|
|
jne @f
|
|
mov eax,[edi]
|
|
and eax,$00FFFFFF
|
|
jnz @f
|
|
jmp no_transp
|
|
@@:
|
|
|
|
movzx eax,[r]
|
|
cmp [itype],0
|
|
je @f
|
|
movzx ebx,byte[ar]
|
|
sub eax,ebx
|
|
imul eax,ecx
|
|
xor edx,edx
|
|
or ebx,$0FF
|
|
div ebx
|
|
movzx ebx,[ar]
|
|
add eax,ebx
|
|
@@:
|
|
mov [esi+ebp+0],al
|
|
|
|
movzx eax,[g]
|
|
cmp [itype],0
|
|
je @f
|
|
movzx ebx,[ag]
|
|
sub eax,ebx
|
|
imul eax,ecx
|
|
xor edx,edx
|
|
or ebx,$0FF
|
|
div ebx
|
|
movzx ebx,[ag]
|
|
add eax,ebx
|
|
@@:
|
|
mov [esi+ebp+1],al
|
|
|
|
movzx eax,[b]
|
|
cmp [itype],0
|
|
je @f
|
|
movzx ebx,[ab]
|
|
sub eax,ebx
|
|
imul eax,ecx
|
|
xor edx,edx
|
|
or ebx,$0FF
|
|
div ebx
|
|
movzx ebx,[ab]
|
|
add eax,ebx
|
|
@@:
|
|
mov [esi+ebp+2],al
|
|
|
|
no_transp:
|
|
|
|
pop ebp
|
|
|
|
movzx eax,[itype]
|
|
imul eax,6
|
|
add eax,[iconstate]
|
|
push eax
|
|
mov eax,[add_table1+eax*4]
|
|
add edi,eax
|
|
|
|
add ebp,3
|
|
pop eax
|
|
mov eax,[add_table2+eax*4]
|
|
add [pixl],eax
|
|
cmp [pixl],48
|
|
jl newp
|
|
xor ebp,ebp
|
|
mov [pixl],0
|
|
|
|
sub esi,52*3
|
|
cmp esi,I_END+256+9662+52*4*3
|
|
jge newp
|
|
|
|
;*****************************************************************************
|
|
|
|
ret
|
|
|
|
draw_picture:
|
|
mcall 7,I_END+256+9662,52 shl 16+68,0
|
|
ret
|
|
|
|
draw_icon:
|
|
call draw_picture
|
|
call draw_text
|
|
ret
|
|
|
|
draw_text:
|
|
|
|
mov eax,labelt ;text_length
|
|
news:
|
|
cmp [eax],byte 40
|
|
jb founde
|
|
inc eax
|
|
cmp eax,labelt+11
|
|
jb news
|
|
founde:
|
|
sub eax,labelt
|
|
|
|
lea eax,[eax+eax*2] ; eax *= char_width/2
|
|
shl eax,16
|
|
mov ebx,26*65536+58
|
|
sub ebx,eax
|
|
movzx ecx,byte [I_PARAM+8+30+30+10]
|
|
shl ecx,16
|
|
add ebx,ecx
|
|
|
|
; black shade of text
|
|
; uncomment lines below if you like that style
|
|
|
|
xor ecx,ecx
|
|
mov edx,labelt
|
|
mov esi,labellen-labelt
|
|
add ebx,1 shl 16
|
|
mcall 4
|
|
inc ebx
|
|
mcall
|
|
add ebx,1 shl 16
|
|
mcall
|
|
inc ebx
|
|
mcall
|
|
sub ebx,1 shl 16
|
|
mcall
|
|
sub ebx,1*65536+1
|
|
mcall
|
|
sub ebx,1*65536+1
|
|
mcall
|
|
add ebx,1*65536-1
|
|
mcall
|
|
inc ebx
|
|
or ecx,0xffffff
|
|
mcall
|
|
|
|
;xor ecx,ecx
|
|
;mov edx,labelt
|
|
;mov esi,labellen-labelt
|
|
;mcall 4
|
|
;sub ebx,1*65536+1
|
|
;or ecx,0xffffff
|
|
;mcall
|
|
|
|
ret
|
|
|
|
|
|
; DATA AREA
|
|
|
|
itype db 0
|
|
|
|
tl dd 2
|
|
|
|
|
|
bgrxy dd 0x0
|
|
scrxy dd 0x0
|
|
bgrdrawtype dd 0x0
|
|
|
|
hand file 'hand.cur'
|
|
|
|
icon_moved dd 0
|
|
|
|
iconstate dd 0
|
|
|
|
add_table0 dd (24-6*4)*3,(24-6*2)*3,(24-6*1)*3,\
|
|
(24+6*1)*3,(24+6*2)*3,(24+6*4)*3
|
|
|
|
add_table1 dd 3,6,12,12,6,3
|
|
dd 4,8,16,16,8,4
|
|
|
|
add_table2 dd 1,2,4,4,2,1
|
|
dd 1,2,4,4,2,1
|
|
|
|
finfo_start:
|
|
dd 7
|
|
dd 0
|
|
dd 0
|
|
dd 0
|
|
dd 0
|
|
db 0
|
|
dd start_file
|
|
|
|
finfo:
|
|
dd 0
|
|
dd 0
|
|
dd 0
|
|
dd 9662
|
|
dd I_END+256
|
|
db 0
|
|
dd fname
|
|
|
|
start_file rb 30
|
|
fname rb 30
|
|
|
|
labelt:
|
|
rb 10
|
|
labellen:
|
|
|
|
pixl dd ?
|
|
|
|
xpos dd ?
|
|
ypos dd ?
|
|
|
|
mouse_pressed dd ?
|
|
|
|
xmouse_rel dd ?
|
|
ymouse_rel dd ?
|
|
|
|
xmouse_old dd ?
|
|
ymouse_old dd ?
|
|
processes dd ?
|
|
pid dd ?
|
|
|
|
process process_information
|
|
|
|
;include_debug_strings
|
|
|
|
I_PARAM:
|
|
|
|
I_END: |