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