
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:

