Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
465 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
983 diamond 3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
465 serge 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
221 serge 7
 
593 mikedld 8
$Revision: 2434 $
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
 
2434 Serge 356
        mov     ecx, [.hcursor]
357
        lea     ecx, [ecx+CURSOR.list_next]
358
        lea     edx, [_display.cr_list.next]
1316 serge 359
 
2434 Serge 360
        pushfd
361
        cli
362
        list_add ecx, edx   ;list_add_tail(new, head)
363
        popfd
1316 serge 364
 
2434 Serge 365
        mov     eax, [.hcursor]
366
;--------------------------------------
367
align 4
1316 serge 368
.check_hw:
2434 Serge 369
        cmp     [_display.init_cursor], 0
370
        je      .fail
1316 serge 371
 
2434 Serge 372
        push    eax
373
        call    [_display.init_cursor]
374
        add     esp, 4
1316 serge 375
 
2434 Serge 376
        mov     eax, [.hcursor]
377
;--------------------------------------
378
align 4
221 serge 379
.fail:
2434 Serge 380
        add     esp, 12
381
        ret
382
;--------------------------------------
383
align 4
227 serge 384
.indirect:
2434 Serge 385
        shr     ebx, 16
386
        movzx   ecx, bh
387
        movzx   edx, bl
388
        mov     [eax+CURSOR.hot_x], ecx
389
        mov     [eax+CURSOR.hot_y], edx
221 serge 390
 
2434 Serge 391
        xchg    edi, eax
392
        mov     ecx, 1024
393
        cld
394
        rep movsd
395
        jmp     .check_hw
396
;------------------------------------------------------------------------------
221 serge 397
align 4
398
proc load_cursor stdcall, src:dword, flags:dword
399
           locals
400
             handle  dd ?
401
           endl
402
 
2434 Serge 403
        xor     eax, eax
404
        cmp     [create_cursor], eax
405
        je      .fail2
786 serge 406
 
2434 Serge 407
        mov     [handle], eax
408
        cmp     word [flags], LOAD_FROM_FILE
409
        jne     @F
221 serge 410
 
2434 Serge 411
        stdcall load_file, [src]
412
        test    eax, eax
413
        jz      .fail
414
        mov     [src], eax
415
;--------------------------------------
416
align 4
227 serge 417
@@:
2434 Serge 418
        push    ebx
419
        push    esi
420
        push    edi
662 serge 421
 
2434 Serge 422
        mov     eax, [CURRENT_TASK]
423
        shl     eax, 5
424
        mov     eax, [CURRENT_TASK+eax+4]
425
        mov     ebx, [src]
426
        mov     ecx, [flags]
427
        call    create_cursor    ;eax, ebx, ecx
428
        mov     [handle], eax
662 serge 429
 
2434 Serge 430
        cmp     word [flags], LOAD_FROM_FILE
431
        jne     .exit
432
        stdcall kernel_free, [src]
433
;--------------------------------------
434
align 4
227 serge 435
.exit:
2434 Serge 436
        pop     edi
437
        pop     esi
438
        pop     ebx
439
;--------------------------------------
440
align 4
662 serge 441
.fail:
2434 Serge 442
        mov     eax, [handle]
443
;--------------------------------------
444
align 4
786 serge 445
.fail2:
2434 Serge 446
        ret
221 serge 447
endp
2434 Serge 448
;------------------------------------------------------------------------------
221 serge 449
align 4
233 serge 450
proc delete_cursor stdcall, hcursor:dword
451
           locals
452
             hsrv       dd ?
453
             io_code    dd ?
454
             input      dd ?
455
             inp_size   dd ?
456
             output     dd ?
457
             out_size   dd ?
458
           endl
459
 
2434 Serge 460
        mov     esi, [hcursor]
461
        cmp     [esi+CURSOR.magic], 'CURS'
462
        jne     .fail
233 serge 463
 
2434 Serge 464
        mov     ebx, [CURRENT_TASK]
465
        shl     ebx, 5
466
        mov     ebx, [CURRENT_TASK+ebx+4]
467
        cmp     ebx, [esi+CURSOR.pid]
468
        jne     .fail
233 serge 469
 
2434 Serge 470
        mov     ebx, [current_slot]
