Subversion Repositories Kolibri OS

Rev

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