Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
465 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2465 Serge 3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
465 serge 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
221 serge 7
 
593 mikedld 8
$Revision: 2987 $
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
 
2434 Serge 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
29
;------------------------------------------------------------------------------
221 serge 30
align 4
1316 serge 31
proc init_cursor stdcall, dst:dword, src:dword
221 serge 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
 
2434 Serge 42
        mov     esi, [src]
43
        add     esi, [esi+18]
44
        mov     eax, esi
221 serge 45
 
2434 Serge 46
        cmp     [esi+BITMAPINFOHEADER.BitCount], 24
47
        je      .img_24
48
        cmp     [esi+BITMAPINFOHEADER.BitCount], 8
49
        je      .img_8
50
        cmp     [esi+BITMAPINFOHEADER.BitCount], 4
51
        je      .img_4
52
;--------------------------------------
53
align 4
233 serge 54
.img_2:
2434 Serge 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
233 serge 66
 
2434 Serge 67
        mov     edi, [dst]
68
        add     edi, 32*31*4
69
        mov     [rBase], edi
233 serge 70
 
2434 Serge 71
        mov     esi, [pQuad]
72
;--------------------------------------
73
align 4
233 serge 74
.l21:
2434 Serge 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
82
;--------------------------------------
83
align 4
233 serge 84
@@:
2434 Serge 85
        xor     edx, edx
86
        shl     eax, 1
87
        setc    dl
88
        dec     edx
233 serge 89
 
2434 Serge 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
233 serge 98
 
2434 Serge 99
        add     edi, 4
100
        dec     [counter]
101
        jnz     @B
233 serge 102
 
2434 Serge 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
111
;--------------------------------------
112
align 4
224 serge 113
.img_4:
2434 Serge 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
221 serge 125
 
2434 Serge 126
        mov     edi, [dst]
127
        add     edi, 32*31*4
128
        mov     [rBase], edi
221 serge 129
 
2434 Serge 130
        mov     esi, [pQuad]
131
        mov     ebx, [pBits]
132
;--------------------------------------
133
align 4
233 serge 134
.l4:
2434 Serge 135
        mov     eax, [pAnd]
136
        mov     eax, [eax]
137
        bswap   eax
138
        mov     [counter], 16
139
;--------------------------------------
140
align 4
221 serge 141
@@:
2434 Serge 142
        xor     edx, edx
143
        shl     eax, 1
144
        setc    dl
145
        dec     edx
221 serge 146
 
2434 Serge 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
221 serge 155
 
2434 Serge 156
        xor     edx, edx
157
        shl     eax, 1
158
        setc    dl
159
        dec     edx
221 serge 160
 
2434 Serge 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
221 serge 168
 
2434 Serge 169
        inc     ebx
170
        add     edi, 8
171
        dec     [counter]
172
        jnz     @B
221 serge 173
 
2434 Serge 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
181
;--------------------------------------
182
align 4
233 serge 183
.img_8:
2434 Serge 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
233 serge 195
 
2434 Serge 196
        mov     edi, [dst]
197
        add     edi, 32*31*4
198
        mov     [rBase], edi
233 serge 199
 
2434 Serge 200
        mov     esi, [pQuad]
201
        mov     ebx, [pBits]
202
;--------------------------------------
203
align 4
233 serge 204
.l81:
2434 Serge 205
        mov     eax, [pAnd]
206
        mov     eax, [eax]
207
        bswap   eax
208
        mov     [counter], 32
209
;--------------------------------------
210
align 4
233 serge 211
@@:
2434 Serge 212
        xor     edx, edx
213
        shl     eax, 1
214
        setc    dl
215
        dec     edx
233 serge 216
 
2434 Serge 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
233 serge 223
 
2434 Serge 224
        inc     ebx
225
        add     edi, 4
226
        dec     [counter]
227
        jnz     @B
233 serge 228
 
2434 Serge 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
236
;--------------------------------------
237
align 4
224 serge 238
.img_24:
2434 Serge 239
        add     eax, [esi]
240
        mov     [pQuad], eax
241
        add     eax, 0xC00
242
        mov     [pAnd], eax
243
        mov     eax, [esi+BITMAPINFOHEADER.Width]
244
        mov     [width], eax
245
        mov     ebx, [esi+BITMAPINFOHEADER.Height]
246
        shr     ebx, 1
247
        mov     [height], ebx
224 serge 248
 
2434 Serge 249
        mov     edi, [dst]
250
        add     edi, 32*31*4
251
        mov     [rBase], edi
224 serge 252
 
2434 Serge 253
        mov     esi, [pAnd]
254
        mov     ebx, [pQuad]
255
;--------------------------------------
256
align 4
224 serge 257
.row_24:
2434 Serge 258
        mov     eax, [esi]
259
        bswap   eax
260
        mov     [counter], 32
261
;--------------------------------------
262
align 4
224 serge 263
@@:
2434 Serge 264
        xor     edx, edx
265
        shl     eax, 1
266
        setc    dl
267
        dec     edx
224 serge 268
 
2434 Serge 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
224 serge 279
 
2434 Serge 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
221 serge 287
endp
2434 Serge 288
;------------------------------------------------------------------------------
221 serge 289
align 4
227 serge 290
proc set_cursor stdcall, hcursor:dword
2434 Serge 291
        mov     eax, [hcursor]
292
        cmp     [eax+CURSOR.magic], 'CURS'
293
        jne     .fail
281 serge 294
;           cmp [eax+CURSOR.size], CURSOR_SIZE
295
;           jne .fail
2434 Serge 296
        mov     ebx, [current_slot]
297
        xchg    eax, [ebx+APPDATA.cursor]
298
        ret
299
;--------------------------------------
300
align 4
230 serge 301
.fail:
2434 Serge 302
        mov     eax, [def_cursor]
303
        mov     ebx, [current_slot]
304
        xchg    eax, [ebx+APPDATA.cursor]
305
        ret
227 serge 306
endp
2434 Serge 307
;------------------------------------------------------------------------------
308
align 4
281 serge 309
; param
310
;  eax= pid
311
;  ebx= src
312
;  ecx= flags
227 serge 313
 
1316 serge 314
create_cursor:
281 serge 315
.src     equ esp
316
.flags   equ esp+4
317
.hcursor equ esp+8
318
 
2434 Serge 319
        sub     esp, 4         ;space for .hcursor
320
        push    ecx
321
        push    ebx
281 serge 322
 
2434 Serge 323
        mov     ebx, eax
324
        mov     eax, sizeof.CURSOR
325
        call    create_kernel_object
326
        test    eax, eax
327
        jz      .fail
281 serge 328
 
2434 Serge 329
        mov     [.hcursor], eax
281 serge 330
 
2434 Serge 331
        xor     ebx, ebx
332
        mov     [eax+CURSOR.magic], 'CURS'
333
        mov     [eax+CURSOR.destroy], destroy_cursor
334
        mov     [eax+CURSOR.hot_x], ebx
335
        mov     [eax+CURSOR.hot_y], ebx
281 serge 336
 
2434 Serge 337
        stdcall kernel_alloc, 0x1000
338
        test    eax, eax
339
        jz      .fail
221 serge 340
 
2434 Serge 341
        mov     edi, [.hcursor]
342
        mov     [edi+CURSOR.base], eax
221 serge 343
 
2434 Serge 344
        mov     esi, [.src]
345
        mov     ebx, [.flags]
346
        cmp     bx, LOAD_INDIRECT
347
        je      .indirect
221 serge 348
 
2434 Serge 349
        movzx   ecx, word [esi+10]
350
        movzx   edx, word [esi+12]
351
        mov     [edi+CURSOR.hot_x], ecx
352
        mov     [edi+CURSOR.hot_y], edx
221 serge 353
 
2434 Serge 354
        stdcall init_cursor, eax, esi
1316 serge 355
 
2987 Serge 356
align 4
357
.add_cursor:
2434 Serge 358
        mov     ecx, [.hcursor]
359
        lea     ecx, [ecx+CURSOR.list_next]
360
        lea     edx, [_display.cr_list.next]
1316 serge 361
 
2434 Serge 362
        pushfd
363
        cli
364
        list_add ecx, edx   ;list_add_tail(new, head)
365
        popfd
1316 serge 366
 
