Subversion Repositories Kolibri OS

Rev

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