Subversion Repositories Kolibri OS

Rev

Rev 9472 | 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
9470 leency 68
  org    0
69
  db     'MENUET01'
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
 
9541 leency 77
  include 'draw_sliders.inc'
78
  include 'draw_utils.inc'
79
  include 'draw_palitra.inc'
80
 
81
 
82
 
9472 leency 83
  WIN_W  = 394            ; ширина окна
84
  WIN_H  = 251            ; высота окна
85
  WIN_X  = 250            ; координата х окна
86
  WIN_Y  = 190            ; координата у окна
9541 leency 87
 
88
  Left_Border=4
89
  SliderPanel_W = 110
9472 leency 90
  DRAWY  = 9
9541 leency 91
 
92
  CELLW  = 11; 11            ; not used yet, but has to be :)
93
 
9472 leency 94
  ICONX  = WIN_W - 35
95
  SLIDEW = 25
3099 Akyltist 96
 
9541 leency 97
  palitra_x = Left_Border+SliderPanel_W+12
98
  palitra_w = CELLW*(8)+8+1
99
  palitra_xw = palitra_x shl 16 + palitra_w
100
  palitra_yw = DRAWY shl 16 + palitra_w
101
 
3004 leency 102
START:
7421 leency 103
    mcall   SF_SYS_MISC,SSF_HEAP_INIT ; инициализация кучи
9472 leency 104
    mcall SF_SYS_MISC, SSF_MEM_OPEN, i18_name
105
    mov [icons18], eax
106
    mcall SF_SYS_MISC, SSF_MEM_OPEN, i18bg_name
107
    mov [icons18bg], eax
108
 
7421 leency 109
    stdcall dll.Load, @IMPORT
110
    or      eax,eax
111
    jnz     bexit
9472 leency 112
    mcall   SF_SET_EVENTS_MASK,EVM_REDRAW+EVM_KEY+EVM_BUTTON+EVM_MOUSE ; устанавливаем маску событий
9470 leency 113
    include 'params_init.inc'             ; обработка параметров командной строки
3099 Akyltist 114
 
3004 leency 115
;#___________________________________________________________________________________________________
116
;****************************************************************************************************|
3091 leency 117
; ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ - ОБРАБОТКА СОБЫТИЙ                                                        |
3004 leency 118
;----------------------------------------------------------------------------------------------------/
119
red:
9470 leency 120
    call draw_main                        ; вызываем перерисовку окна приложения
3004 leency 121
still:
9470 leency 122
    mcall   SF_WAIT_EVENT         ; функция 10 - ждать события
9472 leency 123
    cmp     eax,EV_REDRAW                 ; перерисовать окно ?
9470 leency 124
    je      red                           ; если да - на метку red
9472 leency 125
    cmp     eax,EV_KEY                    ; нажата клавиша ?
9470 leency 126
    je      key                           ; если да - на key
9472 leency 127
    cmp     eax,EV_BUTTON                 ; нажата кнопка ?
9470 leency 128
    je      button                        ; если да - на button
9472 leency 129
    cmp     eax,EV_MOUSE                  ; событие от мыши вне окна
9470 leency 130
    je      mouse                         ; если да - на button
131
    jmp     still                         ; если другое событие - в начало цикла
3004 leency 132
;end_still
133
 
9470 leency 134
key:                                      ; нажата клавиша на клавиатуре
135
    mcall   SF_GET_KEY    ; функция 2 - считать код символа (в ah) (тут в принципе не нужна)
136
    jmp     still                         ; вернуться к началу цикла
3004 leency 137
;end_key
138
 
3453 Akyltist 139
mouse:
3904 leency 140
    cmp     [renmode],2
141
    jne     left
3453 Akyltist 142
    call    cyrcle_draw
3904 leency 143
    jmp     center
144
  left:
7421 leency 145
    mcall   SF_MOUSE_GET,SSF_BUTTON
3904 leency 146
    cmp     al,1b
147
    jne     right
148
    mov     [mouse_f],1
149
    jmp     still
150
  right:
151
    cmp     al,10b
152
    jne     still
153
    mov     [mouse_f],2
154
    jmp     still
155
  center:
7421 leency 156
    mcall   SF_MOUSE_GET,SSF_BUTTON
3453 Akyltist 157
    cmp     al,100b
158
    jne     still
3904 leency 159
    mov     [mouse_f],3
3453 Akyltist 160
    mov     [color],edx
161
    call    draw_result
9470 leency 162
    jmp     still                         ; вернуться к началу цикла
3453 Akyltist 163
;end_mouse
164
 
3004 leency 165
button:
9470 leency 166
    mcall   SF_GET_BUTTON         ; 17 - получить идентификатор нажатой кнопки
167
    cmp     ah, 1                         ; если нажата кнопка с номером 1,
168
    jz      bexit                         ; выходим
3091 leency 169
  ;обработка кнопки Next
9470 leency 170
    cmp     ah, 12                        ; если нажата кнопка NEXT
171
    jne     next_bg                       ; выходим
172
    inc     [pnext]                       ; увеличиваем при нажатии номер палитры
173
    mov     [renmode],0                   ; включаем цветовые схемы
174
    mov     eax,[pnext]                   ; заносим значение в еах
175
    cmp     al,6                          ; сравниваем с заявленным количеством палитр
176
    jne     next_redraw                   ; если не больше максимума то на вызов отрисовки
177
    xor     eax,eax                       ; иначе зануляем палитру на default
178
    mov     [pnext],eax                   ; и запоминаем что сбросили палитру на default
3026 leency 179
  next_redraw:
9470 leency 180
    call    draw_palitra                  ; РИСУЕМ ПАЛИТРУ
181
    jmp     still                         ; Уходим на ожидание другого события
3091 leency 182
  next_bg:
9470 leency 183
    cmp     ah, 14                        ; Кнопка BACKGROUND
184
    jne     next_bg2                      ; если не нажата то выходим
185
    call    set_background                ; иначе устанавливаем фон
186
    jmp     still                         ; и на ожидание события
4962 eAndrew 187
  next_bg2:
9470 leency 188
    cmp     ah, 16                        ; Кнопка BACKGROUND
189
    jne     circle_bg                     ; если не нажата то выходим
190
    call    set_background2               ; иначе устанавливаем фон
191
    jmp     still                         ; и на ожидание события
3091 leency 192
  circle_bg:
9470 leency 193
    cmp     ah, 15                        ; Кнопка Круговая палитра
194
    jne     next_end                      ; если не нажата то выходим
195
    mov     [renmode],2                   ; включаем отрисовку круговой палитры
196
    call    draw_palitra                  ; РИСУЕМ ПАЛИТРУ
197
    jmp     still                         ; и на ожидание события
3026 leency 198
  next_end:
9470 leency 199
    cmp     ah,13                         ; COLOR SWAP
3088 leency 200
    jne     color_swap_end
201
    push    [color2]
202
    push    [color]
203
    pop     [color2]
204
    pop     [color]
205
    call    draw_result
9470 leency 206
    jmp     still                         ; И уходим на ожидание другого события
3088 leency 207
  color_swap_end:
9470 leency 208
    cmp     ah, 7                         ; Проверяем нажата кнопка с ID=7
209
    jne     color_button                  ; Если не нажата, то идём дальше
210
    call    mouse_get                     ; Иначе включаем обработчик мыши, чтобы считать значение цвета с палитры
211
    jmp     still                         ; И уходим на ожидание другого события
212
  color_button:                           ; РАСЧЁТ координат для ползунков RGBA
213
    push    eax                           ; запоминаем еах
214
    call    mouse_local                   ; получаем локальные координаты
215
    mov     ebx, 188;137                       ; нижняя граница ползунка по У
216
    mov     ecx,[mouse_y]                 ; занисим в есх значение курсора по У
217
    sub     ebx,ecx                       ; находим разность (т.е. куда смещается ползунок)
218
    mov     ecx, 2;3                         ; заносим в есх цифру 3 (256/3=85, где 85-высота ползунков)
219
    imul    ecx,ebx                       ; находим истинный параметр цвета с учётом масштаба ползунка---+
220
    pop     eax                           ; восстанавливаем еах                                          :
3091 leency 221
  ;red_button:                            ; Красный Трекбар                                              :
9470 leency 222
    cmp     ah, 8                         ; ID=8                                                         :
223
    jne     green_button                  ; если нет, то проверяем зелёный трекбар                       :
224
    mov     [cred],cl                     ; иначе присваиваем значение, красному цвету спектра    <------+
225
    call    set_spectr                    ; устанавливаем спектр
226
    jmp     still                         ; Уходим на ожидание другого события
3004 leency 227
  green_button:
228
    cmp     ah, 9
229
    jne     blue_button
230
    mov     [cgreen],cl
231
    call    set_spectr
9470 leency 232
    jmp     still                         ; Уходим на ожидание другого события
3004 leency 233
  blue_button:
234
    cmp     ah, 10
3088 leency 235
    jne     alpha_button
3004 leency 236
    mov     [cblue],cl
237
    call    set_spectr
9470 leency 238
    jmp     still                         ; Уходим на ожидание другого события
3088 leency 239
  alpha_button:
240
    cmp     ah, 11
241
    jne     still
242
    mov     [calpha],cl
243
    call    set_spectr
9470 leency 244
    jmp     still                         ; Уходим на ожидание другого события
3004 leency 245
  bexit:
7421 leency 246
    mcall SF_TERMINATE_PROCESS ; иначе конец программы
3004 leency 247
;end_button
248
 
249
;#___________________________________________________________________________________________________
250
;****************************************************************************************************|
3091 leency 251
; ГЛАВНЫЙ МОДУЛЬ ОТРИСОВКИ ОКНА И ЭЛЕМЕНТОВ ПРИЛОЖЕНИЯ                                               |
3004 leency 252
;----------------------------------------------------------------------------------------------------/
3091 leency 253
draw_main:
7421 leency 254
    ; функция 12: означает, что будет рисоваться окно
9470 leency 255
    mcall   SF_REDRAW,SSF_BEGIN_DRAW
3004 leency 256
 
7421 leency 257
    ; Функция 48 - стили отображения окон
258
    mcall   SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
3004 leency 259
 
7421 leency 260
    ; Функция 48 - стили отображения окон
261
    mcall   SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT
9470 leency 262
    mov     ecx,eax                       ; Запоминаем высоту скина
3004 leency 263
 
3099 Akyltist 264
    mov     edi,[runmode]
265
    cmp     edi,2
266
    jne     no_hiddenmode
267
    mov     edi,hidden
268
    jmp     set_title
269
  no_hiddenmode:
270
    cmp     edi,3
271
    jne     no_dialogmode
272
    mov     edi,hidden
273
    jmp     set_title
274
  no_dialogmode:
