Subversion Repositories Kolibri OS

Rev

Rev 9941 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2455 mario79 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
10051 ace_dent 3
;; Copyright (C) KolibriOS team 2011-2024. All rights reserved. ;;
2455 mario79 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1894 serge 7
 
4850 mario79 8
 
2384 hidnplayr 9
struct  BLITTER_BLOCK
10
        xmin            dd ?
11
        ymin            dd ?
12
        xmax            dd ?
13
        ymax            dd ?
14
ends
1894 serge 15
 
16
 
2384 hidnplayr 17
struct  BLITTER
2988 Serge 18
        dc              RECT
19
        sc              RECT
2384 hidnplayr 20
        dst_x           dd ?            ;  32
21
        dst_y           dd ?            ;  36
22
        src_x           dd ?            ;  40
23
        src_y           dd ?            ;  44
24
        w               dd ?            ;  48
25
        h               dd ?            ;  52
1894 serge 26
 
2384 hidnplayr 27
        bitmap          dd ?            ;  56
28
        stride          dd ?            ;  60
29
ends
1894 serge 30
 
31
 
2988 Serge 32
 
1894 serge 33
align 4
2988 Serge 34
block_clip:
35
;esi= clip RECT ptr
36
;edi= RECT ptr
37
;return code:
5349 serge 38
;CF= 0 - draw, 1 - don't draw
1894 serge 39
 
2288 clevermous 40
        push    ebx
1894 serge 41
 
9715 Doczom 42
        mov     eax, [edi + RECT.left]
43
        mov     ebx, [edi + RECT.right]
44
        mov     ecx, [esi + RECT.left]    ;clip.left
45
        mov     edx, [esi + RECT.right]   ;clip.right
1894 serge 46
 
2988 Serge 47
        cmp     eax, edx                ;left >= clip.right
48
        jge     .fail
1894 serge 49
 
2988 Serge 50
        cmp     ebx, ecx                ;right < clip.left
51
        jl      .fail
1894 serge 52
 
2988 Serge 53
        cmp     eax, ecx                ;left >= clip.left
5349 serge 54
        jge     @F
1894 serge 55
 
9715 Doczom 56
        mov     [edi + RECT.left], ecx
2988 Serge 57
@@:
58
        cmp     ebx, edx                ;right <= clip.right
59
        jle     @f
5349 serge 60
 
9715 Doczom 61
        mov     [edi + RECT.right], edx
2988 Serge 62
@@:
9715 Doczom 63
        mov     eax, [edi + RECT.top]
64
        mov     ebx, [edi + RECT.bottom]
65
        mov     ecx, [esi + RECT.top]     ;clip.top
66
        mov     edx, [esi + RECT.bottom]  ;clip.bottom
2988 Serge 67
 
68
        cmp     eax, edx                ;top >= clip.bottom
69
        jge     .fail
70
 
71
        cmp     ebx, ecx                ;bottom < clip.top
72
        jl      .fail
73
 
74
        cmp     eax, ecx                ;top >= clip.top
5349 serge 75
        jge     @F
2988 Serge 76
 
9715 Doczom 77
        mov     [edi + RECT.top], ecx
2988 Serge 78
@@:
79
        cmp     ebx, edx                ;bottom <= clip.bottom
80
        jle     @f
5349 serge 81
 
9715 Doczom 82
        mov     [edi + RECT.bottom], edx
2988 Serge 83
@@:
2288 clevermous 84
        pop     ebx
5349 serge 85
        clc
1894 serge 86
        ret
2988 Serge 87
.fail:
88
        pop     ebx
5349 serge 89
        stc
2988 Serge 90
        ret
1894 serge 91
 
2988 Serge 92
 
1894 serge 93
align 4
94
blit_clip:
95
 
5349 serge 96
;return code:
97
;CF= 0 - draw, 1 - don't draw
98
 
7136 dunkaist 99
.sx0   = 8
100
.sy0   = 12
101
.sx1   = 16
102
.sy1   = 20
1894 serge 103
 
7136 dunkaist 104
.dx0   = 24
105
.dy0   = 28
106
.dx1   = 32
107
.dy1   = 36
1894 serge 108
 
109
 
2288 clevermous 110
        push    edi
111
        push    esi
112
        push    ebx
113
        sub     esp, 40
1894 serge 114
 
2288 clevermous 115
        mov     ebx, ecx
9715 Doczom 116
        mov     edx, [ecx + BLITTER.src_x]
2288 clevermous 117
        mov     [esp+.sx0], edx
9715 Doczom 118
        mov     eax, [ecx + BLITTER.src_y]
