Subversion Repositories Kolibri OS

Rev

Rev 233 | Rev 276 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
221 serge 1
 
2
LOAD_FROM_MEM   equ 1
3
LOAD_INDIRECT   equ 2
4
LOAD_SYSTEM     equ 3
5
VIDEO_FREE      equ 2
233 serge 6
221 serge 7
 
224 serge 8
  .biSize          dd ? ; DWORD
9
  .biWidth         dd ? ; LONG
10
  .biHeight        dd ? ; LONG
11
  .biPlanes        dw ? ; WORD
12
  .biBitCount      dw ? ; WORD
13
  .biCompression   dd ? ; DWORD
14
  .biSizeImage     dd ? ; DWORD
15
  .biXPelsPerMeter dd ? ; LONG
16
  .biYPelsPerMeter dd ? ; LONG
17
  .biClrUsed       dd ? ; DWORD
18
  .biClrImportant  dd ? ; DWORD
19
}
20
21
 
22
  BI BITMAPINFOHEADER
23
end virtual
24
25
 
221 serge 26
proc vesa_init_cursor stdcall, dst:dword, src:dword
27
           locals
28
             rBase    dd ?
29
             pQuad    dd ?
30
             pBits    dd ?
31
             pAnd     dd ?
32
             width    dd ?
33
             height   dd ?
34
             counter  dd ?
35
           endl
36
37
 
38
           add esi,[esi+18]
224 serge 39
           mov eax,esi
40
221 serge 41
 
224 serge 42
           je .img_24
43
           cmp [esi+BI.biBitCount], 8
233 serge 44
           je .img_8
45
           cmp [esi+BI.biBitCount], 4
46
           je .img_4
47
48
 
49
           add eax, [esi]
50
           mov [pQuad],eax
51
           add eax,8
52
           mov [pBits],eax
53
           add eax, 128
54
           mov [pAnd],eax
55
           mov eax,[esi+4]
56
           mov [width],eax
57
           mov ebx,[esi+8]
58
           shr ebx,1
59
           mov [height],ebx
60
61
 
62
           add edi, 32*31*4
63
           mov [rBase],edi
64
65
 
66
.l21:
67
           mov ebx, [pBits]
68
           mov ebx, [ebx]
69
           bswap ebx
70
           mov eax, [pAnd]
71
           mov eax, [eax]
72
           bswap eax
73
           mov [counter], 32
74
@@:
75
           xor edx, edx
76
           shl eax,1
77
           setc dl
78
           dec edx
79
80
 
81
           shl ebx,1
82
           setc cl
83
           mov ecx, [esi+ecx*4]
84
           and ecx, edx
85
           and edx, 0xFF000000
86
           or edx, ecx
87
           mov [edi], edx
88
89
 
90
           dec [counter]
91
           jnz @B
92
93
 
94
           add [pAnd], 4
95
           mov edi,[rBase]
96
           sub edi,128
97
           mov [rBase],edi
98
           sub [height],1
99
           jnz .l21
100
           ret
101
102
 
224 serge 103
           add eax, [esi]
221 serge 104
           mov [pQuad],eax
105
           add eax,64
106
           mov [pBits],eax
107
           add eax, 0x200
108
           mov [pAnd],eax
109
           mov eax,[esi+4]
110
           mov [width],eax
111
           mov ebx,[esi+8]
112
           shr ebx,1
113
           mov [height],ebx
114
115
 
116
           add edi, 32*31*4
117
           mov [rBase],edi
118
119
 
233 serge 120
           mov ebx, [pBits]
221 serge 121
.l4:
233 serge 122
           mov eax, [pAnd]
123
           mov eax, [eax]
124
           bswap eax
221 serge 125
           mov [counter], 16
126
@@:
127
           xor edx, edx
128
           shl eax,1
129
           setc dl
130
           dec edx
131
132
 
233 serge 133
           and cl, 0xF0
134
           shr ecx, 2
221 serge 135
           mov ecx, [esi+ecx]
233 serge 136
           and ecx, edx
221 serge 137
           and edx, 0xFF000000
138
           or edx, ecx
139
           mov [edi], edx
140
141
 
142
           shl eax,1
143
           setc dl
144
           dec edx
145
146
 
233 serge 147
           and cl, 0x0F
148
           mov ecx, [esi+ecx*4]
149
           and ecx, edx
221 serge 150
           and edx, 0xFF000000
151
           or edx, ecx
152
           mov [edi+4], edx
153
154
 
155
           add edi, 8
156
           dec [counter]
157
           jnz @B
158
159
 
233 serge 160
           mov edi,[rBase]
221 serge 161
           sub edi,128
162
           mov [rBase],edi
163
           sub [height],1
164
           jnz .l4
233 serge 165
           ret
221 serge 166
.img_8:
233 serge 167
           add eax, [esi]
168
           mov [pQuad],eax
169
           add eax,1024
170
           mov [pBits],eax
171
           add eax, 1024
172
           mov [pAnd],eax
173
           mov eax,[esi+4]
174
           mov [width],eax
175
           mov ebx,[esi+8]
176
           shr ebx,1
177
           mov [height],ebx
178
179
 
180
           add edi, 32*31*4
181
           mov [rBase],edi
182
183
 
184
           mov ebx, [pBits]
185
.l81:
186
           mov eax, [pAnd]
187
           mov eax, [eax]
188
           bswap eax
189
           mov [counter], 32
190
@@:
191
           xor edx, edx
192
           shl eax,1
193
           setc dl
194
           dec edx
195
196
 
197
           mov ecx, [esi+ecx*4]
198
           and ecx, edx
199
           and edx, 0xFF000000
200
           or edx, ecx
201
           mov [edi], edx
202
203
 
204
           add edi, 4
205
           dec [counter]
206
           jnz @B
207
208
 
209
           mov edi,[rBase]
210
           sub edi,128
211
           mov [rBase],edi
212
           sub [height],1
213
           jnz .l81
214
           ret
215
.img_24:
224 serge 216
           add eax, [esi]
217
           mov [pQuad],eax
218
           add eax, 0xC00
219
           mov [pAnd],eax
220
           mov eax,[esi+BI.biWidth]
221
           mov [width],eax
222
           mov ebx,[esi+BI.biHeight]
223
           shr ebx,1
224
           mov [height],ebx
225
226
 
227
           add edi, 32*31*4
228
           mov [rBase],edi
229
230
 
231
           mov ebx, [pQuad]
232
.row_24:
233
           mov eax, [esi]
234
           bswap eax
235
           mov [counter], 32
236
@@:
237
           xor edx, edx
238
           shl eax,1
239
           setc dl
240
           dec edx
241
242
 
243
           and ecx, 0x00FFFFFF
244
           and ecx, edx
245
           and edx, 0xFF000000
246
           or edx, ecx
247
           mov [edi], edx
248
           add ebx, 3
249
           add edi, 4
250
           dec [counter]
251
           jnz @B
252
253
 
254
           mov edi,[rBase]
255
           sub edi,128
256
           mov [rBase],edi
257
           sub [height],1
258
           jnz .row_24
259
           ret
260
endp
221 serge 261
262
 
263
proc alloc_cursor
264
265
 
266
           cli
267
           mov ebx, [cursor_start]
268
           mov ecx, [cursor_end]
269
.l1:
270
           bsf eax,[ebx];
271
           jnz .found
272
           add ebx,4
273
           cmp ebx, ecx
274
           jb .l1
275
           popfd
276
           xor eax,eax
277
           ret
278
.found:
279
           btr [ebx], eax
280
           popfd
227 serge 281
282
 
221 serge 283
           sub ebx, cursor_map
284
           lea eax,[eax+ebx*8]
254 serge 285
           shl eax,3
221 serge 286
           lea eax,[cursors+eax+eax*2]
287
227 serge 288
 
289
           mov [eax+CURSOR.magic], 'CURS'
290
           mov [eax+CURSOR.size],  CURSOR_SIZE
291
           mov [eax+CURSOR.pid], ebx
292
           mov [eax+CURSOR.hot_x], ebx
293
           mov [eax+CURSOR.hot_y], ebx
294
           ret
221 serge 295
endp
296
297
 
298
proc free_cursor
233 serge 299
           pushfd
300
           cli
301
           xor edx, edx
302
           mov ecx, CURSOR_SIZE
303
           sub eax, cursors
304
           div ecx
305
           test edx, edx
306
           jnz .exit
307
308
 
309
           bts [ebx], eax
310
           shr eax, 3
311
           and eax, not 3
312
           add eax, ebx
313
           cmp [cursor_start], eax
314
           ja @f
315
.exit:
316
           popfd
317
           ret
318
@@:
319
           mov [cursor_start], eax
320
           popfd
321
           ret
322
endp
323
324
 
325
 
326
proc set_cursor stdcall, hcursor:dword
227 serge 327
           mov eax, [hcursor]
328
           cmp [eax+CURSOR.magic], 'CURS'
230 serge 329
           jne .fail
330
           cmp [eax+CURSOR.size], CURSOR_SIZE
331
           jne .fail
332
           mov ebx, [CURRENT_TASK]
227 serge 333
           shl ebx, 8
334
           xchg eax, [ebx+PROC_BASE+APPDATA.cursor]
335
           ret
336
.fail:
230 serge 337
           mov eax, [def_cursor]
338
           mov ebx, [CURRENT_TASK]
339
           shl ebx, 8
340
           xchg eax, [ebx+PROC_BASE+APPDATA.cursor]
341
           ret
342
endp
227 serge 343
221 serge 344
 
227 serge 345
346
 
347
           test eax, eax
221 serge 348
           jz .fail
349
350
 
227 serge 351
           mov [edi+CURSOR.base], eax
352
221 serge 353
 
227 serge 354
           mov ebx, [flags]
355
           cmp bx, LOAD_INDIRECT
356
           je .indirect
357
221 serge 358
 
227 serge 359
           movzx edx, word [esi+12]
360
           mov [edi+CURSOR.hot_x], ecx
361
           mov [edi+CURSOR.hot_y], edx
362
221 serge 363
 
227 serge 364
           mov eax, [hcursor]
365
.fail:
221 serge 366
           ret
367
.indirect:
227 serge 368
           shr ebx, 16
369
           movzx ecx, bh
370
           movzx edx, bl
371
           mov [eax+CURSOR.hot_x], ecx
372
           mov [eax+CURSOR.hot_y], edx
373
221 serge 374
 
227 serge 375
           mov ecx, 1024
376
           cld
377
           rep movsd
378
           ret
221 serge 379
endp
380
381
 
382
proc load_cursor stdcall, src:dword, flags:dword
383
           locals
384
             handle  dd ?
385
           endl
386
387
 
227 serge 388
           mov [handle], eax
389
           cmp word [flags], LOAD_FROM_FILE
390
           jne @F
391
221 serge 392
 
393
           test eax, eax
394
           jz .exit
395
           mov [src], eax
396
@@:
227 serge 397
           call alloc_cursor
398
           test eax, eax
221 serge 399
           jz .fail
400
401
 
230 serge 402
           shl ebx, 5
403
           mov ebx, [0x3000+ebx+4]
404
           mov [eax+CURSOR.pid], ebx
405
406
 
227 serge 407
           mov [handle], eax
221 serge 408
.fail:
227 serge 409
           cmp word [flags], LOAD_FROM_FILE
410
           jne .exit
411
           stdcall kernel_free, [src]
221 serge 412
.exit:
227 serge 413
           mov eax, [handle]
221 serge 414
           ret
415
endp
416
417
 
418
proc delete_cursor stdcall, hcursor:dword
233 serge 419
           locals
420
             hsrv       dd ?
421
             io_code    dd ?
422
             input      dd ?
423
             inp_size   dd ?
424
             output     dd ?
425
             out_size   dd ?
426
           endl
427
428
 
429
           cmp [esi+CURSOR.magic], 'CURS'
430
           jne .fail
431
           cmp [esi+CURSOR.size], CURSOR_SIZE
432
           jne .fail
433
434
 
435
           shl ebx, 5
436
           mov ebx, [0x3000+ebx+4]
437
           cmp ebx, [esi+CURSOR.pid]
438
           jne .fail
439
440
 
441
           shl ebx, 8
442
           cmp esi, [ebx+PROC_BASE+APPDATA.cursor]
443
           jne @F
444
           mov eax, [def_cursor]
445
           mov [ebx+PROC_BASE+APPDATA.cursor], eax
446
@@:
447
           mov eax, [hw_cursor]
448
           test eax, eax
449
           jz @F
450
451
 
452
           mov ecx, [esi+CURSOR.base]
453
           mov [hsrv], eax
454
           mov [io_code], VIDEO_FREE
455
           mov [input], ecx
456
           mov [inp_size], 4
457
           mov [output], ebx
458
           mov [out_size], ebx
459
460
 
461
           stdcall srv_handler, eax