471
        cmp     esi, [ebx+APPDATA.cursor]
472
        jne     @F
473
        mov     eax, [def_cursor]
474
        mov     [ebx+APPDATA.cursor], eax
475
;--------------------------------------
476
align 4
233 serge 477
@@:
2434 Serge 478
        mov     eax, [hcursor]
479
        call    [eax+APPOBJ.destroy]
480
;--------------------------------------
481
align 4
233 serge 482
.fail:
2434 Serge 483
        ret
233 serge 484
endp
2434 Serge 485
;------------------------------------------------------------------------------
486
align 4
281 serge 487
; param
488
;  eax= cursor
489
destroy_cursor:
490
 
2434 Serge 491
        push    eax
492
        stdcall kernel_free, [eax+CURSOR.base]
281 serge 493
 
2434 Serge 494
        mov     eax, [esp]
495
        lea     eax, [eax+CURSOR.list_next]
281 serge 496
 
2434 Serge 497
        pushfd
498
        cli
499
        list_del eax
500
        popfd
501
 
502
        pop     eax
503
        call    destroy_kernel_object
504
        ret
505
;------------------------------------------------------------------------------
281 serge 506
align 4
638 serge 507
select_cursor:
2434 Serge 508
        mov     eax, [esp+4]
509
        mov     [_display.cursor], eax
510
        ret     4
511
;------------------------------------------------------------------------------
638 serge 512
align 4
1316 serge 513
proc restore_24 stdcall, x:dword, y:dword
673 serge 514
 
2434 Serge 515
        push    ebx
233 serge 516
 
2434 Serge 517
        mov     ebx, [cur_saved_base]
518
        mov     edx, [cur.h]
519
        test    edx, edx
520
        jz      .ret
221 serge 521
 
2434 Serge 522
        push    esi
523
        push    edi
1316 serge 524
 
2434 Serge 525
        mov     esi, cur_saved_data
526
        mov     ecx, [cur.w]
527
        lea     ecx, [ecx+ecx*2]
528
        push    ecx
529
;--------------------------------------
530
align 4
221 serge 531
@@:
2434 Serge 532
        mov     edi, ebx
533
        add     ebx, [BytesPerScanLine]
1316 serge 534
 
2434 Serge 535
        mov     ecx, [esp]
536
        rep movsb
537
        dec     edx
538
        jnz     @B
1316 serge 539
 
2434 Serge 540
        pop     ecx
541
        pop     edi
542
        pop     esi
543
;--------------------------------------
544
align 4
641 diamond 545
.ret:
2434 Serge 546
        pop     ebx
547
        ret
221 serge 548
endp
2434 Serge 549
;------------------------------------------------------------------------------
221 serge 550
align 4
551
proc restore_32 stdcall, x:dword, y:dword
552
 
2434 Serge 553
        push    ebx
1316 serge 554
 
2434 Serge 555
        mov     ebx, [cur_saved_base]
556
        mov     edx, [cur.h]
557
        test    edx, edx
558
        jz      .ret
221 serge 559
 
2434 Serge 560
        push    esi
561
        push    edi
1316 serge 562
 
2434 Serge 563
        mov     esi, cur_saved_data
564
;--------------------------------------
565
align 4
221 serge 566
@@:
2434 Serge 567
        mov     edi, ebx
568
        add     ebx, [BytesPerScanLine]
1316 serge 569
 
2434 Serge 570
        mov     ecx, [cur.w]
571
        rep movsd
572
        dec     edx
573
        jnz     @B
1316 serge 574
 
2434 Serge 575
        pop     edi
576
;--------------------------------------
577
align 4
641 diamond 578
.ret:
2434 Serge 579
        pop     esi
580
        pop     ebx
581
        ret
221 serge 582
endp
2434 Serge 583
;------------------------------------------------------------------------------
221 serge 584
align 4
1316 serge 585
proc move_cursor_24 stdcall, hcursor:dword, x:dword, y:dword
221 serge 586
           locals
587
             h      dd ?
588
             _dx     dd ?
589
             _dy     dd ?
590
           endl
591
 
2434 Serge 592
        mov     esi, [hcursor]
593
        mov     ecx, [x]
594
        mov     eax, [y]
595
        mov     ebx, [BytesPerScanLine]
221 serge 596
 
2434 Serge 597
        xor     edx, edx
598
        sub     ecx, [esi+CURSOR.hot_x]
599
        lea     ebx, [ecx+32-1]
600
        mov     [x], ecx
601
        sets    dl
602
        dec     edx
603
        and     ecx, edx      ;clip x to 0<=x
604
        mov     [cur.left], ecx
605
        mov     edi, ecx
606
        sub     edi, [x]
607
        mov     [_dx], edi
221 serge 608
 
2434 Serge 609
        xor     edx, edx
610
        sub     eax, [esi+CURSOR.hot_y]
611
        lea     edi, [eax+32-1]
612
        mov     [y], eax
613
        sets    dl
614
        dec     edx
615
        and     eax, edx      ;clip y to 0<=y
616
        mov     [cur.top], eax
617
        mov     edx, eax
618
        sub     edx, [y]
619
        mov     [_dy], edx
221 serge 620
 
2434 Serge 621
        mul     dword [BytesPerScanLine]
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
221 serge 645
 
2434 Serge 646
        mov     [cur.w], ebx
647
        mov     [cur.h], edi
648
        mov     [h], edi
221 serge 649
 
2434 Serge 650
        mov     eax, edi
651
        mov     edi, cur_saved_data
652
;--------------------------------------
653
align 4
221 serge 654
@@:
2434 Serge 655
        mov     esi, edx
656
        add     edx, [BytesPerScanLine]
657
        mov     ecx, [cur.w]
658
        lea     ecx, [ecx+ecx*2]
659
        rep movsb
660
        dec     eax
661
        jnz     @B
221 serge 662
 
663
;draw cursor
2434 Serge 664
        mov     ebx, [cur_saved_base]
665
        mov     eax, [_dy]
666
        shl     eax, 5
667
        add     eax, [_dx]
221 serge 668
 
2434 Serge 669
        mov     esi, [hcursor]
670
        mov     esi, [esi+CURSOR.base]
671
        lea     edx, [esi+eax*4]
672
;--------------------------------------
673
align 4
221 serge 674
.row:
2434 Serge 675
        mov     ecx, [cur.w]
676
        mov     esi, edx
677
        mov     edi, ebx
678
        add     edx, 32*4
679
        add     ebx, [BytesPerScanLine]
680
;--------------------------------------
681
align 4
221 serge 682
.pix:
2434 Serge 683
        lodsd
684
        test    eax, 0xFF000000
685
        jz      @F
686
        mov     [edi], ax
687
        shr     eax, 16
688
        mov     [edi+2], al
689
;--------------------------------------
690
align 4
221 serge 691
@@:
2434 Serge 692
        add     edi, 3
693
        dec     ecx
694
        jnz     .pix
221 serge 695
 
2434 Serge 696
        dec     [h]
697
        jnz     .row
698
        ret
221 serge 699
endp
2434 Serge 700
;------------------------------------------------------------------------------
221 serge 701
align 4
1316 serge 702
proc move_cursor_32 stdcall, hcursor:dword, x:dword, y:dword
221 serge 703
           locals
704
             h      dd ?
705
             _dx     dd ?
706
             _dy     dd ?
707
           endl
708
 
2434 Serge 709
        mov     esi, [hcursor]
710
        mov     ecx, [x]
711
        mov     eax, [y]
221 serge 712
 
2434 Serge 713
        xor     edx, edx
714
        sub     ecx, [esi+CURSOR.hot_x]
715
        lea     ebx, [ecx+32-1]
716
        mov     [x], ecx
717
        sets    dl
718
        dec     edx
719
        and     ecx, edx      ;clip x to 0<=x
720
        mov     [cur.left], ecx
721
        mov     edi, ecx
722
        sub     edi, [x]
723
        mov     [_dx], edi
221 serge 724
 
2434 Serge 725
        xor     edx, edx
726
        sub     eax, [esi+CURSOR.hot_y]
727
        lea     edi, [eax+32-1]
728
        mov     [y], eax
729
        sets    dl
730
        dec     edx
731
        and     eax, edx      ;clip y to 0<=y
732
        mov     [cur.top], eax
733
        mov     edx, eax
734
        sub     edx, [y]