2434 Serge 367
        mov     eax, [.hcursor]
368
        cmp     [_display.init_cursor], 0
369
        je      .fail
1316 serge 370
 
2434 Serge 371
        push    eax
372
        call    [_display.init_cursor]
373
        add     esp, 4
1316 serge 374
 
2434 Serge 375
        mov     eax, [.hcursor]
376
;--------------------------------------
377
align 4
221 serge 378
.fail:
2434 Serge 379
        add     esp, 12
380
        ret
381
;--------------------------------------
382
align 4
227 serge 383
.indirect:
2434 Serge 384
        shr     ebx, 16
385
        movzx   ecx, bh
386
        movzx   edx, bl
2987 Serge 387
        mov     [edi+CURSOR.hot_x], ecx
388
        mov     [edi+CURSOR.hot_y], edx
221 serge 389
 
2434 Serge 390
        xchg    edi, eax
391
        mov     ecx, 1024
392
        cld
393
        rep movsd
2987 Serge 394
        jmp     .add_cursor
2434 Serge 395
;------------------------------------------------------------------------------
221 serge 396
align 4
397
proc load_cursor stdcall, src:dword, flags:dword
398
           locals
399
             handle  dd ?
400
           endl
401
 
2434 Serge 402
        xor     eax, eax
403
        cmp     [create_cursor], eax
404
        je      .fail2
786 serge 405
 
2434 Serge 406
        mov     [handle], eax
407
        cmp     word [flags], LOAD_FROM_FILE
408
        jne     @F
221 serge 409
 
2434 Serge 410
        stdcall load_file, [src]
411
        test    eax, eax
412
        jz      .fail
413
        mov     [src], eax
414
;--------------------------------------
415
align 4
227 serge 416
@@:
2434 Serge 417
        push    ebx
418
        push    esi
419
        push    edi
662 serge 420
 
2434 Serge 421
        mov     eax, [CURRENT_TASK]
422
        shl     eax, 5
423
        mov     eax, [CURRENT_TASK+eax+4]
424
        mov     ebx, [src]
425
        mov     ecx, [flags]
426
        call    create_cursor    ;eax, ebx, ecx
427
        mov     [handle], eax
662 serge 428
 
2434 Serge 429
        cmp     word [flags], LOAD_FROM_FILE
430
        jne     .exit
431
        stdcall kernel_free, [src]
432
;--------------------------------------
433
align 4
227 serge 434
.exit:
2434 Serge 435
        pop     edi
436
        pop     esi
437
        pop     ebx
438
;--------------------------------------
439
align 4
662 serge 440
.fail:
2434 Serge 441
        mov     eax, [handle]
442
;--------------------------------------
443
align 4
786 serge 444
.fail2:
2434 Serge 445
        ret
221 serge 446
endp
2434 Serge 447
;------------------------------------------------------------------------------
221 serge 448
align 4
233 serge 449
proc delete_cursor stdcall, hcursor:dword
450
           locals
451
             hsrv       dd ?
452
             io_code    dd ?
453
             input      dd ?
454
             inp_size   dd ?
455
             output     dd ?
456
             out_size   dd ?
457
           endl
458
 
2434 Serge 459
        mov     esi, [hcursor]
460
        cmp     [esi+CURSOR.magic], 'CURS'
461
        jne     .fail
233 serge 462
 
2434 Serge 463
        mov     ebx, [CURRENT_TASK]
464
        shl     ebx, 5
465
        mov     ebx, [CURRENT_TASK+ebx+4]
466
        cmp     ebx, [esi+CURSOR.pid]
467
        jne     .fail
233 serge 468
 
2434 Serge 469
        mov     ebx, [current_slot]
470
        cmp     esi, [ebx+APPDATA.cursor]
471
        jne     @F
472
        mov     eax, [def_cursor]
473
        mov     [ebx+APPDATA.cursor], eax
474
;--------------------------------------
475
align 4
233 serge 476
@@:
2434 Serge 477
        mov     eax, [hcursor]
478
        call    [eax+APPOBJ.destroy]
479
;--------------------------------------
480
align 4
233 serge 481
.fail:
2434 Serge 482
        ret
233 serge 483
endp
2434 Serge 484
;------------------------------------------------------------------------------
485
align 4
281 serge 486
; param
487
;  eax= cursor
488
destroy_cursor:
489
 
2434 Serge 490
        push    eax
491
        stdcall kernel_free, [eax+CURSOR.base]
281 serge 492
 
2434 Serge 493
        mov     eax, [esp]
494
        lea     eax, [eax+CURSOR.list_next]
281 serge 495
 
2434 Serge 496
        pushfd
497
        cli
498
        list_del eax
499
        popfd
500
 
501
        pop     eax
502
        call    destroy_kernel_object
503
        ret
504
;------------------------------------------------------------------------------
281 serge 505
align 4
638 serge 506
select_cursor:
2434 Serge 507
        mov     eax, [esp+4]
508
        mov     [_display.cursor], eax
509
        ret     4
510
;------------------------------------------------------------------------------
638 serge 511
align 4
1316 serge 512
proc restore_24 stdcall, x:dword, y:dword
673 serge 513
 
2434 Serge 514
        push    ebx
233 serge 515
 
2434 Serge 516
        mov     ebx, [cur_saved_base]
517
        mov     edx, [cur.h]
518
        test    edx, edx
519
        jz      .ret
221 serge 520
 
2434 Serge 521
        push    esi
522
        push    edi
1316 serge 523
 
2434 Serge 524
        mov     esi, cur_saved_data
525
        mov     ecx, [cur.w]
526
        lea     ecx, [ecx+ecx*2]
527
        push    ecx
528
;--------------------------------------
529
align 4
221 serge 530
@@:
2434 Serge 531
        mov     edi, ebx
532
        add     ebx, [BytesPerScanLine]
1316 serge 533
 
2434 Serge 534
        mov     ecx, [esp]
535
        rep movsb
536
        dec     edx
537
        jnz     @B
1316 serge 538
 
2434 Serge 539
        pop     ecx
540
        pop     edi
541
        pop     esi
542
;--------------------------------------
543
align 4
641 diamond 544
.ret:
2434 Serge 545
        pop     ebx
546
        ret
221 serge 547
endp
2434 Serge 548
;------------------------------------------------------------------------------
221 serge 549
align 4
550
proc restore_32 stdcall, x:dword, y:dword
551
 
2434 Serge 552
        push    ebx
1316 serge 553
 
2434 Serge 554
        mov     ebx, [cur_saved_base]
555
        mov     edx, [cur.h]
556
        test    edx, edx
557
        jz      .ret
221 serge 558
 
2434 Serge 559
        push    esi
560
        push    edi
1316 serge 561
 
2434 Serge 562
        mov     esi, cur_saved_data
563
;--------------------------------------
564
align 4
221 serge 565
@@:
2434 Serge 566
        mov     edi, ebx
567
        add     ebx, [BytesPerScanLine]
1316 serge 568
 
2434 Serge 569
        mov     ecx, [cur.w]
570
        rep movsd
571
        dec     edx
572
        jnz     @B
1316 serge 573
 
2434 Serge 574
        pop     edi
575
;--------------------------------------
576
align 4
641 diamond 577
.ret:
2434 Serge 578
        pop     esi
579
        pop     ebx
580
        ret
221 serge 581
endp
2434 Serge 582
;------------------------------------------------------------------------------
221 serge 583
align 4
1316 serge 584
proc move_cursor_24 stdcall, hcursor:dword, x:dword, y:dword
221 serge 585
           locals
586
             h      dd ?
587
             _dx     dd ?
588
             _dy     dd ?
589
           endl
590
 
2434 Serge 591
        mov     esi, [hcursor]
592
        mov     ecx, [x]
593
        mov     eax, [y]
2465 Serge 594
;        mov     ebx, [BytesPerScanLine]
221 serge 595
 
2434 Serge 596
        xor     edx, edx
597
        sub     ecx, [esi+CURSOR.hot_x]
598
        lea     ebx, [ecx+32-1]
599
        mov     [x], ecx
600
        sets    dl
601
        dec     edx
602
        and     ecx, edx      ;clip x to 0<=x
603
        mov     [cur.left], ecx
604
        mov     edi, ecx
605
        sub     edi, [x]
606
        mov     [_dx], edi
