Subversion Repositories Kolibri OS

Rev

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

  1. ;#___________________________________________________________________________________________________
  2. ;****************************************************************************************************|
  3. ; Program Palitra (c) Sergei Steshin (Akyltist)                                                      |
  4. ;----------------------------------------------------------------------------------------------------|
  5. ;; Charset:DOS-866 Font:Courier New Size:9pt                                                         |
  6. ;.....................................................................................................
  7. ;; compiler:     FASM 1.69.31                                                                        |
  8. ;; version:      0.3.0                                                                               |
  9. ;; last update:  08/11/2012                                                                          |
  10. ;; e-mail:       dr.steshin@gmail.com                                                                |
  11. ;.....................................................................................................
  12. ;; History:                                                                                          |
  13. ;; 0.1.0 - Первая версия программы.                                                                  |
  14. ;; 0.2.0 - Исправлено попадание в сетку, берется ближайший по диагонали пиксель.                     |
  15. ;;       - Добавлены ползунки, для регулирования rgb составляющих цвета и вывод этих составляющих.   |
  16. ;;       - Убран вывод цвета в бинарном виде (пока за не надобностью и не актуальностью).            |
  17. ;;       - Мелкая косметика.                                                                         |
  18. ;; 0.3.0 - Добавлено переключение видов цветовых схем (кнопка NEXT)                                  |
  19. ;;       - Улучшены ползунки, производится обработка нажатия рядом с ползунком.                      |
  20. ;;       - Число сеток в цветовой схеме уменьшено с 6 до 4 (кратность 256, иначе дублирование цвета).|
  21. ;;       - Мелкая косметика.                                                                         |
  22. ;; 0.4.0 - Добавлено переключение между двумя цветами                                                |
  23. ;;       - Добавлен ползунок регулирования прозрачности (без визуализации).                          |
  24. ;;       - Добавлено выравнивание значений rgba по центру, в зависимости от длинны.                  |
  25. ;;       - Косметические правки.                                                                     |
  26. ;;       - Небольшая оптимизация.                                                                    |
  27. ;; 0.5.0 - Добавлена кнопка смены фона рабочего стола (от Leency).                                   |
  28. ;;       - Добавлено изменение фона рабочего стола градиентной заливкой.                             |
  29. ;;       - Косметические правки.                                                                     |
  30. ;;       - Небольшая деоптимизация.                                                                  |
  31. ;; 0.6.0 - Добавлена возможность запуска с параметрами                                               |
  32. ;;       - Добавлен режим H (hidden) производит замену фона рабочего стола градиентной заливкой.     |
  33. ;;       - Большая деоптимизация.                                                                    |
  34. ;; 0.7.0 - Добавлена пипетка - выбор на среднюю кнопку мыши                                          |
  35. ;.....................................................................................................
  36. ;; All rights reserved.                                                                              |
  37. ;;                                                                                                   |
  38. ;; Redistribution and use in source and binary forms, with or without modification, are permitted    |
  39. ;; provided that the following conditions are met:                                                   |
  40. ;;       * Redistributions of source code must retain the above copyright notice, this list of       |
  41. ;;         conditions and the following disclaimer.                                                  |
  42. ;;       * Redistributions in binary form must reproduce the above copyright notice, this list of    |
  43. ;;         conditions and the following disclaimer in the documentation and/or other materials       |
  44. ;;         provided with the distribution.                                                           |
  45. ;;       * Neither the name of the <organization> nor the names of its contributors may be used to   |
  46. ;;         endorse or promote products derived from this software without specific prior written     |
  47. ;;         permission.                                                                               |
  48. ;;                                                                                                   |
  49. ;; THIS SOFTWARE IS PROVIDED BY Sergei Steshin ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,      |
  50. ;; INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A        |
  51. ;; PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY DIRECT, |
  52. ;; INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED    |
  53. ;; TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS       |
  54. ;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
  55. ;; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  |
  56. ;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                      |
  57. ;....................................................................................................|
  58.  
  59.  
  60. ;#___________________________________________________________________________________________________
  61. ;****************************************************************************************************|
  62. ; ЗАГОЛОВОК ИСПОЛНЯЕМОГО ФАЙЛА ПРИЛОЖЕНИЯ ДЛЯ КОЛИБРИ ОС                                             |
  63. ;----------------------------------------------------------------------------------------------------/
  64.   use32
  65.   org    0x0
  66.   db     'MENUET01'
  67.   dd     0x01
  68.   dd     START
  69.   dd     I_END
  70.   dd     I_END+4096
  71.   dd     I_END+4096
  72.   dd     params
  73.   dd     0x0
  74.  
  75.   include '..\..\..\macros.inc'
  76.  
  77.   WIN_W equ 295            ; ширина окна
  78.   WIN_H equ 195            ; высота окна
  79.   WIN_X equ 250            ; координата х окна
  80.   WIN_Y equ 190            ; координата у окна
  81.  
  82. panel:
  83.   file "panel.raw"
  84.  
  85. START:
  86.     mcall   68,11                         ; инициализация кучи
  87.     mcall   40,0x27                       ; устанавливаем маску событий
  88.     include 'params_init.inc'             ; обработка параметров командной строки
  89.  
  90. ;#___________________________________________________________________________________________________
  91. ;****************************************************************************************************|
  92. ; ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ - ОБРАБОТКА СОБЫТИЙ                                                        |
  93. ;----------------------------------------------------------------------------------------------------/
  94. red:
  95.     call draw_main                        ; вызываем перерисовку окна приложения
  96. still:
  97.     mcall   10                            ; функция 10 - ждать события
  98.     cmp     eax,1                         ; перерисовать окно ?
  99.     je      red                           ; если да - на метку red
  100.     cmp     eax,2                         ; нажата клавиша ?
  101.     je      key                           ; если да - на key
  102.     cmp     eax,3                         ; нажата кнопка ?
  103.     je      button                        ; если да - на button
  104.     cmp     eax,6                         ; событие от мыши вне окна
  105.     je      mouse                         ; если да - на button
  106.     jmp     still                         ; если другое событие - в начало цикла
  107. ;end_still
  108.  
  109. key:                                      ; нажата клавиша на клавиатуре
  110.     mcall   2                             ; функция 2 - считать код символа (в ah) (тут в принципе не нужна)
  111.     jmp     still                         ; вернуться к началу цикла
  112. ;end_key
  113.  
  114. mouse:
  115.     mov     eax,[renmode]
  116.     cmp     eax,2
  117.     jnz     still
  118.     call    cyrcle_draw
  119.     mcall   37,2
  120.     cmp     al,100b
  121.     jne     still
  122.     mov     [color],edx
  123.     call    draw_result
  124.     jmp     still                         ; вернуться к началу цикла
  125. ;end_mouse
  126.  
  127. button:
  128.     mcall   17                            ; 17 - получить идентификатор нажатой кнопки
  129.     cmp     ah, 1                         ; если нажата кнопка с номером 1,
  130.     jz      bexit                         ; выходим
  131.   ;обработка кнопки Next
  132.     cmp     ah, 12                        ; если нажата кнопка NEXT
  133.     jne     next_bg                       ; выходим
  134.     inc     [pnext]                       ; увеличиваем при нажатии номер палитры
  135.     mov     [renmode],0                   ; включаем цветовые схемы
  136.     mov     eax,[pnext]                   ; заносим значение в еах
  137.     cmp     al,6                          ; сравниваем с заявленным количеством палитр
  138.     jne     next_redraw                   ; если не больше максимума то на вызов отрисовки
  139.     xor     eax,eax                       ; иначе зануляем палитру на default
  140.     mov     [pnext],eax                   ; и запоминаем что сбросили палитру на default
  141.   next_redraw:
  142.     call    draw_palitra                  ; РИСУЕМ ПАЛИТРУ
  143.     jmp     still                         ; Уходим на ожидание другого события
  144.   next_bg:
  145.     cmp     ah, 14                        ; Кнопка BACKGROUND
  146.     jne     circle_bg                     ; если не нажата то выходим
  147.     call    set_background                ; иначе устанавливаем фон
  148.     jmp     still                         ; и на ожидание события
  149.   circle_bg:
  150.     cmp     ah, 15                        ; Кнопка Круговая палитра
  151.     jne     next_end                      ; если не нажата то выходим
  152.     mov     [renmode],2                   ; включаем отрисовку круговой палитры
  153.     call    draw_palitra                  ; РИСУЕМ ПАЛИТРУ
  154.     jmp     still                         ; и на ожидание события
  155.   next_end:
  156.     cmp     ah,13                         ; COLOR SWAP
  157.     jne     color_swap_end
  158.     push    [color2]
  159.     push    [color]
  160.     pop     [color2]
  161.     pop     [color]
  162.     call    draw_result
  163.     jmp     still                         ; И уходим на ожидание другого события
  164.   color_swap_end:
  165.     cmp     ah, 7                         ; Проверяем нажата кнопка с ID=7
  166.     jne     color_button                  ; Если не нажата, то идём дальше
  167.     call    mouse_get                     ; Иначе включаем обработчик мыши, чтобы считать значение цвета с палитры
  168.     jmp     still                         ; И уходим на ожидание другого события
  169.   color_button:                           ; РАСЧЁТ координат для ползунков RGBA
  170.     push    eax                           ; запоминаем еах
  171.     call    mouse_local                   ; получаем локальные координаты
  172.     mov     ebx,137                       ; нижняя граница ползунка по У
  173.     mov     ecx,[mouse_y]                 ; занисим в есх значение курсора по У
  174.     sub     ebx,ecx                       ; находим разность (т.е. куда смещается ползунок)
  175.     mov     ecx,3                         ; заносим в есх цифру 3 (256/3=85, где 85-высота ползунков)
  176.     imul    ecx,ebx                       ; находим истинный параметр цвета с учётом масштаба ползунка---+
  177.     pop     eax                           ; восстанавливаем еах                                          :
  178.   ;red_button:                            ; Красный Трекбар                                              :
  179.     cmp     ah, 8                         ; ID=8                                                         :
  180.     jne     green_button                  ; если нет, то проверяем зелёный трекбар                       :
  181.     mov     [cred],cl                     ; иначе присваиваем значение, красному цвету спектра    <------+
  182.     call    set_spectr                    ; устанавливаем спектр
  183.     jmp     still                         ; Уходим на ожидание другого события
  184.   green_button:
  185.     cmp     ah, 9
  186.     jne     blue_button
  187.     mov     [cgreen],cl
  188.     call    set_spectr
  189.     jmp     still                         ; Уходим на ожидание другого события
  190.   blue_button:
  191.     cmp     ah, 10
  192.     jne     alpha_button
  193.     mov     [cblue],cl
  194.     call    set_spectr
  195.     jmp     still                         ; Уходим на ожидание другого события
  196.   alpha_button:
  197.     cmp     ah, 11
  198.     jne     still
  199.     mov     [calpha],cl
  200.     call    set_spectr
  201.     jmp     still                         ; Уходим на ожидание другого события
  202.   bexit:
  203.     mcall -1                              ; иначе конец программы
  204. ;end_button
  205.  
  206. ;#___________________________________________________________________________________________________
  207. ;****************************************************************************************************|
  208. ; ГЛАВНЫЙ МОДУЛЬ ОТРИСОВКИ ОКНА И ЭЛЕМЕНТОВ ПРИЛОЖЕНИЯ                                               |
  209. ;----------------------------------------------------------------------------------------------------/
  210. draw_main:
  211.     mov     eax,12                        ; функция 12: означает, что будет рисоваться окно
  212.     mov     ebx,1                         ; 1,начало рисования
  213.     int     0x40                          ; Прерывание
  214.  
  215.     mov     eax,48                        ; Функция 48 - стили отображения окон
  216.     mov     ebx,3                         ; Подфункция 3 - получить стандартные цвета окон.
  217.     mov     ecx,sc                        ; Указатель на буфер размером edx байт, под структуру
  218.     mov     edx,sizeof.system_colors      ; Размер таблицы цветов (должен быть 40 байт)
  219.     int     0x40                          ; Прерывание
  220.  
  221.     mov     eax,48                        ; Функция 48 - стили отображения окон.
  222.     mov     ebx,4                         ; Подфункция 4 - возвращает eax = высота скина.
  223.     int     0x40                          ; Прерывание
  224.     mov     ecx,eax                       ; Запоминаем высоту скина
  225.  
  226.     mov     edi,[runmode]
  227.     cmp     edi,2
  228.     jne     no_hiddenmode
  229.     mov     edi,hidden
  230.     jmp     set_title
  231.   no_hiddenmode:
  232.     cmp     edi,3
  233.     jne     no_dialogmode
  234.     mov     edi,hidden
  235.     jmp     set_title
  236.   no_dialogmode:
  237.     mov     edi,title                     ; Заголовок окна
  238.   set_title:
  239.  
  240.     xor     eax,eax                       ; Очищаем eax (mov eax,0) (Функция 0)
  241.     mov     ebx,WIN_X shl 16+WIN_W        ; [координата по оси x]*65536 + [размер по оси x]
  242.     add     ecx,WIN_Y shl 16+WIN_H        ; Высота скина + [координата по y]*65536 + [размер по y] (168 для версии 0.2)
  243.     mov     edx,[sc.work]                 ; Видимо стиль окна по дефолту
  244.     or      edx,0x34000000                ; Или окно со скином фиксированных размеров
  245.    
  246.     int     0x40                          ; Прерывание
  247.  
  248.  
  249.     call    draw_palitra                  ; РИСУЕМ ПАЛИТРУ
  250.     call    draw_result                   ; РИСУЕМ РЕЗУЛЬТАТ
  251.  
  252.     mov     eax,8                         ; Функция 8 - определить/удалить кнопку
  253.     mov     ebx,110 shl 16+147            ; Начальные координаты по х [к-та x]*65536 + [размер]
  254.     mov     ecx,9 shl 16+147              ; Начальные координаты по y [к-та y]*65536 + [размер]
  255.     mov     edx,0x60000007                ; Начальное ID кнопок - 0xXYnnnnnn
  256.     int     0x40
  257.  
  258.     mov     ebx,13 shl 16+12              ; Начальные координаты по х [к-та x]*65536 + [размер]
  259.     mov     edx,0x60000008                ; ID = 8
  260.     mov     ecx,51 shl 16+85              ; Начальные координаты по y [к-та y]*65536 + [размер]
  261.     int     0x40                          ; Рисуем невидимую кнопку под слайдером red
  262.     add     ebx,23 shl 16                 ; Добавляем
  263.     inc     edx                           ; ID = 9
  264.     int     0x40                          ; Рисуем невидимую кнопку под слайдером green
  265.     add     ebx,23 shl 16                 ; Добавляем
  266.     inc     edx                           ; ID = 10
  267.     int     0x40                          ; Рисуем невидимую кнопку под слайдером blue
  268.     add     ebx,23 shl 16                 ; Добавляем
  269.     inc     edx                           ; ID = 11
  270.     int     0x40                          ; Рисуем невидимую кнопку под слайдером alpha
  271.  
  272.     mov     eax,8                         ; Функция 8 - определить/удалить кнопку (СМЕНА ЦВЕТА)
  273.     mov     ebx,11 shl 16+20              ; Начальные координаты по х [к-та x]*65536 + [размер]
  274.     mov     ecx,12 shl 16+20              ; Начальные координаты по y [к-та y]*65536 + [размер]
  275.     mov     edx,0x6000000D                ; ID = 13
  276.     int     0x40
  277.  
  278.     call    draw_bottom_panel
  279.     call    draw_left_panel
  280.  
  281.     mov     eax,12                        ; функция 12: означает, что будет рисоваться окно
  282.     mov     ebx,2                         ; 2 - конец рисования
  283.     int     0x40                          ; Прерывание
  284.     ret
  285.  
  286. ;#___________________________________________________________________________________________________
  287. ;****************************************************************************************************|
  288. ; БЛОК ВСПОМОГАТЕЛЬНЫХ ПРОЦЕДУР И ФУНКЦИЙ ПРИЛОЖЕНИЯ                                                 |
  289. ;----------------------------------------------------------------------------------------------------/
  290.  
  291.  
  292.     ;------------------------------------------------------------------------------------------------+
  293.     draw_left_panel:                      ; Отрисовка боковой панели
  294.     ;.................................................................................................
  295.     mov     eax,8                         ; button_next_colorsheme
  296.     mov     ebx,266 shl 16+16             ; [x] + [size]
  297.     mov     ecx,9 shl 16+16               ; [y] + [size]
  298.     mov     edx,0x6000000C                ; ID = 12
  299.     mov     esi,[sc.work_button]          ; RGB
  300.     int     0x40                          ; call
  301.     ; circle diagram
  302.     add     ecx,19 shl 16                 ; move rect
  303.     mov     edx,0x6000000F                ; ID = 15
  304.     int     0x40                          ; call
  305.  
  306.     mov     eax,7                         ; 7 - номер функции
  307.     mov     ebx,panel                     ; указатель на изображение в формате BBGGRRBBGGRR...
  308.     mov     ecx, 16 shl 16 + 149          ; [размер по оси x]*65536 + [размер по оси y]
  309.     mov     edx,266 shl 16 +   9            ; [координата по оси x]*65536 + [координата по оси y]
  310.     int     0x40
  311.  
  312.     ;mov     eax,13                        ; draw rect
  313.     ;mov     ebx,266 shl 16+16             ; [x] + [size]
  314.     ;mov     ecx,9 shl 16+16               ; [y] + [size]
  315.     ;mov     edx,0x666666                  ; RGB
  316.     ;push    esi                           ; backup esi
  317.     ;mov     esi,8                         ; counter=8
  318.     ;draw_lpanel:                          ; loop label
  319.     ;  int     0x40                        ; call draw black rect
  320.     ;  add     ecx,19 shl 16               ; move rect
  321.     ;  dec     esi                         ; decrement counter
  322.     ;  cmp     esi,0                       ; if counter!=zero
  323.     ;  jne     draw_lpanel                 ; then goto label
  324.     ;  mov     esi,8                       ; else counter=8
  325.     ;  mov     ebx,267 shl 16+14           ; [x] + [size]
  326.     ;  mov     ecx,10 shl 16+14            ; [y] + [size]
  327.     ;  mov     edx,0xF3F3F3                ; RGB
  328.     ;draw_lpanel2:                         ; 2 loop label
  329.     ;  int     0x40                        ; call draw white rect
  330.     ;  add     ecx,19 shl 16               ; move rect
  331.     ;  dec     esi                         ; decrement counter
  332.     ;  cmp     esi,0                       ; if counter!=0
  333.     ;  jne     draw_lpanel2                ; then goto label2
  334.     ;pop     esi                           ; restore esi
  335.     ; draw_left_arrow for button_next_colorsheme
  336.     ;mov     eax,4                         ; Write string
  337.     ;mov     ebx,272 shl 16+13             ; [x] + [y]
  338.     ;mov     ecx,0x0                       ; RGB
  339.     ;mov     edx,larrow                    ; string pointer
  340.     ;mov     esi,1                         ; count symbol
  341.     ;int     0x40                          ; call
  342.     ;mov     eax,38                        ; draw line
  343.     ;mov     ebx,270 shl 16+272            ; [start x] + [end x]
  344.     ;mov     ecx,16 shl 16+16              ; [start y] + [end y]
  345.     ;mov     edx,0x0                       ; RGB
  346.     ;int     0x40                          ; call
  347.     ret                                   ; return
  348.     ;.................................................................................................
  349.  
  350.  
  351.     ;------------------------------------------------------------------------------------------------+
  352.     draw_bottom_panel:                    ; Отрисовка нижней панели
  353.     ;.................................................................................................
  354.     mov     eax,8                         ; draw button
  355.     mov     ebx,92 shl 16+100             ; [x] + [size]
  356.     mov     ecx,169 shl 16+16             ; [y] + [size]
  357.     mov     edx,14                        ; ID = 14
  358.     mov     esi,[sc.work_button]          ; RGB
  359.     int     0x40                          ; call
  360.     mov     eax,4                         ; Write string
  361.     mov     ebx,113 shl 16+174            ; [x] + [y]
  362.     mov     ecx,[sc.work_button_text]     ; RGB
  363.     mov     edx,bground                   ; string pointer
  364.     mov     esi,10                        ; count symbol
  365.     int     0x40                          ; call
  366.     mov     eax,38                        ; draw line
  367.     mov     ebx,4 shl 16+282              ; [start x] + [end x]
  368.     mov     ecx,163 shl 16+163            ; [start y] + [end y]
  369.     mov     edx,0x00666666                ; RGB
  370.     int     0x40                          ; call
  371.     ret                                   ; return
  372.     ;.................................................................................................
  373.  
  374. mouse_global:
  375.     ;.................................................................................................
  376.     ; Получаем координаты мыши
  377.     ;.................................................................................................
  378.     mov     eax,37                        ; Функция 37 - работа с мышью
  379.     mov     ebx,0                         ; нам нужны глобальные координаты
  380.     int     0x40                          ; eax = x*65536 + y, (x,y)=координаты курсора мыши
  381.     mov     ecx,eax                       ;
  382.     shr     ecx,16                        ; ecx = x+1
  383.     movzx   edx,ax                        ; edx = y+1
  384.     dec     ecx                           ; ecx = x
  385.     dec     edx                           ; edx = y
  386.     mov     [mouse_x],ecx                 ; mouse_x = x
  387.     mov     [mouse_y],edx                 ; mouse_y = y
  388.     ret                                   ; Возвращаем управление
  389. ;end_mouse_global
  390.  
  391. mouse_local:
  392.     ;.................................................................................................
  393.     ; Получаем координаты мыши относительно окна
  394.     ;.................................................................................................
  395.     mov     eax,37                        ; Функция 37 - работа с мышью
  396.     mov     ebx,1                         ; нам нужны глобальные координаты
  397.     int     0x40                          ; eax = x*65536 + y, (x,y)=координаты курсора мыши
  398.     mov     ecx,eax                       ;
  399.     shr     ecx,16                        ; ecx = x+1
  400.     movzx   edx,ax                        ; edx = y+1
  401.     dec     ecx                           ; ecx = x
  402.     dec     edx                           ; edx = y
  403.     mov     [mouse_x],ecx                 ; mouse_x = x
  404.     mov     [mouse_y],edx                 ; mouse_y = y
  405.     ret                                   ; Возвращаем управление
  406. ;end_mouse_local
  407.  
  408. set_background:
  409.     ;.................................................................................................
  410.     ; Устанавливает фон рабочего стола
  411.     ;.................................................................................................
  412.     mov     eax,15                        ; Функция 15 - работа с фоновой графикой
  413.     mov     ebx,4                         ; Подфункция 4 - установить режим отрисовки фона.
  414.     mov     ecx,2                         ; Режим отрисовки - замостить (1)
  415.     int     0x40                          ; Вызываем
  416.  
  417.     mov     eax,15                        ; Функция 15 - работа с фоновой графикой
  418.     mov     ebx,1                         ; Подфункция 1 - установить размер фонового изображения.
  419.     mov     ecx,2                         ; Ширина изображения
  420.     mov     edx,2                         ; Высота изображения
  421.     int     0x40                          ; Вызываем
  422.  
  423.     mov     eax,[color]
  424.     mov     [cm+0],al
  425.     mov     [cm+9],al
  426.     shr     eax,8
  427.     mov     [cm+1],al
  428.     mov     [cm+10],al
  429.     shr     eax,8
  430.     mov     [cm+2],al
  431.     mov     [cm+11],al
  432.  
  433.     mov     eax,[color2]
  434.     mov     [cm+3],al
  435.     mov     [cm+6],al
  436.     shr     eax,8
  437.     mov     [cm+4],al
  438.     mov     [cm+7],al
  439.     shr     eax,8
  440.     mov     [cm+5],al
  441.     mov     [cm+8],al
  442.  
  443.     mov     eax,15                        ; Функция 15 - работа с фоновой графикой
  444.     mov     ebx,5                         ; Подфункция 5 - поместить блок пикселей на фон.
  445.     mov     ecx,cm                      ; Указатель на данные в формате BBGGRRBBGGRR
  446.     mov     edx,0                         ; Cмещение в данных фонового изображения
  447.     mov     esi,3*4                      ; Размер данных в байтах = 3 * число пикселей
  448.     int     0x40                          ; Вызываем
  449.  
  450.     mov     eax,15                        ; Функция 15 - работа с фоновой графикой
  451.     mov     ebx,3                         ; Подфункция 3 - перерисовать фон.
  452.     int     0x40                          ; Вызываем
  453.  
  454.     ret
  455. ;end_set_background
  456.  
  457. desktop_get:
  458.     ;.................................................................................................
  459.     ; Определяем ширину экрана
  460.     ;.................................................................................................
  461.     mov     eax,14                        ; Определяем ширину экрана (eax = [xsize]*65536 + [ysize])
  462.     int     0x40                          ; xsize = размер по горизонтали - 1
  463.     mov     ebx,eax                       ;
  464.     shr     ebx,16                        ; ebx = xsize-1
  465.     movzx   edx,ax                        ; edx = ysize-1 (лишний код)
  466.     inc     ebx                           ; ebx = xsize
  467.     inc     edx                           ; edx = ysize (лишний код)
  468.     mov     [desctop_w],ebx
  469.     mov     [desctop_h],edx
  470.     ret
  471. ;end_desktop_get
  472.  
  473. mouse_get:
  474.     mov     esi,2                         ; КОСТЫЛЬ: флаг для избежания зацикливания
  475.     call    mouse_global
  476.     call    desktop_get
  477.     re_mouse_loop:                        ; КОСТЫЛЬ: метка для возврата если попали в сетку
  478.       mov     ebx,[desctop_w]
  479.       imul    ebx,[mouse_y]               ; ebx = y*xsize
  480.       add     ebx,[mouse_x]               ; ebx = y*xsize+x
  481.  
  482.       ;.................................................................................................
  483.       ; Берем цвет с палитры в переменную
  484.       ;.................................................................................................
  485.       mov     eax,35                      ; Функция взятия цвета
  486.       ;mov     ebx,ecx                    ;; ebx = y*xsize+x (лишний код)
  487.       int     0x40                        ; Получаем цвет в eax
  488.       cmp     eax,[sc.work]               ; Сравниваем с фоном приложения
  489.       je      mouse_err                   ; Если это он - то ничего не делаем
  490.       cmp     eax,0x222222                ; Сравниваем с цветом сетки
  491.       je      mouse_err                   ; Если это он - то ничего не делаем
  492.       jmp     mouse_set                   ; КОСТЫЛЬ: прыгаем чтобы не брать цвет сетки
  493.     mouse_err:                            ; КОСТЫЛЬ: если попали в сетку или фон
  494.       inc     [mouse_y]                   ; КОСТЫЛЬ: смещаем по диагонали сначала по х
  495.       inc     [mouse_x]                   ; КОСТЫЛЬ: смещаем по диагонали потом по у
  496.       dec     esi                         ; КОСТЫЛЬ: Уменьшаем флаг
  497.       cmp     esi,0                       ; КОСТЫЛЬ: Сравниваем с нулем
  498.     jz        mouse_exit                  ; КОСТЫЛЬ: Если ноль то сделали всё что могли
  499.     jmp    re_mouse_loop                  ; КОСТЫЛЬ: Если не ноль то попробуем взять соселний пиксель
  500.     mouse_set:
  501.     mov     [color],eax                   ; Иначе запоминаем новый цвет
  502.     call    draw_result                   ; Выводим результат
  503.     mouse_exit:
  504.     ret                                   ; Возвращаем управление
  505. ;end_mouse_get----------------------------------------------------------------------------------------
  506.  
  507. draw_palitra:
  508.     mov     eax,13                        ; Функция 13 - нарисовать прямоугольник
  509.     mov     ebx,110 shl 16+148            ; Начальные координаты по x [к-та x]*65536 + [размер]
  510.     mov     ecx,9 shl 16+148              ; Начальные координаты по y [к-та y]*65536 + [размер]
  511.     mov     edx,[sc.work]                 ; цвет
  512.     int     0x40
  513.  
  514.     cmp     [renmode],2
  515.     je      cyrcle_draw
  516.     ;cmp     [renmode],1
  517.     ;je      picker_draw
  518.     cmp     [renmode],0
  519.     je      sheme_draw
  520.     ret
  521.  
  522.     ;.................................................................................................
  523.     ; Отрисовка круговой диаграммы
  524.     ;.................................................................................................
  525.     cyrcle_draw:
  526.     ;mov     eax,13
  527.     ;mov     edx,0x666666
  528.     ;mov     ebx,108*65536+152
  529.     ;mov     ecx,125*65536+33
  530.     ;mcall
  531.     ;mov     edx,0xF3F3F3
  532.     ;mov     ebx,109*65536+150
  533.     ;mov     ecx,126*65536+31
  534.     ;mcall
  535.  
  536.     ;mov     eax,4                         ; 4 - вывести строку текста в окно
  537.     ;mov     ebx,115 shl 16+131            ; [координата по оси x]*65536 + [координата по оси y]
  538.     ;mov     ecx,0x666666                  ; 0xX0RRGGBB (RR, GG, BB задают цвет текста)
  539.     ;mov     edx,hint                      ; указатель на начало строки
  540.     ;mov     esi,24                        ; выводить esi символов
  541.     ;mcall
  542.     ;mov     ebx,125 shl 16+144            ; [координата по оси x]*65536 + [координата по оси y]
  543.     ;mov     edx,hint2                     ; указатель на начало строки
  544.     ;mov     esi,21                        ; выводить esi символов
  545.     ;mcall
  546.  
  547.     mov     eax,13
  548.     mov     edx,0x666666
  549.     mov     ebx,111*65536+145
  550.     mov     ecx,  9*65536+145
  551.     mcall
  552.     ;mov     edx,[color]
  553.     ;mov     ebx,109*65536+150
  554.     ;mov     ecx, 10*65536+150
  555.     ;mcall
  556.     call    mouse_local                   ; получаем координаты мыши относительно окна
  557.     mov     ecx, [mouse_x]                ; заносим в регистр
  558.     mov     edx, [mouse_y]                ; заносим в регистр
  559.     cmp     ecx, WIN_W-10
  560.     jg      cyrcle_draw_2
  561.     cmp     edx, WIN_H
  562.     jle     end_cyrcle_draw
  563.  
  564.     cyrcle_draw_2:
  565.     call    desktop_get
  566.     call    mouse_global
  567.  
  568.     mov     ebx,112*65536+11
  569.     mov     esi,0                         ; counter=8
  570.     circle_loop:
  571.       mov     ecx, 10*65536+11
  572.       mov     edi,0
  573.       circle_loop2:
  574.         mov     eax,13
  575.         call    circle_pixel_read
  576.         mcall
  577.         add     ecx,11 shl 16
  578.         inc     edi
  579.         cmp     edi,13
  580.         jne     circle_loop2
  581.  
  582.       add     ebx,11 shl 16
  583.       inc     esi
  584.       cmp     esi,13
  585.       jne     circle_loop
  586.    
  587.    
  588.     mov     eax,13
  589.     mov     edx,0x0
  590.     mov     ebx,177*65536+13
  591.     mov     ecx, 76*65536+13
  592.     mcall
  593.     mov     ecx, [mouse_x]
  594.     mov     edx, [mouse_y]
  595.     inc     ecx
  596.     inc     edx
  597.     mov     ebx, edx
  598.     imul    ebx, [desctop_w]
  599.     add     ebx, ecx
  600.     mov     eax, 35
  601.     mcall
  602.     mov     edx,eax
  603.     mov     eax,13
  604.     mov     ebx,178*65536+11
  605.     mov     ecx, 77*65536+11
  606.     mcall
  607.     end_cyrcle_draw:
  608.     ret
  609.  
  610.     circle_pixel_read:
  611.     push    ecx
  612.     push    ebx
  613.     push    eax
  614.     mov     ecx, [mouse_x]
  615.     mov     edx, [mouse_y]
  616.     inc     ecx
  617.     add     ecx, esi
  618.     cmp     ecx, 6
  619.     jl      _cpr_exit
  620.     sub     ecx, 6
  621.     inc     edx
  622.     add     edx, edi
  623.     cmp     edx, 6
  624.     jl      _cpr_exit
  625.     sub     edx, 6
  626.  
  627.     mov     ebx, edx
  628.     imul    ebx, [desctop_w]
  629.     add     ebx, ecx
  630.     mov     eax, 35
  631.     mcall
  632.     mov     edx,eax
  633.     pop     eax
  634.     pop     ebx
  635.     pop     ecx
  636.     ret
  637.  
  638.     _cpr_exit:
  639.     mov     edx,0x00000000
  640.     pop     eax
  641.     pop     ebx
  642.     pop     ecx
  643.     ret
  644.  
  645.     ;picker_draw:
  646.     ;ret
  647.  
  648.     ;.................................................................................................
  649.     ; Отрисовка фона под кнопки
  650.     ;.................................................................................................
  651.     sheme_draw:
  652.     mov     eax,13                        ; Функция 13 - нарисовать прямоугольник
  653.     mov     edx,0x222222                  ; цвет
  654.     mov     ecx,9 shl 16+73               ; Начальные координаты по y [к-та y]*65536 + [размер]
  655.     mov     esi,2                         ; Счетчик линий подложек
  656.     re_draw:
  657.     mov     ebx,110 shl 16+73             ; Начальные координаты по x [к-та x]*65536 + [размер]
  658.     mov     edi,2                         ; Счетчик количества подложек
  659.     for_fon_loop:
  660.       int     0x40                        ; Прерывание
  661.       add     ebx,75 shl 16               ; Смещаем положение линии по х
  662.       dec     edi                         ; Уменьшаем счетчик кнопок
  663.       cmp     edi,0                       ; Сравниваем с нулем
  664.     jnz     for_fon_loop                  ; Если не ноль то в начало цикла
  665.     dec     esi                           ; Уменьшаем его
  666.     cmp     esi,0                         ; Сравниваем с нулем
  667.     mov     ecx,84 shl 16+73              ; Начальные координаты по y [к-та y]*65536 + [размер]
  668.     jnz     re_draw                       ; Если не ноль то в начало цикла
  669.  
  670.     ;.................................................................................................
  671.     ; Отрисовка кнопок по циклу
  672.     ;.................................................................................................
  673.     mov     eax,13                        ; Функция 13 - нарисовать прямоугольник
  674.     mov     edx,0x0FFFFFFF                ; цвет
  675.     mov     esi,4                         ; Счетчик количества абзацев (#4,8)
  676.     mov     ebx,99 shl 16+8               ; Начальные координаты по x [к-та x]*65536 + [размер]
  677.     for_abz:
  678.       ;;push    esi                       ; Сохраняем значение счетчика линий в стек
  679.       cmp     esi,2
  680.       jne     x2_line
  681.       mov     ebx,99 shl 16+8
  682.       x2_line:
  683.       add     ebx,3 shl 16                ; Смещаем положение линии по x
  684.       mov     edi,8                       ; Счетчик количества кнопок в строке
  685.       for_stolbik:
  686.         push    edi                       ; Сохраняем значение счетчика линий в стек
  687.         mov     edi,8                     ; Счетчик количества кнопок в строке
  688.         mov     ecx,  1 shl 16+8          ; Начальные координаты по y [к-та y]*65536 + [размер]  
  689.         cmp     esi,2
  690.         jg      y2_line                   ; Если больше 4 то игнорим
  691.         mov     ecx,76 shl 16+8
  692.         y2_line:
  693.         add     ebx,9 shl 16              ; Смещаем положение линии по x
  694.         for_loop:
  695.           add     ecx,9 shl 16            ; Смещаем положение линии по y
  696.           int     0x40                    ; Прерывание
  697.           call    sub_red
  698.           dec     edi                     ; Уменьшаем счетчик кнопок
  699.           cmp     edi,0                   ; Сравниваем с нулем
  700.           jnz     for_loop                ; Если не ноль то в начало цикла
  701.       call    sub_green
  702.       pop     edi                         ; Иначе восстанавливаем счетчик линий
  703.       dec     edi                         ; Уменьшаем его
  704.       cmp     edi,0                       ; Сравниваем с нулем
  705.       jnz     for_stolbik                 ; Если не ноль то в начало цикла
  706.     call    sub_blue
  707.     ;;pop     esi                         ; Иначе восстанавливаем счетчик линий
  708.     dec     esi                           ; Уменьшаем его
  709.     cmp     esi,0                         ; Сравниваем с нулем
  710.     jnz     for_abz                       ; Если не ноль то в начало цикла
  711.     ret                                   ; Возвращаем управление
  712. ;end_draw_palitra-------------------------------------------------------------------------------------
  713.  
  714.  
  715. sub_red:
  716.     ;.................................................................................................
  717.     ; Расчёт смещений красного цвета в генерации цвета палитры
  718.     ;.................................................................................................
  719.     push    eax
  720.     mov     eax,[pnext]
  721.   ;sub_red_0                              ; palitra
  722.     cmp     al,0
  723.     jne     sub_red_1
  724.     sub     edx,0x40
  725.     jmp     sub_red_e
  726.   sub_red_1:                              ; random
  727.     cmp     al,1
  728.     jne     sub_red_2
  729.     sub     edx,0x20
  730.     jmp     sub_red_e
  731.   sub_red_2:                              ; gree
  732.     cmp     al,2
  733.     jne     sub_red_3
  734.     sub     edx,0x010101
  735.     jmp     sub_red_e
  736.   sub_red_3:                              ; red
  737.     cmp     al,3
  738.     jne     sub_red_4
  739.     sub     edx,0x0101
  740.     jmp     sub_red_e
  741.   sub_red_4:                              ; green
  742.     cmp     al,4
  743.     jne     sub_red_5
  744.     sub     edx,0x010001
  745.     jmp     sub_red_e
  746.   sub_red_5:                              ; blue
  747.     cmp     al,5
  748.     jne     sub_red_e
  749.     sub     edx,0x010100
  750.     jmp     sub_red_e
  751.   sub_red_e:
  752.     pop     eax
  753.     ret                                   ; Возвращаем управление
  754. ;end_sub_red------------------------------------------------------------------------------------------
  755.  
  756. sub_green:
  757.     ;.................................................................................................
  758.     ; Расчёт смещений красного цвета в генерации цвета палитры
  759.     ;.................................................................................................
  760.     push    eax
  761.     mov     eax,[pnext]
  762.   ;sub_green_0
  763.     cmp     al,0
  764.     jne     sub_green_1
  765.     sub     edx,0x4000
  766.     jmp     sub_green_e
  767.   sub_green_1:
  768.     cmp     al,1
  769.     jne     sub_green_e
  770.     sub     edx,0x2000
  771.     ;jmp     sub_green_e
  772.   sub_green_e:
  773.     pop     eax
  774.     ret                                   ; Возвращаем управление
  775. ;end_sub_green----------------------------------------------------------------------------------------
  776.  
  777.  
  778. sub_blue:
  779.     ;.................................................................................................
  780.     ; Расчёт смещений красного цвета в генерации цвета палитры
  781.     ;.................................................................................................
  782.     push    eax
  783.     mov     eax,[pnext]
  784.   ;sub_blue_0
  785.     cmp     al,0
  786.     jne     sub_blue_1
  787.     sub     edx,0x600000
  788.     jmp     sub_blue_e
  789.   sub_blue_1:
  790.     cmp     al,1
  791.     jne     sub_blue_e
  792.     sub     edx,0x400000
  793.     ;jmp     sub_blue_e
  794.   sub_blue_e:
  795.     pop     eax
  796.     ret                                   ; Возвращаем управление
  797. ;end_sub_blue-----------------------------------------------------------------------------------------
  798.  
  799. draw_result:
  800.     ;.................................................................................................
  801.     ; Большая рамка вывода результата
  802.     ;.................................................................................................
  803.     mov     eax,13                        ; Функция 13 - нарисовать прямоугольник
  804.     mov     edx,0x00666666                ; цвет-обводки
  805.     mov     ebx,4 shl 16+98               ; Начальные координаты по x [к-та x]*65536 + [размер]
  806.     mov     ecx,9 shl 16+148              ; Начальные координаты по y [к-та y]*65536 + [размер]
  807.     int     0x40
  808.     mov     edx,0x00F3F3F3                ; цвет-фона
  809.     mov     ebx,5 shl 16+96               ; Начальные координаты по x [к-та x]*65536 + [размер]
  810.     mov     ecx,10 shl 16+146             ; Начальные координаты по y [к-та y]*65536 + [размер]
  811.     int     0x40
  812.  
  813.     ;.................................................................................................
  814.     ; Отрисовка результата цвета в hex color2
  815.     ;.................................................................................................
  816.     mov     eax,13                        ; Функция 13 - нарисовать прямоугольник
  817.     ; color 2 - draw fringle
  818.     mov     edx,0x222222                  ; цвет-обводки
  819.     mov     ebx,16 shl 16+15              ; Начальные координаты по x [к-та x]*65536 + [размер]
  820.     mov     ecx,16 shl 16+15              ; Начальные координаты по y [к-та y]*65536 + [размер]
  821.     int     0x40                          ; Прерывание (ос рисует прямоугольник)
  822.     ; color 2 - draw color
  823.     mov     edx,[color2]                  ; цвет
  824.     mov     ebx,17 shl 16+13              ; Начальные координаты по x [к-та x]*65536 + [размер]
  825.     mov     ecx,17 shl 16+13              ; Начальные координаты по y [к-та y]*65536 + [размер]
  826.     int     0x40                          ; Прерывание (ос рисует прямоугольник)
  827.     ; color 1 - draw fringle
  828.     mov     edx,0x222222                  ; цвет-обводки
  829.     mov     ebx,11 shl 16+15              ; Начальные координаты по x [к-та x]*65536 + [размер]
  830.     mov     ecx,12 shl 16+15              ; Начальные координаты по y [к-та y]*65536 + [размер]
  831.     int     0x40                          ; Прерывание (ос рисует прямоугольник)
  832.     ; value - draw fringle
  833.     mov     ebx,34 shl 16+62              ; Начальные координаты по x [к-та x]*65536 + [размер]
  834.     mov     ecx,16 shl 16+15              ; Начальные координаты по y [к-та y]*65536 + [размер]
  835.     int     0x40                          ; Прерывание (ос рисует прямоугольник)
  836.  
  837.     ; color 2 - draw color
  838.     mov     edx,[color]                   ; цвет
  839.     mov     ebx,12 shl 16+13              ; Начальные координаты по x [к-та x]*65536 + [размер]
  840.     mov     ecx,13 shl 16+13              ; Начальные координаты по y [к-та y]*65536 + [размер]
  841.     int     0x40                          ; Прерывание (ос рисует прямоугольник)
  842.     ; value - draw background
  843.     mov     edx,0xFFFFFF                  ; цвет-фона
  844.     mov     ebx,35 shl 16+60              ; Начальные координаты по x [к-та x]*65536 + [размер]
  845.     mov     ecx,17 shl 16+13              ; Начальные координаты по y [к-та y]*65536 + [размер]
  846.     int     0x40                          ; Прерывание (ос рисует прямоугольник)
  847.  
  848.     mov     eax,47                        ; Функция 47 - вывод числа в окно
  849.     mov     ecx,[color]                   ; число (при bl=0) или указатель (при bl=1)
  850.     mov     esi,0x0                       ; 0xX0RRGGBB
  851.     mov     ebx,256+8 shl 16              ; параметры преобразования числа в текст (HEX)
  852.     mov     edx,45 shl 16+20              ; [координата по оси x]*65536 + [координата по оси y]
  853.     int     0x40                          ; Прерывание - выводим результат в окно (HEX)
  854.  
  855.     mov     eax,4                         ; функция 4: написать текст в окне
  856.     mov     ebx,38*65536+20               ; [x начальный] *65536 + [y начальный]
  857.     mov     ecx,0x0                       ; цвет текста RRGGBB
  858.     mov     edx,hex                       ; рисуем '#'
  859.     mov     esi,1                         ; длина текста в байтах
  860.     int     0x40
  861.  
  862.     ;.................................................................................................
  863.     ; Отрисовка r g b значений
  864.     ;.................................................................................................
  865.     call    get_spectr
  866.  
  867.     movzx   eax,[cred]                    ; красный
  868.     mov     ebx,9*65536+142               ; [x начальный] *65536 + [y начальный]
  869.     call    draw_value                    ; выводим результат
  870.  
  871.     movzx   eax,[cgreen]                  ; зеленый
  872.     mov     ebx,32*65536+142              ; [x начальный] *65536 + [y начальный]
  873.     call    draw_value                    ; выводим результат
  874.  
  875.     movzx   eax,[cblue]                   ; синий
  876.     mov     ebx,55*65536+142              ; [x начальный] *65536 + [y начальный]
  877.     call    draw_value                    ; выводим результат
  878.  
  879.     movzx   eax,[calpha]                  ; альфа
  880.     mov     ebx,78*65536+142              ; [x начальный] *65536 + [y начальный]
  881.     call    draw_value                    ; выводим результат
  882.  
  883.     ;.................................................................................................
  884.     ; Выводим буквы r g b a
  885.     ;.................................................................................................
  886.     mov     eax,4                         ; 4 - вывести строку текста в окно
  887.     mov     ebx,16 shl 16+40              ; [координата по оси x]*65536 + [координата по оси y]
  888.     mov     ecx,0x0                       ; 0xX0RRGGBB (RR, GG, BB задают цвет текста)
  889.     mov     edx,cname                     ; указатель на начало строки
  890.     mov     esi,1                         ; выводить esi символов
  891.     newline:                              ; цикл
  892.       int     0x40                        ; Прерывание
  893.       add     ebx,23 shl 16               ; Добавляем
  894.       add     edx,1                       ; Добавляем
  895.       cmp     [edx],byte 'x'              ; Сравнение с байтом х
  896.     jne    newline                        ; Если не нуль или не равно
  897.  
  898.     ;.................................................................................................
  899.     ; Отрисовка слайдеров
  900.     ;.................................................................................................
  901.     mov     eax,13                        ; Функция 13 - нарисовать прямоугольник
  902.     mov     edx,0x222222                  ; цвет-обводки
  903.     mov     ebx,16 shl 16+4               ; Начальные координаты по x [к-та x]*65536 + [размер]
  904.     mov     ecx,51 shl 16+86              ; Начальные координаты по y [к-та y]*65536 + [размер]
  905.     int     0x40
  906.     add     ebx,23 shl 16                 ; Начальные координаты по x [к-та y]*65536 + [размер]
  907.     int     0x40
  908.     add     ebx,23 shl 16                 ; Начальные координаты по x [к-та y]*65536 + [размер]
  909.     int     0x40
  910.     add     ebx,23 shl 16                 ; Начальные координаты по x [к-та y]*65536 + [размер]
  911.     int     0x40
  912.  
  913.     mov     edx,0xFA0919                  ; цвет-обводки
  914.     mov     ebx,17 shl 16+2               ; Начальные координаты по x [к-та x]*65536 + [размер]
  915.     mov     ecx,52 shl 16+84              ; Начальные координаты по y [к-та y]*65536 + [размер]
  916.     int     0x40
  917.     mov     edx,0x08CE19                  ; цвет-обводки
  918.     add     ebx,23 shl 16                 ; Начальные координаты по x [к-та y]*65536 + [размер]
  919.     int     0x40
  920.     mov     edx,0x0909FF                  ; цвет-обводки
  921.     add     ebx,23 shl 16                 ; Начальные координаты по x [к-та y]*65536 + [размер]
  922.     int     0x40
  923.     mov     edx,0xE4E4E4                  ; цвет-обводки
  924.     add     ebx,23 shl 16                 ; Начальные координаты по x [к-та y]*65536 + [размер]
  925.     int     0x40
  926.  
  927.     ;.................................................................................................
  928.     ; Отрисовка ползунков
  929.     ;.................................................................................................
  930.     mov     edx,0x0                       ; цвет-ползунков
  931.     mov     ebx,17 shl 16+11              ; Начальные координаты по x [к-та x]*65536 + [размер]
  932.     movzx   eax,[cred]                    ; берем значение цвета
  933.     call    draw_slider
  934.     add     ebx,23 shl 16
  935.     movzx   eax,[cgreen]                  ; берем значение цвета
  936.     call    draw_slider
  937.     add     ebx,23 shl 16
  938.     movzx   eax,[cblue]                   ; берем значение цвета
  939.     call    draw_slider
  940.     add     ebx,23 shl 16
  941.     movzx   eax,[calpha]                  ; берем значение цвета
  942.     call    draw_slider
  943.  
  944.     ret                                   ; Возвращаем управление
  945. ;end_draw_result
  946.  
  947. draw_slider:
  948.     xor     ecx,ecx
  949.     mov     cl,0x3                        ; будем делить его на 3 так как ползунки длинной 85 пикселей
  950.     div     cl                            ; делим - целое в al остаток в ah
  951.     mov     cl,136                        ; нижняя точка ползунка
  952.     sub     cl,al                         ; cl=cl-al
  953.     shl     ecx,16
  954.     add     ecx,1                         ; задаем начальное положение
  955.     mov     eax,13                        ; Функция 13 - нарисовать прямоугольник
  956.     int     0x40
  957.     push    ebx                           ; сохраняем для следующего ползунка x+w
  958.     sub     ebx,8                         ; так как ширина линии 11 то отнимаем 8 чтобы кубик стал шириной 3
  959.     add     ebx,8 shl 16                  ; Координаты по x для квадрата на ползунке смещаем на 8 в право
  960.     inc     ecx                           ; быдлокодим высоту ползунка до 3-х (1+1=2)
  961.     inc     ecx                           ; (2+1=3) ну вот у нас будет кубик 3х3 на 8 в право от линии
  962.     int     0x40                          ; рисуем
  963.     pop     ebx                           ; восстанавливаем нормальные координаты
  964.     ret                                   ; Возвращаем управление
  965.  
  966. ;end_slider
  967.  
  968. draw_value:
  969.     ;.................................................................................................
  970.     ; Вывод числа из строки в указанной области
  971.     ;.................................................................................................
  972.     push    ebx                           ; сохраняем присланные координаты
  973.     mov     ebx,10                        ; устанавливаем основание системы счисления
  974.     mov     edi,buff                      ; указатель на строку буфера
  975.     call    int2ascii                     ; конвертируем число и ложим как строку в буфер + esi длина
  976.     mov     eax,4                         ; функция 4: написать текст в окне
  977.     pop     ebx                           ; достаем из стека присланные координаты
  978.     cmp     esi,2                         ; ЦЕНТРИРОВАНИЕ ТЕКСТА
  979.     jne     draw_value_1
  980.     add     ebx,4 shl 16
  981.     jmp     draw_value_e
  982.   draw_value_1:
  983.     cmp     esi,1
  984.     jne     draw_value_e
  985.     add     ebx,7 shl 16
  986.   draw_value_e:
  987.     mov     ecx,0x0                       ; цвет текста RRGGBB
  988.     mov     edx,buff                      ; указатель на начало текста
  989.     int     0x40
  990.     ret                                   ; Возвращаем управление
  991. ;end_draw_value
  992.  
  993.   _read_params:
  994.  
  995.       mov al,[params+2]
  996.       mov [params_c+0],al
  997.  
  998.       mov al,[params+3]
  999.       mov [params_c+1],al
  1000.  
  1001.       mov al,[params+4]
  1002.       mov [params_c+2],al
  1003.  
  1004.       mov al,[params+5]
  1005.       mov [params_c+3],al
  1006.  
  1007.       mov al,[params+6]
  1008.       mov [params_c+4],al
  1009.  
  1010.       mov al,[params+7]
  1011.       mov [params_c+5],al
  1012.  
  1013.       mov al,[params+8]
  1014.       mov [params_c+6],al
  1015.  
  1016.       mov al,[params+9]
  1017.       mov [params_c+7],al
  1018.  
  1019.       mov   esi,params_c
  1020.       mov   ecx,16
  1021.       call  ascii2int
  1022.       mov   [color],eax
  1023.  
  1024.       mov al,[params+11]
  1025.       mov [params_c+0],al
  1026.  
  1027.       mov al,[params+12]
  1028.       mov [params_c+1],al
  1029.  
  1030.       mov al,[params+13]
  1031.       mov [params_c+2],al
  1032.  
  1033.       mov al,[params+14]
  1034.       mov [params_c+3],al
  1035.  
  1036.       mov al,[params+15]
  1037.       mov [params_c+4],al
  1038.  
  1039.       mov al,[params+16]
  1040.       mov [params_c+5],al
  1041.  
  1042.       mov al,[params+17]
  1043.       mov [params_c+6],al
  1044.  
  1045.       mov al,[params+18]
  1046.       mov [params_c+7],al
  1047.  
  1048.       mov   esi,params_c
  1049.       mov   ecx,16
  1050.       call  ascii2int
  1051.       mov   [color2],eax
  1052.  
  1053.       ret
  1054.  
  1055. hex_digit:
  1056.     ;.................................................................................................
  1057.     ; Преобразование в ASCII (вне зависимости от системы счисления)
  1058.     ;.................................................................................................
  1059.     cmp    dl,10                          ; в dl ожидается число от 0 до 15
  1060.     jb     .less                          ; если dl<10 то переходим
  1061.     add    dl,'A'-10                      ; 10->A 11->B 12->C ...
  1062.     ret                                   ; Возвращаем управление
  1063.     .less:
  1064.     or     dl,'0'                         ; Если система счисления 10-я и менее
  1065.     ret                                   ; Возвращаем управление
  1066. ;end_hex_digit
  1067.  
  1068. int2ascii:
  1069.     ;.................................................................................................
  1070.     ; Преобразование числа в строку
  1071.     ;.................................................................................................
  1072.     ; eax - 32-х значное число
  1073.     ; ebx - основание системы счисления
  1074.     ; edi - указатель на строку буфера
  1075.     ; Возвращает заполненный буфер и esi - длина строки
  1076.     ;pushad
  1077.     xor     esi,esi                       ; зануляем счетчик символов
  1078.     convert_loop:
  1079.     xor     edx,edx                       ; зануляем регистр под остаток
  1080.     div     ebx                           ; eax/ebx - остаток в edx
  1081.     call    hex_digit                     ; преобразуем символ
  1082.     push    edx                           ; ложим в стек
  1083.     inc     esi                           ; увеличиваем счетчик
  1084.     test    eax,eax                       ; если еще можно делить
  1085.     jnz     convert_loop                  ; то делием еще
  1086.     cld                                   ; ОБЯЗАТЕЛЬНО сбрасываем флаг направления DF (запись вперёд)
  1087.     write_loop:                           ; иначе
  1088.     pop     eax                           ; достаем из стека в еах
  1089.     stosb                                 ; записываем в буфер по адресу ES:(E)DI
  1090.     dec     esi                           ; уменьшаем счетчик
  1091.     test    esi,esi                       ; если есть что доставать из стека
  1092.     jnz     write_loop                    ; то достаём
  1093.     mov     byte [edi],0                  ; иначе дописыываем нулевой байт
  1094.     ;popad                                 ; восстанавливаем значения регистров
  1095.     ; код ниже не имеет ничего общего к функции, просто возвращает еще длинну полученной строки
  1096.     mov     edi,buff                      ; указатель на начало текста
  1097.     call    str_len
  1098.     mov     esi,eax
  1099.     ret                                   ; и возвращаем управление
  1100. ;end_int2ascii
  1101.  
  1102. char2byte:
  1103.     sub al,'0'
  1104.     cmp al,10
  1105.     jb  done
  1106.     add al,'0'
  1107.     and al,0x5f
  1108.     sub al,'A'-10
  1109.     and al,0x0f
  1110.     done:
  1111.     ret
  1112. ;end_char2byte
  1113.  
  1114. ascii2int:
  1115.     ;.................................................................................................
  1116.     ; Преобразование строки в число
  1117.     ;.................................................................................................
  1118.     ; esi - указатель на нультерминированную строку
  1119.     ; ecx - основание системы счисления
  1120.     ; Возвращает eax - число
  1121.     push esi
  1122.     xor eax,eax
  1123.     xor ebx,ebx
  1124.     cmp byte [esi],'-'
  1125.     jnz .next
  1126.     inc esi
  1127.     .next:
  1128.     lodsb
  1129.     or al,al
  1130.     jz .done
  1131.     call char2byte
  1132.     imul ebx,ecx
  1133.     add ebx,eax
  1134.     jmp .next
  1135.     .done:
  1136.     xchg ebx,eax
  1137.     pop esi
  1138.     cmp byte [esi],'-'
  1139.     jz .negate
  1140.     ret
  1141.     .negate:
  1142.     neg eax
  1143.     ret
  1144. ;end_ascii2int
  1145.  
  1146. get_spectr:
  1147.     ;.................................................................................................
  1148.     ; возвращает r,g,b состовляющие цвета
  1149.     ;.................................................................................................
  1150.     mov     ecx,[color]
  1151.     mov     [cblue],cl
  1152.     shr     ecx,8
  1153.     mov     [cgreen],cl
  1154.     shr     ecx,8
  1155.     mov     [cred],cl
  1156.     shr     ecx,8
  1157.     mov     [calpha],cl
  1158.     ret                                   ; и возвращаем управление
  1159. ;end_get_spectr
  1160.  
  1161. set_spectr:
  1162.     ;.................................................................................................
  1163.     ; устанавливает из r,g,b цвет
  1164.     ;.................................................................................................
  1165.     movzx   eax,[calpha]
  1166.     shl     eax,8
  1167.     mov     al,[cred]
  1168.     shl     eax,8
  1169.     mov     al,[cgreen]
  1170.     shl     eax,8
  1171.     mov     al,[cblue]
  1172.     mov     [color],eax
  1173.     call    draw_result                   ; Выводим результат
  1174.     ret                                   ; и возвращаем управление
  1175. ;end_get_spectr
  1176.  
  1177. str_len:
  1178.     ;.................................................................................................
  1179.     ; определяет длину строки (вход->EDI ZS offset ; выход->EAX ZS length)
  1180.     ;.................................................................................................
  1181.         push ecx
  1182.         push esi
  1183.         push edi
  1184.  
  1185.         cld
  1186.         xor   al, al
  1187.         mov ecx, 0FFFFFFFFh
  1188.         mov esi, edi
  1189.         repne scasb
  1190.         sub edi, esi
  1191.         mov eax, edi
  1192.         dec eax
  1193.  
  1194.         pop edi
  1195.         pop esi
  1196.         pop ecx
  1197.  
  1198.         ret
  1199. ;end_str_len
  1200.  
  1201.  
  1202.  
  1203. ;#___________________________________________________________________________________________________
  1204. ;****************************************************************************************************|
  1205. ; БЛОК ПЕРЕМЕННЫХ И КОНСТАНТ                                                                         |
  1206. ;----------------------------------------------------------------------------------------------------/
  1207. circle:
  1208.     cm          db 12 dup(0)
  1209.     color       dd 00000000h              ; хранит значение выбранного цвета
  1210.     color2      dd 00FFFFFFh              ; хранит значение второго выбранного цвета
  1211.     mouse_x     dd 0                      ; хранит глобальную х координату мыши
  1212.     mouse_y     dd 0                      ; хранит глобальную у координату мыши
  1213.     mouse_f     dd 0                      ; хранит данные о том какая кнопка мыши была нажата
  1214.     desctop_w   dd 0                      ; хранит ширину экрана
  1215.     desctop_h   dd 0                      ; хранит высоту экрана
  1216.     sc          system_colors             ; хранит структуру системных цветов скина
  1217.     title       db 'Palitra v0.7',0       ; хранит имя программы
  1218.     hidden      db 'Hidden',0
  1219.     hex         db '#',0                  ; для вывода решётки как текста
  1220.     cname       db 'RGBAx'                ; хранит разряды цветов (red,green,blue) x-метка конца
  1221.     cred        db 0                      ; храним красный спекрт
  1222.     cgreen      db 0                      ; храним зеленый спектр
  1223.     cblue       db 0                      ; храним синий спектр
  1224.     calpha      db 0                      ; храним прозрачность
  1225.     larrow      db 0x1A,0
  1226.     buff        db '000',0
  1227.     bground     db 'BACKGROUND',0         ; имя кнопки - 14
  1228.     pnext       dd 0                      ; счетчик переключения палитры
  1229.     renmode     dd 0                      ; режим отрисовки (1-цветовая схема,2-пипетка,3-круговая)
  1230.     runmode     dd 1                      ; режим запуска (1-normal, 2-hidden, 3-colordialog)
  1231.     params      db 20 dup(0)              ; приём параметров
  1232.     params_c    db 9  dup(0)              ; приёмник для цвета
  1233.  
  1234.  
  1235.  
  1236. I_END:
  1237.  
  1238.  
  1239.