2288 clevermous 119
        mov     [esp+.sy0], eax
9715 Doczom 120
        add     edx, [ecx + BLITTER.w]
121
        add     eax, [ecx + BLITTER.h]
122
        mov     [esp + .sx1], edx
123
        mov     [esp + .sy1], eax
1894 serge 124
 
9715 Doczom 125
        lea     edi, [esp + .sx0]
126
        lea     esi, [ebx + BLITTER.sc]
1894 serge 127
 
2288 clevermous 128
        call    block_clip
5349 serge 129
        jc      .done
1894 serge 130
 
9715 Doczom 131
        mov     edi, [esp + .sx0]
132
        mov     edx, [ebx + BLITTER.dst_x]
2288 clevermous 133
        add     edx, edi
9715 Doczom 134
        sub     edx, [ebx + BLITTER.src_x]
135
        mov     [esp + .dx0], edx
1894 serge 136
 
2288 clevermous 137
        mov     ecx, [esp+.sy0]
9715 Doczom 138
        mov     eax, [ebx + BLITTER.dst_y]
2288 clevermous 139
        add     eax, ecx
9715 Doczom 140
        sub     eax, [ebx + BLITTER.src_y]
141
        mov     [esp + .dy0], eax
2988 Serge 142
 
2288 clevermous 143
        sub     edx, edi
9715 Doczom 144
        add     edx, [esp + .sx1]
145
        mov     [esp + .dx1], edx
1894 serge 146
 
2288 clevermous 147
        sub     eax, ecx
9715 Doczom 148
        add     eax, [esp + .sy1]
149
        mov     [esp + .dy1], eax
1894 serge 150
 
9715 Doczom 151
        lea     edi, [esp + .dx0]
152
        lea     esi, [ebx + BLITTER.dc]
2288 clevermous 153
        call    block_clip
5349 serge 154
        jc      .done
1894 serge 155
 
9715 Doczom 156
        mov     edx, [esp + .dx0]
157
        mov     eax, [esp + .dx1]
2288 clevermous 158
        sub     eax, edx
9715 Doczom 159
        mov     [ebx + BLITTER.w], eax
1894 serge 160
 
9715 Doczom 161
        mov     eax, [esp + .dy0]
162
        mov     ecx, [esp + .dy1]
2288 clevermous 163
        sub     ecx, eax
9715 Doczom 164
        mov     [ebx + BLITTER.h], ecx
1894 serge 165
 
9715 Doczom 166
        mov     ecx, [ebx + BLITTER.src_x]
2288 clevermous 167
        add     ecx, edx
9715 Doczom 168
        sub     ecx, [ebx + BLITTER.dst_x]
169
        mov     [ebx + BLITTER.src_x], ecx
1894 serge 170
 
9715 Doczom 171
        mov     ecx, [ebx + BLITTER.src_y]
2288 clevermous 172
        add     ecx, eax
9715 Doczom 173
        sub     ecx, [ebx + BLITTER.dst_y]
174
        mov     [ebx + BLITTER.src_y], ecx
175
        mov     [ebx + BLITTER.dst_x], edx
176
        mov     [ebx + BLITTER.dst_y], eax
5349 serge 177
        clc
2988 Serge 178
.done:
2288 clevermous 179
        add     esp, 40
180
        pop     ebx
181
        pop     esi
182
        pop     edi
1894 serge 183
 
184
 
185
purge .sx0
186
purge .sy0
187
purge .sx1
188
purge .sy1
189
 
190
purge .dx0
191
purge .dy0
192
purge .dx1
193
purge .dy1
194
 
195
        ret
196
 
197
align 4
198
blit_32:
2288 clevermous 199
        push    ebp
200
        push    edi
201
        push    esi
202
        push    ebx
4444 clevermous 203
virtual at sizeof.BLITTER
204
.position       dd      ? ; (x shl 16) + y
205
; ???
206
.extra_var1     dd      ?
6790 0CodErr 207
.flags          dd      ?
4444 clevermous 208
.local_vars_size = $
209
end virtual
210
        sub     esp, .local_vars_size
10051 ace_dent 211
 
9715 Doczom 212
        mov     [esp + .flags], ebx
9679 Doczom 213
 
9941 Doczom 214
        mov     eax, [current_slot]
215
        mov     eax, [eax + APPDATA.window]
216
        mov     ebx, [eax + WDATA.box.width]
217
        mov     edx, [eax + WDATA.box.height]
2988 Serge 218
        inc     ebx
219
        inc     edx
1894 serge 220
 
2288 clevermous 221
        xor     eax, eax
1894 serge 222
 