9470 leency 275
    mov     edi,title                     ; Заголовок окна
3099 Akyltist 276
  set_title:
277
 
9470 leency 278
    xor     eax,eax                       ; Очищаем eax (mov eax,0) (Функция 0)
279
    mov     ebx,WIN_X shl 16+WIN_W        ; [координата по оси x]*65536 + [размер по оси x]
280
    add     ecx,WIN_Y shl 16+WIN_H        ; Высота скина + [координата по y]*65536 + [размер по y] (168 для версии 0.2)
281
    mov     edx,[sc.work]                 ; Видимо стиль окна по дефолту
282
    or      edx,0x34000000                ; Или окно со скином фиксированных размеров
3004 leency 283
 
9470 leency 284
    int     0x40                          ; Прерывание
3004 leency 285
 
3091 leency 286
 
9470 leency 287
    call    draw_palitra                  ; РИСУЕМ ПАЛИТРУ
288
    call    draw_result                   ; РИСУЕМ РЕЗУЛЬТАТ
4187 eAndrew 289
 
9541 leency 290
    mcall   SF_DEFINE_BUTTON,  , , 0x07+BT_HIDE ; palitra
3004 leency 291
 
9472 leency 292
    add     edx,1++BT_NOFRAME
293
    mcall   , <10,22>, <62,128>           ; Рисуем невидимую кнопку под слайдером red
294
    add     ebx,25*65536                  ; Добавляем
9470 leency 295
    inc     edx                           ; ID = 9
296
    int     0x40                          ; Рисуем невидимую кнопку под слайдером green
9472 leency 297
    add     ebx,25*65536                  ; Добавляем
9470 leency 298
    inc     edx                           ; ID = 10
299
    int     0x40                          ; Рисуем невидимую кнопку под слайдером blue
9472 leency 300
    add     ebx,25*65536                  ; Добавляем
9470 leency 301
    inc     edx                           ; ID = 11
302
    int     0x40                          ; Рисуем невидимую кнопку под слайдером alpha
3004 leency 303
 
7421 leency 304
    ; Функция 8 - определить/удалить кнопку (СМЕНА ЦВЕТА)
9472 leency 305
    mcall   , <13,19>, <20,18>, 0x0D+BT_HIDE
3088 leency 306
 
3091 leency 307
    call    draw_bottom_panel
308
    call    draw_left_panel
3004 leency 309
 
7421 leency 310
    ; функция 12: означает, что будет рисоваться окно
9470 leency 311
    mcall SF_REDRAW,SSF_END_DRAW
3091 leency 312
    ret
3088 leency 313
 
9472 leency 314
 
9541 leency 315
 
3091 leency 316
;#___________________________________________________________________________________________________
317
;****************************************************************************************************|
318
; БЛОК ВСПОМОГАТЕЛЬНЫХ ПРОЦЕДУР И ФУНКЦИЙ ПРИЛОЖЕНИЯ                                                 |
319
;----------------------------------------------------------------------------------------------------/
3004 leency 320
 
3026 leency 321
 
3091 leency 322
    ;------------------------------------------------------------------------------------------------+
9470 leency 323
    draw_left_panel:                      ; Отрисовка боковой панели  SL97: На самом деле правой.
3091 leency 324
    ;.................................................................................................
7421 leency 325
    ; button_next_colorsheme
9472 leency 326
    mcall   SF_DEFINE_BUTTON, , , 12+BT_HIDE
3453 Akyltist 327
 
9541 leency 328
    ; palitra button                    ; ID = 14
329
    mcall , ,(DRAWY+150) shl 16 + 21, 14+BT_HIDE
330
 
331
    ; pipet button                        ; ID = 15
332
    mcall , , (DRAWY+150) shl 16 + 21, 15+BT_HIDE
333
 
9472 leency 334
    mov     ebx,[icons18bg]
335
    add     ebx,18*18*4*53
336
    mcall   SF_PUT_IMAGE_EXT, ebx, <18,18>, , 32, 0, 0
3453 Akyltist 337
 
9472 leency 338
    add     ebx,18*18*4*(39-53)
9541 leency 339
    mov     edx,(ICONX+2)*65536+WIN_H-90
9472 leency 340
    mcall
9541 leency 341
 
9472 leency 342
    mov     ebx,[icons18]
9541 leency 343
    add     ebx,18*18*4*(53-1)
9472 leency 344
    sub     edx,40
345
    mcall
9541 leency 346
 
347
    stdcall DrawDeepRectangle, ICONX, DRAWY, 22, 22, [sc.work_light], [sc.work_dark]
348
 
349
    stdcall DrawDeepRectangle, ICONX, DRAWY+110, 22, 22, [sc.work_light], [sc.work_dark]
350
 
351
    stdcall DrawDeepRectangle, ICONX, DRAWY+150, 22, 22, [sc.work_light], [sc.work_dark]
352
 
353
    ;stdcall DrawRectangle3D, ICONX, DRAWY, 22, 22, [sc.work_light], [sc.work_dark]   ;Leency: draw rectangle around the button, buggy now
354
 
3453 Akyltist 355
    ;mov     eax,13                        ; draw rect
356
    ;mov     ebx,266 shl 16+16             ; [x] + [size]
357
    ;mov     ecx,9 shl 16+16               ; [y] + [size]
358
    ;mov     edx,0x666666                  ; RGB
359
    ;push    esi                           ; backup esi
360
    ;mov     esi,8                         ; counter=8
