Subversion Repositories Kolibri OS

Rev

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