Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2288 clevermous 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
5154 hidnplayr 3
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;;
2288 clevermous 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
8
$Revision: 5154 $
9
 
10
 
11
LOAD_FROM_FILE  equ 0
12
LOAD_FROM_MEM   equ 1
13
LOAD_INDIRECT   equ 2
14
LOAD_SYSTEM     equ 3
15
 
2384 hidnplayr 16
struct  BITMAPINFOHEADER
17
        Size                    dd ?
18
        Width                   dd ?
19
        Height                  dd ?
20
        Planes                  dw ?
21
        BitCount                dw ?
22
        Compression             dd ?
23
        SizeImage               dd ?
24
        XPelsPerMeter           dd ?
25
        YPelsPerMeter           dd ?
26
        ClrUsed                 dd ?
27
        ClrImportant            dd ?
28
ends
2430 mario79 29
;------------------------------------------------------------------------------
2288 clevermous 30
align 4
31
proc init_cursor stdcall, dst:dword, src:dword
32
           locals
33
             rBase    dd ?
34
             pQuad    dd ?
35
             pBits    dd ?
36
             pAnd     dd ?
37
             width    dd ?
38
             height   dd ?
39
             counter  dd ?
40
           endl
41
 
42
        mov     esi, [src]
43
        add     esi, [esi+18]
44
        mov     eax, esi
45
 
2384 hidnplayr 46
        cmp     [esi+BITMAPINFOHEADER.BitCount], 24
2288 clevermous 47
        je      .img_24
2384 hidnplayr 48
        cmp     [esi+BITMAPINFOHEADER.BitCount], 8
2288 clevermous 49
        je      .img_8
2384 hidnplayr 50
        cmp     [esi+BITMAPINFOHEADER.BitCount], 4
2288 clevermous 51
        je      .img_4
2430 mario79 52
;--------------------------------------
53
align 4
2288 clevermous 54
.img_2:
55
        add     eax, [esi]
56
        mov     [pQuad], eax
57
        add     eax, 8
58
        mov     [pBits], eax
59
        add     eax, 128
60
        mov     [pAnd], eax
61
        mov     eax, [esi+4]
62
        mov     [width], eax
63
        mov     ebx, [esi+8]
64
        shr     ebx, 1
65
        mov     [height], ebx
66
 
67
        mov     edi, [dst]
68
        add     edi, 32*31*4
69
        mov     [rBase], edi
70
 
71
        mov     esi, [pQuad]
2430 mario79 72
;--------------------------------------
73
align 4
2288 clevermous 74
.l21:
75
        mov     ebx, [pBits]
76
        mov     ebx, [ebx]
77
        bswap   ebx
78
        mov     eax, [pAnd]
79
        mov     eax, [eax]
80
        bswap   eax
81
        mov     [counter], 32
2430 mario79 82
;--------------------------------------
83
align 4
2288 clevermous 84
@@:
85
        xor     edx, edx
86
        shl     eax, 1
87
        setc    dl
88
        dec     edx
89
 
90
        xor     ecx, ecx
91
        shl     ebx, 1
92
        setc    cl
93
        mov     ecx, [esi+ecx*4]
94
        and     ecx, edx
95
        and     edx, 0xFF000000
96
        or      edx, ecx
97
        mov     [edi], edx
98
 
99
        add     edi, 4
100
        dec     [counter]
101
        jnz     @B
102
 
103
        add     [pBits], 4
104
        add     [pAnd], 4
105
        mov     edi, [rBase]
106
        sub     edi, 128
107
        mov     [rBase], edi
108
        sub     [height], 1
109
        jnz     .l21
110
        ret
2430 mario79 111
;--------------------------------------
112
align 4
2288 clevermous 113
.img_4:
114
        add     eax, [esi]
115
        mov     [pQuad], eax
116
        add     eax, 64
117
        mov     [pBits], eax
118
        add     eax, 0x200
119
        mov     [pAnd], eax
120
        mov     eax, [esi+4]
121
        mov     [width], eax
122
        mov     ebx, [esi+8]
123
        shr     ebx, 1
124
        mov     [height], ebx
125
 
126
        mov     edi, [dst]
127
        add     edi, 32*31*4
128
        mov     [rBase], edi
129
 
130
        mov     esi, [pQuad]
131
        mov     ebx, [pBits]
2430 mario79 132
;--------------------------------------
133
align 4
2288 clevermous 134
.l4:
135
        mov     eax, [pAnd]
136
        mov     eax, [eax]
137
        bswap   eax
138
        mov     [counter], 16
2430 mario79 139
;--------------------------------------
140
align 4
2288 clevermous 141
@@:
142
        xor     edx, edx
143
        shl     eax, 1
144
        setc    dl
145
        dec     edx
146
 
147
        movzx   ecx, byte [ebx]
148
        and     cl, 0xF0
149
        shr     ecx, 2
150
        mov     ecx, [esi+ecx]
151
        and     ecx, edx
152
        and     edx, 0xFF000000
153
        or      edx, ecx
154
        mov     [edi], edx
155
 
156
        xor     edx, edx
157
        shl     eax, 1
158
        setc    dl
159
        dec     edx
160
 
161
        movzx   ecx, byte [ebx]
162
        and     cl, 0x0F
163
        mov     ecx, [esi+ecx*4]
164
        and     ecx, edx
165
        and     edx, 0xFF000000