361
    ;draw_lpanel:                          ; loop label
362
    ;  int     0x40                        ; call draw black rect
363
    ;  add     ecx,19 shl 16               ; move rect
364
    ;  dec     esi                         ; decrement counter
365
    ;  cmp     esi,0                       ; if counter!=zero
366
    ;  jne     draw_lpanel                 ; then goto label
367
    ;  mov     esi,8                       ; else counter=8
368
    ;  mov     ebx,267 shl 16+14           ; [x] + [size]
369
    ;  mov     ecx,10 shl 16+14            ; [y] + [size]
370
    ;  mov     edx,0xF3F3F3                ; RGB
371
    ;draw_lpanel2:                         ; 2 loop label
372
    ;  int     0x40                        ; call draw white rect
373
    ;  add     ecx,19 shl 16               ; move rect
374
    ;  dec     esi                         ; decrement counter
375
    ;  cmp     esi,0                       ; if counter!=0
376
    ;  jne     draw_lpanel2                ; then goto label2
377
    ;pop     esi                           ; restore esi
3091 leency 378
    ; draw_left_arrow for button_next_colorsheme
3453 Akyltist 379
    ;mov     eax,4                         ; Write string
380
    ;mov     ebx,272 shl 16+13             ; [x] + [y]
381
    ;mov     ecx,0x0                       ; RGB
382
    ;mov     edx,larrow                    ; string pointer
383
    ;mov     esi,1                         ; count symbol
384
    ;int     0x40                          ; call
385
    ;mov     eax,38                        ; draw line
4187 eAndrew 386
    ;mov     ebx,270 shl 16+272            ; [start x] + [end x]
387
    ;mov     ecx,16 shl 16+16              ; [start y] + [end y]
3453 Akyltist 388
    ;mov     edx,0x0                       ; RGB
389
    ;int     0x40                          ; call
9470 leency 390
    ret                                   ; return
3091 leency 391
    ;.................................................................................................
3026 leency 392
 
393
 
3091 leency 394
    ;------------------------------------------------------------------------------------------------+
9470 leency 395
    draw_bottom_panel:                    ; Отрисовка нижней панели
3091 leency 396
    ;.................................................................................................
9541 leency 397
    mcall   SF_DEFINE_BUTTON, ((60+70) shl 16)+90, ((WIN_H-26) shl 16)+16, 14, [sc.work_button]
4962 eAndrew 398
 
399
    add     ebx, 100 shl 16
400
    add     edx, 2
401
    int     0x40
402
 
7421 leency 403
    ; Write string
9470 leency 404
    mov     ecx,[sc.work_text]            ; RGB
405
    or      ecx, 1 shl 31
9541 leency 406
    mcall   SF_DRAW_TEXT, (60) shl 16+(WIN_H-21), ,bground
4962 eAndrew 407
 
408
    mov     ecx, [sc.work_button_text]
9470 leency 409
    or      ecx, 1 shl 31
4962 eAndrew 410
 
9470 leency 411
    add     ebx, 90 shl 16
4962 eAndrew 412
    mov     edx, bground1
413
    int     0x40
414
 
9470 leency 415
    add     ebx, 108 shl 16
4962 eAndrew 416
    mov     edx, bground2
417
    int     0x40
418
 
9541 leency 419
    mcall SF_DRAW_LINE, 4 shl 16+(WIN_W-14), (WIN_H-32) shl 16+(WIN_H-32), 0x00666666
9470 leency 420
    ret                                   ; return
3091 leency 421
    ;.................................................................................................
3026 leency 422
 
3004 leency 423
mouse_global:
424
    ;.................................................................................................
3091 leency 425
    ; Получаем координаты мыши
3004 leency 426
    ;.................................................................................................
7421 leency 427
    mcall   SF_MOUSE_GET,SSF_SCREEN_POSITION
428
    ; eax = x*65536 + y, (x,y)=координаты курсора мыши
9470 leency 429
    mov     ecx,eax                       ;
430
    shr     ecx,16                        ; ecx = x+1
431
    movzx   edx,ax                        ; edx = y+1
432
    dec     ecx                           ; ecx = x
433
    dec     edx                           ; edx = y
434
    mov     [mouse_x],ecx                 ; mouse_x = x
435
    mov     [mouse_y],edx                 ; mouse_y = y
436
    ret                                   ; Возвращаем управление
3004 leency 437
;end_mouse_global
438
 
439
mouse_local:
440
    ;.................................................................................................
3091 leency 441
    ; Получаем координаты мыши относительно окна
3004 leency 442
    ;.................................................................................................
7421 leency 443
    mcall   SF_MOUSE_GET,SSF_WINDOW_POSITION
9470 leency 444
        ; eax = x*65536 + y, (x,y)=координаты курсора мыши
445
    mov     ecx,eax                       ;
446
    shr     ecx,16                        ; ecx = x+1
447
    movzx   edx,ax                        ; edx = y+1
448
    dec     ecx                           ; ecx = x
449
    dec     edx                           ; edx = y
450
    mov     [mouse_x],ecx                 ; mouse_x = x
451
    mov     [mouse_y],edx                 ; mouse_y = y
452
    ret                                   ; Возвращаем управление
3004 leency 453
;end_mouse_local
454
 
3091 leency 455
set_background:
456
    ;.................................................................................................
457
    ; Устанавливает фон рабочего стола
458
    ;.................................................................................................
7421 leency 459
    ; Функция 15 - работа с фоновой графикой
460
    ; Подфункция 4 - установить режим отрисовки фона.
461
    ; Режим отрисовки - замостить (1), растянуть (2)
462
    mcall   SF_BACKGROUND_SET,SSF_MODE_BG,2
3091 leency 463
 
7421 leency 464
    ; Функция 15 - работа с фоновой графикой
465
    ; Подфункция 1 - установить размер фонового изображения.
466
    mcall   SF_BACKGROUND_SET,SSF_SIZE_BG,2,2
3091 leency 467
 
468
    mov     eax,[color]
469
    mov     [cm+0],al
470
    mov     [cm+9],al
471
    shr     eax,8
472
    mov     [cm+1],al
473
    mov     [cm+10],al
474
    shr     eax,8
475
    mov     [cm+2],al
476
    mov     [cm+11],al
477
 
478
    mov     eax,[color2]
479
    mov     [cm+3],al
480
    mov     [cm+6],al
481
    shr     eax,8
482
    mov     [cm+4],al
483
    mov     [cm+7],al
484
    shr     eax,8
485
    mov     [cm+5],al
486
    mov     [cm+8],al
487
 
7421 leency 488
    ; Функция 15 - работа с фоновой графикой
489
    ; Подфункция 5 - поместить блок пикселей на фон.
490
    ; - Указатель на данные в формате BBGGRRBBGGRR
491
    ; - Cмещение в данных фонового изображения
492
    ; - Размер данных в байтах = 3 * число пикселей
493
    mcall   SF_BACKGROUND_SET,SSF_IMAGE_BG,cm,0,3*4
3091 leency 494
 
7421 leency 495
    ; Функция 15 - работа с фоновой графикой
496
    ; Подфункция 3 - перерисовать фон.
497
    mcall   SF_BACKGROUND_SET,SSF_REDRAW_BG
3091 leency 498
 
7423 leency 499
    stdcall save_eskin_ini, 'H '
7421 leency 500
 
3091 leency 501
    ret
502
;end_set_background
503
 
3004 leency 504
desktop_get:
505
    ;.................................................................................................
3091 leency 506
    ; Определяем ширину экрана
3004 leency 507
    ;.................................................................................................
7421 leency 508
    ; Определяем ширину экрана (eax = [xsize]*65536 + [ysize])
509
    mcall   SF_GET_SCREEN_SIZE ; xsize = размер по горизонтали - 1
9470 leency 510
    mov     ebx,eax                       ;
511
    shr     ebx,16                        ; ebx = xsize-1
512
    movzx   edx,ax                        ; edx = ysize-1 (лишний код)
513
    inc     ebx                           ; ebx = xsize
514
    inc     edx                           ; edx = ysize (лишний код)
3004 leency 515
    mov     [desctop_w],ebx
3453 Akyltist 516
    mov     [desctop_h],edx
3004 leency 517
    ret
518
;end_desktop_get
519
 
520
mouse_get:
9470 leency 521
    mov     esi,2                         ; КОСТЫЛЬ: флаг для избежания зацикливания
3004 leency 522
    call    mouse_global
523
    call    desktop_get
9470 leency 524
    re_mouse_loop:                        ; КОСТЫЛЬ: метка для возврата если попали в сетку
3004 leency 525
      mov     ebx,[desctop_w]
9470 leency 526
      imul    ebx,[mouse_y]               ; ebx = y*xsize
527
      add     ebx,[mouse_x]               ; ebx = y*xsize+x
3004 leency 528
 
529
      ;.................................................................................................
3091 leency 530
      ; Берем цвет с палитры в переменную
3004 leency 531
      ;.................................................................................................
7421 leency 532
       ;mov     ebx,ecx                    ;; ebx = y*xsize+x (лишний код)
533
      mcall   SF_GET_PIXEL    ; Получаем цвет в eax
9470 leency 534
      cmp     eax,[sc.work]               ; Сравниваем с фоном приложения
535
      je      mouse_err                   ; Если это он - то ничего не делаем
536
      cmp     eax,0x222222                ; Сравниваем с цветом сетки
537
      je      mouse_err                   ; Если это он - то ничего не делаем
538
      jmp     mouse_set                   ; КОСТЫЛЬ: прыгаем чтобы не брать цвет сетки
539
    mouse_err:                            ; КОСТЫЛЬ: если попали в сетку или фон
540
      inc     [mouse_y]                   ; КОСТЫЛЬ: смещаем по диагонали сначала по х
541
      inc     [mouse_x]                   ; КОСТЫЛЬ: смещаем по диагонали потом по у
542
      dec     esi                         ; КОСТЫЛЬ: Уменьшаем флаг
543
      cmp     esi,0                       ; КОСТЫЛЬ: Сравниваем с нулем
544
    jz        mouse_exit                  ; КОСТЫЛЬ: Если ноль то сделали всё что могли
545
    jmp    re_mouse_loop                  ; КОСТЫЛЬ: Если не ноль то попробуем взять соселний пиксель
546
    mouse_set:                            ; Иначе запоминаем новый цвет
3904 leency 547
      cmp     [mouse_f],1
548
      jne     was_right
549
      mov     [color],eax
550
      call    draw_result
551
      jmp     mouse_exit
552
    was_right:
553
      cmp     [mouse_f],2
554
      jne     mouse_exit
555
      mov     [color2],eax
9470 leency 556
      call    draw_result                   ; Выводим результат
3004 leency 557
    mouse_exit:
9470 leency 558
    ret                                   ; Возвращаем управление
