Subversion Repositories Kolibri OS

Rev

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