166
        or      edx, ecx
167
        mov     [edi+4], edx
168
 
169
        inc     ebx
170
        add     edi, 8
171
        dec     [counter]
172
        jnz     @B
173
 
174
        add     [pAnd], 4
175
        mov     edi, [rBase]
176
        sub     edi, 128
177
        mov     [rBase], edi
178
        sub     [height], 1
179
        jnz     .l4
180
        ret
2430 mario79 181
;--------------------------------------
182
align 4
2288 clevermous 183
.img_8:
184
        add     eax, [esi]
185
        mov     [pQuad], eax
186
        add     eax, 1024
187
        mov     [pBits], eax
188
        add     eax, 1024
189
        mov     [pAnd], eax
190
        mov     eax, [esi+4]
191
        mov     [width], eax
192
        mov     ebx, [esi+8]
193
        shr     ebx, 1
194
        mov     [height], ebx
195
 
196
        mov     edi, [dst]
197
        add     edi, 32*31*4
198
        mov     [rBase], edi
199
 
200
        mov     esi, [pQuad]
201
        mov     ebx, [pBits]
2430 mario79 202
;--------------------------------------
203
align 4
2288 clevermous 204
.l81:
205
        mov     eax, [pAnd]
206
        mov     eax, [eax]
207
        bswap   eax
208
        mov     [counter], 32
2430 mario79 209
;--------------------------------------
210
align 4
2288 clevermous 211
@@:
212
        xor     edx, edx
213
        shl     eax, 1
214
        setc    dl
215
        dec     edx
216
 
217
        movzx   ecx, byte [ebx]
218
        mov     ecx, [esi+ecx*4]
219
        and     ecx, edx
220
        and     edx, 0xFF000000
221
        or      edx, ecx
222
        mov     [edi], edx
223
 
224
        inc     ebx
225
        add     edi, 4
226
        dec     [counter]
227
        jnz     @B
228
 
229
        add     [pAnd], 4
230
        mov     edi, [rBase]
231
        sub     edi, 128
232
        mov     [rBase], edi
233
        sub     [height], 1
234
        jnz     .l81
235
        ret
2430 mario79 236
;--------------------------------------
237
align 4
2288 clevermous 238
.img_24:
239
        add     eax, [esi]
240
        mov     [pQuad], eax
241
        add     eax, 0xC00
242
        mov     [pAnd], eax
2384 hidnplayr 243
        mov     eax, [esi+BITMAPINFOHEADER.Width]
2288 clevermous 244
        mov     [width], eax
2384 hidnplayr 245
        mov     ebx, [esi+BITMAPINFOHEADER.Height]
2288 clevermous 246
        shr     ebx, 1
247
        mov     [height], ebx
248
 
249
        mov     edi, [dst]
250
        add     edi, 32*31*4
251
        mov     [rBase], edi
252
 
253
        mov     esi, [pAnd]
254
        mov     ebx, [pQuad]
2430 mario79 255
;--------------------------------------
256
align 4
2288 clevermous 257
.row_24:
258
        mov     eax, [esi]
259
        bswap   eax
260
        mov     [counter], 32
2430 mario79 261
;--------------------------------------
262
align 4
2288 clevermous 263
@@:
264
        xor     edx, edx
265
        shl     eax, 1
266
        setc    dl
267
        dec     edx
268
 
269
        mov     ecx, [ebx]
270
        and     ecx, 0x00FFFFFF
271
        and     ecx, edx
272
        and     edx, 0xFF000000
273
        or      edx, ecx
274
        mov     [edi], edx
275
        add     ebx, 3
276
        add     edi, 4
277
        dec     [counter]
278
        jnz     @B
279
 
280
        add     esi, 4
281
        mov     edi, [rBase]
282
        sub     edi, 128
283
        mov     [rBase], edi
284
        sub     [height], 1
285
        jnz     .row_24
286
        ret
287
endp
2430 mario79 288
;------------------------------------------------------------------------------
2288 clevermous 289
align 4
290
proc set_cursor stdcall, hcursor:dword
291
        mov     eax, [hcursor]
292
        cmp     [eax+CURSOR.magic], 'CURS'
293
        jne     .fail
294
;           cmp [eax+CURSOR.size], CURSOR_SIZE
295
;           jne .fail
296
        mov     ebx, [current_slot]
297
        xchg    eax, [ebx+APPDATA.cursor]
4507 lev 298
        jmp     .end
2430 mario79 299
;--------------------------------------
300
align 4
2288 clevermous 301
.fail:
302
        mov     eax, [def_cursor]
303
        mov     ebx, [current_slot]
304
        xchg    eax, [ebx+APPDATA.cursor]
4507 lev 305
align 4
306
.end:
307
        mov     [redrawmouse_unconditional], 1
308
        call    __sys_draw_pointer
2288 clevermous 309
        ret
310
endp
2430 mario79 311
;------------------------------------------------------------------------------
312
align 4
2288 clevermous 313
; param
314
;  eax= pid
315
;  ebx= src
316
;  ecx= flags
317
 
318
create_cursor:
319
.src     equ esp
320
.flags   equ esp+4
321
.hcursor equ esp+8
322
 
323
        sub     esp, 4         ;space for .hcursor
324
        push    ecx
325
        push    ebx
326
 
327
        mov     ebx, eax