462
           jmp .exit
463
@@:
464
           stdcall kernel_free, [esi+CURSOR.base]
465
.exit:
466
           mov eax, [hcursor]
467
           call free_cursor
468
           ret
469
.fail:
470
           ret
471
endp
472
473
 
474
proc init_cursors
221 serge 475
           cmp [0xfe0c],word 0x13
233 serge 476
           jbe .fail
477
478
 
221 serge 479
           mov ebx, [SCR_BYTES_PER_LINE]
480
           cmp eax, 32
481
           jne @F
482
           sub ebx, 128
483
           jmp .init
484
@@:
485
           cmp eax, 24
486
           jne .fail
487
           sub ebx, 96
488
.init:
489
           mov [cur_def_interl], ebx
490
491
 
492
           mov edi, cursors
493
           mov ecx, CURSOR_SIZE*16
494
           cld
495
           rep stosd
496
497
 
498
           mov [cursor_map], eax
499
           mov [cursor_map+4], eax
500
           mov edx, cursor_map
501
           mov [cursor_start], edx
502
           add edx, 8
230 serge 503
           mov [cursor_end], edx
221 serge 504
505
 
227 serge 506
           mov [hw_cursor], eax
233 serge 507
           test eax, eax
227 serge 508
           jz .sw_mouse
509
510
 
221 serge 511
           mov [def_cursor], eax
512
           ret
227 serge 513
.sw_mouse:
514
           mov [create_cursor], vesa_cursor
515
221 serge 516
 
227 serge 517
           mov [def_cursor], eax
518
519
 
221 serge 520
           mov edx, [SCR_Y_SIZE]
521
           inc ecx
522
           inc edx
523
           mov [scr_width], ecx
524
           mov [scr_height], edx
525
526
 
527
           cmp ebx, 32
528
           jne @F
529
530
 
531
           mov dword [hw_restore], restore_32
532
           ret
533
@@:
534
           mov dword [set_hw_cursor], cursor_24
535
           mov dword [hw_restore], restore_24
536
           ret
537
.fail:
538
           xor eax, eax
539
           mov dword [set_hw_cursor], eax
540
           mov dword [hw_restore], eax
541
           ret
542
endp
543
544
 
545
proc restore_24 stdcall, x:dword, y:dword
546
           locals
547
             w  dd ?
548
           endl
549
550
 
551
           mov edx, [cur_saved_h]
552
           mov ebx, [cur_saved_interl]
553
554
 
555
@@:
556
           mov ecx, [cur_saved_w]
557
           lea ecx, [ecx+ecx*2]
558
           rep movsb
559
           add edi, ebx
560
           dec edx
561
           jnz @B
562
           ret
563
endp
564
565
 
566
proc restore_32 stdcall, x:dword, y:dword
567
           locals
568
             w  dd ?
569
           endl
570
571
 
572
           mov edx, [cur_saved_h]
573
           mov ebx, [cur_saved_interl]
574
575
 
576
@@:
577
           mov ecx, [cur_saved_w]
578
           rep movsd
579
           add edi, ebx
580
           dec edx
581
           jnz @B
582
           ret
583
endp
584
585
 
586
proc cursor_24 stdcall, hcursor:dword, x:dword, y:dword
587
           locals
588
             w      dd ?
589
             h      dd ?
590
             st     dd ?
591
             _dx     dd ?
592
             _dy     dd ?
593
           endl
594
595
 
596
           mov ecx, [x]
597
           mov eax, [y]
598
           mov ebx, [BytesPerScanLine]
599
600
 
601
           sub ecx, [esi+CURSOR.hot_x]
602
           mov [x], ecx
603
           sets dl
604
           dec edx
605
           and ecx, edx       ;clip x to 0<=x
606
           mov edi, ecx
607
           sub edi, [x]
608
           mov [_dx], edi
609
610
 
611
           sub eax, [esi+CURSOR.hot_y]
612
           mov [y], eax
613
           sets dl
614
           dec edx
615
           and eax, edx       ;clip y to 0<=y
616
           mov edi, eax
617
           sub edi, [y]
618
           mov [_dy], edi
619
620
 
621
           lea esi, [ecx+ecx*2]
622
           add esi, [LFBAddress]
623
           add esi, eax
624
           mov [cur_saved_base],esi
625
626
 
627
           mov edx, [scr_height]
628
           mov eax, 32
629
630
 
