Subversion Repositories Kolibri OS

Rev

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

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