2384 hidnplayr 328
        mov     eax, sizeof.CURSOR
2288 clevermous 329
        call    create_kernel_object
330
        test    eax, eax
331
        jz      .fail
332
 
333
        mov     [.hcursor], eax
334
 
335
        xor     ebx, ebx
336
        mov     [eax+CURSOR.magic], 'CURS'
337
        mov     [eax+CURSOR.destroy], destroy_cursor
338
        mov     [eax+CURSOR.hot_x], ebx
339
        mov     [eax+CURSOR.hot_y], ebx
340
 
341
        stdcall kernel_alloc, 0x1000
342
        test    eax, eax
343
        jz      .fail
344
 
345
        mov     edi, [.hcursor]
346
        mov     [edi+CURSOR.base], eax
347
 
348
        mov     esi, [.src]
349
        mov     ebx, [.flags]
350
        cmp     bx, LOAD_INDIRECT
351
        je      .indirect
352
 
353
        movzx   ecx, word [esi+10]
354
        movzx   edx, word [esi+12]
355
        mov     [edi+CURSOR.hot_x], ecx
356
        mov     [edi+CURSOR.hot_y], edx
357
 
358
        stdcall init_cursor, eax, esi
359
 
2473 Serge 360
align 4
361
.add_cursor:
2337 Serge 362
        mov     ecx, [.hcursor]
363
        lea     ecx, [ecx+CURSOR.list_next]
2288 clevermous 364
        lea     edx, [_display.cr_list.next]
365
 
366
        pushfd
367
        cli
2337 Serge 368
        list_add ecx, edx   ;list_add_tail(new, head)
2288 clevermous 369
        popfd
370
 
371
        mov     eax, [.hcursor]
372
        cmp     [_display.init_cursor], 0
373
        je      .fail
374
 
375
        push    eax
376
        call    [_display.init_cursor]
377
        add     esp, 4
378
 
379
        mov     eax, [.hcursor]
2430 mario79 380
;--------------------------------------
381
align 4
2288 clevermous 382
.fail:
383
        add     esp, 12
384
        ret
2430 mario79 385
;--------------------------------------
386
align 4
2288 clevermous 387
.indirect:
388
        shr     ebx, 16
389
        movzx   ecx, bh
390
        movzx   edx, bl
2483 mario79 391
        mov     [edi+CURSOR.hot_x], ecx
392
        mov     [edi+CURSOR.hot_y], edx
2288 clevermous 393
 
394
        xchg    edi, eax
395
        mov     ecx, 1024
396
        cld
397
        rep movsd
2473 Serge 398
        jmp     .add_cursor
2430 mario79 399
;------------------------------------------------------------------------------
2288 clevermous 400
align 4
401
proc load_cursor stdcall, src:dword, flags:dword
402
           locals
403
             handle  dd ?
404
           endl
405
 
406
        xor     eax, eax
407
        cmp     [create_cursor], eax
408
        je      .fail2
409
 
410
        mov     [handle], eax
411
        cmp     word [flags], LOAD_FROM_FILE
412
        jne     @F
413
 
414
        stdcall load_file, [src]
415
        test    eax, eax
416
        jz      .fail
417
        mov     [src], eax
2430 mario79 418
;--------------------------------------
419
align 4
2288 clevermous 420
@@:
421
        push    ebx
422
        push    esi
423
        push    edi
424
 
425
        mov     eax, [CURRENT_TASK]
426
        shl     eax, 5
427
        mov     eax, [CURRENT_TASK+eax+4]
428
        mov     ebx, [src]
429
        mov     ecx, [flags]
430
        call    create_cursor    ;eax, ebx, ecx
431
        mov     [handle], eax
432
 
433
        cmp     word [flags], LOAD_FROM_FILE
434
        jne     .exit
435
        stdcall kernel_free, [src]
2430 mario79 436
;--------------------------------------
437
align 4
2288 clevermous 438
.exit:
439
        pop     edi
440
        pop     esi
441
        pop     ebx
2430 mario79 442
;--------------------------------------
443
align 4
2288 clevermous 444
.fail:
445
        mov     eax, [handle]
2430 mario79 446
;--------------------------------------
447
align 4
2288 clevermous 448
.fail2:
449
        ret
450
endp
2430 mario79 451
;------------------------------------------------------------------------------
2288 clevermous 452
align 4
453
proc delete_cursor stdcall, hcursor:dword
454
 
3069 serge 455
;        DEBUGF 1,'K : delete_cursor %x\n', [hcursor]
456
 
2288 clevermous 457
        mov     esi, [hcursor]
3069 serge 458
 
2288 clevermous 459
        cmp     [esi+CURSOR.magic], 'CURS'
460
        jne     .fail
461
 
462
        mov     ebx, [CURRENT_TASK]
463
        shl     ebx, 5
464
        mov     ebx, [CURRENT_TASK+ebx+4]
465
        cmp     ebx, [esi+CURSOR.pid]
466
        jne     .fail
467
 
468
        mov     ebx, [current_slot]
469
        cmp     esi, [ebx+APPDATA.cursor]
470
        jne     @F
471
        mov     eax, [def_cursor]
472
        mov     [ebx+APPDATA.cursor], eax
2430 mario79 473
;--------------------------------------
474
align 4
2288 clevermous 475
@@:
476
        mov     eax, [hcursor]
477
        call    [eax+APPOBJ.destroy]
2430 mario79 478
;--------------------------------------
479
align 4
2288 clevermous 480
.fail:
481
        ret
482
endp
2430 mario79 483
;------------------------------------------------------------------------------
484
align 4
2288 clevermous 485
; param
486
;  eax= cursor
487
destroy_cursor:
488
 
489
        push    eax
490
        stdcall kernel_free, [eax+CURSOR.base]
2337 Serge 491
 
492
        mov     eax, [esp]
493
        lea     eax, [eax+CURSOR.list_next]
494
 
495
        pushfd
496
        cli
497
        list_del eax
498
        popfd
499
 
2288 clevermous 500
        pop     eax
501
        call    destroy_kernel_object
502
        ret
2430 mario79 503
;------------------------------------------------------------------------------
2288 clevermous 504
align 4
505
select_cursor:
506
        mov     eax, [esp+4]
507
        mov     [_display.cursor], eax
508
        ret     4
2430 mario79 509
;------------------------------------------------------------------------------
2288 clevermous 510
align 4
511
proc restore_24 stdcall, x:dword, y:dword
512
 
513
        push    ebx
514
 
515
        mov     ebx, [cur_saved_base]
516
        mov     edx, [cur.h]
517
        test    edx, edx
518
        jz      .ret
519
 
520
        push    esi
521
        push    edi
522
 
523
        mov     esi, cur_saved_data
524
        mov     ecx, [cur.w]
525
        lea     ecx, [ecx+ecx*2]
526
        push    ecx
2430 mario79 527
;--------------------------------------
528
align 4
2288 clevermous 529
@@:
530
        mov     edi, ebx
3606 Serge 531
        add     ebx, [_display.pitch]
2288 clevermous 532
 
533
        mov     ecx, [esp]
534
        rep movsb
535
        dec     edx
536
        jnz     @B
537
 
538
        pop     ecx
539
        pop     edi
540
        pop     esi
2430 mario79 541
;--------------------------------------
542
align 4
2288 clevermous 543
.ret:
544
        pop     ebx
545
        ret
546
endp
2430 mario79 547
;------------------------------------------------------------------------------
2288 clevermous 548
align 4
549
proc restore_32 stdcall, x:dword, y:dword
550
 
551
        push    ebx
552
 
553
        mov     ebx, [cur_saved_base]
554
        mov     edx, [cur.h]
555
        test    edx, edx
556
        jz      .ret
557
 
558
        push    esi
559
        push    edi
560
 
561
        mov     esi, cur_saved_data
2430 mario79 562
;--------------------------------------
563
align 4
2288 clevermous 564
@@:
565
        mov     edi, ebx
3606 Serge 566
        add     ebx, [_display.pitch]
2288 clevermous 567
 
568
        mov     ecx, [cur.w]
569
        rep movsd
570
        dec     edx
571
        jnz     @B
572
 
573
        pop     edi
2430 mario79 574
;--------------------------------------
575
align 4
2288 clevermous 576
.ret:
577
        pop     esi
578
        pop     ebx
579
        ret
580
endp
2430 mario79 581
;------------------------------------------------------------------------------
2288 clevermous 582
align 4
5154 hidnplayr 583
proc restore_16 stdcall, x:dword, y:dword
584
 
585
        push    ebx
586
 
587
        mov     ebx, [cur_saved_base]
588
        mov     edx, [cur.h]
589
        test    edx, edx
590
        jz      .ret
591
 
592
        push    esi
593
        push    edi
594
 
595
        mov     esi, cur_saved_data
596
;--------------------------------------
597
align 4
598
@@:
599
        mov     edi, ebx
600
        add     ebx, [_display.pitch]
601
 
602
        mov     ecx, [cur.w]
603
        rep movsw
604
        dec     edx
605
        jnz     @B
606
 
607
        pop     edi
608
;--------------------------------------
609
align 4
610
.ret:
611
        pop     esi
612
        pop     ebx
613
        ret
614
endp
615
;------------------------------------------------------------------------------
616
align 4
2288 clevermous 617
proc move_cursor_24 stdcall, hcursor:dword, x:dword, y:dword
618
           locals
619
             h      dd ?
620
             _dx     dd ?
621
             _dy     dd ?
622
           endl
623
 
624
        mov     esi, [hcursor]
625
        mov     ecx, [x]
626
        mov     eax, [y]
2446 mario79 627
;        mov     ebx, [BytesPerScanLine]
2288 clevermous 628
 
629
        xor     edx, edx
630
        sub     ecx, [esi+CURSOR.hot_x]
631
        lea     ebx, [ecx+32-1]
632
        mov     [x], ecx
633
        sets    dl
634
        dec     edx
635
        and     ecx, edx      ;clip x to 0<=x
636
        mov     [cur.left], ecx
637
        mov     edi, ecx
638
        sub     edi, [x]
639
        mov     [_dx], edi
640
 
641
        xor     edx, edx
642
        sub     eax, [esi+CURSOR.hot_y]
643
        lea     edi, [eax+32-1]
644
        mov     [y], eax
645
        sets    dl
646
        dec     edx
647
        and     eax, edx      ;clip y to 0<=y
648
        mov     [cur.top], eax
649
        mov     edx, eax
650
        sub     edx, [y]
651
        mov     [_dy], edx
652
 
2446 mario79 653
;        mul     dword [BytesPerScanLine]
2480 mario79 654
        mov     eax, [BPSLine_calc_area+eax*4]
2288 clevermous 655
        lea     edx, [LFB_BASE+ecx*3]
656
        add     edx, eax
657
        mov     [cur_saved_base], edx
658
 
659
        cmp     ebx, [Screen_Max_X]
660
        jbe     @F
661
        mov     ebx, [Screen_Max_X]
2430 mario79 662
;--------------------------------------
663
align 4
2288 clevermous 664
@@:
665
        cmp     edi, [Screen_Max_Y]
666
        jbe     @F
667
        mov     edi, [Screen_Max_Y]
2430 mario79 668
;--------------------------------------
669
align 4
2288 clevermous 670
@@:
671
        mov     [cur.right], ebx
672
        mov     [cur.bottom], edi
673
 
674
        sub     ebx, [x]
675
        sub     edi, [y]
676
        inc     ebx
677
        inc     edi
2576 mario79 678
        sub     ebx, [_dx]
679
        sub     edi, [_dy]
2288 clevermous 680
 
681
        mov     [cur.w], ebx
682
        mov     [cur.h], edi
683
        mov     [h], edi
684
 
685
        mov     eax, edi
686
        mov     edi, cur_saved_data
2430 mario79 687
;--------------------------------------
688
align 4
2288 clevermous 689
@@:
690
        mov     esi, edx
3606 Serge 691
        add     edx, [_display.pitch]
2288 clevermous 692
        mov     ecx, [cur.w]
693
        lea     ecx, [ecx+ecx*2]
694
        rep movsb
695
        dec     eax
696
        jnz     @B
697
 
698
;draw cursor
699
        mov     ebx, [cur_saved_base]
700
        mov     eax, [_dy]
701
        shl     eax, 5
702
        add     eax, [_dx]
703
 
704
        mov     esi, [hcursor]
705
        mov     esi, [esi+CURSOR.base]
706
        lea     edx, [esi+eax*4]
2430 mario79 707
;--------------------------------------
708
align 4
2288 clevermous 709
.row:
710
        mov     ecx, [cur.w]
711
        mov     esi, edx
712
        mov     edi, ebx
713
        add     edx, 32*4
3606 Serge 714
        add     ebx, [_display.pitch]
2430 mario79 715
;--------------------------------------
716
align 4
2288 clevermous 717
.pix:
718
        lodsd
719
        test    eax, 0xFF000000
720
        jz      @F
721
        mov     [edi], ax
722
        shr     eax, 16
723
        mov     [edi+2], al
2430 mario79 724
;--------------------------------------
725
align 4
2288 clevermous 726
@@:
727
        add     edi, 3
728
        dec     ecx
729
        jnz     .pix
730
 
731
        dec     [h]
732
        jnz     .row
733
        ret
734
endp
2430 mario79 735
;------------------------------------------------------------------------------
2288 clevermous 736
align 4
737
proc move_cursor_32 stdcall, hcursor:dword, x:dword, y:dword
738
           locals
739
             h      dd ?
740
             _dx     dd ?
741
             _dy     dd ?
742
           endl
743
 
744
        mov     esi, [hcursor]
745
        mov     ecx, [x]
746
        mov     eax, [y]
747
 
748
        xor     edx, edx
749
        sub     ecx, [esi+CURSOR.hot_x]
750
        lea     ebx, [ecx+32-1]
751
        mov     [x], ecx
752
        sets    dl
753
        dec     edx
754
        and     ecx, edx      ;clip x to 0<=x
755
        mov     [cur.left], ecx
756
        mov     edi, ecx
757
        sub     edi, [x]
758
        mov     [_dx], edi
759
 
760
        xor     edx, edx
761
        sub     eax, [esi+CURSOR.hot_y]
762
        lea     edi, [eax+32-1]
763
        mov     [y], eax
764
        sets    dl
765
        dec     edx
766
        and     eax, edx      ;clip y to 0<=y
767
        mov     [cur.top], eax
768
        mov     edx, eax
769
        sub     edx, [y]
770
        mov     [_dy], edx
771
 
2446 mario79 772
;        mul     dword [BytesPerScanLine]
2480 mario79 773
        mov     eax, [BPSLine_calc_area+eax*4]
2288 clevermous 774
        lea     edx, [LFB_BASE+eax+ecx*4]
775
        mov     [cur_saved_base], edx
776
 
777
        cmp     ebx, [Screen_Max_X]
778
        jbe     @F
779
        mov     ebx, [Screen_Max_X]
2430 mario79 780
;--------------------------------------
781
align 4
2288 clevermous 782
@@:
783
        cmp     edi, [Screen_Max_Y]
784
        jbe     @F
785
        mov     edi, [Screen_Max_Y]
2430 mario79 786
;--------------------------------------
787
align 4
2288 clevermous 788
@@:
789
        mov     [cur.right], ebx
790
        mov     [cur.bottom], edi
791
 
792
        sub     ebx, [x]
793
        sub     edi, [y]
794
        inc     ebx
795
        inc     edi
2576 mario79 796
        sub     ebx, [_dx]
797
        sub     edi, [_dy]
2288 clevermous 798
 
799
        mov     [cur.w], ebx
800
        mov     [cur.h], edi
801
        mov     [h], edi
802
 
803
        mov     eax, edi
804
        mov     edi, cur_saved_data
2430 mario79 805
;--------------------------------------
806
align 4
2288 clevermous 807
@@:
808
        mov     esi, edx
3606 Serge 809
        add     edx, [_display.pitch]
2288 clevermous 810
        mov     ecx, [cur.w]
811
        rep movsd
812
        dec     eax
813
        jnz     @B
814
 
815
;draw cursor
816
        mov     ebx, [cur_saved_base]
817
        mov     eax, [_dy]
818
        shl     eax, 5
819
        add     eax, [_dx]
820
 
821
        mov     esi, [hcursor]
822
        mov     esi, [esi+CURSOR.base]
823
        lea     edx, [esi+eax*4]
2430 mario79 824
;--------------------------------------
825
align 4
2288 clevermous 826
.row:
827
        mov     ecx, [cur.w]
828
        mov     esi, edx
829
        mov     edi, ebx
830
        add     edx, 32*4
3606 Serge 831
        add     ebx, [_display.pitch]
2430 mario79 832
;--------------------------------------
833
align 4
2288 clevermous 834
.pix:
835
        lodsd
836
        test    eax, 0xFF000000
837
        jz      @F
838
        mov     [edi], eax
2430 mario79 839
;--------------------------------------
840
align 4
2288 clevermous 841
@@:
842
        add     edi, 4
843
        dec     ecx
844
        jnz     .pix
845
 
846
        dec     [h]
847
        jnz     .row
848
        ret
849
endp
2430 mario79 850
;------------------------------------------------------------------------------
851
align 4
5154 hidnplayr 852
proc move_cursor_16 stdcall, hcursor:dword, x:dword, y:dword
853
           locals
854
             h      dd ?
855
             _dx     dd ?
856
             _dy     dd ?
857
           endl
858
 
859
        mov     esi, [hcursor]
860
        mov     ecx, [x]
861
        mov     eax, [y]
862
 
863
        xor     edx, edx
864
        sub     ecx, [esi+CURSOR.hot_x]
865
        lea     ebx, [ecx+32-1]
866
        mov     [x], ecx
867
        sets    dl
868
        dec     edx
869
        and     ecx, edx      ;clip x to 0<=x
870
        mov     [cur.left], ecx
871
        mov     edi, ecx
872
        sub     edi, [x]
873
        mov     [_dx], edi
874
 
875
        xor     edx, edx
876
        sub     eax, [esi+CURSOR.hot_y]
877
        lea     edi, [eax+32-1]
878
        mov     [y], eax
879
        sets    dl
880
        dec     edx
881
        and     eax, edx      ;clip y to 0<=y
882
        mov     [cur.top], eax
883
        mov     edx, eax
884
        sub     edx, [y]
885
        mov     [_dy], edx
886
 
887
;        mul     dword [BytesPerScanLine]
888
        mov     eax, [BPSLine_calc_area+eax*4]
889
        lea     edx, [LFB_BASE+eax+ecx*2]
890
        mov     [cur_saved_base], edx
891
 
892
        cmp     ebx, [Screen_Max_X]
893
        jbe     @F
894
        mov     ebx, [Screen_Max_X]
895
;--------------------------------------
896
align 4
897
@@:
898
        cmp     edi, [Screen_Max_Y]
899
        jbe     @F
900
        mov     edi, [Screen_Max_Y]
901
;--------------------------------------
902
align 4
903
@@:
904
        mov     [cur.right], ebx
905
        mov     [cur.bottom], edi
906
 
907
        sub     ebx, [x]
908
        sub     edi, [y]
909
        inc     ebx
910
        inc     edi
911
        sub     ebx, [_dx]
912
        sub     edi, [_dy]
913
 
914
        mov     [cur.w], ebx
915
        mov     [cur.h], edi
916
        mov     [h], edi
917
 
918
        mov     eax, edi
919
        mov     edi, cur_saved_data
920
;--------------------------------------
921
align 4
922
@@:
923
        mov     esi, edx
924
        add     edx, [_display.pitch]
925
        mov     ecx, [cur.w]
926
 
927
        rep movsw
928
        dec     eax
929
        jnz     @B
930
 
931
;draw cursor
932
        mov     ebx, [cur_saved_base]
933
        mov     eax, [_dy]
934
        shl     eax, 5
935
        add     eax, [_dx]
936
 
937
        mov     esi, [hcursor]
938
        mov     esi, [esi+CURSOR.base]
939
        lea     edx, [esi+eax*4]
940
;--------------------------------------
941
align 4
942
.row:
943
        mov     ecx, [cur.w]
944
        mov     esi, edx
945
        mov     edi, ebx
946
        add     edx, 32*4
947
        add     ebx, [_display.pitch]
948
;--------------------------------------
949
align 4
950
.pix:
951
        lodsd
952
        test    eax, 0xFF000000
953
        jz      @F
954
; convert to 16 bpp and store to real LFB
955
        and     eax, 00000000111110001111110011111000b
956
        shr     ah, 2
957
        shr     ax, 3
958
        ror     eax, 8
959
        add     al, ah
960
        rol     eax, 8
961
        mov     [edi], ax
962
;--------------------------------------
963
align 4
964
@@:
965
        add     edi, 2
966
        dec     ecx
967
        jnz     .pix
968
 
969
        dec     [h]
970
        jnz     .row
971
        ret