631
           cmp edi, eax
632
           jng @F
224 serge 633
           mov edi, eax
634
@@:
635
           sub edi, [_dx]
221 serge 636
637
 
638
           cmp edx, eax
639
           jng @F
224 serge 640
           mov edx, eax
641
@@:
642
           sub edx, [_dy]
221 serge 643
644
 
645
           mov [h], edx
646
           mov [cur_saved_w], edi
647
           mov [cur_saved_h], edx
648
649
 
650
           shl eax, 2       ;lea eax, [eax+eax*2]
224 serge 651
           lea edi, [edi+edi*2]
221 serge 652
           sub ebx, edi
653
           mov [cur_saved_interl], ebx
654
655
 
656
@@:
657
           mov ecx, [w]
658
           lea ecx, [ecx+ecx*2]
659
           rep movsb
660
           add esi, ebx
661
           dec edx
662
           jnz @B
663
664
 
665
           mov edx, eax
666
           mov edi, [cur_saved_base]
667
           mov eax, [_dy]
668
           shl eax, 5
669
           add eax, [_dx]
670
           shl eax, 2
671
672
 
673
           mov esi, [esi+CURSOR.base]
674
           add esi, eax
675
.row:
676
           mov ecx, [w]
677
.pix:
678
           lodsd
679
           test eax, 0xFF000000
680
           jz @F
681
682
 
683
           shr eax, 16
684
           mov [edi+2],al
685
@@:
686
           add edi, 3
687
           dec ecx
688
           jnz .pix
689
690
 
691
           add edi, ebx
692
           dec [h]
693
           jnz .row
694
           ret
695
endp
696
697
 
698
proc cursor_32 stdcall, hcursor:dword, x:dword, y:dword
699
           locals
700
             w      dd ?
701
             h      dd ?
702
             st     dd ?
703
             _dx     dd ?
704
             _dy     dd ?
705
           endl
706
707
 
708
           mov ecx, [x]
709
           mov eax, [y]
710
           mov ebx, [BytesPerScanLine]
711
712
 
713
           sub ecx, [esi+CURSOR.hot_x]
714
           mov [x], ecx
715
           sets dl
716
           dec edx
717
           and ecx, edx       ;clip x to 0<=x
718
           mov edi, ecx
719
           sub edi, [x]
720
           mov [_dx], edi
721
722
 
723
           sub eax, [esi+CURSOR.hot_y]
724
           mov [y], eax
725
           sets dl
726
           dec edx
727
           and eax, edx       ;clip y to 0<=y
728
           mov edi, eax
729
           sub edi, [y]
730
           mov [_dy], edi
731
732
 
733
           lea esi, [eax+ecx*4]
734
           add esi, [LFBAddress]
735
           mov [cur_saved_base],esi
736
737
 
738
           mov edx, [scr_height]
739
           mov eax, 32
740
741
 
742
           cmp edi, eax
743
           jng @F
224 serge 744
           mov edi, eax
745
@@:
746
           sub edi, [_dx]
221 serge 747
748
 
749
           cmp edx, eax
750
           jng @F
224 serge 751
           mov edx, eax
752
@@:
753
           sub edx, [_dy]
221 serge 754
755
 
756
           mov [h], edx
757
           mov [cur_saved_w], edi
758
           mov [cur_saved_h], edx
759
760
 
761
           shl eax, 2
762
           shl edi, 2
763
           sub ebx, edi
764
           mov [cur_saved_interl], ebx
765
766
 
767
@@:
768
           mov ecx, [w]
769
           rep movsd
770
           add esi, ebx
771
           dec edx
772
           jnz @B
773
774
 
775
           mov edx, eax
776
           mov edi, [cur_saved_base]
777
           mov eax, [_dy]
778
           shl eax, 5
779
           add eax, [_dx]
780
           shl eax, 2
781
782
 
783
           mov esi, [esi+CURSOR.base]
784
           add esi, eax
785
.row:
786
           mov ecx, [w]
787
.pix:
788
           lodsd
789
           test eax, 0xFF000000
790
           jz @F
791
           mov [edi], eax
792
@@:
793
           add edi, 4
794
           dec ecx
795
           jnz .pix
796
           add esi, edx
797
           add edi, ebx
798
           dec [h]
799
           jnz .row
800
           ret
801
endp
802
803
 
804
def_arrow:
805
  file 'arrow.cur'
806
>
807