3004 leency 559
;end_mouse_get----------------------------------------------------------------------------------------
560
 
3091 leency 561
 
562
 
563
 
3453 Akyltist 564
 
565
 
3004 leency 566
draw_value:
567
    ;.................................................................................................
3091 leency 568
    ; Вывод числа из строки в указанной области
3004 leency 569
    ;.................................................................................................
9470 leency 570
    push    ebx                           ; сохраняем присланные координаты
571
    mov     ebx,10                        ; устанавливаем основание системы счисления
572
    mov     edi,buff              ; указатель на строку буфера
573
        call    int2ascii         ; конвертируем число и ложим как строку в буфер + esi длина
7421 leency 574
    mov     eax,SF_DRAW_TEXT  ; функция 4: написать текст в окне
9470 leency 575
    pop     ebx                           ; достаем из стека присланные координаты
576
    cmp     esi,2                         ; ЦЕНТРИРОВАНИЕ ТЕКСТА
3088 leency 577
    jne     draw_value_1
578
    add     ebx,4 shl 16
579
    jmp     draw_value_e
580
  draw_value_1:
581
    cmp     esi,1
582
    jne     draw_value_e
583
    add     ebx,7 shl 16
584
  draw_value_e:
9472 leency 585
    mov     ecx,0x0;0x10000000                 ; цвет текста RRGGBB
586
    add     ecx,[sc.work_text]
9470 leency 587
    mov     edx,buff                      ; указатель на начало текста
3088 leency 588
    int     0x40
9470 leency 589
    ret                                   ; Возвращаем управление
3004 leency 590
;end_draw_value
591
 
3099 Akyltist 592
  _read_params:
593
 
7421 leency 594
      mov eax,dword[params+2]
595
      mov dword[params_c+0],eax
3099 Akyltist 596
 
7421 leency 597
      mov eax,dword[params+6]
598
      mov dword[params_c+4],eax
3099 Akyltist 599
 
4962 eAndrew 600
      mov   esi,params_c
601
      mov   ecx,16
602
      call  ascii2int
603
      mov   [color],eax
604
 
7421 leency 605
      mov eax,dword[params+11]
606
      mov dword[params_c+0],eax
4962 eAndrew 607
 
7421 leency 608
      mov eax,dword[params+15]
609
      mov dword[params_c+4],eax
4962 eAndrew 610
 
611
      mov   esi,params_c
612
      mov   ecx,16
613
      call  ascii2int
614
      mov   [color2],eax
615
 
3099 Akyltist 616
      ret
617
 
3004 leency 618
hex_digit:
619
    ;.................................................................................................
3091 leency 620
    ; Преобразование в ASCII (вне зависимости от системы счисления)
3004 leency 621
    ;.................................................................................................
9470 leency 622
    cmp    dl,10                          ; в dl ожидается число от 0 до 15
623
    jb     .less                          ; если dl<10 то переходим
624
    add    dl,'A'-10                      ; 10->A 11->B 12->C ...
625
    ret                                   ; Возвращаем управление
3004 leency 626
    .less:
9470 leency 627
    or     dl,'0'                         ; Если система счисления 10-я и менее
628
    ret                                   ; Возвращаем управление
3004 leency 629
;end_hex_digit
630
 
631
int2ascii:
632
    ;.................................................................................................
3091 leency 633
    ; Преобразование числа в строку
3004 leency 634
    ;.................................................................................................
3091 leency 635
    ; eax - 32-х значное число
636
    ; ebx - основание системы счисления
637
    ; edi - указатель на строку буфера
638
    ; Возвращает заполненный буфер и esi - длина строки
7421 leency 639
    push    edi
9470 leency 640
    xor     esi,esi                       ; зануляем счетчик символов
3004 leency 641
    convert_loop:
9470 leency 642
    xor     edx,edx                       ; зануляем регистр под остаток
643
    div     ebx                           ; eax/ebx - остаток в edx
644
    call    hex_digit                     ; преобразуем символ
645
    push    edx                           ; ложим в стек
646
    inc     esi                           ; увеличиваем счетчик
647
    test    eax,eax                       ; если еще можно делить
648
    jnz     convert_loop                  ; то делием еще
649
    cld                                   ; ОБЯЗАТЕЛЬНО сбрасываем флаг направления DF (запись вперёд)
650
    write_loop:                           ; иначе
651
    pop     eax                           ; достаем из стека в еах
652
    stosb                                 ; записываем в буфер по адресу ES:(E)DI
653
    dec     esi                           ; уменьшаем счетчик
654
    test    esi,esi                       ; если есть что доставать из стека
655
    jnz     write_loop                    ; то достаём
656
    mov     byte [edi],0                  ; иначе дописыываем нулевой байт
7421 leency 657
    pop     edi
3091 leency 658
    ; код ниже не имеет ничего общего к функции, просто возвращает еще длинну полученной строки
3004 leency 659
    call    str_len
660
    mov     esi,eax
9470 leency 661
    ret                                   ; и возвращаем управление
3004 leency 662
;end_int2ascii
663
 
3099 Akyltist 664
char2byte:
665
    sub al,'0'
666
    cmp al,10
9470 leency 667
    jb  done
3099 Akyltist 668
    add al,'0'
669
    and al,0x5f
670
    sub al,'A'-10
671
    and al,0x0f
672
    done:
673
    ret
674
;end_char2byte
675
 
676
ascii2int:
677
    ;.................................................................................................
