Subversion Repositories Kolibri OS

Rev

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