Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 484 → Rev 485

/programs/system/icon_new/trunk/icon.asm
0,0 → 1,539
;
; 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: