Max Logaev 4550e15838 Magnify: Moved to programs/system
Signed-off-by: Max Logaev <maxlogaev@proton.me>
2025-05-14 21:58:44 +03:00

230 lines
5.4 KiB
NASM

; SPDX-License-Identifier: GPL-2.0-only
;
; Magnify - Screen Magnifier
; Copyright (C) 2005 MenuetOS
; Copyright (C) 2005-2025 KolibriOS team
;---------------------------------------------------------------------
use32
org 0x0
db 'MENUET01'
dd 1
dd START
dd I_END
dd MEM
dd STACKTOP
dd 0, 0
;---------------------------------------------------------------------
include '../../macros.inc'
include "../../KOSfuncs.inc"
include "../../encoding.inc"
;---------------------------------------------------------------------
START:
mcall SF_SET_EVENTS_MASK, EVM_REDRAW or EVM_BUTTON or EVM_MOUSE
mcall SF_SYS_MISC, SSF_HEAP_INIT
; initializing MAG_H * MAG_W rect of pixels from screen
mcall SF_SYS_MISC, SSF_MEM_ALLOC, MAG_H * MAG_W * 3
mov [screen_rect], eax
call logic_read_screen
still:
mcall SF_WAIT_EVENT_TIMEOUT, DELAY
cmp eax, EV_REDRAW
je redraw
cmp eax, EV_BUTTON
je button
cmp eax, EV_MOUSE
je mouse
jmp redraw
redraw:
call draw_window
call draw_magnify
jmp still
;---------------------------------------------------------------------
button:
; we have only one button, close
or eax, SF_TERMINATE_PROCESS
mcall
mouse:
mcall SF_MOUSE_GET, SSF_BUTTON
test ax, 0x0001
jnz still
call logic_read_screen
call draw_magnify
jmp still
;---------------------------------------------------------------------
; ******* WINDOW DEFINITIONS AND DRAW ********
;---------------------------------------------------------------------
draw_window:
mcall SF_REDRAW, SSF_BEGIN_DRAW
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
mov ecx, eax
add ecx, WIN.Y shl 16 + WIN.H
mcall SF_CREATE_WINDOW, <WIN.X, WIN.W>, , 0x34181818, , labelt
mcall SF_REDRAW, SSF_END_DRAW
ret
; MAG_H * MAG_W pixels grid
draw_magnify:
mcall SF_THREAD_INFO, procinfo, -1
mov al, byte [procinfo.wnd_state]
test al, 0x04
jne .du_loop_end
mov eax, SF_DRAW_RECT
mov ebx, MAG_S - 1
mov ecx, MAG_S - 1
mov esi, [screen_rect]
mov edi, MAG_W * MAG_H
.du_loop_rect:
mcall , , , dword [esi]
add ebx, MAG_S shl 16
cmp ebx, MAG_S * MAG_W shl 16
jle .du_loop_rect_row
mov ebx, MAG_S - 1
add ecx, MAG_S shl 16
.du_loop_rect_row:
add esi, 3
dec edi
jne .du_loop_rect
.du_loop_end:
ret
;---------------------------------------------------------------------
; LOGIC AREA
;---------------------------------------------------------------------
; read array of pixels from screen by mouse coords
logic_read_screen:
mcall SF_MOUSE_GET, SSF_SCREEN_POSITION
mov edx, eax
; clamping mouse coords to stay within the screen
mcall SF_GET_SCREEN_SIZE
mov ebx, eax
call logic_clamp_pixels
sub edx, (MAG_W / 2) shl 16 + (MAG_H / 2)
mcall SF_GET_IMAGE, [screen_rect], <MAG_W, MAG_H>,
ret
; clamping mouse coords to stay within the screen
logic_clamp_pixels:
mov eax, edx
shr eax, 16
mov cx, ax
mov ax, dx
push ax
push cx
mov ax, bx
mov di, ax
mov eax, ebx
shr eax, 16
mov si, ax
pop cx
pop ax
.check_min_x:
cmp cx, MAG_W / 2
jge .check_min_y
mov cx, MAG_W / 2
.check_min_y:
cmp ax, MAG_H / 2
jge .check_max_x
mov ax, MAG_H / 2
.check_max_x:
mov dx, si
sub dx, MAG_W / 2 - 1
cmp cx, dx
jle .check_max_y
mov cx, dx
.check_max_y:
mov dx, di
sub dx, MAG_H / 2 - 1
cmp ax, dx
jle .combine_coords
mov ax, dx
.combine_coords:
mov dx, cx
shl edx, 16
or dx, ax
ret
;---------------------------------------------------------------------
; DATA AREA
;---------------------------------------------------------------------
DELAY = 5
MAG_W = 40
MAG_H = 30
MAG_S = 8
WIN RECT 100, 100, MAG_W * MAG_S + 8, MAG_H * MAG_S + 3
;---------------------------------------------------------------------
if lang eq ru_RU
labelt cp866 'Magnify - Экранная лупа', 0
else if lang eq es_ES
labelt db 'Magnify - Lupa de Pantalla', 0
else
labelt db 'Magnify - Screen Magnifier', 0
endf
;---------------------------------------------------------------------
screen_rect dd 0x00000000
;---------------------------------------------------------------------
I_END:
rb 512
align 512
STACKTOP:
procinfo process_information
MEM: