Subversion Repositories Kolibri OS

Rev

Rev 4962 | Rev 7423 | 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
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
 
7421 leency 455
	;save to file eskin.ini
456
	xor     al,al
457
	mov     ecx,1024
458
	mov     edi,sys_path+2
459
	repne   scasb
460
	sub     edi,sys_path+3
461
	invoke  ini_set_str, inifileeskin, amain, aprogram, sys_path+2, edi
462
	;add param 'H '
463
	mov     word[params],'H '
464
	mov     eax,[color]
465
	or      eax,0xf ;для избежания вечного цикла если eax=0
466
	mov     edi,params+2
467
	@@:
468
	rol     eax,8
469
	or      al,al
470
	jnz     @f
471
	mov     word[edi],'00' ;нули перед числом
472
	add     edi,2
473
	jmp     @b
474
	@@:
475
	and     al,0xf0
476
	jnz     @f
477
	mov     byte[edi],'0'
478
	inc     edi
479
	@@:
480
	mov     eax,[color]
481
	mov     ebx,16
482
	call    int2ascii
483
	mov     byte[params+10],' '
484
	;add color2
485
	mov     eax,[color2]
486
	or      eax,0xf ;для избежания вечного цикла если eax=0
487
	mov     edi,params+11
488
	@@:
489
	rol     eax,8
490
	or      al,al
491
	jnz     @f
492
	mov     word[edi],'00' ;нули перед числом
493
	add     edi,2
494
	jmp     @b
495
	@@:
496
	and     al,0xf0
497
	jnz     @f
498
	mov     byte[edi],'0'
499
	inc     edi
500
	@@:
501
	mov     eax,[color2]
502
	mov     ebx,16
503
	call    int2ascii
504
 
505
	invoke  ini_set_str, inifileeskin, amain, aparam, params, 19
506
 
3091 leency 507
    ret
508
;end_set_background
509
 
3004 leency 510
desktop_get:
511
    ;.................................................................................................
3091 leency 512
    ; Определяем ширину экрана
3004 leency 513
    ;.................................................................................................
7421 leency 514
    ; Определяем ширину экрана (eax = [xsize]*65536 + [ysize])
515
    mcall   SF_GET_SCREEN_SIZE ; xsize = размер по горизонтали - 1
4187 eAndrew 516
    mov     ebx,eax			  ;
517
    shr     ebx,16			  ; ebx = xsize-1
518
    movzx   edx,ax			  ; edx = ysize-1 (лишний код)
519
    inc     ebx 			  ; ebx = xsize
520
    inc     edx 			  ; edx = ysize (лишний код)
3004 leency 521
    mov     [desctop_w],ebx
3453 Akyltist 522
    mov     [desctop_h],edx
3004 leency 523
    ret
524
;end_desktop_get
525
 
526
mouse_get:
4187 eAndrew 527
    mov     esi,2			  ; КОСТЫЛЬ: флаг для избежания зацикливания
3004 leency 528
    call    mouse_global
529
    call    desktop_get
4187 eAndrew 530
    re_mouse_loop:			  ; КОСТЫЛЬ: метка для возврата если попали в сетку
3004 leency 531
      mov     ebx,[desctop_w]
4187 eAndrew 532
      imul    ebx,[mouse_y]		  ; ebx = y*xsize
533
      add     ebx,[mouse_x]		  ; ebx = y*xsize+x
3004 leency 534
 
535
      ;.................................................................................................
3091 leency 536
      ; Берем цвет с палитры в переменную
3004 leency 537
      ;.................................................................................................
7421 leency 538
       ;mov     ebx,ecx                    ;; ebx = y*xsize+x (лишний код)
539
      mcall   SF_GET_PIXEL    ; Получаем цвет в eax
4187 eAndrew 540
      cmp     eax,[sc.work]		  ; Сравниваем с фоном приложения
541
      je      mouse_err 		  ; Если это он - то ничего не делаем
542
      cmp     eax,0x222222		  ; Сравниваем с цветом сетки
543
      je      mouse_err 		  ; Если это он - то ничего не делаем
544
      jmp     mouse_set 		  ; КОСТЫЛЬ: прыгаем чтобы не брать цвет сетки
545
    mouse_err:				  ; КОСТЫЛЬ: если попали в сетку или фон
546
      inc     [mouse_y] 		  ; КОСТЫЛЬ: смещаем по диагонали сначала по х
547
      inc     [mouse_x] 		  ; КОСТЫЛЬ: смещаем по диагонали потом по у
548
      dec     esi			  ; КОСТЫЛЬ: Уменьшаем флаг
549
      cmp     esi,0			  ; КОСТЫЛЬ: Сравниваем с нулем
550
    jz	      mouse_exit		  ; КОСТЫЛЬ: Если ноль то сделали всё что могли
551
    jmp    re_mouse_loop		  ; КОСТЫЛЬ: Если не ноль то попробуем взять соселний пиксель
552
    mouse_set:				  ; Иначе запоминаем новый цвет
3904 leency 553
      cmp     [mouse_f],1
554
      jne     was_right
555
      mov     [color],eax
556
      call    draw_result
557
      jmp     mouse_exit
558
    was_right:
559
      cmp     [mouse_f],2
560
      jne     mouse_exit
561
      mov     [color2],eax
4187 eAndrew 562
      call    draw_result		    ; Выводим результат
3004 leency 563
    mouse_exit:
4187 eAndrew 564
    ret 				  ; Возвращаем управление
3004 leency 565
;end_mouse_get----------------------------------------------------------------------------------------
566
 
567
draw_palitra:
7421 leency 568
    ; Функция 13 - нарисовать прямоугольник
569
    mcall   SF_DRAW_RECT, 110 shl 16+148, 9 shl 16+148, [sc.work]
3091 leency 570
 
3453 Akyltist 571
    cmp     [renmode],2
4187 eAndrew 572
    je	    cyrcle_draw
3091 leency 573
    ;cmp     [renmode],1
574
    ;je      picker_draw
575
    cmp     [renmode],0
4187 eAndrew 576
    je	    sheme_draw
3091 leency 577
    ret
578
 
3004 leency 579
    ;.................................................................................................
3091 leency 580
    ; Отрисовка круговой диаграммы
3004 leency 581
    ;.................................................................................................
3453 Akyltist 582
    cyrcle_draw:
583
    ;mov     eax,13
584
    ;mov     edx,0x666666
585
    ;mov     ebx,108*65536+152
586
    ;mov     ecx,125*65536+33
587
    ;mcall
588
    ;mov     edx,0xF3F3F3
589
    ;mov     ebx,109*65536+150
590
    ;mov     ecx,126*65536+31
591
    ;mcall
3091 leency 592
 
3453 Akyltist 593
    ;mov     eax,4                         ; 4 - вывести строку текста в окно
594
    ;mov     ebx,115 shl 16+131            ; [координата по оси x]*65536 + [координата по оси y]
595
    ;mov     ecx,0x666666                  ; 0xX0RRGGBB (RR, GG, BB задают цвет текста)
596
    ;mov     edx,hint                      ; указатель на начало строки
597
    ;mov     esi,24                        ; выводить esi символов
598
    ;mcall
599
    ;mov     ebx,125 shl 16+144            ; [координата по оси x]*65536 + [координата по оси y]
600
    ;mov     edx,hint2                     ; указатель на начало строки
601
    ;mov     esi,21                        ; выводить esi символов
602
    ;mcall
603
 
604
    ;mov     edx,[color]
605
    ;mov     ebx,109*65536+150
606
    ;mov     ecx, 10*65536+150
607
    ;mcall
4187 eAndrew 608
    call    mouse_local 		  ; получаем координаты мыши относительно окна
609
    mov     ecx, [mouse_x]		  ; заносим в регистр
610
    mov     edx, [mouse_y]		  ; заносим в регистр
3453 Akyltist 611
    cmp     ecx, WIN_W-10
4187 eAndrew 612
    jg	    cyrcle_draw_2
3453 Akyltist 613
    cmp     edx, WIN_H
614
    jle     end_cyrcle_draw
615
 
616
    cyrcle_draw_2:
7421 leency 617
	mcall	SF_SLEEP,10
3453 Akyltist 618
    call    desktop_get
619
    call    mouse_global
620
 
621
    mov     ebx,112*65536+11
4187 eAndrew 622
    mov     esi,0			  ; counter=8
3453 Akyltist 623
    circle_loop:
624
      mov     ecx, 10*65536+11
625
      mov     edi,0
626
      circle_loop2:
4187 eAndrew 627
	call	circle_pixel_read
7421 leency 628
	mcall   SF_DRAW_RECT
4187 eAndrew 629
	add	ecx,11 shl 16
630
	inc	edi
631
	cmp	edi,13
632
	jne	circle_loop2
3453 Akyltist 633
 
634
      add     ebx,11 shl 16
635
      inc     esi
636
      cmp     esi,13
637
      jne     circle_loop
4187 eAndrew 638
 
7421 leency 639
    mcall   SF_DRAW_RECT, 177*65536+13, 76*65536+13, 0
3453 Akyltist 640
    mov     ecx, [mouse_x]
641
    mov     edx, [mouse_y]
642
    inc     ecx
643
    inc     edx
644
    mov     ebx, edx
645
    imul    ebx, [desctop_w]
646
    add     ebx, ecx
7421 leency 647
    mcall   SF_GET_PIXEL
3453 Akyltist 648
    mov     edx,eax
7421 leency 649
    mcall   SF_DRAW_RECT, 178*65536+11, 77*65536+11
3904 leency 650
    ret
3453 Akyltist 651
    end_cyrcle_draw:
7421 leency 652
    mcall   SF_DRAW_RECT, 111*65536+145, 9*65536+145, 0x666666
3453 Akyltist 653
    ret
654
 
655
    circle_pixel_read:
7421 leency 656
    push    ecx ebx
3453 Akyltist 657
    mov     ecx, [mouse_x]
658
    mov     edx, [mouse_y]
659
    inc     ecx
660
    add     ecx, esi
661
    cmp     ecx, 6
4187 eAndrew 662
    jl	    _cpr_exit
3453 Akyltist 663
    sub     ecx, 6
664
    inc     edx
665
    add     edx, edi
666
    cmp     edx, 6
4187 eAndrew 667
    jl	    _cpr_exit
