Subversion Repositories Kolibri OS

Rev

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

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