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