9715 Doczom 223
        mov     [esp + BLITTER.dc.left], eax
224
        mov     [esp + BLITTER.dc.top], eax
225
        mov     [esp + BLITTER.dc.right], ebx
226
        mov     [esp + BLITTER.dc.bottom], edx
1894 serge 227
 
9715 Doczom 228
        mov     [esp + BLITTER.sc.left], eax
229
        mov     [esp + BLITTER.sc.top], eax
2288 clevermous 230
        mov     eax, [ecx+24]
2988 Serge 231
 
9715 Doczom 232
        mov     [esp + BLITTER.sc.right], eax
2288 clevermous 233
        mov     eax, [ecx+28]
1894 serge 234
 
9715 Doczom 235
        mov     [esp + BLITTER.sc.bottom], eax
2988 Serge 236
 
2288 clevermous 237
        mov     eax, [ecx]
9715 Doczom 238
        mov     [esp + BLITTER.dst_x], eax
2288 clevermous 239
        mov     eax, [ecx+4]
9715 Doczom 240
        mov     [esp + BLITTER.dst_y], eax
1894 serge 241
 
2288 clevermous 242
        mov     eax, [ecx+16]
9715 Doczom 243
        mov     [esp + BLITTER.src_x], eax
2288 clevermous 244
        mov     eax, [ecx+20]
9715 Doczom 245
        mov     [esp + BLITTER.src_y], eax
2288 clevermous 246
        mov     eax, [ecx+8]
9715 Doczom 247
        mov     [esp + BLITTER.w], eax
2288 clevermous 248
        mov     eax, [ecx+12]
9715 Doczom 249
        mov     [esp + BLITTER.h], eax
1894 serge 250
 
251
 
2288 clevermous 252
        mov     eax, [ecx+32]
9715 Doczom 253
        mov     [esp + BLITTER.bitmap], eax
2288 clevermous 254
        mov     eax, [ecx+36]
9715 Doczom 255
        mov     [esp + BLITTER.stride], eax
1894 serge 256
 
2288 clevermous 257
        mov     ecx, esp
258
        call    blit_clip
5349 serge 259
        jc      .L57
1894 serge 260
 
9941 Doczom 261
        mov     eax, [current_slot]
262
        mov     eax, [eax + APPDATA.window]
1894 serge 263
 
9715 Doczom 264
        mov     ebx, [esp + BLITTER.dst_x]
265
        mov     ebp, [esp + BLITTER.dst_y]
9941 Doczom 266
        add     ebx, [eax + WDATA.box.left]
267
        add     ebp, [eax + WDATA.box.top]
10051 ace_dent 268
 
9715 Doczom 269
        test    [esp + .flags], BLIT_CLIENT_RELATIVE
10051 ace_dent 270
        jz      .no_client_relative
2430 mario79 271
 
9941 Doczom 272
        add     ebx, [eax + WDATA.clientbox.left]
273
        add     ebp, [eax + WDATA.clientbox.top]
6790 0CodErr 274
.no_client_relative:
275
 
2430 mario79 276
        mov     ecx, ebx
9715 Doczom 277
        add     ecx, [esp + BLITTER.w]
2430 mario79 278
        shl     ecx, 16
279
        mov     cx, bp
9715 Doczom 280
        add     ecx, [esp + BLITTER.h]
2430 mario79 281
 
4444 clevermous 282
        mov     eax, ebx
283
        shl     eax, 16
284
        mov     ax, bp
9715 Doczom 285
        mov     [esp + .position], eax
4444 clevermous 286
 
2288 clevermous 287
        mov     edi, ebp
1894 serge 288
 
2480 mario79 289
;        imul    edi, [_display.pitch]
290
        mov     edi, [BPSLine_calc_area+edi*4]
2446 mario79 291
;        imul    ebp, [_display.width]
2480 mario79 292
        mov     ebp, [d_width_calc_area+ebp*4]
2446 mario79 293
 
2288 clevermous 294
        add     ebp, ebx
5351 serge 295
        add     ebp, [_display.win_map]
1894 serge 296
 
9715 Doczom 297
        mov     eax, [esp + BLITTER.src_y]
298
        imul    eax, [esp + BLITTER.stride]
299
        mov     esi, [esp + BLITTER.src_x]
300
        lea     esi, [eax + esi*4]
301
        add     esi, [esp + BLITTER.bitmap]
1894 serge 302
 
2430 mario79 303
        mov     eax, ecx
9715 Doczom 304
        mov     ecx, [esp + BLITTER.h]
305
        mov     edx, [esp + BLITTER.w]
1894 serge 306
 
