Subversion Repositories Kolibri OS

Rev

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