Subversion Repositories Kolibri OS

Rev

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