From 4701a15222b4f9aaab3eb7e6f47753e27c02af5c Mon Sep 17 00:00:00 2001 From: IgorA Date: Wed, 12 Mar 2025 12:06:01 +0300 Subject: [PATCH] Apps/tube: Added support for window resizing --- programs/demos/tube/tube.asm | 121 +++++++++++++++++++++++++++-------- 1 file changed, 94 insertions(+), 27 deletions(-) diff --git a/programs/demos/tube/tube.asm b/programs/demos/tube/tube.asm index cb7863adf..03cc7f5a1 100644 --- a/programs/demos/tube/tube.asm +++ b/programs/demos/tube/tube.asm @@ -20,11 +20,13 @@ include '../../KOSfuncs.inc' title db 'Tube - FPU',0 -SCREEN_W equ (640-10) ;10 px for borders -SCREEN_H equ (400-10) +SCREEN_W dd 640-10 ;10 px for borders +SCREEN_H dd 400-10 align 4 START: + mcall SF_SYS_MISC,SSF_HEAP_INIT + call OnResize call draw_window call init_tube push ebx @@ -47,8 +49,19 @@ still: mcall SF_TERMINATE_PROCESS -EYE equ EYE_P-4 - +align 4 +OnResize: + mov ecx,[SCREEN_W] + imul ecx,[SCREEN_H] + ;ecx = SCREEN_W*SCREEN_H + mcall SF_SYS_MISC,SSF_MEM_REALLOC,,[PIXBUF] + mov [PIXBUF],eax + mcall SF_SYS_MISC,SSF_MEM_REALLOC,,[buf1] + mov [buf1],eax + lea ecx,[ecx+2*ecx] + mcall SF_SYS_MISC,SSF_MEM_REALLOC,,[buf2] + mov [buf2],eax + ret align 4 MAIN: @@ -56,17 +69,27 @@ MAIN: ;ebp - coord x ;edi - pixel buffer add ebx,10 shl 8 - mov edi,PIXBUF + mov edi,[PIXBUF] fadd dword [TEXUV-4] push edi - mov edx,-SCREEN_H/2 - + mov edx,[SCREEN_H] + inc edx ;fix (height%2)==1 + shr edx,1 + neg edx ;edx=-SCREEN_H/2 +align 4 TUBEY: - mov ebp,-SCREEN_W/2 - + mov ebp,[SCREEN_W] + inc ebp ;fix (width%2)==1 + shr ebp,1 + neg ebp ;ebp=-SCREEN_W/2 +align 4 TUBEX: mov esi,TEXUV - fild word [EYE] + fild dword [SCREEN_W] + fld1 + fld1 + faddp + fdivp ;st0=SCREEN_W/2 mov [esi],ebp fild word [esi] mov [esi],edx @@ -123,18 +146,22 @@ STORE_1: add [edi],al inc edi inc ebp - cmp ebp,SCREEN_W/2 + mov eax,[SCREEN_W] + shr eax,1 ;eax=SCREEN_W/2 + cmp ebp,eax -EYE_P: jnz TUBEX inc edx - cmp edx,SCREEN_H/2 + mov eax,[SCREEN_H] + shr eax,1 ;eax=SCREEN_H/2 + cmp edx,eax jnz TUBEY call display_image pop esi - mov ecx,SCREEN_H*SCREEN_W + mov ecx,[SCREEN_W] + imul ecx,[SCREEN_H] align 4 BLUR: @@ -148,8 +175,11 @@ align 4 display_image: pusha - mov esi,PIXBUF - mov edi,buf2 + mov esi,[PIXBUF] + mov edi,[buf2] + mov eax,[SCREEN_W] + imul eax,[SCREEN_H] + add eax,esi align 4 newp: movzx edx,byte [esi] @@ -160,11 +190,14 @@ newp: add edi,3 inc esi - cmp esi,PIXBUF+SCREEN_W*SCREEN_H + cmp esi,eax jbe newp xor edx,edx - mcall SF_PUT_IMAGE,buf2, + mov ecx,[SCREEN_W] + shl ecx,16 + add ecx,[SCREEN_H] + mcall SF_PUT_IMAGE,[buf2] popa ret @@ -176,9 +209,41 @@ draw_window: mcall SF_REDRAW, SSF_BEGIN_DRAW mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT - add eax,SCREEN_H + add eax,[SCREEN_H] lea ecx,[100*65536+4+eax] - mcall SF_CREATE_WINDOW,100*65536+SCREEN_W+9,, 0x74000000,,title + mov ebx,[SCREEN_W] + add ebx,(100 shl 16)+9 + mcall SF_CREATE_WINDOW,,, 0x73000000,,title + + mcall SF_THREAD_INFO,procinfo,-1 + mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT + 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 popa ret @@ -191,6 +256,7 @@ TEXUV: align 4 init_tube: mov ecx,256 + mov edi,[buf1] PAL1: mov edx,3C8h @@ -210,7 +276,7 @@ PAL2: PAL3: mov ebx,ecx - mov [ebx+buf1],bh + mov [ebx+edi],bh loop PAL1 mov ecx,256 @@ -221,11 +287,11 @@ TEX: mov dh,al sar dh,5 adc dl,dh - adc dl,[ebx+255+buf1] + adc dl,[ebx+255+edi] shr dl,1 - mov [ebx+buf1],dl + mov [ebx+edi],dl not bh - mov [ebx+buf1],dl + mov [ebx+edi],dl loop TEX fninit @@ -236,9 +302,10 @@ TEX: align 4 image_end: -PIXBUF rb SCREEN_W*SCREEN_H -buf1 rb SCREEN_W*SCREEN_H -buf2 rb SCREEN_W*SCREEN_H*3 +PIXBUF rd 1 +buf1 rd 1 +buf2 rd 1 +procinfo process_information rb 1024 align 4