Subversion Repositories Kolibri OS

Rev

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

  1. ;*****************************************************************************
  2. ; Color Dialog - for Kolibri OS
  3. ; Copyright (c) 2013, Marat Zakiyanov aka Mario79, aka Mario
  4. ; All rights reserved.
  5. ;
  6. ; Redistribution and use in source and binary forms, with or without
  7. ; modification, are permitted provided that the following conditions are met:
  8. ;        * Redistributions of source code must retain the above copyright
  9. ;          notice, this list of conditions and the following disclaimer.
  10. ;        * Redistributions in binary form must reproduce the above copyright
  11. ;          notice, this list of conditions and the following disclaimer in the
  12. ;          documentation and/or other materials provided with the distribution.
  13. ;        * Neither the name of the <organization> nor the
  14. ;          names of its contributors may be used to endorse or promote products
  15. ;          derived from this software without specific prior written permission.
  16. ;
  17. ; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY
  18. ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  19. ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  20. ; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
  21. ; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  22. ; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  23. ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  24. ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25. ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  26. ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. ;*****************************************************************************
  28. ;---------------------------------------------------------------------
  29. ;Some documentation for memory
  30. ;
  31. ;area name db 'FFFFFFFF_color_dialog',0 ; FFFFFFFF = PID
  32. ;
  33. ; communication area data
  34. ; flag  ; +0
  35. ; dw 0   ; 0 - empty, 1 - OK, color selected
  36. ;          2 - use another method/not found program, 3 - cancel
  37. ;
  38. ; type of dialog:  0-Palette&Tone
  39. ; dw 0 ; +2
  40. ;
  41. ; window X size ; +4
  42. ; dw 0
  43. ;
  44. ; window X position ; +6
  45. ; dw 0
  46. ;
  47. ; window y size ; +8
  48. ; dw 0
  49. ;
  50. ; window Y position ; +10
  51. ; dw 0
  52. ;
  53. ; ColorDialog WINDOW SLOT ; +12
  54. ; dd 0
  55. ;
  56. ; Color type ; +16
  57. ; dd 0
  58. ;
  59. ; Color value ; +20
  60. ; dd 0
  61.  
  62. ; First start flag ; +24
  63. ; dd 0 ; 0 - first start, 1 - subsequent starts
  64. ;
  65. ; Old colors ; +28
  66. ; rd 10
  67. ;
  68. ; Free area ; +68
  69. ;---------------------------------------------------------------------
  70.   use32
  71.   org    0x0
  72.  
  73.   db     'MENUET01'
  74.   dd     0x01
  75.   dd     START
  76.   dd     IM_END
  77.   dd     I_END
  78.   dd     stacktop
  79.   dd     param
  80.   dd     path
  81. ;---------------------------------------------------------------------
  82. include '../../macros.inc'
  83. include '../../develop/libraries/box_lib/load_lib.mac'
  84. include '../../develop/libraries/box_lib/trunk/box_lib.mac'
  85. ;include 'lang.inc'
  86. ;include '../../debug.inc'
  87. @use_library
  88. ;---------------------------------------------------------------------
  89. p_start_x = 10
  90. p_start_y = 10
  91.  
  92. p_size_x = 20
  93. p_size_y = 256
  94. ;--------------------------------------
  95. t_start_x = 40
  96. t_start_y = 10
  97. ;--------------------------------------
  98. w_start_x = 200
  99. w_start_y = 200
  100.  
  101. w_size_x = 400
  102. w_size_y = 350
  103. ;--------------------------------------
  104. c_start_x = t_start_x + p_size_y + 10
  105. c_start_y = 10
  106.  
  107. c_size_x = 40
  108. c_size_y = 20
  109. ;---------------------------------------------------------------------
  110. x_minimal_size equ 350
  111. y_minimal_size equ 250
  112. ;---------------------------------------------------------------------
  113. START:
  114.         mcall   68,11
  115.         mcall   66,1,1
  116.         mcall   40,0x27
  117. ;       mcall   40,0x7
  118.         call    get_communication_area
  119.         call    get_active_pocess
  120.         call    clear_colors_history
  121. ;--------------------------------------
  122. load_libraries  l_libs_start,end_l_libs
  123.         test    eax,eax
  124.         jnz     button.exit_2
  125. ;--------------------------------------
  126.         xor     eax,eax
  127.         mov     al,p_size_x
  128.         mov     [palette_SIZE_X],eax
  129.         mov     ax,p_size_y
  130.         mov     [palette_SIZE_Y],eax
  131.         mov     [tone_SIZE_X],eax
  132.         mov     [tone_SIZE_Y],eax
  133.         mov     eax,0xff0000
  134.         mov     [tone_color],eax
  135.         mov     [selected_color],eax
  136.         call    prepare_scrollbars_position_from_color
  137. ;--------------------------------------
  138.         mov     ecx,[palette_SIZE_Y]
  139.         imul    ecx,[palette_SIZE_X]
  140.         lea     ecx,[ecx*3]
  141.         inc     ecx     ;reserve for stosd
  142.         mcall   68,12
  143.         mov     [palette_area],eax
  144. ;--------------------------------------
  145.         call    create_palette
  146. ;--------------------------------------
  147.         mov     ecx,[tone_SIZE_Y]
  148.         imul    ecx,[tone_SIZE_X]
  149.         lea     ecx,[ecx*3]
  150.         inc     ecx     ;reserve for stosd
  151.         mcall   68,12
  152.         mov     [tone_area],eax
  153. ;--------------------------------------
  154.         call    create_tone
  155. ;---------------------------------------------------------------------
  156. align 4
  157. red:
  158.         call    draw_window
  159. ;---------------------------------------------------------------------
  160. align 4
  161. still:
  162.         mcall   10
  163.  
  164.         cmp     eax,1
  165.         je      red
  166.  
  167.         cmp     eax,2
  168.         je      key
  169.  
  170.         cmp     eax,3
  171.         je      button
  172.        
  173.         cmp     eax,6
  174.         je      mouse
  175.        
  176.         jmp     still
  177. ;---------------------------------------------------------------------
  178. align 4
  179. button:
  180.         mcall   17
  181.  
  182.         cmp     ah, 2
  183.         je      palette_button
  184.        
  185.         cmp     ah, 3
  186.         je      tone_button
  187.  
  188.         cmp     ah, 4
  189.         je      color_button
  190.        
  191.         cmp     ah, 30
  192.         jb      @f
  193.        
  194.         cmp     ah, 39
  195.         ja      @f
  196.        
  197.         sub     ah,30
  198.         movzx   eax,ah
  199.         shl     eax,2
  200.         add     eax,[communication_area]
  201.         add     eax,28
  202.         mov     eax,[eax]
  203.         mov     [selected_color],eax
  204.         call    prepare_scrollbars_position_from_color
  205.         call    draw_selected_color
  206.         call    draw_scrollbars
  207.         jmp     still
  208. ;--------------------------------------
  209. align 4
  210. @@:
  211.         cmp     ah, 1
  212.         jne     still
  213. ;--------------------------------------
  214. align 4
  215. .exit:
  216.         mov     eax,[communication_area]
  217.         mov     [eax],word 3
  218.         jmp     @f
  219. ; dps "CD flag value: cancel "
  220. ;--------------------------------------
  221. align 4
  222. .exit_1:
  223. ;--------------------------------------
  224.         call    scroll_colors_history
  225. ;--------------------------------------
  226. align 4
  227. @@:
  228. ;       mov     ax,[eax]
  229. ;       and     eax,0xffff
  230. ; dps "CD flag value: "
  231. ; dpd eax
  232. ; newline
  233.  
  234.         call    get_window_param
  235.         mov     ebx,[communication_area]
  236.         mov     ecx,procinfo
  237. ;       mov     eax,[window_x]
  238.         mov     eax,[ecx+34]
  239.         shl     eax,16
  240.         add     eax,[ecx+42]
  241.         mov     [ebx+4],eax
  242. ;       mov     eax,[window_y]
  243.         mov     eax,[ecx+38]
  244.         shl     eax,16
  245.         add     eax,[ecx+46]
  246.         mov     [ebx+8],eax
  247. ;--------------------------------------
  248. align 4
  249. .exit_2:
  250.         mcall   -1
  251. ;---------------------------------------------------------------------
  252. align 4
  253. get_window_param:
  254.         mcall   9,procinfo,-1
  255.         mov     eax,[ebx+66]
  256.         inc     eax
  257. ;       mov     [window_high],eax
  258.         mov     eax,[ebx+62]
  259.         inc     eax
  260. ;       mov     [window_width],eax
  261.         mov     eax,[ebx+70]
  262. ;       mov     [window_status],eax
  263.         ret
  264. ;---------------------------------------------------------------------
  265. align 4
  266. get_communication_area:
  267.         xor     eax,eax
  268.         mov     al,[param]
  269.         test    eax,eax
  270.         jz      @f
  271.         mcall   68,22,param,,0x01
  272.         mov     [communication_area],eax
  273. ;       movzx   ebx,word [eax+2]
  274. ;       mov     [color_dialog_type],ebx
  275.  
  276.         mov     ebx,[eax+4]
  277. ;       cmp     bx,word x_minimal_size ;300
  278. ;       jb      @f
  279.         mov     bx,510
  280.         mov     [window_x],ebx
  281.         mov     ebx,[eax+8]
  282. ;       cmp     bx,word y_minimal_size ;200
  283. ;       jb      @f
  284.         mov     bx,310
  285.         mov     [window_y],ebx
  286. @@:
  287.         ret
  288. ;---------------------------------------------------------------------
  289. align 4
  290. get_active_pocess:
  291.         mcall   9,procinfo,-1
  292.         mov     ecx,[ebx+30]    ; PID
  293.         mcall   18,21
  294.         mov     [active_process],eax    ; WINDOW SLOT
  295.         mov     ebx,[communication_area]       
  296.         test    ebx,ebx
  297.         jz      .1
  298.         mov     [ebx+12],eax    ; WINDOW SLOT to com. area
  299. .1:
  300.         ret
  301. ;---------------------------------------------------------------------
  302. align 4
  303. clear_colors_history:
  304.         mov     edi,[communication_area]
  305.         cmp     [edi+24],dword 1
  306.         je      @f
  307.         mov     [edi+24],dword 1
  308.         add     edi,28
  309.         mov     ecx,10
  310.         cld
  311.         mov     eax,0xffffff
  312.         rep     stosd
  313. @@:
  314.         ret
  315. ;---------------------------------------------------------------------
  316. align 4
  317. scroll_colors_history:
  318.         mov     edi,[communication_area]
  319.         add     edi,28
  320.         mov     eax,[selected_color]
  321.         cmp     [edi],eax
  322.         je      @f
  323.         mov     ecx,9
  324.         mov     esi,edi
  325.         add     esi,32
  326.         add     edi,36
  327.         std
  328.         rep     movsd
  329.         mov     edi,[communication_area]
  330.         mov     [edi+28],eax
  331. @@:
  332.         ret
  333. ;---------------------------------------------------------------------
  334. align 4
  335. palette_button:
  336.         mcall   37,1
  337.         and     eax,0xffff
  338.         sub     eax,p_start_y
  339.         imul    eax,p_size_x
  340.         lea     eax,[eax+eax*2]
  341.         add     eax,[palette_area]
  342.         mov     eax,[eax]
  343.         mov     [tone_color],eax
  344.         mov     [selected_color],eax
  345.         call    prepare_scrollbars_position_from_color
  346.         call    create_and_draw_tone
  347.         call    draw_selected_color
  348.         call    draw_scrollbars
  349.         jmp     still
  350. ;---------------------------------------------------------------------
  351. align 4
  352. tone_button:
  353.         mcall   37,1
  354.         mov     ebx,eax
  355.         and     eax,0xffff
  356.         shr     ebx,16
  357.         sub     eax,t_start_y
  358.         imul    eax,p_size_y
  359.         sub     ebx,t_start_x
  360.         add     eax,ebx
  361.         lea     eax,[eax+eax*2]
  362.         add     eax,[tone_area]
  363.         mov     eax,[eax]
  364.         mov     [selected_color],eax
  365.         call    prepare_scrollbars_position_from_color
  366.         call    draw_selected_color
  367.         call    draw_scrollbars
  368.         jmp     still
  369. ;---------------------------------------------------------------------
  370. align 4
  371. color_button:
  372.         mov     eax,[communication_area]
  373.         mov     [eax],word 1
  374.         mov     ebx,[selected_color]
  375.         and     ebx,0xffffff
  376.         mov     [eax+20],ebx
  377. ; dps "CD flag value: OK "
  378.         jmp     button.exit_1
  379. ;---------------------------------------------------------------------
  380. align 4
  381. prepare_scrollbars_position_from_color:
  382. ; in: eax = selected color
  383.         movzx   ebx,al
  384.         mov     [scroll_bar_data_blue.position],ebx
  385.         shr     eax,8
  386.         mov     bl,al
  387.         mov     [scroll_bar_data_green.position],ebx
  388.         shr     eax,8
  389.         mov     bl,al
  390.         mov     [scroll_bar_data_red.position],ebx
  391.         ret
  392. ;---------------------------------------------------------------------
  393. align 4
  394. prepare_color_from_scrollbars_position:
  395. ; out: ebx = selected color
  396.         mov     eax,[scroll_bar_data_red.position]
  397.         movzx   ebx,al
  398.         shl     ebx,8
  399.         mov     eax,[scroll_bar_data_green.position]
  400.         mov     bl,al
  401.         shl     ebx,8
  402.         mov     eax,[scroll_bar_data_blue.position]
  403.         mov     bl,al
  404.         ret
  405. ;--------------------------------------------------------------------- 
  406. align 4
  407. key:
  408.         mcall   2
  409.         jmp     still
  410. ;---------------------------------------------------------------------
  411. align 4
  412. mouse:
  413.         cmp     [scroll_bar_data_red.delta2],0
  414.         jne     .red
  415.         cmp     [scroll_bar_data_green.delta2],0
  416.         jne     .green
  417.         cmp     [scroll_bar_data_blue.delta2],0
  418.         jne     .blue  
  419. ;--------------------------------------
  420. align 4
  421. .red:
  422.         push    dword scroll_bar_data_red
  423.         call    [scrollbar_ver_mouse]
  424.         cmp     [scroll_bar_data_red.delta2],0
  425.         jne     @f
  426. ;--------------------------------------
  427. align 4
  428. .green:
  429.         push    dword scroll_bar_data_green
  430.         call    [scrollbar_ver_mouse]
  431.         cmp     [scroll_bar_data_green.delta2],0
  432.         jne     @f
  433. ;--------------------------------------
  434. align 4
  435. .blue:
  436.         push    dword scroll_bar_data_blue
  437.         call    [scrollbar_ver_mouse]
  438. ;       cmp     [scroll_bar_data_blue.delta2],0
  439. ;       jne     @f
  440. ;--------------------------------------
  441. align 4
  442. @@:
  443.         call    prepare_color_from_scrollbars_position
  444.         cmp     [selected_color],ebx
  445.         je      still
  446.         mov     [selected_color],ebx
  447.         call    draw_selected_color
  448.         jmp     still
  449. ;---------------------------------------------------------------------
  450. align 4
  451. draw_selected_color:
  452.         mcall   13,<c_start_x,c_size_x>,<c_start_y,c_size_y>,[selected_color]
  453.         mcall   13,<c_start_x+c_size_x+10,c_size_x>,<c_start_y,c_size_y>,0xffffff
  454.         mov     ecx,[selected_color]
  455.         and     ecx,0xffffff
  456.         mcall   47,0x00060100,,<c_start_x+c_size_x+13,c_start_y+(c_size_y-6)/2>,0
  457.         ret
  458. ;---------------------------------------------------------------------
  459. align 4
  460. create_and_draw_tone:
  461.         call    create_tone
  462.         call    draw_tone
  463.         ret
  464. ;---------------------------------------------------------------------
  465. align 4
  466. draw_tone:
  467.         mcall   65,[tone_area],<[tone_SIZE_X],[tone_SIZE_Y]>,<t_start_x,t_start_y>,24
  468.         ret
  469. ;---------------------------------------------------------------------
  470. draw_scrollbars:
  471.         push    dword scroll_bar_data_red
  472.         call    [scrollbar_ver_draw]
  473.         push    dword scroll_bar_data_green
  474.         call    [scrollbar_ver_draw]
  475.         push    dword scroll_bar_data_blue
  476.         call    [scrollbar_ver_draw]
  477.         ret
  478. ;---------------------------------------------------------------------
  479. align 4
  480. draw_history_frame:
  481.         mov     [frame_data.x],dword (c_start_x+c_size_x*2+10*2)*65536+80
  482.         mov     [frame_data.y],dword (p_start_y+5)*65536+(p_size_y-5)
  483.  
  484.         mov     [frame_data.draw_text_flag],dword 1
  485.        
  486.         mov     [frame_data.text_pointer],dword history_text
  487.         push    dword frame_data
  488.         call    [Frame_draw]
  489.         ret
  490. ;---------------------------------------------------------------------
  491. align 4
  492. draw_button_row:
  493.         mov     edx,0x60000000 + 30             ; BUTTON ROW
  494. ;       mov     ebx,220*65536+14
  495.         mov     ebx,(c_start_x+c_size_x*2+10*3)*65536+14
  496.         mov     ecx,25*65536+14
  497.         mov     eax,8
  498. ;-----------------------------------
  499. align 4
  500. .newb:
  501.         mcall
  502.         add     ecx,24*65536
  503.         inc     edx
  504.         cmp     edx,0x60000000 + 39
  505.         jbe     .newb
  506.         ret
  507. ;---------------------------------------------------------------------
  508. align 4
  509. draw_color_value:
  510.         mov     ebx,(c_start_x+c_size_x*3+10)*65536+(c_size_x-1)
  511.         mov     ecx,28*65536+11
  512.         mov     edx,0xffffff
  513.         mov     eax,13
  514.         mov     edi,10
  515.         mov     esi,[communication_area]
  516.         add     esi,28
  517. ;-----------------------------------
  518. align 4
  519. @@:    
  520.         mcall
  521.         pusha
  522.         mov     edx,ebx
  523.         add     edx,2 shl 16
  524.         shr     ecx,16
  525.         mov     dx,cx
  526.         add     dx,2
  527.         mov     ecx,[esi]
  528.         and     ecx,0xffffff
  529.         mcall   47,0x00060100,,,0
  530.         popa
  531.        
  532.         add     ecx,24*65536
  533.         add     esi,4
  534.         dec     edi
  535.         jnz     @b
  536.  
  537.         ret
  538. ;---------------------------------------------------------------------
  539. align 4
  540. draw_colours:
  541.         mov     edi,10
  542.         mov     esi,[communication_area]
  543.         add     esi,28
  544. ;       mov     ebx,220*65536+14
  545.         mov     ebx,(c_start_x+c_size_x*2+10*3)*65536+14
  546.         mov     ecx,27*65536+14
  547.         mov     eax,13
  548.         mov     [frame_data.draw_text_flag],dword 0
  549. ;--------------------------------------
  550. align 4
  551. newcol:
  552.         mov     edx,[esi]
  553.         mcall
  554.  
  555.         push    ebx ecx
  556.  
  557.         sub     ebx,2 shl 16
  558.         add     bx,4
  559.         sub     ecx,2 shl 16
  560.         add     cx,4
  561.        
  562.         mov     [frame_data.x],ebx
  563.         mov     [frame_data.y],ecx     
  564.  
  565.         push    dword frame_data
  566.         call    [Frame_draw]
  567.  
  568.         pop     ecx ebx
  569.  
  570.         add     ecx,24*65536
  571.         add     esi,4
  572.        
  573.         dec     edi
  574.         jnz     newcol
  575.  
  576.         ret
  577. ;----------------------------------------------------------------------
  578. align 4
  579. draw_window:
  580.         mcall   12,1
  581. ;       mcall   0, <w_start_x,w_size_x>, <w_start_y,w_size_y>, 0x33AABBCC,,title
  582.         xor     esi,esi
  583.         mcall   0,[window_x],[window_y], 0x34AABBCC,,title
  584.         mcall   8,<p_start_x,[palette_SIZE_X]>,<p_start_y,[palette_SIZE_Y]>,0x60000002
  585.         mcall   ,<t_start_x,[tone_SIZE_X]>,<t_start_y,[tone_SIZE_Y]>,0x60000003
  586.         mcall   ,<c_start_x,c_size_x>,<c_start_y,c_size_y>,0x60000004
  587.         xor     ebp,ebp
  588.         mcall   65,[palette_area],<[palette_SIZE_X],[palette_SIZE_Y]>,<p_start_x,p_start_y>,24
  589.         call    draw_tone
  590.         call    draw_selected_color
  591.         xor     eax,eax
  592.         inc     eax
  593.         mov     [scroll_bar_data_red.all_redraw],eax
  594.         mov     [scroll_bar_data_green.all_redraw],eax
  595.         mov     [scroll_bar_data_blue.all_redraw],eax
  596.         call    draw_scrollbars
  597.         call    draw_history_frame
  598.         call    draw_button_row
  599.         call    draw_colours
  600.         call    draw_color_value
  601.         mcall   12,2
  602.         ret
  603. ;---------------------------------------------------------------------
  604. include 'palette.inc'
  605. ;---------------------------------------------------------------------
  606. include 'tone.inc'
  607. ;---------------------------------------------------------------------
  608. include 'i_data.inc'
  609. ;---------------------------------------------------------------------
  610. IM_END:
  611. ;---------------------------------------------------------------------
  612. include 'u_data.inc'
  613. ;---------------------------------------------------------------------
  614. I_END:
  615. ;---------------------------------------------------------------------