Apps/firework: Added support for window resizing
This commit is contained in:
@@ -13,10 +13,10 @@
|
|||||||
; optionally AVX, AVX2, AVX512
|
; optionally AVX, AVX2, AVX512
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
use32
|
use32
|
||||||
org 0x0
|
org 0
|
||||||
|
|
||||||
db 'MENUET01' ; 8 byte id
|
db 'MENUET01' ; 8 byte id
|
||||||
dd 0x01 ; version
|
dd 1 ; version
|
||||||
dd STARTAPP ; program start
|
dd STARTAPP ; program start
|
||||||
dd I_END ; program image size
|
dd I_END ; program image size
|
||||||
dd E_END ; required amount of memory
|
dd E_END ; required amount of memory
|
||||||
@@ -27,7 +27,10 @@ include '../../macros.inc'
|
|||||||
include '../../KOSfuncs.inc'
|
include '../../KOSfuncs.inc'
|
||||||
|
|
||||||
SCREEN_WIDTH = 600 ;.. mod 8 == 0
|
SCREEN_WIDTH = 600 ;.. mod 8 == 0
|
||||||
SCREEN_HEIGHT = 400
|
Screen_W dd SCREEN_WIDTH
|
||||||
|
Screen_H dd 400
|
||||||
|
lost_bytes dd 0
|
||||||
|
|
||||||
SIMD equ SSE
|
SIMD equ SSE
|
||||||
SIMD_BYTES = 8
|
SIMD_BYTES = 8
|
||||||
; SSE 8
|
; SSE 8
|
||||||
@@ -50,8 +53,10 @@ PART_SIZE = 20
|
|||||||
macro shade
|
macro shade
|
||||||
{
|
{
|
||||||
local .lop
|
local .lop
|
||||||
mov ecx, SCREEN_WIDTH * SCREEN_HEIGHT / SIMD_BYTES
|
mov ecx, [Screen_H]
|
||||||
mov edi, buffer
|
imul ecx, [Screen_W]
|
||||||
|
shr ecx, 3 ;ecx = Screen_W * Screen_H / SIMD_BYTES
|
||||||
|
mov edi, [buffer]
|
||||||
if SIMD eq SSE
|
if SIMD eq SSE
|
||||||
movq mm1, qword [sub_mask]
|
movq mm1, qword [sub_mask]
|
||||||
.lop:
|
.lop:
|
||||||
@@ -89,10 +94,18 @@ end if
|
|||||||
|
|
||||||
macro blur_prepare
|
macro blur_prepare
|
||||||
{
|
{
|
||||||
mov ecx, (SCREEN_WIDTH * (SCREEN_HEIGHT - 2) - SIMD_BYTES*2) / SIMD_BYTES
|
mov ecx, [Screen_H]
|
||||||
mov edi, buffer + SCREEN_WIDTH + SIMD_BYTES
|
dec ecx
|
||||||
|
dec ecx
|
||||||
|
imul ecx, [Screen_W]
|
||||||
|
sub ecx, SIMD_BYTES*2
|
||||||
|
shr ecx, 3 ;ecx = (Screen_W * (Screen_H - 2) - SIMD_BYTES*2) / SIMD_BYTES
|
||||||
|
mov edi, SIMD_BYTES
|
||||||
|
add edi, [buffer]
|
||||||
|
add edi, [Screen_W]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; eax = [Screen_W]
|
||||||
macro blur
|
macro blur
|
||||||
{
|
{
|
||||||
local .lop
|
local .lop
|
||||||
@@ -102,8 +115,10 @@ if SIMD eq SSE
|
|||||||
movq mm1, [edi + 1]
|
movq mm1, [edi + 1]
|
||||||
movq mm2, [edi - 1]
|
movq mm2, [edi - 1]
|
||||||
movq mm3, mm0
|
movq mm3, mm0
|
||||||
movq mm4, [edi - SCREEN_WIDTH]
|
neg eax
|
||||||
movq mm5, [edi + SCREEN_WIDTH]
|
movq mm4, [edi + eax]
|
||||||
|
neg eax
|
||||||
|
movq mm5, [edi + eax]
|
||||||
|
|
||||||
pavgb mm0, mm1 ; mm0 = avg(cur,cur+1)
|
pavgb mm0, mm1 ; mm0 = avg(cur,cur+1)
|
||||||
pavgb mm3, mm2 ; mm3 = avg(cur,cur-1)
|
pavgb mm3, mm2 ; mm3 = avg(cur,cur-1)
|
||||||
@@ -118,11 +133,13 @@ else if SIMD eq AVX
|
|||||||
.lop:
|
.lop:
|
||||||
vmovdqa xmm0, [edi]
|
vmovdqa xmm0, [edi]
|
||||||
vmovdqa xmm1, xmm0
|
vmovdqa xmm1, xmm0
|
||||||
vmovdqa xmm2, [edi - SCREEN_WIDTH]
|
neg eax
|
||||||
|
vmovdqa xmm2, [edi + eax]
|
||||||
|
neg eax
|
||||||
|
|
||||||
vpavgb xmm0, xmm0, [edi + 1]
|
vpavgb xmm0, xmm0, [edi + 1]
|
||||||
vpavgb xmm1, xmm1, [edi - 1]
|
vpavgb xmm1, xmm1, [edi - 1]
|
||||||
vpavgb xmm2, xmm2, [edi + SCREEN_WIDTH]
|
vpavgb xmm2, xmm2, [edi + eax]
|
||||||
vpavgb xmm1, xmm1, xmm2
|
vpavgb xmm1, xmm1, xmm2
|
||||||
vpavgb xmm0, xmm0, xmm1
|
vpavgb xmm0, xmm0, xmm1
|
||||||
|
|
||||||
@@ -133,11 +150,13 @@ else if SIMD eq AVX2
|
|||||||
.lop:
|
.lop:
|
||||||
vmovdqa ymm0, [edi]
|
vmovdqa ymm0, [edi]
|
||||||
vmovdqa ymm1, ymm0
|
vmovdqa ymm1, ymm0
|
||||||
vmovdqa ymm2, [edi - SCREEN_WIDTH]
|
neg eax
|
||||||
|
vmovdqa ymm2, [edi + eax]
|
||||||
|
neg eax
|
||||||
|
|
||||||
vpavgb ymm0, ymm0, [edi + 1]
|
vpavgb ymm0, ymm0, [edi + 1]
|
||||||
vpavgb ymm1, ymm1, [edi - 1]
|
vpavgb ymm1, ymm1, [edi - 1]
|
||||||
vpavgb ymm2, ymm2, [edi + SCREEN_WIDTH]
|
vpavgb ymm2, ymm2, [edi + eax]
|
||||||
vpavgb ymm1, ymm1, ymm2
|
vpavgb ymm1, ymm1, ymm2
|
||||||
vpavgb ymm0, ymm0, ymm1
|
vpavgb ymm0, ymm0, ymm1
|
||||||
|
|
||||||
@@ -148,11 +167,13 @@ else if SIMD eq AVX512
|
|||||||
.lop:
|
.lop:
|
||||||
vmovdqa64 zmm0, [edi]
|
vmovdqa64 zmm0, [edi]
|
||||||
vmovdqa64 zmm1, zmm0
|
vmovdqa64 zmm1, zmm0
|
||||||
vmovdqa64 zmm2, [edi - SCREEN_WIDTH]
|
neg eax
|
||||||
|
vmovdqa64 zmm2, [edi + eax]
|
||||||
|
neg eax
|
||||||
|
|
||||||
vpavgb zmm0, zmm0, [edi + 1]
|
vpavgb zmm0, zmm0, [edi + 1]
|
||||||
vpavgb zmm1, zmm1, [edi - 1]
|
vpavgb zmm1, zmm1, [edi - 1]
|
||||||
vpavgb zmm2, zmm2, [edi + SCREEN_WIDTH]
|
vpavgb zmm2, zmm2, [edi + eax]
|
||||||
vpavgb zmm1, zmm1, zmm2
|
vpavgb zmm1, zmm1, zmm2
|
||||||
vpavgb zmm0, zmm0, zmm1
|
vpavgb zmm0, zmm0, zmm1
|
||||||
|
|
||||||
@@ -162,6 +183,7 @@ else if SIMD eq AVX512
|
|||||||
end if
|
end if
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; eax = [Screen_W]
|
||||||
macro blur_right
|
macro blur_right
|
||||||
{
|
{
|
||||||
local .lop
|
local .lop
|
||||||
@@ -169,8 +191,8 @@ if SIMD eq SSE
|
|||||||
.lop:
|
.lop:
|
||||||
movq mm0, [edi]
|
movq mm0, [edi]
|
||||||
movq mm1, [edi + 1]
|
movq mm1, [edi + 1]
|
||||||
movq mm2, [edi + SCREEN_WIDTH]
|
movq mm2, [edi + eax]
|
||||||
movq mm3, [edi + SCREEN_WIDTH + 1]
|
movq mm3, [edi + eax + 1]
|
||||||
pavgb mm0, mm1
|
pavgb mm0, mm1
|
||||||
pavgb mm3, mm2
|
pavgb mm3, mm2
|
||||||
pavgb mm0, mm3
|
pavgb mm0, mm3
|
||||||
@@ -180,9 +202,9 @@ if SIMD eq SSE
|
|||||||
else if SIMD eq AVX
|
else if SIMD eq AVX
|
||||||
.lop:
|
.lop:
|
||||||
vmovdqa xmm0, [edi]
|
vmovdqa xmm0, [edi]
|
||||||
vmovdqu xmm1, [edi + SCREEN_WIDTH + 1]
|
vmovdqu xmm1, [edi + eax + 1]
|
||||||
vpavgb xmm2, xmm0, [edi + 1]
|
vpavgb xmm2, xmm0, [edi + 1]
|
||||||
vpavgb xmm3, xmm1, [edi + SCREEN_WIDTH]
|
vpavgb xmm3, xmm1, [edi + eax]
|
||||||
vpavgb xmm4, xmm2, xmm3
|
vpavgb xmm4, xmm2, xmm3
|
||||||
vmovdqa [edi], xmm4
|
vmovdqa [edi], xmm4
|
||||||
add edi, SIMD_BYTES
|
add edi, SIMD_BYTES
|
||||||
@@ -190,9 +212,9 @@ else if SIMD eq AVX
|
|||||||
else if SIMD eq AVX2
|
else if SIMD eq AVX2
|
||||||
.lop:
|
.lop:
|
||||||
vmovdqa ymm0, [edi]
|
vmovdqa ymm0, [edi]
|
||||||
vmovdqu ymm1, [edi + SCREEN_WIDTH + 1]
|
vmovdqu ymm1, [edi + eax + 1]
|
||||||
vpavgb ymm2, ymm0, [edi + 1]
|
vpavgb ymm2, ymm0, [edi + 1]
|
||||||
vpavgb ymm3, ymm1, [edi + SCREEN_WIDTH]
|
vpavgb ymm3, ymm1, [edi + eax]
|
||||||
vpavgb ymm4, ymm2, ymm3
|
vpavgb ymm4, ymm2, ymm3
|
||||||
vmovdqa [edi], ymm4
|
vmovdqa [edi], ymm4
|
||||||
add edi, SIMD_BYTES
|
add edi, SIMD_BYTES
|
||||||
@@ -200,9 +222,9 @@ else if SIMD eq AVX2
|
|||||||
else if SIMD eq AVX512
|
else if SIMD eq AVX512
|
||||||
.lop:
|
.lop:
|
||||||
vmovdqa64 zmm0, [edi]
|
vmovdqa64 zmm0, [edi]
|
||||||
vmovdqu64 zmm1, [edi + SCREEN_WIDTH + 1]
|
vmovdqu64 zmm1, [edi + eax + 1]
|
||||||
vpavgb zmm2, zmm0, [edi + 1]
|
vpavgb zmm2, zmm0, [edi + 1]
|
||||||
vpavgb zmm3, zmm1, [edi + SCREEN_WIDTH]
|
vpavgb zmm3, zmm1, [edi + eax]
|
||||||
vpavgb zmm4, zmm2, zmm3
|
vpavgb zmm4, zmm2, zmm3
|
||||||
vmovdqa64 [edi], zmm4
|
vmovdqa64 [edi], zmm4
|
||||||
add edi, SIMD_BYTES
|
add edi, SIMD_BYTES
|
||||||
@@ -229,11 +251,12 @@ init_palette:
|
|||||||
add ax, 0x0404
|
add ax, 0x0404
|
||||||
jnc @b
|
jnc @b
|
||||||
|
|
||||||
;zero_buffer:
|
;init buffer
|
||||||
mov ecx, SCREEN_WIDTH * SCREEN_HEIGHT / 4
|
mcall SF_SYS_MISC,SSF_HEAP_INIT
|
||||||
; mov edi, buffer
|
mov ecx,[Screen_W]
|
||||||
xor eax, eax
|
imul ecx,[Screen_H]
|
||||||
rep stosd
|
mcall SF_SYS_MISC,SSF_MEM_ALLOC
|
||||||
|
mov [buffer],eax
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Main Functions
|
; Main Functions
|
||||||
@@ -251,19 +274,60 @@ end virtual
|
|||||||
|
|
||||||
jmp MAIN
|
jmp MAIN
|
||||||
|
|
||||||
|
align 4
|
||||||
|
OnResize:
|
||||||
|
mov ecx,[Screen_W]
|
||||||
|
imul ecx,[Screen_H]
|
||||||
|
;ecx = SCREEN_W*SCREEN_H
|
||||||
|
mcall SF_SYS_MISC,SSF_MEM_REALLOC,,[buffer]
|
||||||
|
ret
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
red:
|
red:
|
||||||
mcall SF_THREAD_INFO, proc_info, -1
|
mcall SF_THREAD_INFO, proc_info, -1
|
||||||
x = 100
|
areacolor = 0x53224466
|
||||||
y = 70
|
|
||||||
xsize = SCREEN_WIDTH+9
|
|
||||||
ysize = SCREEN_HEIGHT+4
|
|
||||||
areacolor = 0x54224466
|
|
||||||
mcall SF_REDRAW, SSF_BEGIN_DRAW
|
mcall SF_REDRAW, SSF_BEGIN_DRAW
|
||||||
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
|
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
|
||||||
lea ecx, [(y SHL 16) + ysize + eax]
|
add eax, 4
|
||||||
mcall SF_CREATE_WINDOW, <x, xsize>,, areacolor,, window_title
|
push eax ;for test resize
|
||||||
|
add eax, [Screen_H]
|
||||||
|
lea ecx, [(70 shl 16) + eax]
|
||||||
|
mov ebx, [Screen_W]
|
||||||
|
lea ebx, [(100 shl 16) + 9 + ebx]
|
||||||
|
mcall SF_CREATE_WINDOW,,, areacolor,, window_title
|
||||||
|
|
||||||
|
;test resize
|
||||||
|
pop eax
|
||||||
|
cmp dword[proc_info.box.height],0
|
||||||
|
je .resize_end
|
||||||
|
sub eax,[proc_info.box.height]
|
||||||
|
neg eax
|
||||||
|
cmp eax,[Screen_H]
|
||||||
|
je .end_h
|
||||||
|
cmp eax,32 ;min height
|
||||||
|
jge @f
|
||||||
|
mov eax,32
|
||||||
|
@@:
|
||||||
|
mov [Screen_H],eax
|
||||||
|
xor eax,eax
|
||||||
|
mov [Screen_W],eax
|
||||||
|
.end_h:
|
||||||
|
|
||||||
|
mov eax,[proc_info.box.width]
|
||||||
|
sub eax,9
|
||||||
|
mov [lost_bytes],eax
|
||||||
|
and eax,0xffff-(SIMD_BYTES-1)
|
||||||
|
cmp eax,[Screen_W]
|
||||||
|
je .resize_end
|
||||||
|
cmp eax,64 ;min width
|
||||||
|
jge @f
|
||||||
|
mov eax,64
|
||||||
|
@@:
|
||||||
|
mov [Screen_W],eax
|
||||||
|
|
||||||
|
call OnResize
|
||||||
|
.resize_end:
|
||||||
|
|
||||||
mcall SF_REDRAW, SSF_END_DRAW ; end of redraw
|
mcall SF_REDRAW, SSF_END_DRAW ; end of redraw
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
@@ -281,11 +345,15 @@ MAIN:
|
|||||||
|
|
||||||
cmp eax, 5
|
cmp eax, 5
|
||||||
jb .new_particle
|
jb .new_particle
|
||||||
cmp eax, SCREEN_WIDTH - 5
|
mov edx, [Screen_W]
|
||||||
|
sub edx, 5
|
||||||
|
cmp eax, edx
|
||||||
jge .new_particle
|
jge .new_particle
|
||||||
cmp ebx, 5
|
cmp ebx, 5
|
||||||
jb .new_particle
|
jb .new_particle
|
||||||
cmp ebx, SCREEN_HEIGHT - 5
|
mov edx, [Screen_H]
|
||||||
|
sub edx, 5
|
||||||
|
cmp ebx, edx
|
||||||
jl .part_ok
|
jl .part_ok
|
||||||
|
|
||||||
.new_particle:
|
.new_particle:
|
||||||
@@ -293,9 +361,11 @@ MAIN:
|
|||||||
jmp .advance_particles
|
jmp .advance_particles
|
||||||
|
|
||||||
.part_ok:
|
.part_ok:
|
||||||
imul edi, ebx, SCREEN_WIDTH
|
mov edi, ebx
|
||||||
|
imul edi, [Screen_W]
|
||||||
mov dl, [ebp+COLOR_OFFSET]
|
mov dl, [ebp+COLOR_OFFSET]
|
||||||
mov [buffer+eax+edi], dl
|
add eax,[buffer]
|
||||||
|
mov [eax+edi], dl
|
||||||
|
|
||||||
mov eax, [ebp+X_SPEED_OFFSET]
|
mov eax, [ebp+X_SPEED_OFFSET]
|
||||||
add [ebp+X_OFFSET], eax
|
add [ebp+X_OFFSET], eax
|
||||||
@@ -314,6 +384,7 @@ MAIN:
|
|||||||
shade
|
shade
|
||||||
; jmp .copy_buffer_to_video
|
; jmp .copy_buffer_to_video
|
||||||
blur_prepare
|
blur_prepare
|
||||||
|
mov eax, [Screen_W]
|
||||||
test dword [blur_right_flag] , 0x800000
|
test dword [blur_right_flag] , 0x800000
|
||||||
jnz .do_blur_right
|
jnz .do_blur_right
|
||||||
blur
|
blur
|
||||||
@@ -334,8 +405,23 @@ MAIN:
|
|||||||
push 8
|
push 8
|
||||||
pop esi
|
pop esi
|
||||||
xor ebp, ebp
|
xor ebp, ebp
|
||||||
mcall SF_PUT_IMAGE_EXT, buffer, (SCREEN_WIDTH SHL 16) + SCREEN_HEIGHT,,, pal
|
mov ecx, [Screen_W]
|
||||||
|
shl ecx, 16
|
||||||
|
add ecx, [Screen_H]
|
||||||
|
mcall SF_PUT_IMAGE_EXT, [buffer],,,, pal
|
||||||
|
|
||||||
|
and [lost_bytes], SIMD_BYTES-1
|
||||||
|
jz still
|
||||||
|
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
|
||||||
|
mov ecx, eax
|
||||||
|
shl ecx, 16
|
||||||
|
add ecx, [Screen_H]
|
||||||
|
mov ebx, [Screen_W]
|
||||||
|
add ebx, 5 ;left border
|
||||||
|
shl ebx, 16
|
||||||
|
add ebx, [lost_bytes]
|
||||||
|
xor edx, edx
|
||||||
|
mcall SF_DRAW_RECT
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
still:
|
still:
|
||||||
@@ -372,7 +458,7 @@ init_particle:
|
|||||||
call rand
|
call rand
|
||||||
cdq
|
cdq
|
||||||
;xor dx, dx
|
;xor dx, dx
|
||||||
mov ebx, SCREEN_WIDTH
|
mov ebx, [Screen_W]
|
||||||
div ebx
|
div ebx
|
||||||
shl edx, 6
|
shl edx, 6
|
||||||
mov [4 + global_x], edx
|
mov [4 + global_x], edx
|
||||||
@@ -380,7 +466,7 @@ init_particle:
|
|||||||
call rand
|
call rand
|
||||||
cdq
|
cdq
|
||||||
;xor dx, dx
|
;xor dx, dx
|
||||||
mov ebx, SCREEN_HEIGHT
|
mov ebx, [Screen_H]
|
||||||
div ebx
|
div ebx
|
||||||
shl edx, 6
|
shl edx, 6
|
||||||
mov [4 + global_y], edx
|
mov [4 + global_y], edx
|
||||||
@@ -427,7 +513,7 @@ proc_info process_information
|
|||||||
align 16
|
align 16
|
||||||
pal rb 256 * 4
|
pal rb 256 * 4
|
||||||
align SIMD_BYTES
|
align SIMD_BYTES
|
||||||
buffer rb SCREEN_WIDTH * SCREEN_HEIGHT
|
buffer dd 0
|
||||||
align 4
|
align 4
|
||||||
rd 1024
|
rd 1024
|
||||||
stacktop:
|
stacktop:
|
||||||
|
Reference in New Issue
Block a user