Rev 9487 | Rev 9910 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
9487 | rgimad | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
3 | ;; Copyright (C) KolibriOS team 2004-2021. All rights reserved. ;; |
||
4 | ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; |
||
5 | ;; Distributed under terms of the GNU General Public License ;; |
||
6 | ;; ;; |
||
7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
8 | |||
9488 | rgimad | 9 | $Revision: 9488 $ |
9487 | rgimad | 10 | |
11 | ; Background graphics implementation |
||
12 | |||
13 | uglobal |
||
14 | ; bgrchanged dd 0x0 |
||
15 | align 4 |
||
16 | bgrlockpid dd 0 |
||
17 | bgrlock db 0 |
||
18 | endg |
||
19 | ;-------------------------------------- |
||
20 | align 4 |
||
21 | sys_background: |
||
22 | cmp ebx, 1 ; BACKGROUND SIZE |
||
23 | jnz nosb1 |
||
24 | test ecx, ecx |
||
25 | jz sbgrr |
||
26 | |||
27 | test edx, edx |
||
28 | jz sbgrr |
||
29 | ;-------------------------------------- |
||
30 | align 4 |
||
31 | @@: |
||
32 | ;;Maxis use atomic bts for mutexes 4.4.2009 |
||
33 | bts dword [bgrlock], 0 |
||
34 | jnc @f |
||
35 | call change_task |
||
36 | jmp @b |
||
37 | ;-------------------------------------- |
||
38 | align 4 |
||
39 | @@: |
||
40 | mov [BgrDataWidth], ecx |
||
41 | mov [BgrDataHeight], edx |
||
42 | ; mov [bgrchanged],1 |
||
43 | |||
44 | pushad |
||
45 | ; return memory for old background |
||
46 | mov eax, [img_background] |
||
47 | cmp eax, static_background_data |
||
48 | jz @f |
||
49 | stdcall kernel_free, eax |
||
50 | ;-------------------------------------- |
||
51 | align 4 |
||
52 | @@: |
||
53 | ; calculate RAW size |
||
54 | xor eax, eax |
||
55 | inc eax |
||
56 | cmp [BgrDataWidth], eax |
||
57 | jae @f |
||
58 | mov [BgrDataWidth], eax |
||
59 | ;-------------------------------------- |
||
60 | align 4 |
||
61 | @@: |
||
62 | cmp [BgrDataHeight], eax |
||
63 | jae @f |
||
64 | mov [BgrDataHeight], eax |
||
65 | ;-------------------------------------- |
||
66 | align 4 |
||
67 | @@: |
||
68 | mov eax, [BgrDataWidth] |
||
69 | imul eax, [BgrDataHeight] |
||
70 | lea eax, [eax*3] |
||
71 | ; it is reserved with aligned to the boundary of 4 KB pages, |
||
72 | ; otherwise there may be exceptions a page fault for vesa20_drawbackground_tiled |
||
73 | ; because the 32 bit read is used for high performance: "mov eax,[esi]" |
||
74 | shr eax, 12 |
||
75 | inc eax |
||
76 | shl eax, 12 |
||
77 | mov [mem_BACKGROUND], eax |
||
78 | ; get memory for new background |
||
79 | stdcall kernel_alloc, eax |
||
80 | test eax, eax |
||
81 | jz .memfailed |
||
82 | mov [img_background], eax |
||
83 | jmp .exit |
||
84 | ;-------------------------------------- |
||
85 | align 4 |
||
86 | .memfailed: |
||
87 | ; revert to static monotone data |
||
88 | mov [img_background], static_background_data |
||
89 | xor eax, eax |
||
90 | inc eax |
||
91 | mov [BgrDataWidth], eax |
||
92 | mov [BgrDataHeight], eax |
||
93 | mov [mem_BACKGROUND], 4 |
||
94 | ;-------------------------------------- |
||
95 | align 4 |
||
96 | .exit: |
||
97 | popad |
||
98 | mov [bgrlock], 0 |
||
99 | ;-------------------------------------- |
||
100 | align 4 |
||
101 | sbgrr: |
||
102 | ret |
||
103 | ;-------------------------------------- |
||
104 | align 4 |
||
105 | nosb1: |
||
106 | cmp ebx, 2 ; SET PIXEL |
||
107 | jnz nosb2 |
||
108 | |||
109 | mov eax, [img_background] |
||
110 | test ecx, ecx |
||
111 | jz @f |
||
112 | cmp eax, static_background_data |
||
113 | jz .ret |
||
114 | ;-------------------------------------- |
||
115 | align 4 |
||
116 | @@: |
||
117 | mov ebx, [mem_BACKGROUND] |
||
118 | add ebx, 4095 |
||
119 | and ebx, -4096 |
||
120 | sub ebx, 4 |
||
121 | cmp ecx, ebx |
||
122 | ja .ret |
||
123 | |||
124 | mov ebx, [eax+ecx] |
||
125 | and ebx, 0xFF000000;255*256*256*256 |
||
126 | and edx, 0x00FFFFFF;255*256*256+255*256+255 |
||
127 | add edx, ebx |
||
128 | mov [eax+ecx], edx |
||
129 | ;-------------------------------------- |
||
130 | align 4 |
||
131 | .ret: |
||
132 | ret |
||
133 | ;-------------------------------------- |
||
134 | align 4 |
||
135 | nosb2: |
||
136 | cmp ebx, 3 ; DRAW BACKGROUND |
||
137 | jnz nosb3 |
||
138 | ;-------------------------------------- |
||
139 | align 4 |
||
140 | draw_background_temp: |
||
141 | mov [background_defined], 1 |
||
142 | call force_redraw_background |
||
143 | ;-------------------------------------- |
||
144 | align 4 |
||
145 | nosb31: |
||
146 | ret |
||
147 | ;-------------------------------------- |
||
148 | align 4 |
||
149 | nosb3: |
||
150 | cmp ebx, 4 ; TILED / STRETCHED |
||
151 | jnz nosb4 |
||
152 | cmp ecx, [BgrDrawMode] |
||
153 | je nosb41 |
||
154 | mov [BgrDrawMode], ecx |
||
155 | ;-------------------------------------- |
||
156 | align 4 |
||
157 | nosb41: |
||
158 | ret |
||
159 | ;-------------------------------------- |
||
160 | align 4 |
||
161 | nosb4: |
||
162 | cmp ebx, 5 ; BLOCK MOVE TO BGR |
||
163 | jnz nosb5 |
||
164 | |||
165 | ; add check pointer |
||
166 | stdcall is_region_userspace, ecx, esi |
||
167 | jnz .fin |
||
168 | |||
169 | cmp [img_background], static_background_data |
||
170 | jnz @f |
||
171 | test edx, edx |
||
172 | jnz .fin |
||
173 | cmp esi, 4 |
||
174 | ja .fin |
||
175 | ;-------------------------------------- |
||
176 | align 4 |
||
177 | @@: |
||
178 | ; bughere |
||
179 | mov eax, ecx |
||
180 | mov ebx, edx |
||
181 | add ebx, [img_background];IMG_BACKGROUND |
||
182 | mov ecx, esi |
||
183 | call memmove |
||
184 | ;-------------------------------------- |
||
185 | align 4 |
||
186 | .fin: |
||
187 | ret |
||
188 | ;--------------------------------------- |
||
189 | align 4 |
||
190 | nosb5: |
||
191 | cmp ebx, 6 |
||
192 | jnz nosb6 |
||
193 | ;-------------------------------------- |
||
194 | align 4 |
||
195 | ;;Maxis use atomic bts for mutex 4.4.2009 |
||
196 | @@: |
||
197 | bts dword [bgrlock], 0 |
||
198 | jnc @f |
||
199 | call change_task |
||
200 | jmp @b |
||
201 | ;-------------------------------------- |
||
202 | align 4 |
||
203 | @@: |
||
204 | mov eax, [current_slot_idx] |
||
205 | mov [bgrlockpid], eax |
||
206 | cmp [img_background], static_background_data |
||
207 | jz .nomem |
||
208 | stdcall user_alloc, [mem_BACKGROUND] |
||
209 | mov [esp+32], eax |
||
210 | test eax, eax |
||
211 | jz .nomem |
||
212 | mov ebx, eax |
||
213 | shr ebx, 12 |
||
214 | or dword [page_tabs+(ebx-1)*4], MEM_BLOCK_DONT_FREE |
||
215 | mov esi, [img_background] |
||
216 | shr esi, 12 |
||
217 | mov ecx, [mem_BACKGROUND] |
||
218 | add ecx, 0xFFF |
||
219 | shr ecx, 12 |
||
220 | ;-------------------------------------- |
||
221 | align 4 |
||
222 | .z: |
||
223 | mov eax, [page_tabs+ebx*4] |
||
224 | test al, 1 |
||
225 | jz @f |
||
226 | call free_page |
||
227 | ;-------------------------------------- |
||
228 | align 4 |
||
229 | @@: |
||
230 | mov eax, [page_tabs+esi*4] |
||
231 | or al, PG_UWR |
||
232 | mov [page_tabs+ebx*4], eax |
||
233 | mov eax, ebx |
||
234 | shl eax, 12 |
||
235 | invlpg [eax] |
||
236 | inc ebx |
||
237 | inc esi |
||
238 | loop .z |
||
239 | ret |
||
240 | ;-------------------------------------- |
||
241 | align 4 |
||
242 | .nomem: |
||
243 | and [bgrlockpid], 0 |
||
244 | mov [bgrlock], 0 |
||
245 | ;-------------------------------------- |
||
246 | align 4 |
||
247 | nosb6: |
||
248 | cmp ebx, 7 |
||
249 | jnz nosb7 |
||
250 | cmp [bgrlock], 0 |
||
251 | jz .err |
||
252 | mov eax, [current_slot_idx] |
||
253 | cmp [bgrlockpid], eax |
||
254 | jnz .err |
||
255 | mov eax, ecx |
||
256 | mov ebx, ecx |
||
257 | shr eax, 12 |
||
258 | mov ecx, [page_tabs+(eax-1)*4] |
||
259 | test cl, MEM_BLOCK_USED or MEM_BLOCK_DONT_FREE |
||
260 | jz .err |
||
261 | jnp .err |
||
262 | push eax |
||
263 | shr ecx, 12 |
||
264 | dec ecx |
||
265 | ;-------------------------------------- |
||
266 | align 4 |
||
267 | @@: |
||
268 | and dword [page_tabs+eax*4], 0 |
||
269 | mov edx, eax |
||
270 | shl edx, 12 |
||
271 | push eax |
||
272 | invlpg [edx] |
||
273 | pop eax |
||
274 | inc eax |
||
275 | loop @b |
||
276 | pop eax |
||
277 | and dword [page_tabs+(eax-1)*4], not MEM_BLOCK_DONT_FREE |
||
278 | stdcall user_free, ebx |
||
279 | mov [esp+32], eax |
||
280 | and [bgrlockpid], 0 |
||
281 | mov [bgrlock], 0 |
||
282 | ret |
||
283 | ;-------------------------------------- |
||
284 | align 4 |
||
285 | .err: |
||
286 | and dword [esp+32], 0 |
||
287 | ret |
||
288 | ;------------------------------------- |
||
289 | align 4 |
||
290 | nosb7: |
||
291 | cmp ebx, 8 |
||
292 | jnz nosb8 |
||
293 | |||
294 | mov ecx, [current_slot] |
||
295 | xor eax, eax |
||
296 | xchg eax, [ecx+APPDATA.draw_bgr_x] |
||
297 | mov [esp + 32], eax ; eax = [left]*65536 + [right] |
||
298 | xor eax, eax |
||
299 | xchg eax, [ecx+APPDATA.draw_bgr_y] |
||
300 | mov [esp + 20], eax ; ebx = [top]*65536 + [bottom] |
||
301 | ret |
||
302 | ;--------------------------------------- |
||
303 | align 4 |
||
304 | nosb8: |
||
305 | cmp ebx, 9 |
||
306 | jnz nosb9 |
||
307 | ; ecx = [left]*65536 + [right] |
||
308 | ; edx = [top]*65536 + [bottom] |
||
309 | mov eax, [_display.width] |
||
310 | mov ebx, [_display.height] |
||
311 | ; check [right] |
||
312 | cmp cx, ax |
||
313 | jae .exit |
||
314 | ; check [left] |
||
315 | ror ecx, 16 |
||
316 | cmp cx, ax |
||
317 | jae .exit |
||
318 | ; check [bottom] |
||
319 | cmp dx, bx |
||
320 | jae .exit |
||
321 | ; check [top] |
||
322 | ror edx, 16 |
||
323 | cmp dx, bx |
||
324 | jae .exit |
||
325 | |||
326 | movzx eax, cx ; [left] |
||
327 | movzx ebx, dx ; [top] |
||
328 | |||
329 | shr ecx, 16 ; [right] |
||
330 | shr edx, 16 ; [bottom] |
||
331 | |||
332 | mov [background_defined], 1 |
||
333 | |||
334 | mov [draw_data+32 + RECT.left], eax |
||
335 | mov [draw_data+32 + RECT.top], ebx |
||
336 | |||
337 | mov [draw_data+32 + RECT.right], ecx |
||
338 | mov [draw_data+32 + RECT.bottom], edx |
||
339 | |||
340 | inc [REDRAW_BACKGROUND] |
||
341 | call wakeup_osloop |
||
342 | ;-------------------------------------- |
||
343 | align 4 |
||
344 | .exit: |
||
345 | ret |
||
346 | ;-------------------------------------- |
||
347 | align 4 |
||
348 | nosb9: |
||
349 | ret |
||
350 | ;------------------------------------------------------------------------------ |
||
351 | |||
352 | |||
353 | align 4 |
||
354 | uglobal |
||
355 | BG_Rect_X_left_right dd 0x0 |
||
356 | BG_Rect_Y_top_bottom dd 0x0 |
||
357 | endg |
||
358 | ;------------------------------------------------------------------------------ |
||
359 | |||
360 | |||
361 | align 4 |
||
362 | force_redraw_background: |
||
363 | and [draw_data+32 + RECT.left], 0 |
||
364 | and [draw_data+32 + RECT.top], 0 |
||
365 | push eax ebx |
||
366 | mov eax, [_display.width] |
||
367 | mov ebx, [_display.height] |
||
368 | dec eax |
||
369 | dec ebx |
||
370 | mov [draw_data+32 + RECT.right], eax |
||
371 | mov [draw_data+32 + RECT.bottom], ebx |
||
372 | pop ebx eax |
||
373 | inc [REDRAW_BACKGROUND] |
||
374 | call wakeup_osloop |
||
375 | ret |
||
376 | ;------------------------------------------------------------------------------ |
||
377 | |||
378 | |||
379 | align 4 |
||
380 | sys_getbackground: ; sysfn 39 |
||
381 | dec ebx |
||
382 | jnz .nogb1 |
||
383 | ; sysfn 39.1: |
||
384 | mov eax, [BgrDataWidth] |
||
385 | shl eax, 16 |
||
386 | mov ax, word [BgrDataHeight] |
||
387 | mov [esp+32], eax |
||
388 | ret |
||
389 | ;--------------------------------------- |
||
390 | align 4 |
||
391 | .nogb1: |
||
392 | dec ebx |
||
393 | jnz .nogb2 |
||
394 | ; sysfn 39.2: |
||
395 | mov eax, [img_background] |
||
396 | test ecx, ecx |
||
397 | jz @f |
||
398 | cmp eax, static_background_data |
||
399 | jz .ret |
||
400 | align 4 |
||
401 | @@: |
||
402 | mov ebx, [mem_BACKGROUND] |
||
403 | add ebx, 4095 |
||
404 | and ebx, -4096 |
||
405 | sub ebx, 4 |
||
406 | cmp ecx, ebx |
||
407 | ja .ret |
||
408 | |||
409 | mov eax, [ecx+eax] |
||
410 | |||
411 | and eax, 0xFFFFFF |
||
412 | mov [esp+32], eax |
||
413 | align 4 |
||
414 | .ret: |
||
415 | ret |
||
416 | ;------------------------------------------------------------------------------ |
||
417 | align 4 |
||
418 | .x dd ? |
||
419 | .y dd ? |
||
420 | .w dd ? |
||
421 | .h dd ? |
||
422 | .subrect_startptr dd ? |
||
423 | .subrect_bytes dd ? |
||
424 | align 4 |
||
425 | .nogb2: |
||
426 | dec ebx |
||
427 | jnz .nogb3 |
||
428 | ; sysfn 39.3 read background subrect to buffer |
||
429 | ; ecx - |
||
430 | ; edx - |
||
431 | ; esi - buffer of 0x00RRGGBB |
||
432 | mov eax, [img_background] |
||
433 | cmp eax, static_background_data |
||
434 | jz .ret_39_3 |
||
435 | align 4 |
||
436 | @@: |
||
437 | movzx eax, cx ; store y in eax |
||
438 | mov [.y], eax |
||
439 | |||
440 | shr ecx, 16 ; ecx = x |
||
441 | mov [.x], ecx |
||
442 | |||
443 | imul eax, [BgrDataWidth] |
||
444 | add eax, ecx |
||
445 | imul eax, 3 |
||
446 | mov [.subrect_startptr], eax |
||
447 | |||
448 | movzx eax, dx ; store h in eax |
||
449 | mov [.h], eax |
||
450 | |||
451 | shr edx, 16 ; edx = w |
||
452 | mov [.w], edx |
||
453 | |||
454 | imul eax, edx |
||
455 | mov [.subrect_bytes], eax |
||
456 | |||
457 | ; check bounds |
||
458 | mov ebx, [mem_BACKGROUND] |
||
459 | add ebx, 4095 |
||
460 | and ebx, -4096 |
||
461 | sub ebx, 4 |
||
462 | add eax, [.subrect_startptr] |
||
463 | cmp eax, ebx |
||
464 | ja .fail_39_3 |
||
465 | |||
466 | ; copy contents |
||
467 | mov edi, [img_background] |
||
468 | xor ecx, ecx ; ecx - row index |
||
469 | .copy_rect: |
||
470 | cmp ecx, [.h] |
||
471 | jae .end_copy_rect |
||
472 | |||
473 | xor edx, edx ; edx - column index |
||
474 | .copy_row: |
||
475 | cmp edx, [.w] |
||
476 | jae .end_copy_row |
||
477 | |||
478 | mov ebx, ecx |
||
479 | imul ebx, [BgrDataWidth] |
||
480 | add ebx, edx |
||
481 | imul ebx, 3 |
||
482 | add ebx, [.subrect_startptr] |
||
483 | mov eax, [edi + ebx] |
||
484 | mov ebx, ecx |
||
485 | imul ebx, [.w] |
||
486 | add ebx, edx |
||
487 | and eax, 0xFFFFFF |
||
488 | mov [esi + ebx*4], eax |
||
489 | |||
490 | inc edx |
||
491 | jmp .copy_row |
||
492 | .end_copy_row: |
||
493 | |||
494 | inc ecx |
||
495 | jmp .copy_rect |
||
496 | .end_copy_rect: |
||
497 | xor eax, eax |
||
498 | mov [esp+32], eax |
||
499 | ;-------------------------------------- |
||
500 | align 4 |
||
501 | .fail_39_3: |
||
502 | mov eax, -1 |
||
503 | align 4 |
||
504 | .ret_39_3: |
||
505 | ret |
||
506 | ;-------------------------------------- |
||
507 | align 4 |
||
508 | .nogb3: |
||
509 | dec ebx |
||
510 | jnz .nogb4 |
||
511 | ; sysfn 39.4: |
||
512 | mov eax, [BgrDrawMode] |
||
513 | ;-------------------------------------- |
||
514 | align 4 |
||
515 | .nogb4: |
||
516 | mov [esp+32], eax |
||
517 | ret |
||
518 | ;----------------------------------------------------------------------------- |
||
519 | |||
520 | |||
521 | align 4 |
||
522 | syscall_putarea_backgr: ; sysfn 25 |
||
523 | ;eax = 25 |
||
524 | ;ebx = pointer to bufer for img BBGGRRBBGGRR... |
||
525 | ;ecx = [size x]*65536 + [size y] |
||
526 | ;edx = [start x]*65536 + [start y] |
||
527 | pushad |
||
528 | mov edi, ebx |
||
529 | mov eax, edx |
||
530 | shr eax, 16 |
||
531 | mov ebx, edx |
||
532 | and ebx, 0xffff |
||
533 | dec eax |
||
534 | dec ebx |
||
535 | ; eax - x, ebx - y |
||
536 | mov edx, ecx |
||
537 | shr ecx, 16 |
||
538 | and edx, 0xffff |
||
539 | mov esi, ecx |
||
540 | ; ecx - size x, edx - size y |
||
541 | mov ebp, edx |
||
542 | |||
543 | lea ebp, [ebp*4] |
||
544 | imul ebp, esi |
||
545 | stdcall is_region_userspace, edi, ebp |
||
546 | jnz .exit |
||
547 | |||
548 | mov ebp, edx |
||
549 | |||
550 | dec ebp |
||
551 | shl ebp, 2 |
||
552 | |||
553 | imul ebp, esi |
||
554 | |||
555 | mov esi, ecx |
||
556 | dec esi |
||
557 | shl esi, 2 |
||
558 | |||
559 | add ebp, esi |
||
560 | add ebp, edi |
||
561 | |||
562 | add ebx, edx |
||
563 | ;-------------------------------------- |
||
564 | align 4 |
||
565 | .start_y: |
||
566 | push ecx edx |
||
567 | ;-------------------------------------- |
||
568 | align 4 |
||
569 | .start_x: |
||
570 | push eax ecx |
||
571 | add eax, ecx |
||
572 | |||
573 | mov ecx, [ebp] |
||
574 | rol ecx, 8 |
||
575 | test cl, cl ; transparensy = 0 |
||
576 | jz .no_put |
||
577 | |||
578 | xor cl, cl |
||
579 | ror ecx, 8 |
||
580 | |||
581 | pushad |
||
582 | mov edx, [d_width_calc_area + ebx*4] |
||
583 | add edx, [_display.win_map] |
||
584 | movzx edx, byte [eax+edx] |
||
585 | cmp dl, byte 1 |
||
586 | jne @f |
||
587 | |||
588 | call dword [PUTPIXEL]; eax - x, ebx - y |
||
589 | ;-------------------------------------- |
||
590 | align 4 |
||
591 | @@: |
||
592 | popad |
||
593 | ;-------------------------------------- |
||
594 | align 4 |
||
595 | .no_put: |
||
596 | pop ecx eax |
||
597 | |||
598 | sub ebp, 4 |
||
599 | dec ecx |
||
600 | jnz .start_x |
||
601 | |||
602 | pop edx ecx |
||
603 | dec ebx |
||
604 | dec edx |
||
605 | jnz .start_y |
||
606 | |||
607 | .exit: |
||
608 | popad |
||
609 | ret |
||
610 |