678
    ; Преобразование строки в число
679
    ;.................................................................................................
680
    ; esi - указатель на нультерминированную строку
681
    ; ecx - основание системы счисления
682
    ; Возвращает eax - число
683
    push esi
684
    xor eax,eax
685
    xor ebx,ebx
686
    cmp byte [esi],'-'
687
    jnz .next
688
    inc esi
689
    .next:
690
    lodsb
691
    or al,al
692
    jz .done
693
    call char2byte
694
    imul ebx,ecx
695
    add ebx,eax
696
    jmp .next
697
    .done:
698
    xchg ebx,eax
699
    pop esi
700
    cmp byte [esi],'-'
701
    jz .negate
702
    ret
703
    .negate:
704
    neg eax
705
    ret
706
;end_ascii2int
707
 
3004 leency 708
get_spectr:
709
    ;.................................................................................................
3091 leency 710
    ; возвращает r,g,b состовляющие цвета
3004 leency 711
    ;.................................................................................................
712
    mov     ecx,[color]
3088 leency 713
    mov     [cblue],cl
714
    shr     ecx,8
715
    mov     [cgreen],cl
716
    shr     ecx,8
717
    mov     [cred],cl
718
    shr     ecx,8
719
    mov     [calpha],cl
9470 leency 720
    ret                                   ; и возвращаем управление
3004 leency 721
;end_get_spectr
722
 
723
set_spectr:
724
    ;.................................................................................................
3091 leency 725
    ; устанавливает из r,g,b цвет
3004 leency 726
    ;.................................................................................................
3088 leency 727
    movzx   eax,[calpha]
3004 leency 728
    shl     eax,8
3088 leency 729
    mov     al,[cred]
730
    shl     eax,8
3004 leency 731
    mov     al,[cgreen]
732
    shl     eax,8
733
    mov     al,[cblue]
734
    mov     [color],eax
9470 leency 735
    call    draw_result                   ; Выводим результат
736
    ret                                   ; и возвращаем управление
3004 leency 737
;end_get_spectr
738
 
739
str_len:
740
    ;.................................................................................................
3091 leency 741
    ; определяет длину строки (вход->EDI ZS offset ; выход->EAX ZS length)
3004 leency 742
    ;.................................................................................................
9470 leency 743
        push ecx esi edi
3004 leency 744
 
9470 leency 745
        cld
746
        xor   al, al
747
        mov ecx, 0FFFFFFFFh
748
        mov esi, edi
749
        repne scasb
750
        sub edi, esi
751
        mov eax, edi
752
        dec eax
3004 leency 753
 
9470 leency 754
        pop edi esi ecx
3004 leency 755
 
9470 leency 756
        ret
3004 leency 757
;end_str_len
3099 Akyltist 758
 
759
 
4962 eAndrew 760
 ;-------------------------------
3099 Akyltist 761
 
4962 eAndrew 762
 proc random uses ebx ecx edx, max_value
763
    mov     ebx, 0
764
    mov     eax, ebx
9470 leency 765
    or      eax, eax
4962 eAndrew 766
    jnz     @f
767
    rdtsc
768
    xor     eax, edx
769
    mov     ebx, eax
770
 
771
 @@:
772
    xor     edx, edx
773
    mov     ecx, 127773
774
    div     ecx
775
    mov     ecx, eax
776
    mov     eax, 16807
777
    mul     edx
778
    mov     edx, ecx
779
    mov     ecx, eax
780
    mov     eax, 2836
781
    mul     edx
782
    sub     ecx, eax
783
    xor     edx, edx
784
    mov     eax, ecx
785
    mov     ebx, ecx
786
    mov     ecx, 100000
787
    div     ecx
788
    mov     eax, edx
789
 
790
    xor     edx, edx
791
    mov     ebx, [max_value]
792
    div     ebx
793
    mov     eax, edx
794
 
795
    ret
796
 endp
797
 
798
set_background2:
7421 leency 799
    mcall   SF_SYS_MISC, SSF_HEAP_INIT
800
    mcall   SF_SYS_MISC, SSF_MEM_ALLOC, 256 * 256 * 3
9472 leency 801
    mov     [bgimg_buf], eax
4962 eAndrew 802
 
803
    mov     edx, eax
804
    mov     ecx, 256 * 256
805
  @@:
806
    stdcall random, 15 + 1
807
    sub     al, 15 / 2
808
 
809
    mov     bh, byte [color + 0]
810
    add     bh, al
811
    mov     [edx + 0], bh
812
    mov     bh, byte [color + 1]
813
    add     bh, al
814
    mov     [edx + 1], bh
815
    mov     bh, byte [color + 2]
816
    add     bh, al
817
    mov     [edx + 2], bh
818
    add     edx, 3
819
    loop    @b
820
 
7421 leency 821
    mcall   SF_BACKGROUND_SET, SSF_SIZE_BG, 256, 256
822
    mcall   SF_BACKGROUND_SET, SSF_MODE_BG, 1
9472 leency 823
    mcall   SF_BACKGROUND_SET, SSF_IMAGE_BG, [bgimg_buf], 0, 256 * 256 * 3
7421 leency 824
    mcall   SF_BACKGROUND_SET, SSF_REDRAW_BG
4962 eAndrew 825
 
9472 leency 826
    mcall   SF_SYS_MISC, SSF_MEM_FREE, [bgimg_buf]
7423 leency 827
    stdcall save_eskin_ini, 'B '