221 serge 607
 
2434 Serge 608
        xor     edx, edx
609
        sub     eax, [esi+CURSOR.hot_y]
610
        lea     edi, [eax+32-1]
611
        mov     [y], eax
612
        sets    dl
613
        dec     edx
614
        and     eax, edx      ;clip y to 0<=y
615
        mov     [cur.top], eax
616
        mov     edx, eax
617
        sub     edx, [y]
618
        mov     [_dy], edx
221 serge 619
 
2465 Serge 620
;        mul     dword [BytesPerScanLine]
2987 Serge 621
        mov     eax, [BPSLine_calc_area+eax*4]
2434 Serge 622
        lea     edx, [LFB_BASE+ecx*3]
623
        add     edx, eax
624
        mov     [cur_saved_base], edx
221 serge 625
 
2434 Serge 626
        cmp     ebx, [Screen_Max_X]
627
        jbe     @F
628
        mov     ebx, [Screen_Max_X]
629
;--------------------------------------
630
align 4
224 serge 631
@@:
2434 Serge 632
        cmp     edi, [Screen_Max_Y]
633
        jbe     @F
634
        mov     edi, [Screen_Max_Y]
635
;--------------------------------------
636
align 4
224 serge 637
@@:
2434 Serge 638
        mov     [cur.right], ebx
639
        mov     [cur.bottom], edi
221 serge 640
 
2434 Serge 641
        sub     ebx, [x]
642
        sub     edi, [y]
643
        inc     ebx
644
        inc     edi
2987 Serge 645
        sub     ebx, [_dx]
646
        sub     edi, [_dy]
221 serge 647
 
2434 Serge 648
        mov     [cur.w], ebx
649
        mov     [cur.h], edi
650
        mov     [h], edi
221 serge 651
 
2434 Serge 652
        mov     eax, edi
653
        mov     edi, cur_saved_data
654
;--------------------------------------
655
align 4
221 serge 656
@@:
2434 Serge 657
        mov     esi, edx
658
        add     edx, [BytesPerScanLine]
659
        mov     ecx, [cur.w]
660
        lea     ecx, [ecx+ecx*2]
661
        rep movsb
662
        dec     eax
663
        jnz     @B
221 serge 664
 
665
;draw cursor
2434 Serge 666
        mov     ebx, [cur_saved_base]
667
        mov     eax, [_dy]
668
        shl     eax, 5
669
        add     eax, [_dx]
221 serge 670
 
2434 Serge 671
        mov     esi, [hcursor]
672
        mov     esi, [esi+CURSOR.base]
673
        lea     edx, [esi+eax*4]
674
;--------------------------------------
675
align 4
221 serge 676
.row:
2434 Serge 677
        mov     ecx, [cur.w]
678
        mov     esi, edx
679
        mov     edi, ebx
680
        add     edx, 32*4
681
        add     ebx, [BytesPerScanLine]
682
;--------------------------------------
683
align 4
221 serge 684
.pix:
2434 Serge 685
        lodsd
686
        test    eax, 0xFF000000
687
        jz      @F
688
        mov     [edi], ax
689
        shr     eax, 16
690
        mov     [edi+2], al
691
;--------------------------------------
692
align 4
221 serge 693
@@:
2434 Serge 694
        add     edi, 3
695
        dec     ecx
696
        jnz     .pix
221 serge 697
 
2434 Serge 698
        dec     [h]
699
        jnz     .row
700
        ret
221 serge 701
endp
2434 Serge 702
;------------------------------------------------------------------------------
221 serge 703
align 4
1316 serge 704
proc move_cursor_32 stdcall, hcursor:dword, x:dword, y:dword
221 serge 705
           locals
706
             h      dd ?
707
             _dx     dd ?
708
             _dy     dd ?
709
           endl
710
 
2434 Serge 711
        mov     esi, [hcursor]
712
        mov     ecx, [x]
713
        mov     eax, [y]
221 serge 714
 
2434 Serge 715
        xor     edx, edx
716
        sub     ecx, [esi+CURSOR.hot_x]
717
        lea     ebx, [ecx+32-1]
718
        mov     [x], ecx
719
        sets    dl
720
        dec     edx
