Rev 2703 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | halyavin | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ; ; |
||
3 | ; Color Slider Control Demonstration ; |
||
4 | ; ; |
||
9647 | IgorA | 5 | ; Compile with FASM for Kolibri ; |
31 | halyavin | 6 | ; ; |
7 | ; Author: Jason Delozier ; |
||
8 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
9 | |||
10 | use32 |
||
11 | |||
12 | org 0x0 |
||
13 | |||
14 | db 'MENUET01' ; 8 byte id |
||
15 | dd 0x01 ; header version |
||
16 | dd START ; start of code |
||
17 | dd I_END ; size of image |
||
18 | dd 0x1000 ; memory for app |
||
19 | dd 0x1000 ; esp |
||
20 | dd 0x0 , 0x0 ; I_Param , I_Icon |
||
21 | |||
22 | include 'lang.inc' |
||
485 | heavyiron | 23 | include '..\..\..\macros.inc' |
9647 | IgorA | 24 | include '..\..\..\KOSfuncs.inc' |
31 | halyavin | 25 | START: ; start of execution |
26 | |||
27 | call draw_window ; at first, draw the window |
||
28 | |||
29 | still: |
||
30 | call mouse_info |
||
31 | |||
9647 | IgorA | 32 | mcall SF_WAIT_EVENT_TIMEOUT, 2 |
31 | halyavin | 33 | |
34 | cmp eax,1 ; redraw request ? |
||
35 | je red |
||
36 | cmp eax,2 ; key in buffer ? |
||
37 | je key |
||
38 | cmp eax,3 ; button in buffer ? |
||
39 | je button |
||
40 | |||
41 | jmp still |
||
42 | |||
43 | red: ; redraw |
||
44 | call draw_window |
||
45 | jmp still |
||
46 | |||
47 | key: ; key |
||
9647 | IgorA | 48 | mcall SF_GET_KEY ; just read it and ignore |
31 | halyavin | 49 | jmp still |
50 | |||
51 | button: ; button |
||
9647 | IgorA | 52 | mcall SF_GET_BUTTON ; get id |
2703 | leency | 53 | |
31 | halyavin | 54 | shr eax,8 |
55 | |||
56 | cmp eax,1 ; button id=1 ? |
||
57 | jne noclose |
||
9647 | IgorA | 58 | mcall SF_TERMINATE_PROCESS ; close this program |
31 | halyavin | 59 | noclose: |
60 | |||
61 | |||
62 | nofind: |
||
63 | jmp still |
||
64 | |||
65 | |||
66 | ; ********************************************* |
||
67 | ; ******* WINDOW DEFINITIONS AND DRAW ******** |
||
68 | ; ********************************************* |
||
69 | |||
70 | |||
71 | draw_window: |
||
9647 | IgorA | 72 | mcall SF_REDRAW, SSF_BEGIN_DRAW |
73 | mcall SF_CREATE_WINDOW, <100,200>, <100,200>, 0x14ffffff, , title |
||
74 | mcall SF_REDRAW, SSF_END_DRAW |
||
2703 | leency | 75 | |
31 | halyavin | 76 | call draw_slider_info |
77 | |||
78 | xor ecx,ecx |
||
79 | Draw_Controls_Loop: |
||
80 | mov ebp, [App_Controls+ecx] ;get controls data location |
||
81 | or ebp,ebp |
||
82 | jz Draw_Controls_Done |
||
83 | call dword [App_Controls+ecx+4] ;call controls draw function |
||
84 | add ecx, 12 |
||
85 | jmp Draw_Controls_Loop |
||
86 | Draw_Controls_Done: |
||
87 | |||
88 | ret |
||
89 | |||
90 | |||
91 | ;*********************************************** |
||
92 | ;* Mouse Stuff |
||
93 | ;*********************************************** |
||
94 | mousey dw 0 |
||
95 | mousex dw 0 |
||
96 | mouseb dd 0 |
||
97 | |||
98 | mouse_info: |
||
9647 | IgorA | 99 | mcall SF_MOUSE_GET, SSF_WINDOW_POSITION |
31 | halyavin | 100 | mov ecx, eax ; |
101 | push ecx ; |
||
9647 | IgorA | 102 | mcall SF_MOUSE_GET, SSF_BUTTON |
31 | halyavin | 103 | cmp [mouseb], eax ;compare old mouse states to new states |
104 | jne redraw_mouse_info ; |
||
105 | cmp [mousey], cx ; |
||
106 | jne redraw_mouse_info ; |
||
107 | shr ecx, 16 ; |
||
108 | cmp [mousex], cx ; |
||
109 | jne redraw_mouse_info ; |
||
110 | pop ecx ; |
||
111 | ret ;return if no change in states |
||
112 | |||
113 | |||
114 | redraw_mouse_info: |
||
115 | pop ecx |
||
116 | mov [mouseb], eax ;save new mouse states |
||
117 | mov dword [mousey], ecx |
||
118 | |||
119 | xor ecx, ecx |
||
120 | Check_Mouse_Over_Controls_Loop: |
||
121 | mov ebp, [App_Controls+ecx] |
||
122 | or ebp,ebp |
||
123 | jz Check_Mouse_Over_Controls_Loop_done |
||
124 | movzx eax,word [ebp+2] |
||
125 | cmp ax, [mousex] |
||
126 | ja mouse_not_on_control |
||
127 | movzx eax,word [ebp+6] |
||
128 | cmp ax, [mousey] |
||
129 | ja mouse_not_on_control |
||
130 | movzx eax,word [ebp] |
||
131 | add ax, [ebp+2] |
||
132 | cmp ax, [mousex] |
||
133 | jb mouse_not_on_control |
||
134 | movzx eax,word [ebp+4] |
||
135 | add ax, [ebp+6] |
||
136 | cmp ax, [mousey] |
||
137 | jb mouse_not_on_control |
||
138 | call dword [App_Controls+ecx+8] |
||
139 | mouse_not_on_control: |
||
140 | add ecx, 12 |
||
141 | jmp Check_Mouse_Over_Controls_Loop |
||
142 | Check_Mouse_Over_Controls_Loop_done: |
||
143 | |||
144 | ret |
||
145 | |||
146 | |||
147 | |||
148 | |||
149 | ;*********************************************** |
||
150 | |||
151 | |||
152 | draw_slider_info: |
||
153 | ;Repaint value background |
||
9647 | IgorA | 154 | mcall SF_DRAW_RECT, 144*65536+36, 72*65536+9, 0x00ffffff |
31 | halyavin | 155 | ;Draw Color Box |
156 | xor edx, edx |
||
157 | movzx ecx,word [slider_1+12] |
||
158 | mov dh, cl |
||
159 | movzx ecx,word [slider_2+12] |
||
160 | mov dl, cl |
||
161 | shl edx, 8 |
||
162 | movzx ecx,word [slider_3+12] |
||
163 | mov dl,cl |
||
164 | mov ebx, 0x00860035 |
||
165 | mov ecx, 0x00590040 |
||
9647 | IgorA | 166 | mov eax, SF_DRAW_RECT |
2703 | leency | 167 | mcall |
31 | halyavin | 168 | ;draw current value of slider |
169 | mov ecx, edx |
||
9647 | IgorA | 170 | mov eax, SF_DRAW_NUMBER |
31 | halyavin | 171 | mov ebx, 0x00060100 |
172 | mov esi, 0 |
||
2703 | leency | 173 | mov edx, 144*65536+72 |
485 | heavyiron | 174 | mcall |
31 | halyavin | 175 | ret |
176 | |||
177 | |||
178 | ;************************************** |
||
179 | ;* |
||
180 | ;* App Controls |
||
181 | ;* |
||
182 | ;************************************** |
||
183 | |||
184 | App_Controls: |
||
185 | dd slider_1 , draw_slider, slider_mouse_over ; |
||
186 | dd slider_2 , draw_slider, slider_mouse_over ; |
||
187 | dd slider_3 , draw_slider, slider_mouse_over ; |
||
188 | dd 0 , 0 ; denotes last control do not delete |
||
189 | |||
190 | ;************************************** |
||
191 | ;* |
||
192 | ;* Slider data |
||
193 | ;* |
||
194 | ;************************************** |
||
195 | |||
196 | slider_1: |
||
197 | dw 25 ;width +0 |
||
198 | dw 10 ;x +2 |
||
199 | dw 150 ;height +4 |
||
200 | dw 30 ;y +6 |
||
201 | dw 0 ;min +8 |
||
202 | dw 255 ;max +10 |
||
203 | dw 128 ;current +12 |
||
204 | dw 1 ;small change +14 |
||
205 | dw 5 ;big change +16 |
||
206 | |||
207 | slider_2: |
||
208 | dw 25 ;width +0 |
||
209 | dw 55 ;x +2 |
||
210 | dw 150 ;height +4 |
||
211 | dw 30 ;y +6 |
||
212 | dw 0 ;min +8 |
||
213 | dw 255 ;max +10 |
||
214 | dw 128 ;current +12 |
||
215 | dw 1 ;small change +14 |
||
216 | dw 5 ;big change +16 |
||
217 | |||
218 | slider_3: |
||
219 | dw 25 ;width +0 |
||
220 | dw 100 ;x +2 |
||
221 | dw 150 ;height +4 |
||
222 | dw 30 ;y +6 |
||
223 | dw 0 ;min +8 |
||
224 | dw 255 ;max +10 |
||
225 | dw 128 ;current +12 |
||
226 | dw 1 ;small change +14 |
||
227 | dw 5 ;big change +16 |
||
228 | |||
229 | ;************************************** |
||
230 | ;* |
||
231 | ;* Slider Code |
||
232 | ;* |
||
233 | ;************************************** |
||
234 | |||
235 | box_h dw 10 ;static slider box height |
||
236 | |||
237 | draw_slider: |
||
9647 | IgorA | 238 | push eax ebx ecx edx |
31 | halyavin | 239 | ;Draw slider background |
9647 | IgorA | 240 | mov eax, SF_DRAW_RECT ;slider background |
31 | halyavin | 241 | mov ebx, [ebp] ;x start/width |
242 | mov ecx, [ebp+4] ;y start/height |
||
2703 | leency | 243 | mov edx, 0x00EBEBEB ;color |
485 | heavyiron | 244 | mcall ;draw bar |
31 | halyavin | 245 | ;Draw line for slide rail |
246 | mov eax, 38 ;draw vertical slide line |
||
247 | movzx ebx,word [ebp] ;x |
||
248 | shr ebx, 1 ; |
||
249 | add bx,word [ebp+2]; |
||
250 | push bx ; |
||
251 | shl ebx, 16 ; |
||
252 | pop bx ; |
||
253 | mov ecx, [ebp+4] ;y start / height |
||
254 | add ecx, 0x000A0000 ; |
||
255 | add ecx, [ebp+6] ;y start |
||
256 | sub ecx, 10 ; |
||
9647 | IgorA | 257 | mov edx, 0x00 ;color |
485 | heavyiron | 258 | mcall ; |
31 | halyavin | 259 | ;Draw slider box |
260 | movzx eax,word [ebp+4] ;height |
||
261 | sub eax, 20 ; |
||
262 | movzx ebx,word [ebp+10] ;max value |
||
263 | sub bx,word [ebp+8] ;min value |
||
264 | movzx ecx,word [ebp+12] ; |
||
265 | call slider_fpu_calc ;EAX = ((EAX/EBX)*ECX) |
||
266 | mov ebx, [ebp] ;x start / width |
||
267 | movzx ecx,word [ebp+4] ;height |
||
268 | add cx, [ebp+6] ;y |
||
269 | sub ecx, 10 ; |
||
270 | movzx edx, [box_h] ; |
||
271 | shr edx, 1 ; |
||
272 | sub ecx, edx ; |
||
273 | sub ecx, eax ;*slide box y position |
||
274 | shl ecx, 16 ; |
||
275 | mov cx, [box_h] ;height |
||
9647 | IgorA | 276 | mov eax, SF_DRAW_RECT ;draw bar sys function |
31 | halyavin | 277 | mov edx, 0x00 ;color |
485 | heavyiron | 278 | mcall ;draw slider box |
9647 | IgorA | 279 | pop edx ecx ebx eax |
31 | halyavin | 280 | ret |
281 | |||
282 | slider_mouse_over: |
||
9647 | IgorA | 283 | push eax ebx ecx edx |
31 | halyavin | 284 | cmp [mouseb], 1 |
285 | jne slider_mouse_over_done |
||
286 | movzx eax,word [ebp+4] |
||
287 | add ax, [ebp+6] |
||
288 | sub eax, 10 |
||
289 | cmp [mousey], ax |
||
290 | ja slider_mouse_min |
||
291 | movzx eax,word [ebp+6] |
||
292 | add eax, 10 |
||
293 | cmp [mousey], ax |
||
294 | jb slider_mouse_max |
||
295 | ;determine new current value |
||
296 | movzx eax,word [ebp+10] ;slider max value |
||
297 | sub ax,word [ebp+8] ;slider min value |
||
298 | movzx ebx,word [ebp+4] ;slider height |
||
299 | sub ebx,20 ;rail size |
||
300 | movzx ecx,word [mousey] ;current mouse y pixel |
||
301 | sub cx,word [ebp+6] ;minus y start of slider |
||
302 | sub ecx, 10 ;minus pixels to top of rail |
||
303 | call slider_fpu_calc ;EAX = ((EAX/EBX)*ECX) |
||
304 | movzx ebx,word [ebp+10] ;slider max |
||
305 | sub ebx,eax ;*current calculated position |
||
306 | jmp slider_mouse_change; |
||
307 | slider_mouse_max: ; |
||
308 | movzx ebx,word [ebp+10] ;get maximum value |
||
309 | jmp slider_mouse_change ; |
||
310 | slider_mouse_min: ; |
||
311 | movzx ebx,word [ebp+8] ;get minimum value |
||
312 | slider_mouse_change: ; |
||
313 | mov [ebp+12],bx ;new slider current position |
||
314 | call draw_slider ; |
||
315 | call draw_slider_info ; |
||
316 | slider_mouse_over_done: ; |
||
9647 | IgorA | 317 | pop edx ecx ebx eax |
31 | halyavin | 318 | ret |
319 | |||
320 | |||
321 | temp dd 0 ;temp varibles used in fpu computations |
||
322 | temp2 dd 0 |
||
323 | temp3 dd 0 |
||
324 | |||
325 | slider_fpu_calc: |
||
326 | mov [temp], eax |
||
327 | mov [temp2], ebx |
||
328 | mov [temp3], ecx |
||
329 | finit ;initilize FPU |
||
330 | fld dword [temp] ;load value |
||
331 | fdiv dword [temp2] ;divide |
||
332 | fmul dword [temp3] ;multiply |
||
333 | fst dword [temp] ;store computed value |
||
334 | mov eax, [temp] |
||
335 | ret |
||
336 | |||
337 | ;************************************************** |
||
338 | ;* End Slider Code |
||
339 | ;************************************************** |
||
340 | |||
341 | ; DATA AREA |
||
485 | heavyiron | 342 | title db 'Color Slider',0 |
316 | heavyiron | 343 | I_END:100,200>100,200> |