4962 eAndrew 828
ret
829
 
7423 leency 830
align 4
831
proc save_eskin_ini, opt_HB:dword
9470 leency 832
        ;save to file eskin.ini
833
        xor     al,al
834
        mov     ecx,1024
835
        mov     edi,sys_path+2
836
        repne   scasb
837
        sub     edi,sys_path+3
838
        invoke  ini_set_str, inifileeskin, amain, aprogram, sys_path+2, edi
839
        ;add param 'H '
840
        mov     eax,[opt_HB]
841
        mov     word[params],ax
842
        mov     eax,[color]
843
        or      eax,0xf ;для избежания вечного цикла если eax=0
844
        mov     edi,params+2
845
        @@:
846
        rol     eax,8
847
        or      al,al
848
        jnz     @f
849
        mov     word[edi],'00' ;нули перед числом
850
        add     edi,2
851
        jmp     @b
852
        @@:
853
        and     al,0xf0
854
        jnz     @f
855
        mov     byte[edi],'0'
856
        inc     edi
857
        @@:
858
        mov     eax,[color]
859
        mov     ebx,16
860
        call    int2ascii
861
        mov     byte[params+10],' '
862
        ;add color2
863
        mov     eax,[color2]
864
        or      eax,0xf ;для избежания вечного цикла если eax=0
865
        mov     edi,params+11
866
        @@:
867
        rol     eax,8
868
        or      al,al
869
        jnz     @f
870
        mov     word[edi],'00' ;нули перед числом
871
        add     edi,2
872
        jmp     @b
873
        @@:
874
        and     al,0xf0
875
        jnz     @f
876
        mov     byte[edi],'0'
877
        inc     edi
878
        @@:
879
        mov     eax,[color2]
880
        mov     ebx,16
881
        call    int2ascii
7423 leency 882
 
9470 leency 883
        invoke  ini_set_str, inifileeskin, amain, aparam, params, 19
884
        ret
7423 leency 885
endp
886
 
3004 leency 887
;#___________________________________________________________________________________________________
888
;****************************************************************************************************|
3091 leency 889
; БЛОК ПЕРЕМЕННЫХ И КОНСТАНТ                                                                         |
3004 leency 890
;----------------------------------------------------------------------------------------------------/
3453 Akyltist 891
circle:
9472 leency 892
    title       db 'Palitra v0.77',0      ; хранит имя программы
9470 leency 893
    hidden      db 'Hidden',0
9472 leency 894
;    hex         db '#',0                 ; для вывода решётки как текста
9470 leency 895
    cname       db 'RGBAx'                ; хранит разряды цветов (red,green,blue) x-метка конца
896
    larrow      db 0x1A,0
897
    buff        db '000',0
898
    bground     db 'BACKGROUND',0         ; имя кнопки - 14
9472 leency 899
    bground1    db 'Gradient',0           ; имя кнопки - 15
900
    bground2    db 'Noisy',0              ; имя кнопки - 16
9470 leency 901
    runmode     dd 1                      ; режим запуска (1-normal, 2-hidden, 3-colordialog)
902
    color2      dd 00FFFFFFh              ; хранит значение второго выбранного цвета
4962 eAndrew 903
 
7870 leency 904
    inifileeskin db '/sys/settings/system.ini',0
905
    amain       db 'style',0
906
    aprogram    db 'bg_program',0
907
    aparam      db 'bg_param',0
9541 leency 908
 
9472 leency 909
    i18_name    db 'ICONS18',0
910
    i18bg_name  db 'ICONS18W',0
4962 eAndrew 911
 
9472 leency 912
 
7421 leency 913
align 16
914
@IMPORT:
4962 eAndrew 915
 
7421 leency 916
library \
917
    libini , 'libini.obj'
918
 
919
import  libini, \
9470 leency 920
        ini_set_str, 'ini_set_str'
7421 leency 921
 
4187 eAndrew 922
I_END:
9470 leency 923
    cm          rb 12
924
    color       rd 1                      ; хранит значение выбранного цвета
925
    mouse_x     rd 1                      ; хранит глобальную х координату мыши
926
    mouse_y     rd 1                      ; хранит глобальную у координату мыши
927
    mouse_f     rd 1                      ; хранит данные о том какая кнопка мыши была нажата
928
    desctop_w   rd 1                      ; хранит ширину экрана
929
    desctop_h   rd 1                      ; хранит высоту экрана
930
    sc          system_colors             ; хранит структуру системных цветов скина
9472 leency 931
    cred        rb 1                      ; храним красный спектр
9470 leency 932
    cgreen      rb 1                      ; храним зеленый спектр
933
    cblue       rb 1                      ; храним синий спектр
934
    calpha      rb 1                      ; храним прозрачность
935
    pnext       rd 1                      ; счетчик переключения палитры
936
    renmode     rd 1                      ; режим отрисовки (1-цветовая схема,2-пипетка,3-круговая)
937
    params      rb 20                     ; приём параметров
938
    params_c    rb 9                      ; приёмник для цвета
9472 leency 939
    bgimg_buf   rd 1                      ; buffer for a generated image
940
    icons18     dd ?                      ; pointer to a shared memory of icons18.png
941
    icons18bg   dd ?                      ; pointer to a shared memory of icons18.png with filled bg
3453 Akyltist 942
 
9470 leency 943
        rd 1024
7421 leency 944
stacktop:
9470 leency 945
        sys_path rb 1024
4962 eAndrew 946
I_MEM: