forked from KolibriOS/kolibrios
New program - Screen Ruler, for measuring distance between 2 pixel on screen.
git-svn-id: svn://kolibrios.org@9934 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
31d2901d78
commit
8a7de6d31d
6
programs/demos/ScreenRuler/BUILD_EN.BAT
Normal file
6
programs/demos/ScreenRuler/BUILD_EN.BAT
Normal file
@ -0,0 +1,6 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix en >lang.inc
|
||||
@fasm ScreenRuler.asm ScreenRuler
|
||||
@kpack ScreenRuler
|
||||
@erase lang.inc
|
||||
@pause
|
6
programs/demos/ScreenRuler/BUILD_RU.BAT
Normal file
6
programs/demos/ScreenRuler/BUILD_RU.BAT
Normal file
@ -0,0 +1,6 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix ru >lang.inc
|
||||
@fasm ScreenRuler.asm ScreenRuler
|
||||
@kpack ScreenRuler
|
||||
@erase lang.inc
|
||||
@pause
|
BIN
programs/demos/ScreenRuler/ScreenRuler
Normal file
BIN
programs/demos/ScreenRuler/ScreenRuler
Normal file
Binary file not shown.
298
programs/demos/ScreenRuler/ScreenRuler.asm
Normal file
298
programs/demos/ScreenRuler/ScreenRuler.asm
Normal file
@ -0,0 +1,298 @@
|
||||
;---------------------------------------------------------------------
|
||||
; Screen Ruler v1.0
|
||||
; Version for KolibriOS 2005-2023
|
||||
;---------------------------------------------------------------------
|
||||
; last update: 11.09.2023
|
||||
; created by: Subbotin Anton aka Spaceraven
|
||||
;---------------------------------------------------------------------
|
||||
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 = 20
|
||||
magnify_width = 48
|
||||
magnify_height = 30
|
||||
magnify_halfwidth = magnify_width / 2
|
||||
magnify_halfheight = magnify_height / 2
|
||||
aim0 = (magnify_halfheight - 1) * 65536 + magnify_halfwidth - 1
|
||||
aim1 = (magnify_halfheight - 1) * 65536 + magnify_halfwidth + 1
|
||||
aim2 = (magnify_halfheight + 1) * 65536 + magnify_halfwidth - 1
|
||||
aim3 = (magnify_halfheight + 1) * 65536 + magnify_halfwidth + 1
|
||||
|
||||
;------------------------- Main cycle
|
||||
START:
|
||||
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 eax, 2
|
||||
mcall
|
||||
cmp ah, 32
|
||||
jnz wtevent
|
||||
mov eax, [mouse_x]
|
||||
mov [pix1_x], eax
|
||||
mov eax, [mouse_y]
|
||||
mov [pix1_y], eax
|
||||
|
||||
jmp wtevent
|
||||
;---------------------------------------------------------------------
|
||||
button:
|
||||
; we have only one button, close
|
||||
|
||||
or eax, -1
|
||||
mcall
|
||||
;------------------------- Window 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 + 4*magnify_width + 9
|
||||
lea ecx, [eax + 100*65536 + 4*magnify_height + 128]
|
||||
mov edx, 0x34000000 ; color of work area RRGGBB
|
||||
mov edi, labelt ; header
|
||||
xor eax, eax ; function 0 : define and draw window
|
||||
mcall
|
||||
|
||||
mov eax, 71
|
||||
mov ebx, 1
|
||||
mov ecx, labelt
|
||||
|
||||
mcall 12,2
|
||||
ret
|
||||
;------------------------- Magnify draw
|
||||
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 [screen_size_y], ecx
|
||||
shr eax, 16
|
||||
inc eax
|
||||
mov [screen_size_x], eax
|
||||
|
||||
xor ebx, ebx
|
||||
mcall 37 ; get mouse coordinates
|
||||
mov ecx, eax
|
||||
shr ecx, 16 ; ecx = x
|
||||
movzx edx, ax ; edx = y
|
||||
mov [mouse_x], ecx
|
||||
mov [mouse_y], edx
|
||||
add ecx, magnify_halfwidth
|
||||
add edx, magnify_halfheight
|
||||
mov [magnify_area_end_x], ecx
|
||||
mov [magnify_area_end_y], edx
|
||||
sub ecx, magnify_width
|
||||
sub edx, magnify_height
|
||||
mov [magnify_area_start_x], ecx
|
||||
mov [magnify_area_start_y], edx
|
||||
.loop_y:
|
||||
.loop_x:
|
||||
xor eax, eax ; assume black color for invalid pixels
|
||||
test ecx, ecx
|
||||
js .nopix
|
||||
cmp ecx, [screen_size_x]
|
||||
jge .nopix
|
||||
test edx, edx
|
||||
js .nopix
|
||||
cmp edx, [screen_size_y]
|
||||
jge .nopix
|
||||
mov ebx, edx
|
||||
sub ebx, [magnify_area_start_y]
|
||||
shl ebx, 16
|
||||
mov bx, cx
|
||||
sub ebx, [magnify_area_start_x]
|
||||
cmp ebx, aim0
|
||||
jz .nopix
|
||||
cmp ebx, aim1
|
||||
jz .nopix
|
||||
cmp ebx, aim2
|
||||
jz .nopix
|
||||
cmp ebx, aim3
|
||||
jz .nopix
|
||||
|
||||
mov ebx, edx
|
||||
imul ebx, [screen_size_x]
|
||||
add ebx, ecx
|
||||
mcall 35 ; read pixel
|
||||
|
||||
.nopix:
|
||||
push ecx edx
|
||||
sub ecx, [magnify_area_start_x]
|
||||
sub edx, [magnify_area_start_y]
|
||||
mov ebx, ecx
|
||||
shl ebx, 2+16
|
||||
mov bl, 4
|
||||
mov ecx, edx
|
||||
shl ecx, 2+16
|
||||
mov cl, 4
|
||||
mov edx, eax
|
||||
mcall 13 ; draw rectangle 8x8
|
||||
pop edx ecx
|
||||
|
||||
inc ecx
|
||||
cmp ecx, [magnify_area_end_x]
|
||||
jnz .loop_x
|
||||
mov ecx, [magnify_area_start_x]
|
||||
inc edx
|
||||
cmp edx, [magnify_area_end_y]
|
||||
jnz .loop_y
|
||||
|
||||
;------------------------- Measure labels draw
|
||||
mov eax, 4
|
||||
mov ebx, 8*65536 + 124
|
||||
mov ecx, 11110000111100001111000011110000b
|
||||
mov edx, start_pix
|
||||
xor edi, edi
|
||||
mcall 4
|
||||
add ebx, 20
|
||||
mov edx, end_pix
|
||||
mcall 4
|
||||
add ebx, 20
|
||||
mov edx, measure_x
|
||||
mcall 4
|
||||
add ebx, 20
|
||||
mov edx, measure_y
|
||||
mcall 4
|
||||
add ebx, 20
|
||||
mov edx, measure_d
|
||||
mcall 4
|
||||
add ebx, 20
|
||||
mov edx, inf
|
||||
mcall 4
|
||||
|
||||
mov ebx, 0x80040000
|
||||
mov ecx, [mouse_x]
|
||||
mov edx, 12*8*65536 + 144
|
||||
mov esi, 0x50FFFFFF
|
||||
xor edi, edi
|
||||
mcall 47
|
||||
sub ecx, [pix1_x]
|
||||
jns .sign1
|
||||
neg ecx
|
||||
.sign1:
|
||||
mov edx, 14*8*65536 + 164
|
||||
mov [dist_x], ecx
|
||||
mcall 47
|
||||
mov ecx, [mouse_y]
|
||||
mov edx, 18*8*65536 + 144
|
||||
mcall 47
|
||||
sub ecx, [pix1_y]
|
||||
jns .sign2
|
||||
neg ecx
|
||||
.sign2:
|
||||
mov [dist_y], ecx
|
||||
mov edx, 14*8*65536 + 184
|
||||
mcall 47
|
||||
mov ecx, [pix1_y]
|
||||
mov edx, 18*8*65536 + 124
|
||||
mcall 47
|
||||
mov ecx, [pix1_x]
|
||||
mov edx, 12*8*65536 + 124
|
||||
mcall 47
|
||||
|
||||
mov eax, [dist_x]
|
||||
mov ebx, eax
|
||||
mul bx
|
||||
mov cx, dx
|
||||
shl ecx, 16
|
||||
mov cx, ax
|
||||
mov eax, [dist_y]
|
||||
mov ebx, eax
|
||||
mul bx
|
||||
mov si, dx
|
||||
shl esi, 16
|
||||
mov si, ax
|
||||
add ecx, esi
|
||||
mov [diag_l], ecx
|
||||
finit
|
||||
fild [diag_l]
|
||||
fsqrt
|
||||
fistp [diag_l]
|
||||
|
||||
mov ebx, 0x80040000
|
||||
mov ecx, [diag_l]
|
||||
mov edx, 12*8*65536 + 204
|
||||
mov esi, 0x50FFFFFF
|
||||
xor edi, edi
|
||||
mcall 47
|
||||
|
||||
.end:
|
||||
ret
|
||||
|
||||
;------------------------- Data area
|
||||
if lang eq ru
|
||||
labelt:
|
||||
db 3, 'Измеритель', 0
|
||||
start_pix:
|
||||
db 'Пиксель 1 ( , )', 0
|
||||
end_pix:
|
||||
db 'Пиксель 2 ( , )', 0
|
||||
measure_x:
|
||||
db 'Дистанция x ( )', 0
|
||||
measure_y:
|
||||
db 'Дистанция y ( )', 0
|
||||
measure_d:
|
||||
db 'Диагональ ( )', 0
|
||||
inf:
|
||||
db 'Нажмите пробел', 0
|
||||
|
||||
else
|
||||
labelt:
|
||||
db 3, 'Ruler', 0
|
||||
start_pix:
|
||||
db 'Pixel 1 ( , )', 0
|
||||
end_pix:
|
||||
db 'Pixel 2 ( , )', 0
|
||||
measure_x:
|
||||
db 'Distance x ( )', 0
|
||||
measure_y:
|
||||
db 'Distance y ( )', 0
|
||||
measure_d:
|
||||
db 'Diagonal ( )', 0
|
||||
inf:
|
||||
db 'Press Space', 0
|
||||
|
||||
end if
|
||||
I_END:
|
||||
align 4
|
||||
magnify_area_start_x dd ?
|
||||
magnify_area_start_y dd ?
|
||||
magnify_area_end_x dd ?
|
||||
magnify_area_end_y dd ?
|
||||
screen_size_x dd ?
|
||||
screen_size_y dd ?
|
||||
mouse_x dd ?
|
||||
mouse_y dd ?
|
||||
pix1_x dd 0
|
||||
pix1_y dd 0
|
||||
dist_x dd 0
|
||||
dist_y dd 0
|
||||
diag_l dd 0
|
||||
;---------------------------------------------------------------------
|
||||
procinfo:
|
||||
rb 1024
|
||||
;---------------------------------------------------------------------
|
3
programs/demos/ScreenRuler/TUPFILE.LUA
Normal file
3
programs/demos/ScreenRuler/TUPFILE.LUA
Normal file
@ -0,0 +1,3 @@
|
||||
if tup.getconfig("NO_FASM") ~= "" then return end
|
||||
tup.rule("echo lang fix " .. ((tup.getconfig("LANG") == "") and "en" or tup.getconfig("LANG")) .. " > lang.inc", {"lang.inc"})
|
||||
tup.rule({"ScreenRuler.asm", extra_inputs = {"lang.inc"}}, "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "ScreenRuler")
|
Loading…
Reference in New Issue
Block a user