Subversion Repositories Kolibri OS

Rev

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

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