Subversion Repositories Kolibri OS

Rev

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