Subversion Repositories Kolibri OS

Rev

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