Subversion Repositories Kolibri OS

Rev

Rev 3091 | Rev 3453 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3004 leency 1
;#___________________________________________________________________________________________________
2
;****************************************************************************************************|
3
; Program Palitra (c) Sergei Steshin (Akyltist)                                                      |
4
;----------------------------------------------------------------------------------------------------|
3091 leency 5
;; Charset:DOS-866 Font:Courier New Size:9pt                                                         |
3088 leency 6
;.....................................................................................................
3004 leency 7
;; compiler:     FASM 1.69.31                                                                        |
3026 leency 8
;; version:      0.3.0                                                                               |
9
;; last update:  08/11/2012                                                                          |
3004 leency 10
;; e-mail:       dr.steshin@gmail.com                                                                |
11
;.....................................................................................................
12
;; History:                                                                                          |
3091 leency 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
;;       - Небольшая деоптимизация.                                                                  |
3099 Akyltist 31
;; 0.6.0 - Добавлена возможность запуска с параметрами                                               |
32
;;       - Добавлен режим H (hidden) производит замену фона рабочего стола градиентной заливкой.     |
33
;;       - Большая деоптимизация.                                                                    |
3004 leency 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  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  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
;****************************************************************************************************|
3091 leency 61
; ЗАГОЛОВОК ИСПОЛНЯЕМОГО ФАЙЛА ПРИЛОЖЕНИЯ ДЛЯ КОЛИБРИ ОС                                             |
3004 leency 62
;----------------------------------------------------------------------------------------------------/
63
  use32
64
  org	 0x0
65
 
66
  db	 'MENUET01'
67
  dd	 0x01
68
  dd	 START
69
  dd	 I_END
3091 leency 70
  dd	 0x100000
3004 leency 71
  dd	 0x1000
3099 Akyltist 72
  dd	 params
3004 leency 73
  dd	 0x0
74
 
3091 leency 75
  include '..\..\..\macros.inc'
3004 leency 76
 
3099 Akyltist 77
  WIN_W  equ 295            ; ширина окна
78
  WIN_H  equ 195            ; высота окна
79
  WIN_X  equ 250            ; координата х окна
80
  WIN_Y  equ 190            ; координата у окна
81
 
3004 leency 82
START:
3099 Akyltist 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
 
3004 leency 110
;#___________________________________________________________________________________________________
111
;****************************************************************************************************|
3091 leency 112
; ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ - ОБРАБОТКА СОБЫТИЙ                                                        |
3004 leency 113
;----------------------------------------------------------------------------------------------------/
114
red:
3091 leency 115
    call draw_main                        ; вызываем перерисовку окна приложения
3004 leency 116
still:
3091 leency 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                         ; если другое событие - в начало цикла
3004 leency 125
;end_still
126
 
3091 leency 127
key:                                      ; нажата клавиша на клавиатуре
128
    mcall   2                             ; функция 2 - считать код символа (в ah) (тут в принципе не нужна)
129
    jmp     still                         ; вернуться к началу цикла
3004 leency 130
;end_key
131
 
132
button:
3091 leency 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
3026 leency 146
  next_redraw:
3091 leency 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                         ; и на ожидание события
3026 leency 160
  next_end:
3088 leency 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
3091 leency 168
    jmp     still                         ; И уходим на ожидание другого события
3088 leency 169
  color_swap_end:
3091 leency 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:                            ; Красный Трекбар                                              :
3088 leency 184
    cmp     ah, 8                         ; ID=8                                                         :
3091 leency 185
    jne     green_button                  ; если нет, то проверяем зелёный трекбар                       :
186
    mov     [cred],cl                     ; иначе присваиваем значение, красному цвету спектра    <------+
187
    call    set_spectr                    ; устанавливаем спектр
188
    jmp     still                         ; Уходим на ожидание другого события
3004 leency 189
  green_button:
190
    cmp     ah, 9
191
    jne     blue_button
192
    mov     [cgreen],cl
193
    call    set_spectr
3091 leency 194
    jmp     still                         ; Уходим на ожидание другого события
3004 leency 195
  blue_button:
196
    cmp     ah, 10
3088 leency 197
    jne     alpha_button
3004 leency 198
    mov     [cblue],cl
199
    call    set_spectr
