Subversion Repositories Kolibri OS

Rev

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