0,0 → 1,193 |
|
include 'proc32.inc' |
|
struc system_colors |
{ |
.frame dd ? |
.grab dd ? |
.grab_button dd ? |
.grab_button_text dd ? |
.grab_text dd ? |
.work dd ? |
.work_button dd ? |
.work_button_text dd ? |
.work_text dd ? |
.work_graph dd ? |
} |
|
macro _read_file path, offset, data, count |
{ |
mov eax, dword path |
mov ebx, dword data |
mov ecx, dword offset |
mov edx, dword count |
|
push 0 |
push 0 |
mov [esp+1], eax |
push ebx |
push edx |
push 0 |
push ecx |
push 0 |
mov ebx, esp |
mov eax, 70 |
int 0x40 |
add esp, 28 |
} |
|
use32 |
|
db 'MENUET01' |
dd 1 |
dd start |
dd i_end |
dd mem |
dd mem |
dd 0 |
dd app_path |
|
include 'pixlib.inc' |
|
align 4 |
start: |
fix_cwd app_path |
|
call load_pxlib |
test eax, eax |
jz .fail |
|
mov eax,48 ; get system colors |
mov ebx,3 |
mov ecx,sc |
mov edx,10*4 |
int 0x40 |
|
CreatePixmap 640, 384, ARGB32, PX_MEM_LOCAL ; animation |
mov [pix_0], eax |
test eax, eax |
jz .fail |
|
CreatePixmap 64, 64, ARGB32, PX_MEM_LOCAL ; saved screen |
mov [pix_1], eax |
test eax, eax |
jz .fail |
|
CreatePixmap 64, 64, ARGB32, PX_MEM_LOCAL ; back buffer |
mov [pix_2], eax |
|
Blit [pix_1], 0,0, SCR_PIXMAP, 0,0, 64,64 |
|
LockPixmap [pix_0] |
mov ebx, eax |
_read_file szfile, 128, ebx, 640*384*4 |
UnlockPixmap [pix_0] |
|
|
.redraw: |
call draw_window |
|
.wait_event: |
|
mov ebx, 2 |
mov eax, 23 |
int 0x40 |
|
|
dec eax ; if event = 1 |
jz .redraw ; jump to redraw handler |
dec eax ; else if event = 2 |
jz .key ; jump to key handler |
dec eax |
jz .button |
|
Blit [pix_2], 0,0, [pix_1], 0,0, 64,64 |
|
mov eax, [count] |
inc eax |
cmp eax, 60 |
jb @F |
xor eax, eax |
@@: |
mov [count], eax |
|
xor edx, edx |
mov ebx, 10 |
div ebx |
|
shl eax, 6 |
shl edx, 6 |
|
TransparentBlit [pix_2], 0,0, [pix_0], edx,eax, 64,64 ,0xFF000000 |
Blit SCR_PIXMAP, 0,0, [pix_2], 0, 0, 64,64 |
|
jmp .wait_event |
|
.button: ; button event handler |
mov al, 17 ; get button identifier |
int 0x40 |
|
cmp ah, 1 |
jne .wait_event ; return if button id != 1 |
.exit: |
; restore old screen and cleanup |
|
Blit SCR_PIXMAP, 0,0, [pix_1], 0, 0, 64,64 |
|
DestroyPixmap [pix_2] |
DestroyPixmap [pix_1] |
DestroyPixmap [pix_0] |
.fail: |
or eax, -1 ; exit application |
int 0x40 |
.key: ; key event handler |
mov al, 2 ; get key code |
int 0x40 |
|
jmp .wait_event |
|
draw_window: |
mov eax, 12 ; start drawing |
mov ebx, 1 |
int 0x40 |
|
xor eax, eax ; create and draw the window |
mov ebx, 200*65536+200 ; (window_cx)*65536+(window_sx) |
mov ecx, 200*65536+100 ; (window_cy)*65536+(window_sy) |
mov edx, [sc.work] ; work area color |
or edx, 0x33000000 ; & window type 3 |
mov edi, title ; window title |
int 0x40 |
|
mov eax, 12 ; finish drawing |
mov ebx, 2 |
int 0x40 |
|
ret |
|
align 4 |
|
count dd 0 |
|
title db 'Transparent blit',0 |
|
szfile db 'donut.dds',0 |
|
i_end: |
|
align 4 |
|
pix_0 rd 1 |
pix_1 rd 1 |
pix_2 rd 1 |
|
sc system_colors |
|
|
align 4 |
|
app_path: |
|
rb 2048 ; stack |
mem: |
|