Subversion Repositories Kolibri OS

Rev

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