3091 leency 200
    jmp     still                         ; Уходим на ожидание другого события
3088 leency 201
  alpha_button:
202
    cmp     ah, 11
203
    jne     still
204
    mov     [calpha],cl
205
    call    set_spectr
3091 leency 206
    jmp     still                         ; Уходим на ожидание другого события
3004 leency 207
  bexit:
3091 leency 208
    mcall -1                              ; иначе конец программы
3004 leency 209
;end_button
210
 
211
;#___________________________________________________________________________________________________
212
;****************************************************************************************************|
3091 leency 213
; ГЛАВНЫЙ МОДУЛЬ ОТРИСОВКИ ОКНА И ЭЛЕМЕНТОВ ПРИЛОЖЕНИЯ                                               |
3004 leency 214
;----------------------------------------------------------------------------------------------------/
3091 leency 215
draw_main:
216
    mov     eax,12                        ; функция 12: означает, что будет рисоваться окно
217
    mov     ebx,1                         ; 1,начало рисования
218
    int     0x40                          ; Прерывание
3004 leency 219
 
3091 leency 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                          ; Прерывание
3004 leency 225
 
3091 leency 226
    mov     eax,48                        ; Функция 48 - стили отображения окон.
227
    mov     ebx,4                         ; Подфункция 4 - возвращает eax = высота скина.
228
    int     0x40                          ; Прерывание
229
    mov     ecx,eax                       ; Запоминаем высоту скина
3004 leency 230
 
3099 Akyltist 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
 
3091 leency 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                ; Или окно со скином фиксированных размеров
3099 Akyltist 250
 
3091 leency 251
    int     0x40                          ; Прерывание
3004 leency 252
 
253
 
3091 leency 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
3004 leency 261
    int     0x40
262
 
3091 leency 263
    mov     ebx,13 shl 16+12              ; Начальные координаты по х [к-та x]*65536 + [размер]
3026 leency 264
    mov     edx,0x60000008                ; ID = 8
3091 leency 265
    mov     ecx,51 shl 16+85              ; Начальные координаты по y [к-та y]*65536 + [размер]
266
    int     0x40                          ; Рисуем невидимую кнопку под слайдером red
267
    add     ebx,23 shl 16                 ; Добавляем
3026 leency 268
    inc     edx                           ; ID = 9
3091 leency 269
    int     0x40                          ; Рисуем невидимую кнопку под слайдером green
270
    add     ebx,23 shl 16                 ; Добавляем
3026 leency 271
    inc     edx                           ; ID = 10
3091 leency 272
    int     0x40                          ; Рисуем невидимую кнопку под слайдером blue
273
    add     ebx,23 shl 16                 ; Добавляем
3088 leency 274
    inc     edx                           ; ID = 11
3091 leency 275
    int     0x40                          ; Рисуем невидимую кнопку под слайдером alpha
3004 leency 276
 
3091 leency 277
    mov     eax,8                         ; Функция 8 - определить/удалить кнопку (СМЕНА ЦВЕТА)
278
    mov     ebx,11 shl 16+20              ; Начальные координаты по х [к-та x]*65536 + [размер]
279
    mov     ecx,12 shl 16+20              ; Начальные координаты по y [к-та y]*65536 + [размер]
3088 leency 280
    mov     edx,0x6000000D                ; ID = 13
281
    int     0x40
282
 
3091 leency 283
    call    draw_bottom_panel
284
    call    draw_left_panel
3004 leency 285
 
3091 leency 286
    mov     eax,12                        ; функция 12: означает, что будет рисоваться окно
287
    mov     ebx,2                         ; 2 - конец рисования
288
    int     0x40                          ; Прерывание
289
    ret
3088 leency 290
 
3091 leency 291
;#___________________________________________________________________________________________________
292
;****************************************************************************************************|
293
; БЛОК ВСПОМОГАТЕЛЬНЫХ ПРОЦЕДУР И ФУНКЦИЙ ПРИЛОЖЕНИЯ                                                 |
294
;----------------------------------------------------------------------------------------------------/
3004 leency 295
 
3026 leency 296
 
3091 leency 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
    ;.................................................................................................
3026 leency 343
 
344
 
3091 leency 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
    ;.................................................................................................
3026 leency 367
 
3004 leency 368
mouse_global:
369
    ;.................................................................................................
3091 leency 370
    ; Получаем координаты мыши
3004 leency 371
    ;.................................................................................................
3091 leency 372
    mov     eax,37                        ; Функция 37 - работа с мышью
373
    mov     ebx,0                         ; нам нужны глобальные координаты
374
    int     0x40                          ; eax = x*65536 + y, (x,y)=координаты курсора мыши
3026 leency 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
3091 leency 382
    ret                                   ; Возвращаем управление
3004 leency 383
;end_mouse_global
384
 
385
mouse_local:
386
    ;.................................................................................................
3091 leency 387
    ; Получаем координаты мыши относительно окна
3004 leency 388
    ;.................................................................................................
3091 leency 389
    mov     eax,37                        ; Функция 37 - работа с мышью
390
    mov     ebx,1                         ; нам нужны глобальные координаты
391
    int     0x40                          ; eax = x*65536 + y, (x,y)=координаты курсора мыши
3026 leency 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
3091 leency 399
    ret                                   ; Возвращаем управление
3004 leency 400
;end_mouse_local
401
 
3091 leency 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
 
3004 leency 451
desktop_get:
452
    ;.................................................................................................
3091 leency 453
    ; Определяем ширину экрана
3004 leency 454
    ;.................................................................................................
3091 leency 455
    mov     eax,14                        ; Определяем ширину экрана (eax = [xsize]*65536 + [ysize])
456
    int     0x40                          ; xsize = размер по горизонтали - 1
3026 leency 457
    mov     ebx,eax                       ;
458
    shr     ebx,16                        ; ebx = xsize-1
3091 leency 459
    ;movzx   edx,ax                       ;; edx = ysize-1 (лишний код)
3026 leency 460
    inc     ebx                           ; ebx = xsize
3091 leency 461
    ;inc     edx                          ;; edx = ysize (лишний код)
3004 leency 462
    mov     [desctop_w],ebx
463
    ret
464
;end_desktop_get
465
 
466
mouse_get:
3091 leency 467
    mov     esi,2                         ; КОСТЫЛЬ: флаг для избежания зацикливания
3004 leency 468
    call    mouse_global
469
    call    desktop_get
3091 leency 470
    re_mouse_loop:                        ; КОСТЫЛЬ: метка для возврата если попали в сетку
3004 leency 471
      mov     ebx,[desctop_w]
3026 leency 472
      imul    ebx,[mouse_y]               ; ebx = y*xsize
473
      add     ebx,[mouse_x]               ; ebx = y*xsize+x
3004 leency 474
 
475
      ;.................................................................................................
3091 leency 476
      ; Берем цвет с палитры в переменную
3004 leency 477
      ;.................................................................................................
3091 leency 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                  ; КОСТЫЛЬ: Если не ноль то попробуем взять соселний пиксель
3004 leency 493
    mouse_set:
3091 leency 494
    mov     [color],eax                   ; Иначе запоминаем новый цвет
495
    call    draw_result                   ; Выводим результат
3004 leency 496
    mouse_exit:
3091 leency 497
    ret                                   ; Возвращаем управление
3004 leency 498
;end_mouse_get----------------------------------------------------------------------------------------
499
 
500
draw_palitra:
3091 leency 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
 
3004 leency 515
    ;.................................................................................................
3091 leency 516
    ; Отрисовка круговой диаграммы
3004 leency 517
    ;.................................................................................................
3091 leency 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                         ; Счетчик линий подложек
3004 leency 537
    re_draw:
3091 leency 538
    mov     ebx,110 shl 16+73             ; Начальные координаты по x [к-та x]*65536 + [размер]
539
    mov     edi,2                         ; Счетчик количества подложек
3004 leency 540
    for_fon_loop:
3091 leency 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                       ; Если не ноль то в начало цикла
3004 leency 550
 
551
    ;.................................................................................................
3091 leency 552
    ; Отрисовка кнопок по циклу
3004 leency 553
    ;.................................................................................................
3091 leency 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 + [размер]
3004 leency 558
    for_abz:
3091 leency 559
      ;;push    esi                       ; Сохраняем значение счетчика линий в стек
3026 leency 560
      cmp     esi,2
3004 leency 561
      jne     x2_line
3088 leency 562
      mov     ebx,99 shl 16+8
3004 leency 563
      x2_line:
3091 leency 564
      add     ebx,3 shl 16                ; Смещаем положение линии по x
565
      mov     edi,8                       ; Счетчик количества кнопок в строке
3004 leency 566
      for_stolbik:
3091 leency 567
        push    edi                       ; Сохраняем значение счетчика линий в стек
568
        mov     edi,8                     ; Счетчик количества кнопок в строке
569
        mov     ecx,  1 shl 16+8          ; Начальные координаты по y [к-та y]*65536 + [размер]
3026 leency 570
        cmp     esi,2
3091 leency 571
        jg      y2_line                   ; Если больше 4 то игнорим
3026 leency 572
        mov     ecx,76 shl 16+8
573
        y2_line:
3091 leency 574
        add     ebx,9 shl 16              ; Смещаем положение линии по x
3026 leency 575
        for_loop:
3091 leency 576
          add     ecx,9 shl 16            ; Смещаем положение линии по y
577
          int     0x40                    ; Прерывание
3026 leency 578
          call    sub_red
3091 leency 579
          dec     edi                     ; Уменьшаем счетчик кнопок
580
          cmp     edi,0                   ; Сравниваем с нулем
581
          jnz     for_loop                ; Если не ноль то в начало цикла
3026 leency 582
      call    sub_green
3091 leency 583
      pop     edi                         ; Иначе восстанавливаем счетчик линий
584
      dec     edi                         ; Уменьшаем его
585
      cmp     edi,0                       ; Сравниваем с нулем
586
      jnz     for_stolbik                 ; Если не ноль то в начало цикла
3026 leency 587
    call    sub_blue
3091 leency 588
    ;;pop     esi                         ; Иначе восстанавливаем счетчик линий
589
    dec     esi                           ; Уменьшаем его
590
    cmp     esi,0                         ; Сравниваем с нулем
591
    jnz     for_abz                       ; Если не ноль то в начало цикла
592
    ret                                   ; Возвращаем управление
3004 leency 593
;end_draw_palitra-------------------------------------------------------------------------------------
594
 
3026 leency 595
 
596
sub_red:
597
    ;.................................................................................................
3091 leency 598
    ; Расчёт смещений красного цвета в генерации цвета палитры
3026 leency 599
    ;.................................................................................................
600
    push    eax
601
    mov     eax,[pnext]
602
  ;sub_red_0                              ; palitra
603
    cmp     al,0
604
    jne     sub_red_1
3091 leency 605
    sub     edx,0x40
3026 leency 606
    jmp     sub_red_e
607
  sub_red_1:                              ; random
608
    cmp     al,1
609
    jne     sub_red_2
3091 leency 610
    sub     edx,0x20
3026 leency 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
3091 leency 634
    ret                                   ; Возвращаем управление
3026 leency 635
;end_sub_red------------------------------------------------------------------------------------------
636
 
637
sub_green:
638
    ;.................................................................................................
3091 leency 639
    ; Расчёт смещений красного цвета в генерации цвета палитры
3026 leency 640
    ;.................................................................................................
641
    push    eax
642
    mov     eax,[pnext]
643
  ;sub_green_0
644
    cmp     al,0
645
    jne     sub_green_1
3091 leency 646
    sub     edx,0x4000
3026 leency 647
    jmp     sub_green_e
648
  sub_green_1:
649
    cmp     al,1
650
    jne     sub_green_e
3091 leency 651
    sub     edx,0x2000
3026 leency 652
    ;jmp     sub_green_e
653
  sub_green_e:
654
    pop     eax
3091 leency 655
    ret                                   ; Возвращаем управление
3026 leency 656
;end_sub_green----------------------------------------------------------------------------------------
657
 
658
 
659
sub_blue:
660
    ;.................................................................................................
3091 leency 661
    ; Расчёт смещений красного цвета в генерации цвета палитры
3026 leency 662
    ;.................................................................................................
663
    push    eax
664
    mov     eax,[pnext]
665
  ;sub_blue_0
666
    cmp     al,0
667
    jne     sub_blue_1
3091 leency 668
    sub     edx,0x600000
3026 leency 669
    jmp     sub_blue_e
670
  sub_blue_1:
671
    cmp     al,1
672
    jne     sub_blue_e
3091 leency 673
    sub     edx,0x400000
3026 leency 674
    ;jmp     sub_blue_e
675
  sub_blue_e:
676
    pop     eax
3091 leency 677
    ret                                   ; Возвращаем управление
3026 leency 678
;end_sub_blue-----------------------------------------------------------------------------------------
679
 
3004 leency 680
draw_result:
681
    ;.................................................................................................
3091 leency 682
    ; Большая рамка вывода результата
3004 leency 683
    ;.................................................................................................
3091 leency 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 + [размер]
3088 leency 688
    int     0x40
3091 leency 689
    mov     edx,0x00F3F3F3                ; цвет-фона
690
    mov     ebx,5 shl 16+96               ; Начальные координаты по x [к-та x]*65536 + [размер]
691
    mov     ecx,10 shl 16+146             ; Начальные координаты по y [к-та y]*65536 + [размер]
3088 leency 692
    int     0x40
693
 
694
    ;.................................................................................................
3091 leency 695
    ; Отрисовка результата цвета в hex color2
3088 leency 696
    ;.................................................................................................
3091 leency 697
    mov     eax,13                        ; Функция 13 - нарисовать прямоугольник
3088 leency 698
    ; color 2 - draw fringle
3091 leency 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                          ; Прерывание (ос рисует прямоугольник)
3088 leency 703
    ; color 2 - draw color
3091 leency 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                          ; Прерывание (ос рисует прямоугольник)
3088 leency 708
    ; color 1 - draw fringle
3091 leency 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                          ; Прерывание (ос рисует прямоугольник)
3088 leency 713
    ; value - draw fringle
3091 leency 714
    mov     ebx,34 shl 16+62              ; Начальные координаты по x [к-та x]*65536 + [размер]
715
    mov     ecx,16 shl 16+15              ; Начальные координаты по y [к-та y]*65536 + [размер]
716
    int     0x40                          ; Прерывание (ос рисует прямоугольник)
3004 leency 717
 
3088 leency 718
    ; color 2 - draw color
3091 leency 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                          ; Прерывание (ос рисует прямоугольник)
3088 leency 723
    ; value - draw background
3091 leency 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                          ; Прерывание (ос рисует прямоугольник)
3004 leency 728
 
3091 leency 729
    mov     eax,47                        ; Функция 47 - вывод числа в окно
730
    mov     ecx,[color]                   ; число (при bl=0) или указатель (при bl=1)
3026 leency 731
    mov     esi,0x0                       ; 0xX0RRGGBB
3091 leency 732
    mov     ebx,256+8 shl 16              ; параметры преобразования числа в текст (HEX)
733
    mov     edx,45 shl 16+20              ; [координата по оси x]*65536 + [координата по оси y]
734
    int     0x40                          ; Прерывание - выводим результат в окно (HEX)
3004 leency 735
 
3091 leency 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                         ; длина текста в байтах
3026 leency 741
    int	    0x40
3004 leency 742
 
743
    ;.................................................................................................
3091 leency 744
    ; Отрисовка r g b значений
3004 leency 745
    ;.................................................................................................
746
    call    get_spectr
747
 
3091 leency 748
    movzx   eax,[cred]                    ; красный
749
    mov     ebx,9*65536+142               ; [x начальный] *65536 + [y начальный]
750
    call    draw_value                    ; выводим результат
3004 leency 751
 
3091 leency 752
    movzx   eax,[cgreen]                  ; зеленый
753
    mov     ebx,32*65536+142              ; [x начальный] *65536 + [y начальный]
754
    call    draw_value                    ; выводим результат
3004 leency 755
 
3091 leency 756
    movzx   eax,[cblue]                   ; синий
757
    mov     ebx,55*65536+142              ; [x начальный] *65536 + [y начальный]
758
    call    draw_value                    ; выводим результат
3004 leency 759
 
3091 leency 760
    movzx   eax,[calpha]                  ; альфа
761
    mov     ebx,78*65536+142              ; [x начальный] *65536 + [y начальный]
762
    call    draw_value                    ; выводим результат
3004 leency 763
 
764
    ;.................................................................................................
3091 leency 765
    ; Выводим буквы r g b a
3004 leency 766
    ;.................................................................................................
3091 leency 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                        ; Если не нуль или не равно
3004 leency 778
 
779
    ;.................................................................................................
3091 leency 780
    ; Отрисовка слайдеров
3004 leency 781
    ;.................................................................................................
3091 leency 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 + [размер]
3004 leency 786
    int     0x40
3091 leency 787
    add     ebx,23 shl 16                 ; Начальные координаты по x [к-та y]*65536 + [размер]
3004 leency 788
    int     0x40
3091 leency 789
    add     ebx,23 shl 16                 ; Начальные координаты по x [к-та y]*65536 + [размер]
3004 leency 790
    int     0x40
3091 leency 791
    add     ebx,23 shl 16                 ; Начальные координаты по x [к-та y]*65536 + [размер]
3088 leency 792
    int     0x40
3004 leency 793
 
3091 leency 794
    mov     edx,0xFA0919                  ; цвет-обводки
795
    mov     ebx,17 shl 16+2               ; Начальные координаты по x [к-та x]*65536 + [размер]
796
    mov     ecx,52 shl 16+84              ; Начальные координаты по y [к-та y]*65536 + [размер]
3004 leency 797
    int     0x40
3091 leency 798
    mov     edx,0x08CE19                  ; цвет-обводки
799
    add     ebx,23 shl 16                 ; Начальные координаты по x [к-та y]*65536 + [размер]
3004 leency 800
    int     0x40
3091 leency 801
    mov     edx,0x0909FF                  ; цвет-обводки
802
    add     ebx,23 shl 16                 ; Начальные координаты по x [к-та y]*65536 + [размер]
3004 leency 803
    int     0x40
3091 leency 804
    mov     edx,0xE4E4E4                  ; цвет-обводки
805
    add     ebx,23 shl 16                 ; Начальные координаты по x [к-та y]*65536 + [размер]
3088 leency 806
    int     0x40
3004 leency 807
 
808
    ;.................................................................................................
3091 leency 809
    ; Отрисовка ползунков
3004 leency 810
    ;.................................................................................................
3091 leency 811
    mov     edx,0x0                       ; цвет-ползунков
812
    mov     ebx,17 shl 16+11              ; Начальные координаты по x [к-та x]*65536 + [размер]
813
    movzx   eax,[cred]                    ; берем значение цвета
3004 leency 814
    call    draw_slider
3088 leency 815
    add     ebx,23 shl 16
3091 leency 816
    movzx   eax,[cgreen]                  ; берем значение цвета
3004 leency 817
    call    draw_slider
3088 leency 818
    add     ebx,23 shl 16
3091 leency 819
    movzx   eax,[cblue]                   ; берем значение цвета
3004 leency 820
    call    draw_slider
3088 leency 821
    add     ebx,23 shl 16
3091 leency 822
    movzx   eax,[calpha]                  ; берем значение цвета
3088 leency 823
    call    draw_slider
3004 leency 824
 
3091 leency 825
    ret                                   ; Возвращаем управление
3004 leency 826
;end_draw_result
827
 
828
draw_slider:
829
    xor     ecx,ecx
3091 leency 830
    mov     cl,0x3                        ; будем делить его на 3 так как ползунки длинной 85 пикселей
831
    div     cl                            ; делим - целое в al остаток в ah
832
    mov     cl,136                        ; нижняя точка ползунка
3026 leency 833
    sub     cl,al                         ; cl=cl-al
3004 leency 834
    shl     ecx,16
3091 leency 835
    add     ecx,1                         ; задаем начальное положение
836
    mov     eax,13                        ; Функция 13 - нарисовать прямоугольник
3004 leency 837
    int     0x40
3091 leency 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                                   ; Возвращаем управление
3004 leency 846
 
847
;end_slider
848
 
849
draw_value:
850
    ;.................................................................................................
3091 leency 851
    ; Вывод числа из строки в указанной области
3004 leency 852
    ;.................................................................................................
3091 leency 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                         ; ЦЕНТРИРОВАНИЕ ТЕКСТА
3088 leency 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:
3091 leency 868
    mov     ecx,0x0                       ; цвет текста RRGGBB
869
    mov     edx,buff                      ; указатель на начало текста
3088 leency 870
    int     0x40
3091 leency 871
    ret                                   ; Возвращаем управление
3004 leency 872
;end_draw_value
873
 
3099 Akyltist 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
 
3004 leency 936
hex_digit:
937
    ;.................................................................................................
3091 leency 938
    ; Преобразование в ASCII (вне зависимости от системы счисления)
3004 leency 939
    ;.................................................................................................
3091 leency 940
    cmp    dl,10                          ; в dl ожидается число от 0 до 15
941
    jb     .less                          ; если dl<10 то переходим
3026 leency 942
    add    dl,'A'-10                      ; 10->A 11->B 12->C ...
3091 leency 943
    ret                                   ; Возвращаем управление
3004 leency 944
    .less:
3091 leency 945
    or     dl,'0'                         ; Если система счисления 10-я и менее
946
    ret                                   ; Возвращаем управление
3004 leency 947
;end_hex_digit
948
 
949
int2ascii:
950
    ;.................................................................................................
3091 leency 951
    ; Преобразование числа в строку
3004 leency 952
    ;.................................................................................................
3091 leency 953
    ; eax - 32-х значное число
954
    ; ebx - основание системы счисления
955
    ; edi - указатель на строку буфера
956
    ; Возвращает заполненный буфер и esi - длина строки
3004 leency 957
    ;pushad
3091 leency 958
    xor     esi,esi                       ; зануляем счетчик символов
3004 leency 959
    convert_loop:
3091 leency 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                      ; указатель на начало текста
3004 leency 978
    call    str_len
979
    mov     esi,eax
3091 leency 980
    ret                                   ; и возвращаем управление
3004 leency 981
;end_int2ascii
982
 
3099 Akyltist 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
 
3004 leency 1027
get_spectr:
1028
    ;.................................................................................................
3091 leency 1029
    ; возвращает r,g,b состовляющие цвета
3004 leency 1030
    ;.................................................................................................
1031
    mov     ecx,[color]
3088 leency 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
3091 leency 1039
    ret                                   ; и возвращаем управление
3004 leency 1040
;end_get_spectr
1041
 
1042
set_spectr:
1043
    ;.................................................................................................
3091 leency 1044
    ; устанавливает из r,g,b цвет
3004 leency 1045
    ;.................................................................................................
3088 leency 1046
    movzx   eax,[calpha]
3004 leency 1047
    shl     eax,8
3088 leency 1048
    mov     al,[cred]
1049
    shl     eax,8
3004 leency 1050
    mov     al,[cgreen]
1051
    shl     eax,8
1052
    mov     al,[cblue]
1053
    mov     [color],eax
3091 leency 1054
    call    draw_result                   ; Выводим результат
1055
    ret                                   ; и возвращаем управление
3004 leency 1056
;end_get_spectr
1057
 
1058
str_len:
1059
    ;.................................................................................................
3091 leency 1060
    ; определяет длину строки (вход->EDI ZS offset ; выход->EAX ZS length)
3004 leency 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
3099 Akyltist 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
 
3004 leency 1106
;#___________________________________________________________________________________________________
1107
;****************************************************************************************************|
3091 leency 1108
; БЛОК ПЕРЕМЕННЫХ И КОНСТАНТ                                                                         |
3004 leency 1109
;----------------------------------------------------------------------------------------------------/
1110
 
3091 leency 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             ; хранит структуру системных цветов скина
3099 Akyltist 1119
    title       db 'Palitra v0.6',0       ; хранит имя программы
1120
    hidden      db 'Hidden',0
3091 leency 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
3026 leency 1128
    buff        db '000',0
3091 leency 1129
    bground     db 'BACKGROUND',0         ; имя кнопки - 14
1130
    pnext       dd 0                      ; счетчик переключения палитры
1131
    renmode     dd 0                      ; режим отрисовки (1-цветовая схема,2-пипетка,3-круговая)
3099 Akyltist 1132
    runmode     dd 1                      ; режим запуска (1-normal, 2-hidden, 3-colordialog)
1133
    params      db 20 dup(0)              ; приём параметров
1134
    params_c    db 9  dup(0)              ; приёмник для цвета
3004 leency 1135
I_END:
1136
 
1137