mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-24 23:56:49 +03:00
540 lines
9.2 KiB
NASM
540 lines
9.2 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
|
||
|
or eax,-1
|
||
|
mcall
|
||
|
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
|
||
|
rep movsb
|
||
|
call fill_paths
|
||
|
|
||
|
mov esi,I_PARAM+8+30+30
|
||
|
mov edi,labelt
|
||
|
mov ecx,10
|
||
|
cld
|
||
|
rep movsb
|
||
|
|
||
|
mov eax,40 ; get also event background change
|
||
|
mov ebx,10101b
|
||
|
mcall
|
||
|
|
||
|
|
||
|
call get_bg
|
||
|
|
||
|
red: ; redraw
|
||
|
call draw_window
|
||
|
|
||
|
still:
|
||
|
|
||
|
mov eax,10 ; wait here for event
|
||
|
mcall
|
||
|
|
||
|
cmp eax,1 ; redraw request ?
|
||
|
jz red
|
||
|
cmp eax,3 ; button in buffer ?
|
||
|
jz button
|
||
|
|
||
|
check:
|
||
|
call get_bg
|
||
|
call draw_icon
|
||
|
mcall 5,80
|
||
|
jmp still
|
||
|
|
||
|
button: ; button
|
||
|
mov al,17 ; get id
|
||
|
mcall
|
||
|
|
||
|
mov eax,70
|
||
|
mov ebx,finfo_start
|
||
|
mcall
|
||
|
|
||
|
call flip_icon
|
||
|
|
||
|
jmp still
|
||
|
|
||
|
flip_icon:
|
||
|
|
||
|
mov eax,1
|
||
|
call flip
|
||
|
mov eax,2
|
||
|
call flip
|
||
|
mov eax,3
|
||
|
call flip
|
||
|
mov eax,4
|
||
|
call flip
|
||
|
mov eax,5
|
||
|
call flip
|
||
|
mov eax,4
|
||
|
call flip
|
||
|
mov eax,3
|
||
|
call flip
|
||
|
mov eax,2
|
||
|
call flip
|
||
|
mov eax,1
|
||
|
call flip
|
||
|
mov eax,0
|
||
|
call flip
|
||
|
|
||
|
ret
|
||
|
|
||
|
flip:
|
||
|
mov [iconstate],eax
|
||
|
call get_bg
|
||
|
call draw_icon
|
||
|
mov eax,5
|
||
|
mov ebx,flipdelay
|
||
|
mcall
|
||
|
ret
|
||
|
|
||
|
fill_paths:
|
||
|
dec edi
|
||
|
mov ecx,30
|
||
|
std
|
||
|
mov al,' '
|
||
|
repe scasb
|
||
|
cld
|
||
|
mov byte[edi+2],0
|
||
|
ret
|
||
|
|
||
|
draw_window:
|
||
|
|
||
|
mov eax,12 ; function 12:tell os about windowdraw
|
||
|
mov ebx,1 ; 1, start of draw
|
||
|
mcall
|
||
|
|
||
|
; DRAW WINDOW
|
||
|
xor eax,eax ; function 0 : define and draw window
|
||
|
mov ebx,[xpos-2]
|
||
|
mov ecx,[ypos-2]
|
||
|
add ebx,[yw] ; [x start] *65536 + [x size]
|
||
|
add ecx,67 ; [y start] *65536 + [y size]
|
||
|
mov edx,0x01000000 ; color of work area RRGGBB,8->color gl
|
||
|
mcall
|
||
|
|
||
|
mov eax,8 ; button
|
||
|
mov ebx,51
|
||
|
mov ecx,67
|
||
|
mov edx,0x60000001
|
||
|
mcall
|
||
|
|
||
|
call draw_icon
|
||
|
|
||
|
mov eax,12
|
||
|
mov ebx,2
|
||
|
mcall
|
||
|
|
||
|
ret
|
||
|
|
||
|
get_bg:
|
||
|
|
||
|
mov eax,14
|
||
|
mcall
|
||
|
add eax,0x00010001
|
||
|
mov [scrxy],eax
|
||
|
|
||
|
mov eax,39 ; get background type
|
||
|
mov ebx,4
|
||
|
mcall
|
||
|
mov [bgrdrawtype],eax
|
||
|
|
||
|
mov eax,39 ; get background size
|
||
|
mov ebx,1
|
||
|
mcall
|
||
|
mov [bgrxy],eax
|
||
|
|
||
|
mov eax,70
|
||
|
mov ebx,finfo
|
||
|
mcall
|
||
|
|
||
|
mov [itype],0
|
||
|
cmp word[I_END+256],'BM'
|
||
|
je @f
|
||
|
inc [itype]
|
||
|
@@:
|
||
|
|
||
|
mov ebx,[yw]
|
||
|
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],dword 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],dword 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]
|
||
|
|
||
|
mov eax,39
|
||
|
mov ebx,2
|
||
|
|
||
|
mcall
|
||
|
|
||
|
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,[yw]
|
||
|
|
||
|
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:
|
||
|
mov eax,7
|
||
|
mov ebx,I_END+256+9662
|
||
|
mov ecx,52 shl 16 + 68
|
||
|
xor edx,edx
|
||
|
mcall
|
||
|
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
|
||
|
|
||
|
; replaced - delete commented lines below if you like that style
|
||
|
mov eax,4 ; white text
|
||
|
|
||
|
xor ecx,ecx
|
||
|
mov edx,labelt
|
||
|
mov esi,labellen-labelt
|
||
|
add ebx,1 shl 16 ;*65536+1
|
||
|
mcall
|
||
|
inc ebx
|
||
|
mcall
|
||
|
add ebx,1 shl 16
|
||
|
mcall
|
||
|
inc ebx
|
||
|
mcall
|
||
|
sub ebx,1 shl 16
|
||
|
mcall
|
||
|
dec ebx
|
||
|
sub ebx,1 shl 16
|
||
|
mcall
|
||
|
sub ebx,1 shl 16
|
||
|
dec ebx
|
||
|
mcall
|
||
|
dec ebx
|
||
|
add ebx,1 shl 16
|
||
|
mcall
|
||
|
inc ebx
|
||
|
mov ecx,0xffffff
|
||
|
mcall
|
||
|
|
||
|
;xor ecx,ecx ; black shade of text
|
||
|
;mov edx,labelt
|
||
|
;mov esi,labellen-labelt
|
||
|
;add ebx,1*65536+1
|
||
|
;mcall
|
||
|
;sub ebx,1*65536+1
|
||
|
;mov ecx,0xffffff
|
||
|
;mcall
|
||
|
|
||
|
ret
|
||
|
|
||
|
|
||
|
; DATA AREA
|
||
|
|
||
|
itype db 0
|
||
|
|
||
|
align 4
|
||
|
|
||
|
tl dd 2
|
||
|
yw dd 51
|
||
|
|
||
|
xpos dd 15
|
||
|
ypos dd 185
|
||
|
|
||
|
bgrxy dd 0x0
|
||
|
scrxy dd 0x0
|
||
|
bgrdrawtype dd 0x0
|
||
|
|
||
|
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 ?
|
||
|
|
||
|
;include_debug_strings
|
||
|
I_PARAM:
|
||
|
|
||
|
I_END:
|