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

This commit is contained in:
2025-03-15 19:52:18 +02:00
parent fbd99c82a4
commit 20aba254bc
2 changed files with 148 additions and 63 deletions

View File

@@ -1,2 +0,0 @@
@fasm.exe -m 16384 firework.asm firework.kex
pause

View File

@@ -1,4 +1,5 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SPDX-License-Identifier: GPL-2.0-only
; A firework demo ; A firework demo
; Copyright (C) 2010-2025 KolibriOS team ; Copyright (C) 2010-2025 KolibriOS team
; ;
@@ -13,10 +14,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 +28,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 +54,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 +95,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 +116,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 +134,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 +151,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 +168,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 +184,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 +192,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,30 +203,30 @@ 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
loop .lop loop .lop
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
loop .lop loop .lop
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
loop .lop loop .lop
@@ -229,11 +252,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,20 +275,61 @@ 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
mcall SF_REDRAW, SSF_END_DRAW ; end of redraw 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 align 4
MAIN: MAIN:
@@ -281,11 +346,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 +362,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 +385,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
@@ -329,26 +401,41 @@ MAIN:
.copy_buffer_to_video: .copy_buffer_to_video:
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
lea edx, [(5 shl 16) + eax] lea edx, [(5 shl 16) + eax]
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:
mcall SF_WAIT_EVENT_TIMEOUT, 1 mcall SF_WAIT_EVENT_TIMEOUT, 1
dec eax ; redraw request ? dec eax ; redraw request ?
jz red jz red
dec eax ; key in buffer ? dec eax ; key in buffer ?
jz key jz key
dec eax ; button in buffer ? dec eax ; button in buffer ?
jz button jz button
jmp MAIN jmp MAIN
align 4 align 4
key: key:
@@ -372,7 +459,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 +467,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 +514,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: