forked from KolibriOS/kolibrios
87a31bf736
git-svn-id: svn://kolibrios.org@2096 a494cfbc-eb01-0410-851d-a64ba20cac60
156 lines
3.6 KiB
NASM
156 lines
3.6 KiB
NASM
;---------------------------------------------------------------------
|
||
; MAGNIFY SCREEN v1.0
|
||
;
|
||
; Version for KolibriOS 2005-2011
|
||
;
|
||
; Version for Menuet to 2005
|
||
;---------------------------------------------------------------------
|
||
; last update: 08/18/2011
|
||
; changed by: Marat Zakiyanov aka Mario79, aka Mario
|
||
; changes: Checking for "rolled up" window
|
||
;---------------------------------------------------------------------
|
||
use32
|
||
org 0x0
|
||
db 'MENUET01' ; 8 byte id
|
||
dd 1 ; header version
|
||
dd START ; program start
|
||
dd I_END ; program image size
|
||
dd 0x1000 ; required amount of memory
|
||
dd 0x1000 ; esp
|
||
dd 0, 0 ; no parameters, no path
|
||
;---------------------------------------------------------------------
|
||
include 'lang.inc'
|
||
include '..\..\..\macros.inc'
|
||
delay equ 20
|
||
|
||
magnify_width = 40
|
||
magnify_height = 30
|
||
;---------------------------------------------------------------------
|
||
START: ; start of execution
|
||
redraw:
|
||
call draw_window
|
||
still:
|
||
call draw_magnify
|
||
wtevent:
|
||
mcall 23,delay ; wait here for event with timeout
|
||
dec eax
|
||
js still
|
||
jz redraw
|
||
dec eax
|
||
jnz button
|
||
; key in buffer
|
||
mov al, 2
|
||
mcall
|
||
jmp wtevent
|
||
;---------------------------------------------------------------------
|
||
button:
|
||
; we have only one button, close
|
||
or eax, -1
|
||
mcall
|
||
;---------------------------------------------------------------------
|
||
; ******* WINDOW DEFINITIONS AND DRAW ********
|
||
;---------------------------------------------------------------------
|
||
draw_window:
|
||
mcall 12,1
|
||
|
||
mov al, 48 ; function 48 : graphics parameters
|
||
mov bl, 4 ; subfunction 4 : get skin height
|
||
mcall
|
||
; DRAW WINDOW
|
||
mov ebx, 100*65536 + 8*magnify_width + 8
|
||
lea ecx, [eax + 100*65536 + 8*magnify_height + 3]
|
||
mov edx, 0x34000000 ; color of work area RRGGBB
|
||
mov edi, labelt ; header
|
||
xor eax, eax ; function 0 : define and draw window
|
||
mcall
|
||
|
||
mcall 12,2
|
||
ret
|
||
;---------------------------------------------------------------------
|
||
draw_magnify:
|
||
mcall 9,procinfo,-1
|
||
mov eax,[procinfo+70] ;status of window
|
||
test eax,100b
|
||
jne .end
|
||
|
||
mcall 14 ; get screen size
|
||
movzx ecx, ax
|
||
inc ecx
|
||
mov [size_y], ecx
|
||
shr eax, 16
|
||
inc eax
|
||
mov [size_x], eax
|
||
|
||
xor ebx, ebx
|
||
mcall 37 ; get mouse coordinates
|
||
mov ecx, eax
|
||
shr ecx, 16 ; ecx = x
|
||
movzx edx, ax ; edx = y
|
||
inc ecx
|
||
mov [m_xe], ecx
|
||
inc edx
|
||
mov [m_ye], edx
|
||
sub ecx, magnify_width
|
||
sub edx, magnify_height
|
||
mov [m_x], ecx
|
||
mov [m_y], edx
|
||
.loop_y:
|
||
.loop_x:
|
||
xor eax, eax ; assume black color for invalid pixels
|
||
test ecx, ecx
|
||
js .nopix
|
||
cmp ecx, [size_x]
|
||
jge .nopix
|
||
test edx, edx
|
||
js .nopix
|
||
cmp edx, [size_y]
|
||
jge .nopix
|
||
mov ebx, edx
|
||
imul ebx, [size_x]
|
||
add ebx, ecx
|
||
mcall 35 ; read pixel
|
||
.nopix:
|
||
push ecx edx
|
||
sub ecx, [m_x]
|
||
sub edx, [m_y]
|
||
mov ebx, ecx
|
||
shl ebx, 3+16
|
||
mov bl, 7
|
||
mov ecx, edx
|
||
shl ecx, 3+16
|
||
mov cl, 7
|
||
mov edx, eax
|
||
mcall 13
|
||
pop edx ecx
|
||
inc ecx
|
||
cmp ecx, [m_xe]
|
||
jnz .loop_x
|
||
mov ecx, [m_x]
|
||
inc edx
|
||
cmp edx, [m_ye]
|
||
jnz .loop_y
|
||
.end:
|
||
ret
|
||
;---------------------------------------------------------------------
|
||
; DATA AREA
|
||
;---------------------------------------------------------------------
|
||
if lang eq ru
|
||
labelt:
|
||
db 'Magnifier - <20><>࠭<EFBFBD><E0A0AD><EFBFBD> <20>㯠', 0
|
||
else
|
||
labelt:
|
||
db 'Magnifier', 0
|
||
end if
|
||
|
||
I_END:
|
||
align 4
|
||
m_x dd ?
|
||
m_y dd ?
|
||
m_xe dd ?
|
||
m_ye dd ?
|
||
size_x dd ?
|
||
size_y dd ?
|
||
;---------------------------------------------------------------------
|
||
procinfo:
|
||
rb 1024
|
||
;--------------------------------------------------------------------- |