735
        mov     [_dy], edx
221 serge 736
 
2434 Serge 737
        mul     dword [BytesPerScanLine]
738
        lea     edx, [LFB_BASE+eax+ecx*4]
739
        mov     [cur_saved_base], edx
221 serge 740
 
2434 Serge 741
        cmp     ebx, [Screen_Max_X]
742
        jbe     @F
743
        mov     ebx, [Screen_Max_X]
744
;--------------------------------------
745
align 4
224 serge 746
@@:
2434 Serge 747
        cmp     edi, [Screen_Max_Y]
748
        jbe     @F
749
        mov     edi, [Screen_Max_Y]
750
;--------------------------------------
751
align 4
224 serge 752
@@:
2434 Serge 753
        mov     [cur.right], ebx
754
        mov     [cur.bottom], edi
221 serge 755
 
2434 Serge 756
        sub     ebx, [x]
757
        sub     edi, [y]
758
        inc     ebx
759
        inc     edi
221 serge 760
 
2434 Serge 761
        mov     [cur.w], ebx
762
        mov     [cur.h], edi
763
        mov     [h], edi
221 serge 764
 
2434 Serge 765
        mov     eax, edi
766
        mov     edi, cur_saved_data
767
;--------------------------------------
768
align 4
221 serge 769
@@:
2434 Serge 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
2434 Serge 778
        mov     ebx, [cur_saved_base]
779
        mov     eax, [_dy]
780
        shl     eax, 5
781
        add     eax, [_dx]
221 serge 782
 
2434 Serge 783
        mov     esi, [hcursor]
784
        mov     esi, [esi+CURSOR.base]
785
        lea     edx, [esi+eax*4]
786
;--------------------------------------
787
align 4
221 serge 788
.row:
2434 Serge 789
        mov     ecx, [cur.w]
790
        mov     esi, edx
791
        mov     edi, ebx
792
        add     edx, 32*4
793
        add     ebx, [BytesPerScanLine]
794
;--------------------------------------
795
align 4
221 serge 796
.pix:
2434 Serge 797
        lodsd
798
        test    eax, 0xFF000000
799
        jz      @F
800
        mov     [edi], eax
801
;--------------------------------------
802
align 4
221 serge 803
@@:
2434 Serge 804
        add     edi, 4
805
        dec     ecx
806
        jnz     .pix
1316 serge 807
 
2434 Serge 808
        dec     [h]
809
        jnz     .row
810
        ret
221 serge 811
endp
2434 Serge 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
 
2434 Serge 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
 
2434 Serge 832
        cmp     ax, [X_UNDER_sub_CUR_hot_x_add_curh]
833
        jae     .no_mouse_area
834
;--------------------------------------
835
        push    eax ebx
836
; offset X
837
        mov     ecx, [X_UNDER_subtraction_CUR_hot_x]
838
        sub     eax, ecx        ; x1
839
; offset Y
840
        mov     ecx, [Y_UNDER_subtraction_CUR_hot_y]
841
        sub     ebx, ecx        ; y1
842
;--------------------------------------
843
; ebx = offset y
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
2434 Serge 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
;--------------------------------------
1316 serge 862
align 4
2434 Serge 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:
873
; eax = new color
874
;--------------------------------------
875
; check for Y
876
        cmp     cx, [Y_UNDER_subtraction_CUR_hot_y]
877
        jb      .no_mouse_area
1316 serge 878
 
2434 Serge 879
        cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
880
        jae     .no_mouse_area
1316 serge 881
 
2434 Serge 882
        rol     ecx, 16
883
;--------------------------------------
884
; check for X
885
        cmp     cx, [X_UNDER_subtraction_CUR_hot_x]
886
        jb      .no_mouse_area
1316 serge 887
 
2434 Serge 888
        cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
889
        jae     .no_mouse_area
890
;--------------------------------------
891
align 4
892
.1:
893
        push    eax
894
; offset X
895
        mov     ax, [X_UNDER_subtraction_CUR_hot_x]
896
        sub     cx, ax        ; x1
897
        ror     ecx, 16
898
; offset Y
899
        mov     ax, [Y_UNDER_subtraction_CUR_hot_y]
900
        sub     cx, ax        ; y1
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
907
; ecx = offset y
908
; ebx = offset x
909
        mov     eax, [esp + 4]
1316 serge 910
 
2434 Serge 911
        push    ebx ecx
912
        imul    ecx, [cur.w]    ;y
913
        add     ecx, ebx
914
        mov     ebx, ecx
915
        shl     ecx, 2
916
        cmp     [ScreenBPP], byte 24
917
        je      .24
918
        and     eax, 0xFFFFFF
919
        mov     [ecx + cur_saved_data], eax   ;store new color  to
920
        jmp     @f
921
;--------------------------------------
922
align 4
923
.24:
924
        sub     ecx, ebx
925
        mov     [ecx + cur_saved_data], ax      ;store new color  to
926
        shr     eax, 16
927
        mov     [ecx + cur_saved_data + 2], al  ;store new color  to
928
;--------------------------------------
929
align 4
1316 serge 930
@@:
2434 Serge 931
        pop     ecx ebx
1316 serge 932
 
2434 Serge 933
        shl     ecx, 5
934
        add     ecx, ebx
1316 serge 935
 
2434 Serge 936
        mov     eax, [current_cursor]
937
        mov     eax, [eax+CURSOR.base]
938
        lea     eax, [eax+ecx*4]
939
        mov     eax, [eax]
1316 serge 940
 
2434 Serge 941
        pop     ebx
1316 serge 942
 
2434 Serge 943
        test    eax, 0xFF000000
944
        jz      @f
1316 serge 945
 
2434 Serge 946
        pop     ecx
947
        ret
948
;--------------------------------------
949
align 4
950
@@:
951
        pop     eax
952
;--------------------------------------
953
align 4
954
.no_mouse_area:
955
        ret
956
;------------------------------------------------------------------------------
957
align 4
958
get_display:
959
        mov     eax, _display
960
        ret
961
;------------------------------------------------------------------------------
962
align 4
963
init_display:
964
        xor     eax, eax
965
        mov     edi, _display
1316 serge 966
 
2434 Serge 967
        mov     [edi+display_t.init_cursor], eax
968
        mov     [edi+display_t.select_cursor], eax
969
        mov     [edi+display_t.show_cursor], eax
970
        mov     [edi+display_t.move_cursor], eax
971
        mov     [edi+display_t.restore_cursor], eax
1316 serge 972
 
2434 Serge 973
        lea     ecx, [edi+display_t.cr_list.next]
974
        mov     [edi+display_t.cr_list.next], ecx
975
        mov     [edi+display_t.cr_list.prev], ecx
1316 serge 976
 
2434 Serge 977
        cmp     [SCR_MODE], word 0x13
978
        jbe     .fail
1316 serge 979
 
2434 Serge 980
        test    word [SCR_MODE], 0x4000
981
        jz      .fail
982
;        jmp      .fail
1316 serge 983
 
2434 Serge 984
        mov     ebx, restore_32
985
        mov     ecx, move_cursor_32
986
        movzx   eax, byte [ScreenBPP]
987
        cmp     eax, 32
988
        je      @F
1316 serge 989
 
2434 Serge 990
        mov     ebx, restore_24
991
        mov     ecx, move_cursor_24
992
        cmp     eax, 24
993
        jne     .fail
994
;--------------------------------------
1316 serge 995
align 4
2434 Serge 996
@@:
997
        mov     [_display.select_cursor], select_cursor
998
        mov     [_display.move_cursor], ecx
999
        mov     [_display.restore_cursor], ebx
1000
        mov     [_display.check_mouse], check_mouse_area_for_putpixel_new
1001
        mov     [_display.check_m_pixel], check_mouse_area_for_getpixel_new
1002
 
1003
        stdcall load_cursor, def_arrow, dword LOAD_FROM_MEM
1004
        mov     [def_cursor], eax
1005
        ret
1006
;--------------------------------------
1007
align 4
1008
.fail:
1009
        xor     eax, eax
1010
        mov     [_display.select_cursor], eax
1011
        mov     [_display.move_cursor], eax
1012
        ret
1013
;------------------------------------------------------------------------------
1014
align 4
221 serge 1015
def_arrow:
1016
  file 'arrow.cur'
2434 Serge 1017
;------------------------------------------------------------------------------
221 serge 1018