From 20aba254bcb621c69b623a5877a8b8abe761a1b3 Mon Sep 17 00:00:00 2001 From: IgorA Date: Sat, 15 Mar 2025 19:52:18 +0200 Subject: [PATCH] Apps/firework: Added support for window resizing --- programs/demos/firework/build.bat | 2 - programs/demos/firework/firework.asm | 209 +++++++++++++++++++-------- 2 files changed, 148 insertions(+), 63 deletions(-) delete mode 100644 programs/demos/firework/build.bat diff --git a/programs/demos/firework/build.bat b/programs/demos/firework/build.bat deleted file mode 100644 index 4241a1b0e..000000000 --- a/programs/demos/firework/build.bat +++ /dev/null @@ -1,2 +0,0 @@ -@fasm.exe -m 16384 firework.asm firework.kex -pause diff --git a/programs/demos/firework/firework.asm b/programs/demos/firework/firework.asm index 9d6e76a95..d89ae0f9d 100644 --- a/programs/demos/firework/firework.asm +++ b/programs/demos/firework/firework.asm @@ -1,4 +1,5 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; SPDX-License-Identifier: GPL-2.0-only ; A firework demo ; Copyright (C) 2010-2025 KolibriOS team ; @@ -13,10 +14,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 +28,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 +54,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 +95,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 +116,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 +134,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 +151,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 +168,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 +184,7 @@ else if SIMD eq AVX512 end if } +; eax = [Screen_W] macro blur_right { local .lop @@ -169,8 +192,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,30 +203,30 @@ if SIMD eq SSE else if SIMD eq AVX .lop: vmovdqa xmm0, [edi] - vmovdqu xmm1, [edi + SCREEN_WIDTH + 1] - vpavgb xmm2, xmm0, [edi + 1] - vpavgb xmm3, xmm1, [edi + SCREEN_WIDTH] - vpavgb xmm4, xmm2, xmm3 + vmovdqu xmm1, [edi + eax + 1] + vpavgb xmm2, xmm0, [edi + 1] + vpavgb xmm3, xmm1, [edi + eax] + vpavgb xmm4, xmm2, xmm3 vmovdqa [edi], xmm4 add edi, SIMD_BYTES loop .lop else if SIMD eq AVX2 .lop: vmovdqa ymm0, [edi] - vmovdqu ymm1, [edi + SCREEN_WIDTH + 1] - vpavgb ymm2, ymm0, [edi + 1] - vpavgb ymm3, ymm1, [edi + SCREEN_WIDTH] - vpavgb ymm4, ymm2, ymm3 + vmovdqu ymm1, [edi + eax + 1] + vpavgb ymm2, ymm0, [edi + 1] + vpavgb ymm3, ymm1, [edi + eax] + vpavgb ymm4, ymm2, ymm3 vmovdqa [edi], ymm4 add edi, SIMD_BYTES loop .lop 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 zmm4, zmm2, zmm3 + vpavgb zmm3, zmm1, [edi + eax] + vpavgb zmm4, zmm2, zmm3 vmovdqa64 [edi], zmm4 add edi, SIMD_BYTES loop .lop @@ -229,11 +252,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,20 +275,61 @@ 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, ,, areacolor,, window_title - mcall SF_REDRAW, SSF_END_DRAW ; end of redraw + 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 MAIN: @@ -281,11 +346,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 +362,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 +385,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 @@ -329,26 +401,41 @@ MAIN: .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] - push 8 - pop esi - xor ebp, ebp - mcall SF_PUT_IMAGE_EXT, buffer, (SCREEN_WIDTH SHL 16) + SCREEN_HEIGHT,,, pal + push 8 + pop esi + xor ebp, ebp + 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: +still: mcall SF_WAIT_EVENT_TIMEOUT, 1 - dec eax ; redraw request ? - jz red - dec eax ; key in buffer ? - jz key - dec eax ; button in buffer ? - jz button + dec eax ; redraw request ? + jz red + dec eax ; key in buffer ? + jz key + dec eax ; button in buffer ? + jz button - jmp MAIN + jmp MAIN align 4 key: @@ -372,7 +459,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 +467,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 +514,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: