From 31ca1c76bbcec88f9fa039391d122f67020fc58f Mon Sep 17 00:00:00 2001 From: IgorA Date: Thu, 13 Mar 2025 11:48:52 +0200 Subject: [PATCH] Apps/unvwater: Added support for window resizing --- programs/demos/unvwater/unvwater.asm | 117 +++++++++++++++++++-------- 1 file changed, 83 insertions(+), 34 deletions(-) diff --git a/programs/demos/unvwater/unvwater.asm b/programs/demos/unvwater/unvwater.asm index 90261f9fc..2a409accf 100644 --- a/programs/demos/unvwater/unvwater.asm +++ b/programs/demos/unvwater/unvwater.asm @@ -1,8 +1,11 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; A unvwater demo -; Programmed by Octavio Vega Fernandez +; SPDX-License-Identifier: GPL-2.0-only +; Unvwater demo +; Copyright (C) 2010-2025 KolibriOS team +; +; Initially programmed by Octavio Vega Fernandez (c) in OctASM ; http://octavio.vega.fernandez.googlepages.com/CV4.HTM -; Converted to KolibriOS, By Asper +; Converted to FASM for KolibriOS by Asper ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; use32 @@ -21,24 +24,13 @@ include '../../proc32.inc' include '../../macros.inc' include '../../KOSfuncs.inc' -macro start_draw_window x,y,xsize,ysize,areacolor,caption;,capsize -{ - mcall SF_REDRAW, SSF_BEGIN_DRAW - mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT - push eax - lea ecx, [y*65536+ysize+eax]; [y start] *65536 + [y size] + [skin_height] - mov ebx, x*65536+xsize ; [x start] *65536 + [x size] - mov edx, areacolor ; color of work area RRGGBB - mov edi, caption;0x00ddeeff ; color of frames RRGGBB - mcall SF_CREATE_WINDOW - pop eax -} - -SCREEN_WIDTH equ (600-10) ;10 px for borders -SCREEN_HEIGHT equ 400 - +Screen_W dd 600-10 ;10 px for borders +Screen_H dd 400 +align 4 STARTAPP: + mcall SF_SYS_MISC,SSF_HEAP_INIT + call OnResize mcall SF_SYSTEM, SSF_GET_CPU_FREQUENCY shr eax, 28 mov dword [delay], eax @@ -51,13 +43,17 @@ init_palette: inc al jnz @b +align 4 MAIN: xor esi, esi - mov ecx, SCREEN_WIDTH*SCREEN_HEIGHT + mov edi, [img] + mov ecx, [Screen_W] + imul ecx, [Screen_H] l11: xor ebx, ebx mov edx, 303h - sub esi, SCREEN_WIDTH+1 + sub esi, [Screen_W] + dec esi l2: cmp esi,0 jge @f @@ -68,18 +64,21 @@ l2: sub esi, ecx @@: - add bl, [esi+img] + add bl, [esi+edi] adc bh, ah inc esi dec dh jnz l2 mov dh, 3 - add esi, SCREEN_WIDTH-3 + add esi, [Screen_W] + sub esi, 3 dec dl jnz l2 - sub esi, 2*SCREEN_WIDTH-1 + sub esi, [Screen_W] + sub esi, [Screen_W] + inc esi cmp esi,0 jge @f add esi, ecx @@ -89,7 +88,7 @@ l2: sub esi, ecx @@: - mov al, [img+esi] + mov al, [edi+esi] sub bx, ax shl ax, 2 sub bx, ax @@ -98,7 +97,7 @@ l2: mov ax, bx shr ax, 7 sub bx, ax - mov [img+esi], bl + mov [edi+esi], bl inc esi cmp esi, ecx @@ -136,9 +135,48 @@ button: je close_app jmp MAIN +align 4 draw_window: - start_draw_window 100,70,SCREEN_WIDTH+9,SCREEN_HEIGHT+4,0x54224466,labelt;, 14;labellen-labelt - mov dword [skin_h], eax + mcall SF_REDRAW, SSF_BEGIN_DRAW + mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT + mov [skin_h], eax + lea ecx, [70*65536+4+eax] + add ecx, [Screen_H] ; [y start] *65536 + [y size] + [skin_height] + mov ebx, 100 shl 16 + add ebx, [Screen_W] + add ebx, 9 + mov edi, labelt + mcall SF_CREATE_WINDOW,,, 0x53224466 + + mcall SF_THREAD_INFO,procinfo,-1 + mov eax, [skin_h] + add eax, 4 + sub eax, [procinfo.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,[procinfo.box.width] + sub eax,9 + 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 ret @@ -148,22 +186,33 @@ fail: close_app: mcall SF_TERMINATE_PROCESS +align 4 +OnResize: + mov ecx,[Screen_W] + imul ecx,[Screen_H] + mcall SF_SYS_MISC,SSF_MEM_REALLOC,,[img] + mov byte[eax],1 ; set the coordinate of the start of the first wave: + ; eax+0 -> point(0,0), eax+H*W+W -> point(W,H) + mov [img],eax + ret - +align 4 copy_buffer_to_video: pusha ;mcall SF_SYSTEM, SSF_WAIT_RETRACE mcall SF_SLEEP, [delay] - mov eax, dword [skin_h] + mov eax, [skin_h] lea edx, [5*65536+eax] - mov ecx, SCREEN_WIDTH*65536+SCREEN_HEIGHT ;ecx = w*65536+h + mov ecx, [Screen_W] + shl ecx, 16 + add ecx, [Screen_H] ;mov edx, 5*65536+25 ;edx = x*65536+y mov esi, 8 mov edi, Paleta xor ebp, ebp - mcall SF_PUT_IMAGE_EXT, img + mcall SF_PUT_IMAGE_EXT, [img] popa ret @@ -176,8 +225,8 @@ skin_h dd 25 ; Skin height. I_END: Paleta rb 1024 -img db 1 - rb SCREEN_WIDTH*SCREEN_HEIGHT +img dd 0 +procinfo process_information rb 256 align 4 STACKTOP: