Subversion Repositories Kolibri OS

Rev

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