Subversion Repositories Kolibri OS

Rev

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