Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;---------------------------------------------------------------------
  2. ;    Screen Ruler v1.0
  3. ;    Version for KolibriOS 2005-2023
  4. ;---------------------------------------------------------------------
  5. ; last update:  11.09.2023
  6. ; created by:   Subbotin Anton aka Spaceraven
  7. ;---------------------------------------------------------------------
  8.         use32
  9.         org     0x0
  10.         db      'MENUET01'; 8 byte id
  11.         dd      1         ; header version
  12.         dd      START     ; program start
  13.         dd      I_END     ; program image size
  14.         dd      0x1000    ; required amount of memory
  15.         dd      0x1000    ; esp
  16.         dd      0, 0      ; no parameters, no path
  17. ;---------------------------------------------------------------------
  18.         include 'lang.inc'
  19.         include '..\..\macros.inc'
  20.  
  21.         delay   = 20
  22.         magnify_width = 48
  23.         magnify_height = 30
  24.         magnify_halfwidth = magnify_width / 2
  25.         magnify_halfheight = magnify_height / 2
  26.         aim0 = (magnify_halfheight - 1) * 65536 + magnify_halfwidth - 1
  27.         aim1 = (magnify_halfheight - 1) * 65536 + magnify_halfwidth + 1
  28.         aim2 = (magnify_halfheight + 1) * 65536 + magnify_halfwidth - 1
  29.         aim3 = (magnify_halfheight + 1) * 65536 + magnify_halfwidth + 1
  30.  
  31. ;------------------------- Main cycle
  32. START:
  33. redraw:
  34.         call    draw_window
  35. still:
  36.         call    draw_magnify
  37. wtevent:
  38.         mcall   23, delay ; wait here for event with timeout
  39.         dec     eax
  40.         js      still
  41.         jz      redraw
  42.         dec     eax
  43.         jnz     button
  44. ; key in buffer
  45.         mov     eax, 2
  46.         mcall
  47.         cmp     ah, 32
  48.         jnz     wtevent
  49.         mov     eax, [mouse_x]
  50.         mov     [pix1_x], eax
  51.         mov     eax, [mouse_y]
  52.         mov     [pix1_y], eax
  53.  
  54.         jmp         wtevent
  55. ;---------------------------------------------------------------------
  56. button:
  57. ; we have only one button, close
  58.  
  59.         or      eax, -1
  60.         mcall
  61. ;------------------------- Window draw
  62. draw_window:
  63.         mcall   12, 1
  64.  
  65.         mov     al, 48    ; function 48 : graphics parameters
  66.         mov     bl, 4     ; subfunction 4 : get skin height
  67.         mcall
  68.                                         ; DRAW WINDOW
  69.         mov     ebx, 100*65536 + 4*magnify_width + 9
  70.         lea     ecx, [eax + 100*65536 + 4*magnify_height + 128]
  71.         mov     edx, 0x34000000         ; color of work area RRGGBB
  72.         mov     edi, labelt             ; header
  73.         xor     eax, eax                ; function 0 : define and draw window
  74.         mcall
  75.  
  76.         mov     eax, 71
  77.         mov     ebx, 1
  78.         mov     ecx, labelt
  79.  
  80.         mcall   12,2
  81.         ret
  82. ;------------------------- Magnify draw
  83. draw_magnify:
  84.         mcall   9, procinfo, -1
  85.         mov     eax, [procinfo+70] ;status of window
  86.         test    eax,100b
  87.         jne     .end
  88.  
  89.         mcall   14      ; get screen size
  90.         movzx   ecx, ax
  91.         inc     ecx
  92.         mov     [screen_size_y], ecx
  93.         shr     eax, 16
  94.         inc     eax
  95.         mov     [screen_size_x], eax
  96.  
  97.         xor     ebx, ebx
  98.         mcall   37        ; get mouse coordinates
  99.         mov     ecx, eax
  100.         shr     ecx, 16   ; ecx = x
  101.         movzx   edx, ax   ; edx = y
  102.         mov     [mouse_x], ecx
  103.         mov     [mouse_y], edx
  104.         add     ecx, magnify_halfwidth
  105.         add     edx, magnify_halfheight
  106.         mov     [magnify_area_end_x], ecx
  107.         mov     [magnify_area_end_y], edx
  108.         sub     ecx, magnify_width
  109.         sub     edx, magnify_height
  110.         mov     [magnify_area_start_x], ecx
  111.         mov     [magnify_area_start_y], edx
  112. .loop_y:
  113. .loop_x:
  114.         xor     eax, eax  ; assume black color for invalid pixels
  115.         test    ecx, ecx
  116.         js      .nopix
  117.         cmp     ecx, [screen_size_x]
  118.         jge     .nopix
  119.         test    edx, edx
  120.         js      .nopix
  121.         cmp     edx, [screen_size_y]
  122.         jge     .nopix
  123.         mov     ebx, edx
  124.         sub     ebx, [magnify_area_start_y]
  125.         shl     ebx, 16
  126.         mov     bx, cx
  127.         sub     ebx, [magnify_area_start_x]
  128.         cmp     ebx, aim0
  129.         jz      .nopix
  130.         cmp     ebx, aim1
  131.         jz      .nopix
  132.         cmp     ebx, aim2
  133.         jz      .nopix
  134.         cmp     ebx, aim3
  135.         jz      .nopix
  136.  
  137.         mov     ebx, edx
  138.         imul    ebx, [screen_size_x]
  139.         add     ebx, ecx
  140.         mcall   35        ; read pixel
  141.  
  142. .nopix:
  143.         push    ecx edx
  144.         sub     ecx, [magnify_area_start_x]
  145.         sub     edx, [magnify_area_start_y]
  146.         mov     ebx, ecx
  147.         shl     ebx, 2+16
  148.         mov     bl, 4
  149.         mov     ecx, edx
  150.         shl     ecx, 2+16
  151.         mov     cl, 4
  152.         mov     edx, eax
  153.         mcall   13        ; draw rectangle 8x8
  154.         pop     edx ecx
  155.  
  156.         inc     ecx
  157.         cmp     ecx, [magnify_area_end_x]
  158.         jnz     .loop_x
  159.         mov     ecx, [magnify_area_start_x]
  160.         inc     edx
  161.         cmp     edx, [magnify_area_end_y]
  162.         jnz     .loop_y
  163.  
  164. ;------------------------- Measure labels draw
  165.         mov     eax, 4
  166.         mov     ebx, 8*65536 + 124
  167.         mov     ecx, 11110000111100001111000011110000b
  168.         mov     edx, start_pix
  169.         xor     edi, edi
  170.         mcall   4
  171.         add     ebx, 20
  172.         mov     edx, end_pix
  173.         mcall   4
  174.         add     ebx, 20
  175.         mov     edx, measure_x
  176.         mcall   4
  177.         add     ebx, 20
  178.         mov     edx, measure_y
  179.         mcall   4
  180.         add     ebx, 20
  181.         mov     edx, measure_d
  182.         mcall   4
  183.         add     ebx, 20
  184.         mov     edx, inf
  185.         mcall   4
  186.  
  187.         mov     ebx, 0x80040000
  188.         mov     ecx, [mouse_x]
  189.         mov     edx, 12*8*65536 + 144
  190.         mov     esi, 0x50FFFFFF
  191.         xor     edi, edi
  192.         mcall   47
  193.         sub     ecx, [pix1_x]
  194.         jns     .sign1
  195.         neg     ecx
  196. .sign1:
  197.         mov     edx, 14*8*65536 + 164
  198.         mov     [dist_x], ecx
  199.         mcall   47
  200.         mov     ecx, [mouse_y]
  201.         mov     edx, 18*8*65536 + 144
  202.         mcall   47
  203.         sub     ecx, [pix1_y]
  204.         jns     .sign2
  205.         neg     ecx
  206. .sign2:
  207.         mov     [dist_y], ecx
  208.         mov     edx, 14*8*65536 + 184
  209.         mcall   47
  210.         mov     ecx, [pix1_y]
  211.         mov     edx, 18*8*65536 + 124
  212.         mcall   47
  213.         mov     ecx, [pix1_x]
  214.         mov     edx, 12*8*65536 + 124
  215.         mcall   47
  216.  
  217.         mov     eax, [dist_x]
  218.         mov     ebx, eax
  219.         mul     bx
  220.         mov     cx, dx
  221.         shl     ecx, 16
  222.         mov     cx, ax
  223.         mov     eax, [dist_y]
  224.         mov     ebx, eax
  225.         mul     bx
  226.         mov     si, dx
  227.         shl     esi, 16
  228.         mov     si, ax
  229.         add     ecx, esi
  230.         mov     [diag_l], ecx
  231.         finit
  232.         fild    [diag_l]
  233.         fsqrt
  234.         fistp   [diag_l]
  235.  
  236.         mov     ebx, 0x80040000
  237.         mov     ecx, [diag_l]
  238.         mov     edx, 12*8*65536 + 204
  239.         mov     esi, 0x50FFFFFF
  240.         xor     edi, edi
  241.         mcall   47
  242.  
  243. .end:
  244.         ret
  245.  
  246. ;------------------------- Data area
  247.         if      lang eq ru
  248. labelt:
  249.         db      3, 'Измеритель', 0
  250. start_pix:
  251.         db      'Пиксель 1 (    ,     )', 0
  252. end_pix:
  253.         db      'Пиксель 2 (    ,     )', 0
  254. measure_x:
  255.         db      'Дистанция x (    )', 0
  256. measure_y:
  257.         db      'Дистанция y (    )', 0
  258. measure_d:
  259.         db      'Диагональ (    )', 0
  260. inf:
  261.         db      'Нажмите пробел', 0
  262.  
  263.         else
  264. labelt:
  265.         db      3, 'Ruler', 0
  266. start_pix:
  267.         db      'Pixel 1   (    ,     )', 0
  268. end_pix:
  269.         db      'Pixel 2   (    ,     )', 0
  270. measure_x:
  271.         db      'Distance x  (    )', 0
  272. measure_y:
  273.         db      'Distance y  (    )', 0
  274. measure_d:
  275.         db      'Diagonal  (    )', 0
  276. inf:
  277.         db      'Press Space', 0
  278.  
  279.          end if
  280. I_END:
  281.         align   4
  282.         magnify_area_start_x  dd ?
  283.         magnify_area_start_y  dd ?
  284.         magnify_area_end_x  dd ?
  285.         magnify_area_end_y  dd ?
  286.         screen_size_x   dd ?
  287.         screen_size_y   dd ?
  288.         mouse_x         dd ?
  289.         mouse_y         dd ?
  290.         pix1_x          dd 0
  291.         pix1_y          dd 0
  292.         dist_x          dd 0
  293.         dist_y          dd 0
  294.         diag_l          dd 0
  295. ;---------------------------------------------------------------------
  296. procinfo:
  297.         rb 1024
  298. ;---------------------------------------------------------------------