972
endp
973
;------------------------------------------------------------------------------
974
align 4
2430 mario79 975
check_mouse_area_for_getpixel_new:
976
; in:
977
; eax = x
978
; ebx = y
979
; out:
980
; ecx = new color
981
;--------------------------------------
982
; check for Y
983
        cmp     bx, [Y_UNDER_subtraction_CUR_hot_y]
984
        jb      .no_mouse_area
2288 clevermous 985
 
2430 mario79 986
        cmp     bx, [Y_UNDER_sub_CUR_hot_y_add_curh]
987
        jae     .no_mouse_area
988
;--------------------------------------
989
; check for X
990
        cmp     ax, [X_UNDER_subtraction_CUR_hot_x]
991
        jb      .no_mouse_area
2288 clevermous 992
 
2430 mario79 993
        cmp     ax, [X_UNDER_sub_CUR_hot_x_add_curh]
994
        jae     .no_mouse_area
995
;--------------------------------------
996
        push    eax ebx
997
; offset X
2575 mario79 998
        movzx   ecx, word [X_UNDER_subtraction_CUR_hot_x]
2430 mario79 999
        sub     eax, ecx        ; x1
1000
; offset Y
2575 mario79 1001
        movzx   ecx, word [Y_UNDER_subtraction_CUR_hot_y]
2430 mario79 1002
        sub     ebx, ecx        ; y1
1003
;--------------------------------------
1004
; ebx = offset y
1005
; eax = offset x
1006
        imul    ebx, [cur.w]     ;y
1007
        add     eax, ebx
1008
        mov     ebx, eax
1009
        shl     eax, 2
5154 hidnplayr 1010
        cmp     byte [_display.bits_per_pixel], 32
2430 mario79 1011
        je      @f
1012
        sub     eax, ebx
5154 hidnplayr 1013
        cmp     byte [_display.bits_per_pixel], 24
1014
        je      @f
1015
        sub     eax, ebx
2430 mario79 1016
;--------------------------------------
2288 clevermous 1017
align 4
2430 mario79 1018
@@:
1019
        add     eax, cur_saved_data
1020
        mov     ecx, [eax]
1021
        and     ecx, 0xffffff
1022
        add     ecx, 0xff000000
1023
        pop     ebx eax
1024
        ret
1025
;--------------------------------------
1026
align 4
1027
.no_mouse_area:
1028
        xor     ecx, ecx
1029
        ret
1030
;-----------------------------------------------------------------------------
1031
align 4
1032
check_mouse_area_for_putpixel_new:
1033
; in:
1034
; ecx = x shl 16 + y
1035
; eax = color
1036
; out:
1037
; eax = new color
1038
;--------------------------------------
1039
; check for Y
1040
        cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
1041
        jae     .no_mouse_area
1042
 
2575 mario79 1043
        sub     cx, [Y_UNDER_subtraction_CUR_hot_y]
1044
        jb      .no_mouse_area
1045
 
2430 mario79 1046
        rol     ecx, 16
1047
;--------------------------------------
1048
; check for X
2575 mario79 1049
        cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
1050
        jae     .no_mouse_area
1051
 
1052
        sub     cx, [X_UNDER_subtraction_CUR_hot_x]
2430 mario79 1053
        jb      .no_mouse_area
1054
 
2575 mario79 1055
        ror     ecx, 16
2430 mario79 1056
;--------------------------------------
1057
align 4
1058
.1:
1059
        push    eax
1060
;--------------------------------------
1061
; ecx = (offset x) shl 16 + (offset y)
1062
        push    ebx
1063
        mov     ebx, ecx
1064
        shr     ebx, 16        ; x
1065
        and     ecx, 0xffff    ; y
2575 mario79 1066
 
1067
        cmp     ecx, [cur.h]
1068
        jae     @f
1069
 
1070
        cmp     ebx, [cur.w]
1071
        jb      .ok
1072
;--------------------------------------
1073
align 4
1074
@@:
1075
;        DEBUGF  1, "K : SHIT HAPPENS: %x %x \n", ecx,ebx
1076
        pop     ebx
1077
        jmp     .sh   ; SORRY! SHIT HAPPENS!
1078
;--------------------------------------
1079
align 4
1080
.ok:
2430 mario79 1081
; ecx = offset y
1082
; ebx = offset x
1083
        push    ebx ecx
1084
        imul    ecx, [cur.w]    ;y
1085
        add     ecx, ebx
1086
        mov     ebx, ecx
1087
        shl     ecx, 2
5154 hidnplayr 1088
        cmp     byte [_display.bits_per_pixel], 16
1089
        je      .16
1090
        cmp     byte [_display.bits_per_pixel], 24
2430 mario79 1091
        je      .24
1092
        and     eax, 0xFFFFFF
1093
        mov     [ecx + cur_saved_data], eax   ;store new color  to
1094
        jmp     @f
1095
;--------------------------------------
1096
align 4
5154 hidnplayr 1097
.16:
1098
        sub     ecx, ebx
1099
        sub     ecx, ebx
1100
; convert to 16 bpp and store to real LFB
1101
        and     eax, 00000000111110001111110011111000b
1102
        shr     ah, 2
1103
        shr     ax, 3
1104
        ror     eax, 8
1105
        add     al, ah
1106
        rol     eax, 8
1107
        mov     [ecx + cur_saved_data], ax      ;store new color  to
