Subversion Repositories Kolibri OS

Rev

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