3453 Akyltist 668
    sub     edx, 6
669
 
670
    mov     ebx, edx
671
    imul    ebx, [desctop_w]
672
    add     ebx, ecx
7421 leency 673
    mcall   SF_GET_PIXEL
3453 Akyltist 674
    mov     edx,eax
7421 leency 675
    pop     ebx ecx
3453 Akyltist 676
    ret
677
 
678
    _cpr_exit:
7421 leency 679
    xor     edx,edx
680
    pop     ebx ecx
3453 Akyltist 681
    ret
682
 
3091 leency 683
    ;picker_draw:
684
    ;ret
685
 
686
    ;.................................................................................................
687
    ; Отрисовка фона под кнопки
688
    ;.................................................................................................
689
    sheme_draw:
7421 leency 690
    mov     eax,SF_DRAW_RECT  ; Функция 13 - нарисовать прямоугольник
4187 eAndrew 691
    mov     edx,0x222222		  ; цвет
692
    mov     ecx,9 shl 16+73		  ; Начальные координаты по y [к-та y]*65536 + [размер]
693
    mov     esi,2			  ; Счетчик линий подложек
3004 leency 694
    re_draw:
4187 eAndrew 695
    mov     ebx,110 shl 16+73		  ; Начальные координаты по x [к-та x]*65536 + [размер]
696
    mov     edi,2			  ; Счетчик количества подложек
3004 leency 697
    for_fon_loop:
4187 eAndrew 698
      int     0x40			  ; Прерывание
699
      add     ebx,75 shl 16		  ; Смещаем положение линии по х
700
      dec     edi			  ; Уменьшаем счетчик кнопок
701
      cmp     edi,0			  ; Сравниваем с нулем
702
    jnz     for_fon_loop		  ; Если не ноль то в начало цикла
703
    dec     esi 			  ; Уменьшаем его
704
    cmp     esi,0			  ; Сравниваем с нулем
705
    mov     ecx,84 shl 16+73		  ; Начальные координаты по y [к-та y]*65536 + [размер]
706
    jnz     re_draw			  ; Если не ноль то в начало цикла
3004 leency 707
 
708
    ;.................................................................................................
3091 leency 709
    ; Отрисовка кнопок по циклу
3004 leency 710
    ;.................................................................................................
7421 leency 711
    mov     eax,SF_DRAW_RECT  ; Функция 13 - нарисовать прямоугольник
4187 eAndrew 712
    mov     edx,0x0FFFFFFF		  ; цвет
713
    mov     esi,4			  ; Счетчик количества абзацев (#4,8)
714
    mov     ebx,99 shl 16+8		  ; Начальные координаты по x [к-та x]*65536 + [размер]
3004 leency 715
    for_abz:
3091 leency 716
      ;;push    esi                       ; Сохраняем значение счетчика линий в стек
3026 leency 717
      cmp     esi,2
3004 leency 718
      jne     x2_line
3088 leency 719
      mov     ebx,99 shl 16+8
3004 leency 720
      x2_line:
4187 eAndrew 721
      add     ebx,3 shl 16		  ; Смещаем положение линии по x
722
      mov     edi,8			  ; Счетчик количества кнопок в строке
3004 leency 723
      for_stolbik:
4187 eAndrew 724
	push	edi			  ; Сохраняем значение счетчика линий в стек
725
	mov	edi,8			  ; Счетчик количества кнопок в строке
726
	mov	ecx,  1 shl 16+8	  ; Начальные координаты по y [к-та y]*65536 + [размер]
727
	cmp	esi,2
728
	jg	y2_line 		  ; Если больше 4 то игнорим
729
	mov	ecx,76 shl 16+8
730
	y2_line:
731
	add	ebx,9 shl 16		  ; Смещаем положение линии по x
732
	for_loop:
733
	  add	  ecx,9 shl 16		  ; Смещаем положение линии по y
734
	  int	  0x40			  ; Прерывание
735
	  call	  sub_red
736
	  dec	  edi			  ; Уменьшаем счетчик кнопок
737
	  cmp	  edi,0 		  ; Сравниваем с нулем
738
	  jnz	  for_loop		  ; Если не ноль то в начало цикла
3026 leency 739
      call    sub_green
4187 eAndrew 740
      pop     edi			  ; Иначе восстанавливаем счетчик линий
741
      dec     edi			  ; Уменьшаем его
742
      cmp     edi,0			  ; Сравниваем с нулем
743
      jnz     for_stolbik		  ; Если не ноль то в начало цикла
3026 leency 744
    call    sub_blue
3091 leency 745
    ;;pop     esi                         ; Иначе восстанавливаем счетчик линий
4187 eAndrew 746
    dec     esi 			  ; Уменьшаем его
747
    cmp     esi,0			  ; Сравниваем с нулем
748
    jnz     for_abz			  ; Если не ноль то в начало цикла
749
    ret 				  ; Возвращаем управление
3004 leency 750
;end_draw_palitra-------------------------------------------------------------------------------------
751
 
3026 leency 752
 
753
sub_red:
754
    ;.................................................................................................
3091 leency 755
    ; Расчёт смещений красного цвета в генерации цвета палитры
3026 leency 756
    ;.................................................................................................
757
    push    eax
758
    mov     eax,[pnext]
759
  ;sub_red_0                              ; palitra
760
    cmp     al,0
761
    jne     sub_red_1
3091 leency 762
    sub     edx,0x40
3026 leency 763
    jmp     sub_red_e
4187 eAndrew 764
  sub_red_1:				  ; random
3026 leency 765
    cmp     al,1
766
    jne     sub_red_2
3091 leency 767
    sub     edx,0x20
3026 leency 768
    jmp     sub_red_e
4187 eAndrew 769
  sub_red_2:				  ; gree
3026 leency 770
    cmp     al,2
771
    jne     sub_red_3
772
    sub     edx,0x010101
773
    jmp     sub_red_e
4187 eAndrew 774
  sub_red_3:				  ; red
3026 leency 775
    cmp     al,3
776
    jne     sub_red_4
777
    sub     edx,0x0101
778
    jmp     sub_red_e
4187 eAndrew 779
  sub_red_4:				  ; green
3026 leency 780
    cmp     al,4
781
    jne     sub_red_5
782
    sub     edx,0x010001
783
    jmp     sub_red_e
4187 eAndrew 784
  sub_red_5:				  ; blue
3026 leency 785
    cmp     al,5
786
    jne     sub_red_e
787
    sub     edx,0x010100
788
    jmp     sub_red_e
789
  sub_red_e:
790
    pop     eax
4187 eAndrew 791
    ret 				  ; Возвращаем управление
3026 leency 792
;end_sub_red------------------------------------------------------------------------------------------
793
 
794
sub_green:
795
    ;.................................................................................................
3091 leency 796
    ; Расчёт смещений красного цвета в генерации цвета палитры
3026 leency 797
    ;.................................................................................................
798
    push    eax
799
    mov     eax,[pnext]
800
  ;sub_green_0
801
    cmp     al,0
802
    jne     sub_green_1
3091 leency 803
    sub     edx,0x4000
3026 leency 804
    jmp     sub_green_e
805
  sub_green_1:
806
    cmp     al,1
807
    jne     sub_green_e
3091 leency 808
    sub     edx,0x2000
3026 leency 809
    ;jmp     sub_green_e
810
  sub_green_e:
811
    pop     eax
4187 eAndrew 812
    ret 				  ; Возвращаем управление
3026 leency 813
;end_sub_green----------------------------------------------------------------------------------------
814
 
815
 
816
sub_blue:
817
    ;.................................................................................................
3091 leency 818
    ; Расчёт смещений красного цвета в генерации цвета палитры
3026 leency 819
    ;.................................................................................................
820
    push    eax
821
    mov     eax,[pnext]
822
  ;sub_blue_0
823
    cmp     al,0
824
    jne     sub_blue_1
3091 leency 825
    sub     edx,0x600000
3026 leency 826
    jmp     sub_blue_e
827
  sub_blue_1:
828
    cmp     al,1
829
    jne     sub_blue_e
3091 leency 830
    sub     edx,0x400000
3026 leency 831
    ;jmp     sub_blue_e
832
  sub_blue_e:
833
    pop     eax
4187 eAndrew 834
    ret 				  ; Возвращаем управление
3026 leency 835
;end_sub_blue-----------------------------------------------------------------------------------------
836
 
3004 leency 837
draw_result:
838
    ;.................................................................................................
3091 leency 839
    ; Большая рамка вывода результата
3004 leency 840
    ;.................................................................................................
7421 leency 841
    mcall   SF_DRAW_RECT, 4 shl 16+98, 9 shl 16+148, 0x00666666
842
    mcall   , 5 shl 16+96, 10 shl 16+146, 0x00F3F3F3
3088 leency 843
 
844
    ;.................................................................................................
3091 leency 845
    ; Отрисовка результата цвета в hex color2
3088 leency 846
    ;.................................................................................................
7421 leency 847
    mcall   , 16 shl 16+15, 16 shl 16+15, 0x222222
3088 leency 848
    ; color 2 - draw color
7421 leency 849
    mcall   , 17 shl 16+13, 17 shl 16+13, [color2]
3088 leency 850
    ; color 1 - draw fringle
7421 leency 851
    mcall   , 11 shl 16+15, 12 shl 16+15, 0x222222
3088 leency 852
    ; value - draw fringle
7421 leency 853
    mcall   , 34 shl 16+62, 16 shl 16+15
3004 leency 854
 
3088 leency 855
    ; color 2 - draw color
7421 leency 856
    mcall   , 12 shl 16+13, 13 shl 16+13, [color]
3088 leency 857
    ; value - draw background
7421 leency 858
    mcall   , 35 shl 16+60, 17 shl 16+13, 0xFFFFFF
3004 leency 859
 
7421 leency 860
    ; Функция 47 - вывод числа в окно
861
    ;ebx - параметры преобразования числа в текст (HEX)
862
    mcall   SF_DRAW_NUMBER, 256+8 shl 16, [color], (45 shl 16)+20,, 0
3004 leency 863
 
7421 leency 864
    ; функция 4: написать текст в окне
865
    ; edx - рисуем '#'
866
    ; esi - длина текста в байтах
867
    mcall   SF_DRAW_TEXT,38*65536+20,0,hex,1
3004 leency 868
 
869
    ;.................................................................................................
3091 leency 870
    ; Отрисовка r g b значений
3004 leency 871
    ;.................................................................................................
872
    call    get_spectr
873
 
4187 eAndrew 874
    movzx   eax,[cred]			  ; красный
875
    mov     ebx,9*65536+142		  ; [x начальный] *65536 + [y начальный]
876
    call    draw_value			  ; выводим результат
3004 leency 877
 
4187 eAndrew 878
    movzx   eax,[cgreen]		  ; зеленый
879
    mov     ebx,32*65536+142		  ; [x начальный] *65536 + [y начальный]
880
    call    draw_value			  ; выводим результат
3004 leency 881
 
4187 eAndrew 882
    movzx   eax,[cblue] 		  ; синий
883
    mov     ebx,55*65536+142		  ; [x начальный] *65536 + [y начальный]
884
    call    draw_value			  ; выводим результат
3004 leency 885
 
4187 eAndrew 886
    movzx   eax,[calpha]		  ; альфа
887
    mov     ebx,78*65536+142		  ; [x начальный] *65536 + [y начальный]
888
    call    draw_value			  ; выводим результат
3004 leency 889
 
890
    ;.................................................................................................
3091 leency 891
    ; Выводим буквы r g b a
3004 leency 892
    ;.................................................................................................
7421 leency 893
    mov     eax,SF_DRAW_TEXT  ; 4 - вывести строку текста в окно
4187 eAndrew 894
    mov     ebx,16 shl 16+40		  ; [координата по оси x]*65536 + [координата по оси y]
895
    mov     ecx,0x0			  ; 0xX0RRGGBB (RR, GG, BB задают цвет текста)
896
    mov     edx,cname			  ; указатель на начало строки
897
    mov     esi,1			  ; выводить esi символов
4962 eAndrew 898
    newline:				  ; цикл
4187 eAndrew 899
      int     0x40			  ; Прерывание
900
      add     ebx,23 shl 16		  ; Добавляем
7421 leency 901
      inc     edx			  ; Добавляем
4187 eAndrew 902
      cmp     [edx],byte 'x'		  ; Сравнение с байтом х
4962 eAndrew 903
    jne    newline			  ; Если не нуль или не равно
3004 leency 904
 
905
    ;.................................................................................................
3091 leency 906
    ; Отрисовка слайдеров
3004 leency 907
    ;.................................................................................................
7421 leency 908
    ; Функция 13 - нарисовать прямоугольник
909
    mcall   SF_DRAW_RECT, 16 shl 16+4, 51 shl 16+86, 0x222222
4187 eAndrew 910
    add     ebx,23 shl 16		  ; Начальные координаты по x [к-та y]*65536 + [размер]
3004 leency 911
    int     0x40
4187 eAndrew 912
    add     ebx,23 shl 16		  ; Начальные координаты по x [к-та y]*65536 + [размер]
3004 leency 913
    int     0x40
4187 eAndrew 914
    add     ebx,23 shl 16		  ; Начальные координаты по x [к-та y]*65536 + [размер]
3088 leency 915
    int     0x40
3004 leency 916
 
7421 leency 917
    mcall   , 17 shl 16+2, 52 shl 16+84, 0xFA0919
4187 eAndrew 918
    mov     edx,0x08CE19		  ; цвет-обводки
919
    add     ebx,23 shl 16		  ; Начальные координаты по x [к-та y]*65536 + [размер]
3004 leency 920
    int     0x40
4187 eAndrew 921
    mov     edx,0x0909FF		  ; цвет-обводки
922
    add     ebx,23 shl 16		  ; Начальные координаты по x [к-та y]*65536 + [размер]
3004 leency 923
    int     0x40
4187 eAndrew 924
    mov     edx,0xE4E4E4		  ; цвет-обводки
925
    add     ebx,23 shl 16		  ; Начальные координаты по x [к-та y]*65536 + [размер]
3088 leency 926
    int     0x40
3004 leency 927
 
928
    ;.................................................................................................
3091 leency 929
    ; Отрисовка ползунков
3004 leency 930
    ;.................................................................................................
4187 eAndrew 931
    mov     edx,0x0			  ; цвет-ползунков
932
    mov     ebx,17 shl 16+11		  ; Начальные координаты по x [к-та x]*65536 + [размер]
933
    movzx   eax,[cred]			  ; берем значение цвета
3004 leency 934
    call    draw_slider
3088 leency 935
    add     ebx,23 shl 16
4187 eAndrew 936
    movzx   eax,[cgreen]		  ; берем значение цвета
3004 leency 937
    call    draw_slider
3088 leency 938
    add     ebx,23 shl 16
4187 eAndrew 939
    movzx   eax,[cblue] 		  ; берем значение цвета
3004 leency 940
    call    draw_slider
3088 leency 941
    add     ebx,23 shl 16
4187 eAndrew 942
    movzx   eax,[calpha]		  ; берем значение цвета
3088 leency 943
    call    draw_slider
3004 leency 944
 
4187 eAndrew 945
    ret 				  ; Возвращаем управление
3004 leency 946
;end_draw_result
947
 
948
draw_slider:
949
    xor     ecx,ecx
4187 eAndrew 950
    mov     cl,0x3			  ; будем делить его на 3 так как ползунки длинной 85 пикселей
951
    div     cl				  ; делим - целое в al остаток в ah
952
    mov     cl,136			  ; нижняя точка ползунка
953
    sub     cl,al			  ; cl=cl-al
3004 leency 954
    shl     ecx,16
7421 leency 955
    inc     ecx				  ; задаем начальное положение
956
    mcall   SF_DRAW_RECT      ; Функция 13 - нарисовать прямоугольник
957
    push    ebx				  ; сохраняем для следующего ползунка x+w
4187 eAndrew 958
    sub     ebx,8			  ; так как ширина линии 11 то отнимаем 8 чтобы кубик стал шириной 3
959
    add     ebx,8 shl 16		  ; Координаты по x для квадрата на ползунке смещаем на 8 в право
960
    inc     ecx 			  ; быдлокодим высоту ползунка до 3-х (1+1=2)
961
    inc     ecx 			  ; (2+1=3) ну вот у нас будет кубик 3х3 на 8 в право от линии
962
    int     0x40			  ; рисуем
963
    pop     ebx 			  ; восстанавливаем нормальные координаты
964
    ret 				  ; Возвращаем управление
3004 leency 965
 
966
;end_slider
967
 
968
draw_value:
969
    ;.................................................................................................
3091 leency 970
    ; Вывод числа из строки в указанной области
3004 leency 971
    ;.................................................................................................
4187 eAndrew 972
    push    ebx 			  ; сохраняем присланные координаты
973
    mov     ebx,10			  ; устанавливаем основание системы счисления
7421 leency 974
    mov     edi,buff		  ; указатель на строку буфера
975
	call    int2ascii   	  ; конвертируем число и ложим как строку в буфер + esi длина
976
    mov     eax,SF_DRAW_TEXT  ; функция 4: написать текст в окне
4187 eAndrew 977
    pop     ebx 			  ; достаем из стека присланные координаты
978
    cmp     esi,2			  ; ЦЕНТРИРОВАНИЕ ТЕКСТА
3088 leency 979
    jne     draw_value_1
980
    add     ebx,4 shl 16
981
    jmp     draw_value_e
982
  draw_value_1:
983
    cmp     esi,1
984
    jne     draw_value_e
985
    add     ebx,7 shl 16
986
  draw_value_e:
4187 eAndrew 987
    mov     ecx,0x0			  ; цвет текста RRGGBB
988
    mov     edx,buff			  ; указатель на начало текста
3088 leency 989
    int     0x40
4187 eAndrew 990
    ret 				  ; Возвращаем управление
3004 leency 991
;end_draw_value
992
 
3099 Akyltist 993
  _read_params:
994
 
7421 leency 995
      mov eax,dword[params+2]
996
      mov dword[params_c+0],eax
3099 Akyltist 997
 
7421 leency 998
      mov eax,dword[params+6]
999
      mov dword[params_c+4],eax
3099 Akyltist 1000
 
4962 eAndrew 1001
      mov   esi,params_c
1002
      mov   ecx,16
1003
      call  ascii2int
1004
      mov   [color],eax
1005
 
7421 leency 1006
      mov eax,dword[params+11]
1007
      mov dword[params_c+0],eax
4962 eAndrew 1008
 
7421 leency 1009
      mov eax,dword[params+15]
1010
      mov dword[params_c+4],eax
4962 eAndrew 1011
 
1012
      mov   esi,params_c
1013
      mov   ecx,16
1014
      call  ascii2int
1015
      mov   [color2],eax
1016
 
3099 Akyltist 1017
      ret
1018
 
3004 leency 1019
hex_digit:
1020
    ;.................................................................................................
3091 leency 1021
    ; Преобразование в ASCII (вне зависимости от системы счисления)
3004 leency 1022
    ;.................................................................................................
4187 eAndrew 1023
    cmp    dl,10			  ; в dl ожидается число от 0 до 15
1024
    jb	   .less			  ; если dl<10 то переходим
1025
    add    dl,'A'-10			  ; 10->A 11->B 12->C ...
1026
    ret 				  ; Возвращаем управление
3004 leency 1027
    .less:
4187 eAndrew 1028
    or	   dl,'0'			  ; Если система счисления 10-я и менее
1029
    ret 				  ; Возвращаем управление
3004 leency 1030
;end_hex_digit
1031
 
1032
int2ascii:
1033
    ;.................................................................................................
3091 leency 1034
    ; Преобразование числа в строку
3004 leency 1035
    ;.................................................................................................
3091 leency 1036
    ; eax - 32-х значное число
1037
    ; ebx - основание системы счисления
1038
    ; edi - указатель на строку буфера
1039
    ; Возвращает заполненный буфер и esi - длина строки
7421 leency 1040
    push    edi
4187 eAndrew 1041
    xor     esi,esi			  ; зануляем счетчик символов
3004 leency 1042
    convert_loop:
4187 eAndrew 1043
    xor     edx,edx			  ; зануляем регистр под остаток
1044
    div     ebx 			  ; eax/ebx - остаток в edx
1045
    call    hex_digit			  ; преобразуем символ
1046
    push    edx 			  ; ложим в стек
1047
    inc     esi 			  ; увеличиваем счетчик
1048
    test    eax,eax			  ; если еще можно делить
1049
    jnz     convert_loop		  ; то делием еще
1050
    cld 				  ; ОБЯЗАТЕЛЬНО сбрасываем флаг направления DF (запись вперёд)
1051
    write_loop: 			  ; иначе
1052
    pop     eax 			  ; достаем из стека в еах
1053
    stosb				  ; записываем в буфер по адресу ES:(E)DI
1054
    dec     esi 			  ; уменьшаем счетчик
1055
    test    esi,esi			  ; если есть что доставать из стека
1056
    jnz     write_loop			  ; то достаём
1057
    mov     byte [edi],0		  ; иначе дописыываем нулевой байт
7421 leency 1058
    pop     edi
3091 leency 1059
    ; код ниже не имеет ничего общего к функции, просто возвращает еще длинну полученной строки
3004 leency 1060
    call    str_len
1061
    mov     esi,eax
4187 eAndrew 1062
    ret 				  ; и возвращаем управление
3004 leency 1063
;end_int2ascii
1064
 
3099 Akyltist 1065
char2byte:
1066
    sub al,'0'
1067
    cmp al,10
4187 eAndrew 1068
    jb	done
3099 Akyltist 1069
    add al,'0'
1070
    and al,0x5f
1071
    sub al,'A'-10
1072
    and al,0x0f
1073
    done:
1074
    ret
1075
;end_char2byte
1076
 
1077
ascii2int:
1078
    ;.................................................................................................
1079
    ; Преобразование строки в число
1080
    ;.................................................................................................
1081
    ; esi - указатель на нультерминированную строку
1082
    ; ecx - основание системы счисления
1083
    ; Возвращает eax - число
1084
    push esi
1085
    xor eax,eax
1086
    xor ebx,ebx
1087
    cmp byte [esi],'-'
1088
    jnz .next
1089
    inc esi
1090
    .next:
1091
    lodsb
1092
    or al,al
1093
    jz .done
1094
    call char2byte
1095
    imul ebx,ecx
1096
    add ebx,eax
1097
    jmp .next
1098
    .done:
1099
    xchg ebx,eax
1100
    pop esi
1101
    cmp byte [esi],'-'
1102
    jz .negate
1103
    ret
1104
    .negate:
1105
    neg eax
1106
    ret
1107
;end_ascii2int
1108
 
3004 leency 1109
get_spectr:
1110
    ;.................................................................................................
3091 leency 1111
    ; возвращает r,g,b состовляющие цвета
3004 leency 1112
    ;.................................................................................................
1113
    mov     ecx,[color]
3088 leency 1114
    mov     [cblue],cl
1115
    shr     ecx,8
1116
    mov     [cgreen],cl
1117
    shr     ecx,8
1118
    mov     [cred],cl
1119
    shr     ecx,8
1120
    mov     [calpha],cl
4187 eAndrew 1121
    ret 				  ; и возвращаем управление
3004 leency 1122
;end_get_spectr
1123
 
1124
set_spectr:
1125
    ;.................................................................................................
3091 leency 1126
    ; устанавливает из r,g,b цвет
3004 leency 1127
    ;.................................................................................................
3088 leency 1128
    movzx   eax,[calpha]
3004 leency 1129
    shl     eax,8
3088 leency 1130
    mov     al,[cred]
1131
    shl     eax,8
3004 leency 1132
    mov     al,[cgreen]
1133
    shl     eax,8
1134
    mov     al,[cblue]
1135
    mov     [color],eax
4187 eAndrew 1136
    call    draw_result 		  ; Выводим результат
1137
    ret 				  ; и возвращаем управление
3004 leency 1138
;end_get_spectr
1139
 
1140
str_len:
1141
    ;.................................................................................................
3091 leency 1142
    ; определяет длину строки (вход->EDI ZS offset ; выход->EAX ZS length)
3004 leency 1143
    ;.................................................................................................
7421 leency 1144
	push ecx esi edi
3004 leency 1145
 
1146
	cld
1147
	xor   al, al
1148
	mov ecx, 0FFFFFFFFh
1149
	mov esi, edi
1150
	repne scasb
1151
	sub edi, esi
1152
	mov eax, edi
1153
	dec eax
1154
 
7421 leency 1155
	pop edi esi ecx
3004 leency 1156
 
1157
	ret
1158
;end_str_len
3099 Akyltist 1159
 
1160
 
4962 eAndrew 1161
 ;-------------------------------
3099 Akyltist 1162
 
4962 eAndrew 1163
 proc random uses ebx ecx edx, max_value
1164
    mov     ebx, 0
1165
    mov     eax, ebx
1166
    or	    eax, eax
1167
    jnz     @f
1168
    rdtsc
1169
    xor     eax, edx
1170
    mov     ebx, eax
1171
 
1172
 @@:
1173
    xor     edx, edx
1174
    mov     ecx, 127773
1175
    div     ecx
1176
    mov     ecx, eax
1177
    mov     eax, 16807
1178
    mul     edx
1179
    mov     edx, ecx
1180
    mov     ecx, eax
1181
    mov     eax, 2836
1182
    mul     edx
1183
    sub     ecx, eax
1184
    xor     edx, edx
1185
    mov     eax, ecx
1186
    mov     ebx, ecx
1187
    mov     ecx, 100000
1188
    div     ecx
1189
    mov     eax, edx
1190
 
1191
    xor     edx, edx
1192
    mov     ebx, [max_value]
1193
    div     ebx
1194
    mov     eax, edx
1195
 
1196
    ret
1197
 endp
1198
 
1199
set_background2:
7421 leency 1200
    mcall   SF_SYS_MISC, SSF_HEAP_INIT
1201
    mcall   SF_SYS_MISC, SSF_MEM_ALLOC, 256 * 256 * 3
4962 eAndrew 1202
    mov     [image], eax
1203
 
1204
    mov     edx, eax
1205
    mov     ecx, 256 * 256
1206
  @@:
1207
    stdcall random, 15 + 1
1208
    sub     al, 15 / 2
1209
 
1210
    mov     bh, byte [color + 0]
1211
    add     bh, al
1212
    mov     [edx + 0], bh
1213
    mov     bh, byte [color + 1]
1214
    add     bh, al
1215
    mov     [edx + 1], bh
1216
    mov     bh, byte [color + 2]
1217
    add     bh, al
1218
    mov     [edx + 2], bh
1219
    add     edx, 3
1220
    loop    @b
1221
 
7421 leency 1222
    mcall   SF_BACKGROUND_SET, SSF_SIZE_BG, 256, 256
1223
    mcall   SF_BACKGROUND_SET, SSF_MODE_BG, 1
1224
    mcall   SF_BACKGROUND_SET, SSF_IMAGE_BG, [image], 0, 256 * 256 * 3
1225
    mcall   SF_BACKGROUND_SET, SSF_REDRAW_BG
4962 eAndrew 1226
 
7421 leency 1227
    mcall   SF_SYS_MISC, SSF_MEM_FREE, [image]
4962 eAndrew 1228
ret
1229
 
3004 leency 1230
;#___________________________________________________________________________________________________
1231
;****************************************************************************************************|
3091 leency 1232
; БЛОК ПЕРЕМЕННЫХ И КОНСТАНТ                                                                         |
3004 leency 1233
;----------------------------------------------------------------------------------------------------/
3453 Akyltist 1234
circle:
7421 leency 1235
    title	db 'Palitra v0.77',0	   ; хранит имя программы
4187 eAndrew 1236
    hidden	db 'Hidden',0
1237
    hex 	db '#',0		  ; для вывода решётки как текста
1238
    cname	db 'RGBAx'		  ; хранит разряды цветов (red,green,blue) x-метка конца
1239
    larrow	db 0x1A,0
1240
    buff	db '000',0
1241
    bground	db 'BACKGROUND',0	  ; имя кнопки - 14
4962 eAndrew 1242
    bground1	db 'Gradient',0 	  ; имя кнопки - 14
1243
    bground2	db 'Noisy',0	     ; имя кнопки - 14
4187 eAndrew 1244
    runmode	dd 1			  ; режим запуска (1-normal, 2-hidden, 3-colordialog)
4962 eAndrew 1245
    color2	dd 00FFFFFFh		  ; хранит значение второго выбранного цвета
1246
 
7421 leency 1247
    inifileeskin db '/sys/settings/eskin.ini',0
1248
    amain       db 'main',0
1249
    aprogram    db 'program',0
1250
    aparam      db 'param',0
4962 eAndrew 1251
 
7421 leency 1252
align 16
1253
@IMPORT:
4962 eAndrew 1254
 
7421 leency 1255
library \
1256
    libini , 'libini.obj'
1257
 
1258
import  libini, \
1259
	ini_set_str, 'ini_set_str'
1260
 
4187 eAndrew 1261
I_END:
4962 eAndrew 1262
    cm		rb 12
1263
    color	rd 1			  ; хранит значение выбранного цвета
1264
    mouse_x	rd 1			  ; хранит глобальную х координату мыши
1265
    mouse_y	rd 1			  ; хранит глобальную у координату мыши
1266
    mouse_f	rd 1			  ; хранит данные о том какая кнопка мыши была нажата
1267
    desctop_w	rd 1			  ; хранит ширину экрана
1268
    desctop_h	rd 1			  ; хранит высоту экрана
1269
    sc		system_colors		  ; хранит структуру системных цветов скина
1270
    cred	rb 1			  ; храним красный спекрт
1271
    cgreen	rb 1			  ; храним зеленый спектр
1272
    cblue	rb 1			  ; храним синий спектр
1273
    calpha	rb 1			  ; храним прозрачность
1274
    pnext	rd 1			  ; счетчик переключения палитры
1275
    renmode	rd 1			  ; режим отрисовки (1-цветовая схема,2-пипетка,3-круговая)
1276
    params	rb 20			  ; приём параметров
1277
    params_c	rb 9			  ; приёмник для цвета
7421 leency 1278
    image	    rd 1
3453 Akyltist 1279
 
7421 leency 1280
	rd 1024
1281
stacktop:
1282
	sys_path rb 1024
4962 eAndrew 1283
I_MEM: