Subversion Repositories Kolibri OS

Rev

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