Subversion Repositories Kolibri OS

Rev

Rev 254 | Rev 281 | 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
alloc_cursor:
276 serge 264
265
 
266
           call malloc
267
           test eax, eax
268
           jz .fail
269
270
 
271
           mov [eax+CURSOR.magic], 'CURS'
272
           mov [eax+CURSOR.size],  CURSOR_SIZE
273
           mov [eax+CURSOR.pid], ebx
274
           mov [eax+CURSOR.hot_x], ebx
275
           mov [eax+CURSOR.hot_y], ebx
276
.fail:
277
           ret
278
279
 
280
281
 
282
proc alloc_cursor
221 serge 283
284
 
285
           cli
286
           mov ebx, [cursor_start]
287
           mov ecx, [cursor_end]
288
.l1:
289
           bsf eax,[ebx];
290
           jnz .found
291
           add ebx,4
292
           cmp ebx, ecx
293
           jb .l1
294
           popfd
295
           xor eax,eax
296
           ret
297
.found:
298
           btr [ebx], eax
299
           popfd
227 serge 300
301
 
221 serge 302
           sub ebx, cursor_map
303
           lea eax,[eax+ebx*8]
254 serge 304
           shl eax,3
221 serge 305
           lea eax,[cursors+eax+eax*2]
306
227 serge 307
 
308
           mov [eax+CURSOR.magic], 'CURS'
309
           mov [eax+CURSOR.size],  CURSOR_SIZE
310
           mov [eax+CURSOR.pid], ebx
311
           mov [eax+CURSOR.hot_x], ebx
312
           mov [eax+CURSOR.hot_y], ebx
313
           ret
221 serge 314
endp
315
316
 
276 serge 317
 
221 serge 318
proc free_cursor
233 serge 319
           pushfd
320
           cli
321
           xor edx, edx
322
           mov ecx, CURSOR_SIZE
323
           sub eax, cursors
324
           div ecx
325
           test edx, edx
326
           jnz .exit
327
328
 
329
           bts [ebx], eax
330
           shr eax, 3
331
           and eax, not 3
332
           add eax, ebx
333
           cmp [cursor_start], eax
334
           ja @f
335
.exit:
336
           popfd
337
           ret
338
@@:
339
           mov [cursor_start], eax
340
           popfd
341
           ret
342
endp
343
344
 
276 serge 345
233 serge 346
 
347
proc set_cursor stdcall, hcursor:dword
227 serge 348
           mov eax, [hcursor]
349
           cmp [eax+CURSOR.magic], 'CURS'
230 serge 350
           jne .fail
351
           cmp [eax+CURSOR.size], CURSOR_SIZE
352
           jne .fail
353
           mov ebx, [CURRENT_TASK]
227 serge 354
           shl ebx, 8
355
           xchg eax, [ebx+PROC_BASE+APPDATA.cursor]
356
           ret
357
.fail:
230 serge 358
           mov eax, [def_cursor]
359
           mov ebx, [CURRENT_TASK]
360
           shl ebx, 8
361
           xchg eax, [ebx+PROC_BASE+APPDATA.cursor]
362
           ret
363
endp
227 serge 364
221 serge 365
 
227 serge 366
367
 
368
           test eax, eax
221 serge 369
           jz .fail
370
371
 
227 serge 372
           mov [edi+CURSOR.base], eax
373
221 serge 374
 
227 serge 375
           mov ebx, [flags]
376
           cmp bx, LOAD_INDIRECT
377
           je .indirect
378
221 serge 379
 
227 serge 380
           movzx edx, word [esi+12]
381
           mov [edi+CURSOR.hot_x], ecx
382
           mov [edi+CURSOR.hot_y], edx
383
221 serge 384
 
227 serge 385
           mov eax, [hcursor]
386
.fail:
221 serge 387
           ret
388
.indirect:
227 serge 389
           shr ebx, 16
390
           movzx ecx, bh
391
           movzx edx, bl
392
           mov [eax+CURSOR.hot_x], ecx
393
           mov [eax+CURSOR.hot_y], edx
394
221 serge 395
 
227 serge 396
           mov ecx, 1024
397
           cld
398
           rep movsd
399
           ret
221 serge 400
endp
401
402
 
403
proc load_cursor stdcall, src:dword, flags:dword
404
           locals
405
             handle  dd ?
406
           endl
407
408
 
227 serge 409
           mov [handle], eax
410
           cmp word [flags], LOAD_FROM_FILE
411
           jne @F
412
221 serge 413
 
414
           test eax, eax
415
           jz .exit
416
           mov [src], eax
417
@@:
227 serge 418
           call alloc_cursor
419
           test eax, eax
221 serge 420
           jz .fail
421
422
 
230 serge 423
           shl ebx, 5
424
           mov ebx, [0x3000+ebx+4]
425
           mov [eax+CURSOR.pid], ebx
426
427
 
227 serge 428
           mov [handle], eax
221 serge 429
.fail:
227 serge 430
           cmp word [flags], LOAD_FROM_FILE
431
           jne .exit
432
           stdcall kernel_free, [src]
221 serge 433
.exit:
227 serge 434
           mov eax, [handle]
221 serge 435
           ret
436
endp
437
438
 
439
proc delete_cursor stdcall, hcursor:dword
233 serge 440
           locals
441
             hsrv       dd ?
442
             io_code    dd ?
443
             input      dd ?
444
             inp_size   dd ?
445
             output     dd ?
446
             out_size   dd ?
447
           endl
448
449
 
450
           cmp [esi+CURSOR.magic], 'CURS'
451
           jne .fail
452
           cmp [esi+CURSOR.size], CURSOR_SIZE
453
           jne .fail
454
455
 
456
           shl ebx, 5
457
           mov ebx, [0x3000+ebx+4]
458
           cmp ebx, [esi+CURSOR.pid]
459
           jne .fail
460
461
 
462
           shl ebx, 8
463
           cmp esi, [ebx+PROC_BASE+APPDATA.cursor]
464
           jne @F
465
           mov eax, [def_cursor]
466
           mov [ebx+PROC_BASE+APPDATA.cursor], eax
467
@@:
468
           mov eax, [hw_cursor]
469
           test eax, eax
470
           jz @F
471
472
 
473
           mov ecx, [esi+CURSOR.base]
474
           mov [hsrv], eax
475
           mov [io_code], VIDEO_FREE
476
           mov [input], ecx
477
           mov [inp_size], 4
478
           mov [output], ebx
479
           mov [out_size], ebx
480
481
 
482
           stdcall srv_handler, eax
483
           jmp .exit
484
@@:
485
           stdcall kernel_free, [esi+CURSOR.base]
486
.exit:
487
           mov eax, [hcursor]
488
           call free
276 serge 489
.fail:
233 serge 490
           ret
491
endp
492
493
 
494
proc init_cursors
221 serge 495
           cmp [0xfe0c],word 0x13
233 serge 496
           jbe .fail
497
498
 
221 serge 499
           mov ebx, [SCR_BYTES_PER_LINE]
500
           cmp eax, 32
501
           jne @F
502
           sub ebx, 128
503
           jmp .init
504
@@:
505
           cmp eax, 24
506
           jne .fail
507
           sub ebx, 96
508
.init:
509
           mov [cur_def_interl], ebx
510
511
 
276 serge 512
           xor eax, eax
221 serge 513
           mov edi, cursors
514
           mov ecx, CURSOR_SIZE*16
515
           cld
516
           rep stosd
517
518
 
519
           mov [cursor_map], eax
520
           mov [cursor_map+4], eax
521
           mov edx, cursor_map
522
           mov [cursor_start], edx
523
           add edx, 8
230 serge 524
           mov [cursor_end], edx
221 serge 525
end if
276 serge 526
           stdcall load_driver, drv_hw_mouse
227 serge 527
           mov [hw_cursor], eax
233 serge 528
           test eax, eax
227 serge 529
           jz .sw_mouse
530
531
 
221 serge 532
           mov [def_cursor], eax
533
           ret
227 serge 534
.sw_mouse:
535
           mov [create_cursor], vesa_cursor
536
221 serge 537
 
227 serge 538
           mov [def_cursor], eax
539
540
 
221 serge 541
           mov edx, [SCR_Y_SIZE]
542
           inc ecx
543
           inc edx
544
           mov [scr_width], ecx
545
           mov [scr_height], edx
546
547
 
548
           cmp ebx, 32
549
           jne @F
550
551
 
552
           mov dword [hw_restore], restore_32
553
           ret
554
@@:
555
           mov dword [set_hw_cursor], cursor_24
556
           mov dword [hw_restore], restore_24
557
           ret
558
.fail:
559
           xor eax, eax
560
           mov dword [set_hw_cursor], eax
561
           mov dword [hw_restore], eax
562
           ret
563
endp
564
565
 
566
proc restore_24 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
           lea ecx, [ecx+ecx*2]
579
           rep movsb
580
           add edi, ebx
581
           dec edx
582
           jnz @B
583
           ret
584
endp
585
586
 
587
proc restore_32 stdcall, x:dword, y:dword
588
           locals
589
             w  dd ?
590
           endl
591
592
 
593
           mov edx, [cur_saved_h]
594
           mov ebx, [cur_saved_interl]
595
596
 
597
@@:
598
           mov ecx, [cur_saved_w]
599
           rep movsd
600
           add edi, ebx
601
           dec edx
602
           jnz @B
603
           ret
604
endp
605
606
 
607
proc cursor_24 stdcall, hcursor:dword, x:dword, y:dword
608
           locals
609
             w      dd ?
610
             h      dd ?
611
             st     dd ?
612
             _dx     dd ?
613
             _dy     dd ?
614
           endl
615
616
 
617
           mov ecx, [x]
618
           mov eax, [y]
619
           mov ebx, [BytesPerScanLine]
620
621
 
622
           sub ecx, [esi+CURSOR.hot_x]
623
           mov [x], ecx
624
           sets dl
625
           dec edx
626
           and ecx, edx       ;clip x to 0<=x
