Subversion Repositories Kolibri OS

Rev

Rev 379 | Rev 381 | 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 [0xfe0c],word 0x13
233 serge 429
           jbe .fail
430
431
 
221 serge 432
           mov ebx, [SCR_BYTES_PER_LINE]
433
           cmp eax, 32
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
           test eax, eax
227 serge 447
           jz .sw_mouse
448
449
 
221 serge 450
           mov [def_cursor], eax
451
           ret
227 serge 452
.sw_mouse:
453
           mov [create_cursor], vesa_cursor
454
221 serge 455
 
227 serge 456
           mov [def_cursor], eax
457
458
 
221 serge 459
           mov edx, [SCR_Y_SIZE]
460
           inc ecx
461
           inc edx
462
           mov [scr_width], ecx
463
           mov [scr_height], edx
464
465
 
466
           cmp ebx, 32
467
           jne @F
468
469
 
470
           mov dword [hw_restore], restore_32
471
           ret
472
@@:
473
           mov dword [set_hw_cursor], cursor_24
474
           mov dword [hw_restore], restore_24
475
           ret
476
.fail:
477
           xor eax, eax
478
           mov dword [set_hw_cursor], eax
479
           mov dword [hw_restore], eax
480
           ret
481
endp
482
483
 
484
proc restore_24 stdcall, x:dword, y:dword
485
           locals
486
             w  dd ?
487
           endl
488
489
 
490
           mov edx, [cur_saved_h]
491
           mov ebx, [cur_saved_interl]
492
493
 
494
@@:
495
           mov ecx, [cur_saved_w]
496
           lea ecx, [ecx+ecx*2]
497
           rep movsb
498
           add edi, ebx
499
           dec edx
500
           jnz @B
501
           ret
502
endp
503
504
 
505
proc restore_32 stdcall, x:dword, y:dword
506
           locals
507
             w  dd ?
508
           endl
509
510
 
511
           mov edx, [cur_saved_h]
512
           mov ebx, [cur_saved_interl]
513
514
 
515
@@:
516
           mov ecx, [cur_saved_w]
517
           rep movsd
518
           add edi, ebx
519
           dec edx
520
           jnz @B
521
           ret
522
endp
523
524
 
525
proc cursor_24 stdcall, hcursor:dword, x:dword, y:dword
526
           locals
527
             w      dd ?
528
             h      dd ?
529
             st     dd ?
530
             _dx     dd ?
531
             _dy     dd ?
532
           endl
533
534
 
535
           mov ecx, [x]
536
           mov eax, [y]
537
           mov ebx, [BytesPerScanLine]
538
539
 
540
           sub ecx, [esi+CURSOR.hot_x]
541
           mov [x], ecx
542
           sets dl
543
           dec edx
544
           and ecx, edx       ;clip x to 0<=x
545
           mov edi, ecx
546
           sub edi, [x]
547
           mov [_dx], edi
548
549
 
550
           sub eax, [esi+CURSOR.hot_y]
551
           mov [y], eax
552
           sets dl
553
           dec edx
554
           and eax, edx       ;clip y to 0<=y
555
           mov edi, eax
556
           sub edi, [y]
557
           mov [_dy], edi
558
559
 
560
           lea esi, [ecx+ecx*2]
561
           add esi, [LFBAddress]
562
           add esi, eax
563
           mov [cur_saved_base],esi
564
565
 
566
           mov edx, [scr_height]
567
           mov eax, 32
568
569
 
570
           cmp edi, eax
571
           jng @F
224 serge 572
           mov edi, eax
573
@@:
574
           sub edi, [_dx]
221 serge 575
576
 
577
           cmp edx, eax
578
           jng @F
224 serge 579
           mov edx, eax
580
@@:
581
           sub edx, [_dy]
221 serge 582
583
 
584
           mov [h], edx
585
           mov [cur_saved_w], edi
586
           mov [cur_saved_h], edx
587
588
 