2288 clevermous 307
        test    ecx, ecx    ;FIXME check clipping
308
        jz      .L57
1894 serge 309
 
2288 clevermous 310
        test    edx, edx
311
        jz      .L57
1894 serge 312
 
5154 hidnplayr 313
        cmp     [_display.bits_per_pixel], 32
2288 clevermous 314
        jne     .core_24
1894 serge 315
 
9715 Doczom 316
        lea     edi, [edi + ebx*4]
1894 serge 317
 
8869 rgimad 318
        mov     ebx, [current_slot_idx]
4444 clevermous 319
; check for hardware cursor
320
        cmp     [_display.select_cursor], select_cursor
321
        jne     .core_32.hardware_cursor
322
;--------------------------------------
323
.core_32.software_cursor:
1894 serge 324
align 4
325
.outer32:
326
 
327
align 4
328
.inner32:
4444 clevermous 329
        cmp     [ebp], bl
2449 mario79 330
        jne     .skip
2430 mario79 331
;--------------------------------------
4444 clevermous 332
        mov     eax, [esi]
1894 serge 333
 
9715 Doczom 334
        mov     ecx, [esp + .position]
2430 mario79 335
 
336
; check mouse area for putpixel
337
        call    [_display.check_mouse]
2448 mario79 338
;--------------------------------------
2430 mario79 339
; store to real LFB
9715 Doczom 340
        mov     [LFB_BASE + edi], eax
2430 mario79 341
;--------------------------------------
342
align 4
2449 mario79 343
.skip:
4444 clevermous 344
        add     esi, 4
345
        add     edi, 4
346
        inc     ebp
9715 Doczom 347
        add     [esp + .position], 1 shl 16
2288 clevermous 348
        dec     edx
349
        jnz     .inner32
1894 serge 350
 
9715 Doczom 351
        add     esi, [esp + BLITTER.stride]
5351 serge 352
        add     edi, [_display.lfb_pitch]
2288 clevermous 353
        add     ebp, [_display.width]
1894 serge 354
 
9715 Doczom 355
        mov     edx, [esp + BLITTER.w]
4444 clevermous 356
        mov     eax, edx
357
        inc     [esp+.position]
358
        sub     ebp, edx
359
        shl     eax, 2
360
        sub     esi, eax
361
        sub     edi, eax
362
        shl     eax, 16-2
9715 Doczom 363
        sub     [esp + .position], eax
364
        dec     [esp + BLITTER.h]
2288 clevermous 365
        jnz     .outer32
4444 clevermous 366
        jmp     .done
367
.core_32.hardware_cursor:
368
align 4
369
.hw.outer32:
370
        xor     ecx, ecx
1894 serge 371
 
4444 clevermous 372
align 4
373
.hw.inner32:
9715 Doczom 374
        cmp     [ebp + ecx], bl
4444 clevermous 375
        jne     .hw.skip
9715 Doczom 376
        mov     eax, [esi + ecx*4]
377
        mov     [LFB_BASE + edi + ecx*4], eax
4444 clevermous 378
 
379
align 4
380
.hw.skip:
381
        inc     ecx
382
        dec     edx
383
        jnz     .hw.inner32
384
 
9715 Doczom 385
        add     esi, [esp + BLITTER.stride]
5351 serge 386
        add     edi, [_display.lfb_pitch]
4444 clevermous 387
        add     ebp, [_display.width]
388
 
9715 Doczom 389
        mov     edx, [esp + BLITTER.w]
390
        dec     [esp + BLITTER.h]
4444 clevermous 391
        jnz     .hw.outer32
392
 
1894 serge 393
.done:
2453 mario79 394
;        call    [draw_pointer]
2988 Serge 395
;        call    __sys_draw_pointer
1894 serge 396
.L57:
4444 clevermous 397
        add     esp, .local_vars_size
2288 clevermous 398
        pop     ebx
399
        pop     esi
400
        pop     edi
401
        pop     ebp
1894 serge 402
        ret
403
 
404
.core_24:
5161 hidnplayr 405
        cmp     [_display.bits_per_pixel], 24
406
        jne     .core_16
407
 
9715 Doczom 408
        lea     ebx, [ebx + ebx*2]
409
        lea     edi, [LFB_BASE + edi + ebx]
8869 rgimad 410
        mov     ebx, [current_slot_idx]
1894 serge 411
 
412
align 4
413
.outer24:
9715 Doczom 414
        mov     [esp + .extra_var1], edi
2288 clevermous 415
        xor     ecx, ecx
1894 serge 416
 
417
align 4
418
.inner24:
9715 Doczom 419
        cmp     [ebp + ecx], bl           ; Does the process own this pixel?
