kolibrios/programs/system/icon_new/trunk/icon.asm

608 lines
11 KiB
NASM
Raw Normal View History

;
; 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: