Subversion Repositories Kolibri OS

Rev

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

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