Apps/tube: Added support for window resizing

This commit is contained in:
2025-03-12 12:06:01 +03:00
committed by Max Logaev
parent 61277f8822
commit 4701a15222

View File

@@ -20,11 +20,13 @@ include '../../KOSfuncs.inc'
title db 'Tube - FPU',0 title db 'Tube - FPU',0
SCREEN_W equ (640-10) ;10 px for borders SCREEN_W dd 640-10 ;10 px for borders
SCREEN_H equ (400-10) SCREEN_H dd 400-10
align 4 align 4
START: START:
mcall SF_SYS_MISC,SSF_HEAP_INIT
call OnResize
call draw_window call draw_window
call init_tube call init_tube
push ebx push ebx
@@ -47,8 +49,19 @@ still:
mcall SF_TERMINATE_PROCESS 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 align 4
MAIN: MAIN:
@@ -56,17 +69,27 @@ MAIN:
;ebp - coord x ;ebp - coord x
;edi - pixel buffer ;edi - pixel buffer
add ebx,10 shl 8 add ebx,10 shl 8
mov edi,PIXBUF mov edi,[PIXBUF]
fadd dword [TEXUV-4] fadd dword [TEXUV-4]
push edi 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: 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: TUBEX:
mov esi,TEXUV mov esi,TEXUV
fild word [EYE] fild dword [SCREEN_W]
fld1
fld1
faddp
fdivp ;st0=SCREEN_W/2
mov [esi],ebp mov [esi],ebp
fild word [esi] fild word [esi]
mov [esi],edx mov [esi],edx
@@ -123,18 +146,22 @@ STORE_1:
add [edi],al add [edi],al
inc edi inc edi
inc ebp 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 jnz TUBEX
inc edx inc edx
cmp edx,SCREEN_H/2 mov eax,[SCREEN_H]
shr eax,1 ;eax=SCREEN_H/2
cmp edx,eax
jnz TUBEY jnz TUBEY
call display_image call display_image
pop esi pop esi
mov ecx,SCREEN_H*SCREEN_W mov ecx,[SCREEN_W]
imul ecx,[SCREEN_H]
align 4 align 4
BLUR: BLUR:
@@ -148,8 +175,11 @@ align 4
display_image: display_image:
pusha pusha
mov esi,PIXBUF mov esi,[PIXBUF]
mov edi,buf2 mov edi,[buf2]
mov eax,[SCREEN_W]
imul eax,[SCREEN_H]
add eax,esi
align 4 align 4
newp: newp:
movzx edx,byte [esi] movzx edx,byte [esi]
@@ -160,11 +190,14 @@ newp:
add edi,3 add edi,3
inc esi inc esi
cmp esi,PIXBUF+SCREEN_W*SCREEN_H cmp esi,eax
jbe newp jbe newp
xor edx,edx xor edx,edx
mcall SF_PUT_IMAGE,buf2,<SCREEN_W,SCREEN_H> mov ecx,[SCREEN_W]
shl ecx,16
add ecx,[SCREEN_H]
mcall SF_PUT_IMAGE,[buf2]
popa popa
ret ret
@@ -176,9 +209,41 @@ draw_window:
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
add eax,SCREEN_H add eax,[SCREEN_H]
lea ecx,[100*65536+4+eax] 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 mcall SF_REDRAW, SSF_END_DRAW
popa popa
ret ret
@@ -191,6 +256,7 @@ TEXUV:
align 4 align 4
init_tube: init_tube:
mov ecx,256 mov ecx,256
mov edi,[buf1]
PAL1: PAL1:
mov edx,3C8h mov edx,3C8h
@@ -210,7 +276,7 @@ PAL2:
PAL3: PAL3:
mov ebx,ecx mov ebx,ecx
mov [ebx+buf1],bh mov [ebx+edi],bh
loop PAL1 loop PAL1
mov ecx,256 mov ecx,256
@@ -221,11 +287,11 @@ TEX:
mov dh,al mov dh,al
sar dh,5 sar dh,5
adc dl,dh adc dl,dh
adc dl,[ebx+255+buf1] adc dl,[ebx+255+edi]
shr dl,1 shr dl,1
mov [ebx+buf1],dl mov [ebx+edi],dl
not bh not bh
mov [ebx+buf1],dl mov [ebx+edi],dl
loop TEX loop TEX
fninit fninit
@@ -236,9 +302,10 @@ TEX:
align 4 align 4
image_end: image_end:
PIXBUF rb SCREEN_W*SCREEN_H PIXBUF rd 1
buf1 rb SCREEN_W*SCREEN_H buf1 rd 1
buf2 rb SCREEN_W*SCREEN_H*3 buf2 rd 1
procinfo process_information
rb 1024 rb 1024
align 4 align 4