Apps/firework: Added support for window resizing
All checks were successful
Build system / Check kernel codestyle (pull_request) Successful in 40s
Build system / Build (pull_request) Successful in 5m35s

This commit is contained in:
2025-03-15 19:52:18 +02:00
parent fbd99c82a4
commit 10efb47ee8

View File

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