589
           shl eax, 2       ;lea eax, [eax+eax*2]
224 serge 590
           lea edi, [edi+edi*2]
221 serge 591
           sub ebx, edi
592
           mov [cur_saved_interl], ebx
593
594
 
595
@@:
596
           mov ecx, [w]
597
           lea ecx, [ecx+ecx*2]
598
           rep movsb
599
           add esi, ebx
600
           dec edx
601
           jnz @B
602
603
 
604
           mov edx, eax
605
           mov edi, [cur_saved_base]
606
           mov eax, [_dy]
607
           shl eax, 5
608
           add eax, [_dx]
609
           shl eax, 2
610
611
 
612
           mov esi, [esi+CURSOR.base]
613
           add esi, eax
614
.row:
615
           mov ecx, [w]
616
.pix:
617
           lodsd
618
           test eax, 0xFF000000
619
           jz @F
620
621
 
622
           shr eax, 16
623
           mov [edi+2],al
624
@@:
625
           add edi, 3
626
           dec ecx
627
           jnz .pix
628
629
 
630
           add edi, ebx
631
           dec [h]
632
           jnz .row
633
           ret
634
endp
635
636
 
637
proc cursor_32 stdcall, hcursor:dword, x:dword, y:dword
638
           locals
639
             w      dd ?
640
             h      dd ?
641
             st     dd ?
642
             _dx     dd ?
643
             _dy     dd ?
644
           endl
645
646
 
647
           mov ecx, [x]
648
           mov eax, [y]
649
           mov ebx, [BytesPerScanLine]
650
651
 
652
           sub ecx, [esi+CURSOR.hot_x]
653
           mov [x], ecx
654
           sets dl
655
           dec edx
656
           and ecx, edx       ;clip x to 0<=x
657
           mov edi, ecx
658
           sub edi, [x]
659
           mov [_dx], edi
660
661
 
662
           sub eax, [esi+CURSOR.hot_y]
663
           mov [y], eax
664
           sets dl
665
           dec edx
666
           and eax, edx       ;clip y to 0<=y
667
           mov edi, eax
668
           sub edi, [y]
669
           mov [_dy], edi
670
671
 
672
           lea esi, [eax+ecx*4]
673
           add esi, [LFBAddress]
674
           mov [cur_saved_base],esi
675
676
 
677
           mov edx, [scr_height]
678
           mov eax, 32
679
680
 
681
           cmp edi, eax
682
           jng @F
224 serge 683
           mov edi, eax
684
@@:
685
           sub edi, [_dx]
221 serge 686
687
 
688
           cmp edx, eax
689
           jng @F
224 serge 690
           mov edx, eax
691
@@:
692
           sub edx, [_dy]
221 serge 693
694
 
695
           mov [h], edx
696
           mov [cur_saved_w], edi
697
           mov [cur_saved_h], edx
698
699
 
700
           shl eax, 2
701
           shl edi, 2
702
           sub ebx, edi
703
           mov [cur_saved_interl], ebx
704
705
 
706
@@:
707
           mov ecx, [w]
708
           rep movsd
709
           add esi, ebx
710
           dec edx
711
           jnz @B
712
713
 
714
           mov edx, eax
715
           mov edi, [cur_saved_base]
716
           mov eax, [_dy]
717
           shl eax, 5
718
           add eax, [_dx]
719
           shl eax, 2
720
721
 
722
           mov esi, [esi+CURSOR.base]
723
           add esi, eax
724
.row:
725
           mov ecx, [w]
726
.pix:
727
           lodsd
728
           test eax, 0xFF000000
729
           jz @F
730
           mov [edi], eax
731
@@:
732
           add edi, 4
733
           dec ecx
734
           jnz .pix
735
           add esi, edx
736
           add edi, ebx
737
           dec [h]
738
           jnz .row
739
           ret
740
endp
741
742
 
743
def_arrow:
744
  file 'arrow.cur'
745
>
746