2449 mario79 420
        jne     .skip_1
2430 mario79 421
;--------------------------------------
422
        push    eax
9715 Doczom 423
        mov     eax, [esi + ecx*4]
1894 serge 424
 
9715 Doczom 425
        lea     edi, [edi + ecx*2]
2430 mario79 426
 
2448 mario79 427
; check for hardware cursor
2451 mario79 428
        cmp     [_display.select_cursor], select_cursor
2448 mario79 429
        jne     .no_mouseunder_1
430
;--------------------------------------
431
align 4
2430 mario79 432
        push    ecx
433
 
434
        mov     ecx, [esp+4]
435
        ror     ecx, 16
436
        sub     ecx, edx
437
        rol     ecx, 16
9715 Doczom 438
        sub     ecx, [esp + BLITTER.h + 8]
2430 mario79 439
 
440
; check mouse area for putpixel
441
        call    [_display.check_mouse]
442
        pop     ecx
2448 mario79 443
;--------------------------------------
444
align 4
445
.no_mouseunder_1:
9715 Doczom 446
        mov     [edi + ecx], ax
2288 clevermous 447
        shr     eax, 16
9715 Doczom 448
        mov     [edi + ecx+2], al
2430 mario79 449
 
450
        pop     eax
451
;--------------------------------------
452
align 4
2449 mario79 453
.skip_1:
9715 Doczom 454
        mov     edi, [esp + .extra_var1]
2288 clevermous 455
        inc     ecx
456
        dec     edx
457
        jnz     .inner24
1894 serge 458
 
9715 Doczom 459
        add     esi, [esp + BLITTER.stride]
5351 serge 460
        add     edi, [_display.lfb_pitch]
2288 clevermous 461
        add     ebp, [_display.width]
1894 serge 462
 
9715 Doczom 463
        mov     edx, [esp + BLITTER.w]
464
        dec     [esp + BLITTER.h]
2288 clevermous 465
        jnz     .outer24
1894 serge 466
 
2288 clevermous 467
        jmp     .done
5161 hidnplayr 468
 
469
 
470
.core_16:
9715 Doczom 471
        lea     edi, [LFB_BASE + edi + ebx*2]
8869 rgimad 472
        mov     ebx, [current_slot_idx]
5161 hidnplayr 473
 
5164 hidnplayr 474
  .outer16:
9715 Doczom 475
        mov     [esp + .extra_var1], edi
5161 hidnplayr 476
        xor     ecx, ecx
477
 
5164 hidnplayr 478
  .inner16:
9715 Doczom 479
        cmp     [ebp + ecx], bl                   ; Does the process own this pixel?
5161 hidnplayr 480
        jne     .skip_2
481
;--------------------------------------
482
        push    eax
9715 Doczom 483
        mov     eax, [esi + ecx*4]
5161 hidnplayr 484
 
485
; check for hardware cursor
486
        cmp     [_display.select_cursor], select_cursor
487
        jne     .no_mouseunder_2
488
;--------------------------------------
489
        push    ecx
490
 
491
        mov     ecx, [esp+4]
492
        ror     ecx, 16
493
        sub     ecx, edx
494
        rol     ecx, 16
9715 Doczom 495
        sub     ecx, [esp + BLITTER.h + 8]
5161 hidnplayr 496
 
497
; check mouse area for putpixel
498
        call    [_display.check_mouse]
499
        pop     ecx
500
;--------------------------------------
5164 hidnplayr 501
  .no_mouseunder_2:
5161 hidnplayr 502
; convert to 16 bpp and store to LFB
503
        and     eax, 00000000111110001111110011111000b
504
        shr     ah, 2
505
        shr     ax, 3
506
        ror     eax, 8
507
        add     al, ah
508
        rol     eax, 8
9715 Doczom 509
        mov     [edi + ecx*2], ax
5161 hidnplayr 510
        pop     eax
511
;--------------------------------------
5164 hidnplayr 512
  .skip_2:
9715 Doczom 513
        mov     edi, [esp + .extra_var1]
5161 hidnplayr 514
        inc     ecx
515
        dec     edx
516
        jnz     .inner16
517
 
9715 Doczom 518
        add     esi, [esp + BLITTER.stride]
5351 serge 519
        add     edi, [_display.lfb_pitch]
5161 hidnplayr 520
        add     ebp, [_display.width]
521
 
9715 Doczom 522
        mov     edx, [esp + BLITTER.w]
523
        dec     [esp + BLITTER.h]
5161 hidnplayr 524
        jnz     .outer16
525
 
526
        jmp     .done
527