Subversion Repositories Kolibri OS

Rev

Rev 3904 | Rev 4962 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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