Subversion Repositories Kolibri OS

Rev

Rev 9934 | 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.         mcall   71, 1, labelt
  76.         mcall   12,2
  77.         ret
  78. ;------------------------- Magnify draw
  79. draw_magnify:
  80.         mcall   9, procinfo, -1
  81.         mov     eax, [procinfo+70] ;status of window
  82.         test    eax,100b
  83.         jne     .end
  84.  
  85.         mcall   14      ; get screen size
  86.         movzx   ecx, ax
  87.         inc     ecx
  88.         mov     [screen_size_y], ecx
  89.         shr     eax, 16
  90.         inc     eax
  91.         mov     [screen_size_x], eax
  92.  
  93.         xor     ebx, ebx
  94.         mcall   37        ; get mouse coordinates
  95.         mov     ecx, eax
  96.         shr     ecx, 16   ; ecx = x
  97.         movzx   edx, ax   ; edx = y
  98.         mov     [mouse_x], ecx
  99.         mov     [mouse_y], edx
  100.         add     ecx, magnify_halfwidth
  101.         add     edx, magnify_halfheight
  102.         mov     [magnify_area_end_x], ecx
  103.         mov     [magnify_area_end_y], edx
  104.         sub     ecx, magnify_width
  105.         sub     edx, magnify_height
  106.         mov     [magnify_area_start_x], ecx
  107.         mov     [magnify_area_start_y], edx
  108. .loop_y:
  109. .loop_x:
  110.         xor     eax, eax  ; assume black color for invalid pixels
  111.         test    ecx, ecx
  112.         js      .nopix
  113.         cmp     ecx, [screen_size_x]
  114.         jge     .nopix
  115.         test    edx, edx
  116.         js      .nopix
  117.         cmp     edx, [screen_size_y]
  118.         jge     .nopix
  119.         mov     ebx, edx
  120.         sub     ebx, [magnify_area_start_y]
  121.         shl     ebx, 16
  122.         mov     bx, cx
  123.         sub     ebx, [magnify_area_start_x]
  124.         cmp     ebx, aim0
  125.         jz      .nopix
  126.         cmp     ebx, aim1
  127.         jz      .nopix
  128.         cmp     ebx, aim2
  129.         jz      .nopix
  130.         cmp     ebx, aim3
  131.         jz      .nopix
  132.  
  133.         mov     ebx, edx
  134.         imul    ebx, [screen_size_x]
  135.         add     ebx, ecx
  136.         mcall   35        ; read pixel
  137.  
  138. .nopix:
  139.         push    ecx edx
  140.         sub     ecx, [magnify_area_start_x]
  141.         sub     edx, [magnify_area_start_y]
  142.         mov     ebx, ecx
  143.         shl     ebx, 2+16
  144.         mov     bl, 4
  145.         mov     ecx, edx
  146.         shl     ecx, 2+16
  147.         mov     cl, 4
  148.         mov     edx, eax
  149.         mcall   13        ; draw rectangle 8x8
  150.         pop     edx ecx
  151.  
  152.         inc     ecx
  153.         cmp     ecx, [magnify_area_end_x]
  154.         jnz     .loop_x
  155.         mov     ecx, [magnify_area_start_x]
  156.         inc     edx
  157.         cmp     edx, [magnify_area_end_y]
  158.         jnz     .loop_y
  159.  
  160. ;------------------------- Measure labels draw
  161.         mov     eax, 4
  162.         mov     ebx, 8*65536 + 124
  163.         mov     ecx, 11110000111100001111000011110000b
  164.         mov     edx, start_pix
  165.         xor     edi, edi
  166.         mcall   4
  167.         add     ebx, 20
  168.         mov     edx, end_pix
  169.         mcall   4
  170.         add     ebx, 20
  171.         mov     edx, measure_x
  172.         mcall   4
  173.         add     ebx, 20
  174.         mov     edx, measure_y
  175.         mcall   4
  176.         add     ebx, 20
  177.         mov     edx, measure_d
  178.         mcall   4
  179.         add     ebx, 20
  180.         mov     edx, inf
  181.         mcall   4
  182.  
  183.         mov     ebx, 0x80040000
  184.         mov     ecx, [mouse_x]
  185.         mov     edx, 12*8*65536 + 144
  186.         mov     esi, 0x50FFFFFF
  187.         xor     edi, edi
  188.         mcall   47
  189.         sub     ecx, [pix1_x]
  190.         jns     .sign1
  191.         neg     ecx
  192. .sign1:
  193.         mov     edx, 14*8*65536 + 164
  194.         mov     [dist_x], ecx
  195.         mcall   47
  196.         mov     ecx, [mouse_y]
  197.         mov     edx, 18*8*65536 + 144
  198.         mcall   47
  199.         sub     ecx, [pix1_y]
  200.         jns     .sign2
  201.         neg     ecx
  202. .sign2:
  203.         mov     [dist_y], ecx
  204.         mov     edx, 14*8*65536 + 184
  205.         mcall   47
  206.         mov     ecx, [pix1_y]
  207.         mov     edx, 18*8*65536 + 124
  208.         mcall   47
  209.         mov     ecx, [pix1_x]
  210.         mov     edx, 12*8*65536 + 124
  211.         mcall   47
  212.  
  213.         mov     eax, [dist_x]
  214.         mov     ebx, eax
  215.         mul     bx
  216.         mov     cx, dx
  217.         shl     ecx, 16
  218.         mov     cx, ax
  219.         mov     eax, [dist_y]
  220.         mov     ebx, eax
  221.         mul     bx
  222.         mov     si, dx
  223.         shl     esi, 16
  224.         mov     si, ax
  225.         add     ecx, esi
  226.         mov     [diag_l], ecx
  227.         finit
  228.         fild    [diag_l]
  229.         fsqrt
  230.         fistp   [diag_l]
  231.  
  232.         mov     ebx, 0x80040000
  233.         mov     ecx, [diag_l]
  234.         mov     edx, 12*8*65536 + 204
  235.         mov     esi, 0x50FFFFFF
  236.         xor     edi, edi
  237.         mcall   47
  238.  
  239. .end:
  240.         ret
  241.  
  242. ;------------------------- Data area
  243.         if      lang eq ru
  244. labelt:
  245.         db      3, 'Измеритель', 0
  246. start_pix:
  247.         db      'Пиксель 1 (    ,     )', 0
  248. end_pix:
  249.         db      'Пиксель 2 (    ,     )', 0
  250. measure_x:
  251.         db      'Дистанция x (    )', 0
  252. measure_y:
  253.         db      'Дистанция y (    )', 0
  254. measure_d:
  255.         db      'Диагональ (    )', 0
  256. inf:
  257.         db      'Нажмите пробел', 0
  258.  
  259.         else
  260. labelt:
  261.         db      3, 'Ruler', 0
  262. start_pix:
  263.         db      'Pixel 1   (    ,     )', 0
  264. end_pix:
  265.         db      'Pixel 2   (    ,     )', 0
  266. measure_x:
  267.         db      'Distance x  (    )', 0
  268. measure_y:
  269.         db      'Distance y  (    )', 0
  270. measure_d:
  271.         db      'Diagonal  (    )', 0
  272. inf:
  273.         db      'Press Space', 0
  274.  
  275.          end if
  276. I_END:
  277.         align   4
  278.         magnify_area_start_x  dd ?
  279.         magnify_area_start_y  dd ?
  280.         magnify_area_end_x  dd ?
  281.         magnify_area_end_y  dd ?
  282.         screen_size_x   dd ?
  283.         screen_size_y   dd ?
  284.         mouse_x         dd ?
  285.         mouse_y         dd ?
  286.         pix1_x          dd 0
  287.         pix1_y          dd 0
  288.         dist_x          dd 0
  289.         dist_y          dd 0
  290.         diag_l          dd 0
  291. ;---------------------------------------------------------------------
  292. procinfo:
  293.         rb 1024
  294. ;---------------------------------------------------------------------