627
           mov edi, ecx
628
           sub edi, [x]
629
           mov [_dx], edi
630
631
 
632
           sub eax, [esi+CURSOR.hot_y]
633
           mov [y], eax
634
           sets dl
635
           dec edx
636
           and eax, edx       ;clip y to 0<=y
637
           mov edi, eax
638
           sub edi, [y]
639
           mov [_dy], edi
640
641
 
642
           lea esi, [ecx+ecx*2]
643
           add esi, [LFBAddress]
644
           add esi, eax
645
           mov [cur_saved_base],esi
646
647
 
648
           mov edx, [scr_height]
649
           mov eax, 32
650
651
 
652
           cmp edi, eax
653
           jng @F
224 serge 654
           mov edi, eax
655
@@:
656
           sub edi, [_dx]
221 serge 657
658
 
659
           cmp edx, eax
660
           jng @F
224 serge 661
           mov edx, eax
662
@@:
663
           sub edx, [_dy]
221 serge 664
665
 
666
           mov [h], edx
667
           mov [cur_saved_w], edi
668
           mov [cur_saved_h], edx
669
670
 
671
           shl eax, 2       ;lea eax, [eax+eax*2]
224 serge 672
           lea edi, [edi+edi*2]
221 serge 673
           sub ebx, edi
674
           mov [cur_saved_interl], ebx
675
676
 
677
@@:
678
           mov ecx, [w]
679
           lea ecx, [ecx+ecx*2]
680
           rep movsb
681
           add esi, ebx
682
           dec edx
683
           jnz @B
684
685
 
686
           mov edx, eax
687
           mov edi, [cur_saved_base]
688
           mov eax, [_dy]
689
           shl eax, 5
690
           add eax, [_dx]
691
           shl eax, 2
692
693
 
694
           mov esi, [esi+CURSOR.base]
695
           add esi, eax
696
.row:
697
           mov ecx, [w]
698
.pix:
699
           lodsd
700
           test eax, 0xFF000000
701
           jz @F
702
703
 
704
           shr eax, 16
705
           mov [edi+2],al
706
@@:
707
           add edi, 3
708
           dec ecx
709
           jnz .pix
710
711
 
712
           add edi, ebx
713
           dec [h]
714
           jnz .row
715
           ret
716
endp
717
718
 
719
proc cursor_32 stdcall, hcursor:dword, x:dword, y:dword
720
           locals
721
             w      dd ?
722
             h      dd ?
723
             st     dd ?
724
             _dx     dd ?
725
             _dy     dd ?
726
           endl
727
728
 
729
           mov ecx, [x]
730
           mov eax, [y]
731
           mov ebx, [BytesPerScanLine]
732
733
 
734
           sub ecx, [esi+CURSOR.hot_x]
735
           mov [x], ecx
736
           sets dl
737
           dec edx
738
           and ecx, edx       ;clip x to 0<=x
739
           mov edi, ecx
740
           sub edi, [x]
741
           mov [_dx], edi
742
743
 
744
           sub eax, [esi+CURSOR.hot_y]
745
           mov [y], eax
746
           sets dl
747
           dec edx
748
           and eax, edx       ;clip y to 0<=y
749
           mov edi, eax
750
           sub edi, [y]
751
           mov [_dy], edi
752
753
 
754
           lea esi, [eax+ecx*4]
755
           add esi, [LFBAddress]
756
           mov [cur_saved_base],esi
757
758
 
759
           mov edx, [scr_height]
760
           mov eax, 32
761
762
 
763
           cmp edi, eax
764
           jng @F
224 serge 765
           mov edi, eax
766
@@:
767
           sub edi, [_dx]
221 serge 768
769
 
770
           cmp edx, eax
771
           jng @F
224 serge 772
           mov edx, eax
773
@@:
774
           sub edx, [_dy]
221 serge 775
776
 
777
           mov [h], edx
778
           mov [cur_saved_w], edi
779
           mov [cur_saved_h], edx
780
781
 
782
           shl eax, 2
783
           shl edi, 2
784
           sub ebx, edi
785
           mov [cur_saved_interl], ebx
786
787
 
788
@@:
789
           mov ecx, [w]
790
           rep movsd
791
           add esi, ebx
792
           dec edx
793
           jnz @B
794
795
 
796
           mov edx, eax
797
           mov edi, [cur_saved_base]
798
           mov eax, [_dy]
799
           shl eax, 5
800
           add eax, [_dx]
801
           shl eax, 2
802
803
 
804
           mov esi, [esi+CURSOR.base]
805
           add esi, eax
806
.row:
807
           mov ecx, [w]
808
.pix:
809
           lodsd
810
           test eax, 0xFF000000
811
           jz @F
812
           mov [edi], eax
813
@@:
814
           add edi, 4
815
           dec ecx
816
           jnz .pix
817
           add esi, edx
818
           add edi, ebx
819
           dec [h]
820
           jnz .row
821
           ret
822
endp
823
824
 
825
def_arrow:
826
  file 'arrow.cur'
827
>
828