721
        and     ecx, edx      ;clip x to 0<=x
722
        mov     [cur.left], ecx
723
        mov     edi, ecx
724
        sub     edi, [x]
725
        mov     [_dx], edi
221 serge 726
 
2434 Serge 727
        xor     edx, edx
728
        sub     eax, [esi+CURSOR.hot_y]
729
        lea     edi, [eax+32-1]
730
        mov     [y], eax
731
        sets    dl
732
        dec     edx
733
        and     eax, edx      ;clip y to 0<=y
734
        mov     [cur.top], eax
735
        mov     edx, eax
736
        sub     edx, [y]
737
        mov     [_dy], edx
221 serge 738
 
2465 Serge 739
;        mul     dword [BytesPerScanLine]
2987 Serge 740
        mov     eax, [BPSLine_calc_area+eax*4]
2434 Serge 741
        lea     edx, [LFB_BASE+eax+ecx*4]
742
        mov     [cur_saved_base], edx
221 serge 743
 
2434 Serge 744
        cmp     ebx, [Screen_Max_X]
745
        jbe     @F
746
        mov     ebx, [Screen_Max_X]
747
;--------------------------------------
748
align 4
224 serge 749
@@:
2434 Serge 750
        cmp     edi, [Screen_Max_Y]
751
        jbe     @F
752
        mov     edi, [Screen_Max_Y]
753
;--------------------------------------
754
align 4
224 serge 755
@@:
2434 Serge 756
        mov     [cur.right], ebx
757
        mov     [cur.bottom], edi
221 serge 758
 
2434 Serge 759
        sub     ebx, [x]
760
        sub     edi, [y]
761
        inc     ebx
762
        inc     edi
2987 Serge 763
        sub     ebx, [_dx]
764
        sub     edi, [_dy]
221 serge 765
 
2434 Serge 766
        mov     [cur.w], ebx
767
        mov     [cur.h], edi
768
        mov     [h], edi
221 serge 769
 
2434 Serge 770
        mov     eax, edi
771
        mov     edi, cur_saved_data
772
;--------------------------------------
773
align 4
221 serge 774
@@:
2434 Serge 775
        mov     esi, edx
776
        add     edx, [BytesPerScanLine]
777
        mov     ecx, [cur.w]
778
        rep movsd
779
        dec     eax
780
        jnz     @B
221 serge 781
 
782
;draw cursor
2434 Serge 783
        mov     ebx, [cur_saved_base]
784
        mov     eax, [_dy]
785
        shl     eax, 5
786
        add     eax, [_dx]
221 serge 787
 
2434 Serge 788
        mov     esi, [hcursor]
789
        mov     esi, [esi+CURSOR.base]
790
        lea     edx, [esi+eax*4]
791
;--------------------------------------
792
align 4
221 serge 793
.row:
2434 Serge 794
        mov     ecx, [cur.w]
795
        mov     esi, edx
796
        mov     edi, ebx
797
        add     edx, 32*4
798
        add     ebx, [BytesPerScanLine]
799
;--------------------------------------
800
align 4
221 serge 801
.pix:
2434 Serge 802
        lodsd
803
        test    eax, 0xFF000000
804
        jz      @F
805
        mov     [edi], eax
806
;--------------------------------------
807
align 4
221 serge 808
@@:
2434 Serge 809
        add     edi, 4
810
        dec     ecx
811
        jnz     .pix
1316 serge 812
 
2434 Serge 813
        dec     [h]
814
        jnz     .row
815
        ret
221 serge 816
endp
2434 Serge 817
;------------------------------------------------------------------------------
818
align 4
819
check_mouse_area_for_getpixel_new:
820
; in:
821
; eax = x
822
; ebx = y
823
; out:
824
; ecx = new color
825
;--------------------------------------
826
; check for Y
827
        cmp     bx, [Y_UNDER_subtraction_CUR_hot_y]
828
        jb      .no_mouse_area
221 serge 829
 
2434 Serge 830
        cmp     bx, [Y_UNDER_sub_CUR_hot_y_add_curh]
831
        jae     .no_mouse_area
832
;--------------------------------------
833
; check for X
834
        cmp     ax, [X_UNDER_subtraction_CUR_hot_x]
835
        jb      .no_mouse_area
1316 serge 836
 
2434 Serge 837
        cmp     ax, [X_UNDER_sub_CUR_hot_x_add_curh]
838
        jae     .no_mouse_area
839
;--------------------------------------
840
        push    eax ebx
841
; offset X
2987 Serge 842
        movzx   ecx, word [X_UNDER_subtraction_CUR_hot_x]
2434 Serge 843
        sub     eax, ecx        ; x1
844
; offset Y
2987 Serge 845
        movzx   ecx, word [Y_UNDER_subtraction_CUR_hot_y]
2434 Serge 846
        sub     ebx, ecx        ; y1
847
;--------------------------------------
848
; ebx = offset y
849
; eax = offset x
850
        imul    ebx, [cur.w]     ;y
851
        add     eax, ebx
852
        mov     ebx, eax
853
        shl     eax, 2
854
        cmp     [ScreenBPP], byte 32
855
        je      @f
856
        sub     eax, ebx
857
;--------------------------------------
221 serge 858
align 4
2434 Serge 859
@@:
860
        add     eax, cur_saved_data
861
        mov     ecx, [eax]
862
        and     ecx, 0xffffff
863
        add     ecx, 0xff000000
864
        pop     ebx eax
865
        ret
866
;--------------------------------------
1316 serge 867
align 4
2434 Serge 868
.no_mouse_area:
869
        xor     ecx, ecx
870
        ret
871
;-----------------------------------------------------------------------------
872
align 4
873
check_mouse_area_for_putpixel_new:
874
; in:
875
; ecx = x shl 16 + y
876
; eax = color
877
; out:
878
; eax = new color
879
;--------------------------------------
880
; check for Y
881
        cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
882
        jae     .no_mouse_area
1316 serge 883
 
2987 Serge 884
        sub     cx, [Y_UNDER_subtraction_CUR_hot_y]
885
        jb      .no_mouse_area
886
 
2434 Serge 887
        rol     ecx, 16
888
;--------------------------------------
889
; check for X
2987 Serge 890
        cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
891
        jae     .no_mouse_area
892
 
893
        sub     cx, [X_UNDER_subtraction_CUR_hot_x]
2434 Serge 894
        jb      .no_mouse_area
1316 serge 895
 
2987 Serge 896
        ror     ecx, 16
2434 Serge 897
;--------------------------------------
898
align 4
899
.1:
900
        push    eax
901
;--------------------------------------
902
; ecx = (offset x) shl 16 + (offset y)
903
        push    ebx
904
        mov     ebx, ecx
905
        shr     ebx, 16        ; x
906
        and     ecx, 0xffff    ; y
2987 Serge 907
 
908
        cmp     ecx, [cur.h]
909
        jae     @f
910
 
911
        cmp     ebx, [cur.w]
912
        jb      .ok
913
;--------------------------------------
914
align 4
915
@@:
916
;        DEBUGF  1, "K : SHIT HAPPENS: %x %x \n", ecx,ebx
917
        pop     ebx
918
        jmp     .sh   ; SORRY! SHIT HAPPENS!
919
;--------------------------------------
920
align 4
921
.ok:
2434 Serge 922
; ecx = offset y
923
; ebx = offset x
924
        push    ebx ecx
925
        imul    ecx, [cur.w]    ;y
926
        add     ecx, ebx
927
        mov     ebx, ecx
928
        shl     ecx, 2
929
        cmp     [ScreenBPP], byte 24
930
        je      .24
931
        and     eax, 0xFFFFFF
932
        mov     [ecx + cur_saved_data], eax   ;store new color  to
933
        jmp     @f
934
;--------------------------------------
935
align 4
936
.24:
937
        sub     ecx, ebx
938
        mov     [ecx + cur_saved_data], ax      ;store new color  to
939
        shr     eax, 16
940
        mov     [ecx + cur_saved_data + 2], al  ;store new color  to
941
;--------------------------------------
942
align 4
1316 serge 943
@@:
2434 Serge 944
        pop     ecx ebx
1316 serge 945
 
2434 Serge 946
        shl     ecx, 5
947
        add     ecx, ebx
1316 serge 948
 