1108
        jmp     @f
1109
;--------------------------------------
1110
align 4
2430 mario79 1111
.24:
1112
        sub     ecx, ebx
1113
        mov     [ecx + cur_saved_data], ax      ;store new color  to
1114
        shr     eax, 16
1115
        mov     [ecx + cur_saved_data + 2], al  ;store new color  to
1116
;--------------------------------------
1117
align 4
1118
@@:
1119
        pop     ecx ebx
1120
 
1121
        shl     ecx, 5
1122
        add     ecx, ebx
1123
 
1124
        mov     eax, [current_cursor]
1125
        mov     eax, [eax+CURSOR.base]
1126
        lea     eax, [eax+ecx*4]
1127
        mov     eax, [eax]
1128
 
1129
        pop     ebx
1130
 
1131
        test    eax, 0xFF000000
1132
        jz      @f
1133
 
2652 mario79 1134
        add     esp, 4
2430 mario79 1135
        ret
1136
;--------------------------------------
1137
align 4
2575 mario79 1138
.sh:
1139
        mov     ecx, -1
1140
;--------------------------------------
1141
align 4
2430 mario79 1142
@@:
1143
        pop     eax
1144
;--------------------------------------
1145
align 4
1146
.no_mouse_area:
1147
        ret
1148
;------------------------------------------------------------------------------
1149
align 4
2288 clevermous 1150
get_display:
1151
        mov     eax, _display
1152
        ret
2430 mario79 1153
;------------------------------------------------------------------------------
2288 clevermous 1154
align 4
1155
init_display:
1156
        xor     eax, eax
1157
        mov     edi, _display
1158
 
1159
        mov     [edi+display_t.init_cursor], eax
1160
        mov     [edi+display_t.select_cursor], eax
1161
        mov     [edi+display_t.show_cursor], eax
1162
        mov     [edi+display_t.move_cursor], eax
1163
        mov     [edi+display_t.restore_cursor], eax
1164
 
1165
        lea     ecx, [edi+display_t.cr_list.next]
1166
        mov     [edi+display_t.cr_list.next], ecx
1167
        mov     [edi+display_t.cr_list.prev], ecx
1168
 
1169
        cmp     [SCR_MODE], word 0x13
1170
        jbe     .fail
1171
 
1172
        test    word [SCR_MODE], 0x4000
1173
        jz      .fail
1174
 
1175
        mov     ebx, restore_32
1176
        mov     ecx, move_cursor_32
3537 Serge 1177
        mov     edx, Vesa20_putpixel32_new
5154 hidnplayr 1178
        mov     eax, [_display.bits_per_pixel]
3537 Serge 1179
        cmp     al, 32
5154 hidnplayr 1180
        jne     .not_32bpp
2288 clevermous 1181
 
3537 Serge 1182
.set:
2288 clevermous 1183
        mov     [_display.select_cursor], select_cursor
1184
        mov     [_display.move_cursor], ecx
1185
        mov     [_display.restore_cursor], ebx
2430 mario79 1186
        mov     [_display.check_mouse], check_mouse_area_for_putpixel_new
1187
        mov     [_display.check_m_pixel], check_mouse_area_for_getpixel_new
2288 clevermous 1188
 
2436 mario79 1189
        cmp     [PUTPIXEL], dword VGA_putpixel
1190
        je      @f
3537 Serge 1191
        mov     [PUTPIXEL], edx
2436 mario79 1192
@@:
2497 mario79 1193
        stdcall load_cursor, clock_arrow, dword LOAD_FROM_MEM
1194
        mov     [def_cursor_clock], eax
2288 clevermous 1195
        stdcall load_cursor, def_arrow, dword LOAD_FROM_MEM
1196
        mov     [def_cursor], eax
1197
        ret
3537 Serge 1198
 
5154 hidnplayr 1199
.not_32bpp:
1200
        cmp     al, 24
1201
        jne     .not_24bpp
1202
 
3537 Serge 1203
        mov     ebx, restore_24
1204
        mov     ecx, move_cursor_24
1205
        mov     edx, Vesa20_putpixel24_new
5154 hidnplayr 1206
        jmp     .set
3537 Serge 1207
 
5154 hidnplayr 1208
.not_24bpp:
1209
        cmp     al, 16
1210
        jne     .not_16bpp
1211
        mov     ebx, restore_16
1212
        mov     ecx, move_cursor_16
1213
        mov     edx, Vesa20_putpixel16_new
1214
        jmp     .set
1215
 
1216
.not_16bpp:
1217
;        cmp     al, 15
1218
;        jne     .fail
1219
;        mov     ebx, restore_15
1220
;        mov     ecx, move_cursor_15
1221
;        mov     edx, Vesa20_putpixel15_new
1222
;        jmp     .set
1223
 
2288 clevermous 1224
.fail:
1225
        xor     eax, eax
1226
        mov     [_display.select_cursor], eax
1227
        mov     [_display.move_cursor], eax
1228
        ret
2430 mario79 1229
;------------------------------------------------------------------------------
2288 clevermous 1230
align 4
1231
def_arrow:
1232
  file 'arrow.cur'
2430 mario79 1233
;------------------------------------------------------------------------------
2497 mario79 1234
align 4
1235
clock_arrow:
1236
  file 'arrow_clock.cur'
1237
;------------------------------------------------------------------------------
2288 clevermous 1238