2434 Serge 949
        mov     eax, [current_cursor]
950
        mov     eax, [eax+CURSOR.base]
951
        lea     eax, [eax+ecx*4]
952
        mov     eax, [eax]
1316 serge 953
 
2434 Serge 954
        pop     ebx
1316 serge 955
 
2434 Serge 956
        test    eax, 0xFF000000
957
        jz      @f
1316 serge 958
 
2987 Serge 959
        add     esp, 4
2434 Serge 960
        ret
961
;--------------------------------------
962
align 4
2987 Serge 963
.sh:
964
        mov     ecx, -1
965
;--------------------------------------
966
align 4
2434 Serge 967
@@:
968
        pop     eax
969
;--------------------------------------
970
align 4
971
.no_mouse_area:
972
        ret
973
;------------------------------------------------------------------------------
974
align 4
975
get_display:
976
        mov     eax, _display
977
        ret
978
;------------------------------------------------------------------------------
979
align 4
980
init_display:
981
        xor     eax, eax
982
        mov     edi, _display
1316 serge 983
 
2434 Serge 984
        mov     [edi+display_t.init_cursor], eax
985
        mov     [edi+display_t.select_cursor], eax
986
        mov     [edi+display_t.show_cursor], eax
987
        mov     [edi+display_t.move_cursor], eax
988
        mov     [edi+display_t.restore_cursor], eax
1316 serge 989
 
2434 Serge 990
        lea     ecx, [edi+display_t.cr_list.next]
991
        mov     [edi+display_t.cr_list.next], ecx
992
        mov     [edi+display_t.cr_list.prev], ecx
1316 serge 993
 
2434 Serge 994
        cmp     [SCR_MODE], word 0x13
995
        jbe     .fail
1316 serge 996
 
2434 Serge 997
        test    word [SCR_MODE], 0x4000
998
        jz      .fail
999
;        jmp      .fail
1316 serge 1000
 
2434 Serge 1001
        mov     ebx, restore_32
1002
        mov     ecx, move_cursor_32
1003
        movzx   eax, byte [ScreenBPP]
1004
        cmp     eax, 32
1005
        je      @F
1316 serge 1006
 
2434 Serge 1007
        mov     ebx, restore_24
1008
        mov     ecx, move_cursor_24
1009
        cmp     eax, 24
1010
        jne     .fail
1011
;--------------------------------------
1316 serge 1012
align 4
2434 Serge 1013
@@:
1014
        mov     [_display.select_cursor], select_cursor
1015
        mov     [_display.move_cursor], ecx
1016
        mov     [_display.restore_cursor], ebx
1017
        mov     [_display.check_mouse], check_mouse_area_for_putpixel_new
1018
        mov     [_display.check_m_pixel], check_mouse_area_for_getpixel_new
1019
 
2439 Serge 1020
        cmp     [PUTPIXEL], dword VGA_putpixel
1021
        je      @f
1022
        cmp     [ScreenBPP], byte 32
1023
        je      .32
1024
        mov     [PUTPIXEL], dword Vesa20_putpixel24_new
1025
        jmp     @f
1026
;--------------------------------------
1027
align 4
1028
.32:
1029
        mov     [PUTPIXEL], dword Vesa20_putpixel32_new
1030
;--------------------------------------
1031
align 4
1032
@@:
2987 Serge 1033
        stdcall load_cursor, clock_arrow, dword LOAD_FROM_MEM
1034
        mov     [def_cursor_clock], eax
2434 Serge 1035
        stdcall load_cursor, def_arrow, dword LOAD_FROM_MEM
1036
        mov     [def_cursor], eax
1037
        ret
1038
;--------------------------------------
1039
align 4
1040
.fail:
1041
        xor     eax, eax
1042
        mov     [_display.select_cursor], eax
1043
        mov     [_display.move_cursor], eax
1044
        ret
1045
;------------------------------------------------------------------------------
1046
align 4
221 serge 1047
def_arrow:
1048
  file 'arrow.cur'
2434 Serge 1049
;------------------------------------------------------------------------------
2987 Serge 1050
align 4
1051
clock_arrow:
1052
  file 'arrow_clock.cur'
1053
;------------------------------------------------------------------------------
221 serge 1054