Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2465 Serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2011-2012. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2434 Serge 7
 
8
struct  BLITTER_BLOCK
9
        xmin            dd ?
10
        ymin            dd ?
11
        xmax            dd ?
12
        ymax            dd ?
13
ends
14
 
15
 
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
25
 
26
        bitmap          dd ?            ;  56
27
        stride          dd ?            ;  60
28
ends
29
 
30
 
31
align 4
32
 
33
__L1OutCode:
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
42
.L2:
43
        cmp     ecx, [eax+4]
44
        jge     .L3
45
        or      ebx, 1
46
        jmp     .L4
47
 
48
.L3:
49
        cmp     ecx, [eax+12]
50
        jle     .L4
51
        or      ebx, 2
52
.L4:
53
        mov     eax, ebx
54
        pop     ebx
55
        ret
56
 
57
align 4
58
block_clip:
59
        push    ebp
60
        push    edi
61
        push    esi
62
        push    ebx
63
        sub     esp, 4
64
 
65
        mov     ebx, eax
66
        mov     [esp], edx
67
        mov     ebp, ecx
68
        mov     ecx, [ecx]
69
        mov     edx, [edx]
70
        call    __L1OutCode
71
 
72
        mov     esi, eax
73
        mov     edx, [esp+28]
74
        mov     ecx, [edx]
75
.L21:
76
        mov     eax, [esp+24]
77
        mov     edx, [eax]
78
        mov     eax, ebx
79
        call    __L1OutCode
80
 
81
        mov     edi, eax
82
.L20:
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
94
.L11:
95
        test    edi, 2
96
        je      .L13
97
        mov     eax, [ebx+12]
98
.L25:
99
        mov     edx, [esp+28]
100
        jmp     .L22
101
.L13:
102
        test    edi, 4
103
        je      .L14
104
        mov     eax, [ebx+8]
105
        jmp     .L26
106
.L14:
107
        and     edi, 8
108
        je      .L12
109
        mov     eax, [ebx]
110
.L26:
111
        mov     edx, [esp+24]
112
.L22:
113
        mov     [edx], eax
114
.L12:
115
        mov     eax, [esp+28]
116
        mov     ecx, [eax]
117
        jmp     .L21
118
.L10:
119
        test    esi, 1
120
        je      .L16
121
        mov     eax, [ebx+4]
122
        jmp     .L23
123
.L16:
124
        test    esi, 2
125
        je      .L18
126
        mov     eax, [ebx+12]
127
.L23:
128
        mov     [ebp+0], eax
129
        jmp     .L17
130
.L18:
131
        test    esi, 4
132
        je      .L19
133
        mov     eax, [ebx+8]
134
        jmp     .L24
135
.L19:
136
        and     esi, 8
137
        je      .L17
138
        mov     eax, [ebx]
139
.L24:
140
        mov     edx, [esp]
141
        mov     [edx], eax
142
.L17:
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
150
.L9:
151
        add     esp, 4
152
        pop     ebx
153
        pop     esi
154
        pop     edi
155
        pop     ebp
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
 
172
        push    edi
173
        push    esi
174
        push    ebx
175
        sub     esp, 40
176
 
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
188
 
189
        lea     ecx, [esp+.sy0]
190
        lea     edx, [esp+.sx0]
191
        lea     eax, [ebx+BLITTER.sc]
192
        lea     esi, [esp+.sy1]
193
 
194
        mov     [esp+4], esi
195
        lea     esi, [esp+.sx1]
196
        mov     [esp], esi
197
        call    block_clip
198
 
199
        mov     esi, 1
200
        test    eax, eax
201
        jne     .L28
202
 
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
208
 
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
217
 
218
        sub     eax, ecx
219
        add     eax, [esp+.sy1]
220
        mov     [esp+.dy1], eax
221
 
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
232
 
233
        mov     edx, [esp+.dx0]
234
        mov     eax, [esp+.dx1]
235
        inc     eax
236
        sub     eax, edx
237
        mov     [ebx+BLITTER.w], eax
238
 
239
        mov     eax, [esp+.dy0]
240
        mov     ecx, [esp+.dy1]
241
        inc     ecx
242
        sub     ecx, eax
243
        mov     [ebx+BLITTER.h], ecx
244
 
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
249
 
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
257
.L28:
258
        mov     eax, esi
259
        add     esp, 40
260
        pop     ebx
261
        pop     esi
262
        pop     edi
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:
282
        push    ebp
283
        push    edi
284
        push    esi
285
        push    ebx
286
        sub     esp, 72
287
 
288
        mov     eax, [TASK_BASE]
289
        mov     ebx, [eax-twdw + WDATA.box.width]
290
        mov     edx, [eax-twdw + WDATA.box.height]
291
 
292
        xor     eax, eax
293
 
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
298
 
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
307
 
308
        mov     eax, [ecx]
309
        mov     [esp+BLITTER.dst_x], eax
310
        mov     eax, [ecx+4]
311
        mov     [esp+BLITTER.dst_y], eax
312
 
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
321
 
322
 
323
        mov     eax, [ecx+32]
324
        mov     [esp+56], eax
325
        mov     eax, [ecx+36]
326
        mov     [esp+60], eax
327
 
328
        mov     ecx, esp
329
        call    blit_clip
330
        test    eax, eax
331
        jne     .L57
332
 
333
        mov     eax, [TASK_BASE]
334
 
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]
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
 
346
        mov     edi, ebp
347
 
348
        imul    edi, [_display.pitch]
2465 Serge 349
;        imul    ebp, [_display.width]
350
        mov     ebp, [d_width_calc_area + ebp*4]
351
 
2434 Serge 352
        add     ebp, ebx
353
        add     ebp, [_WinMapAddress]
354
 
355
        mov     eax, [esp+BLITTER.src_y]
356
        imul    eax, [esp+BLITTER.stride]
357
        mov     esi, [esp+BLITTER.src_x]
358
        lea     esi, [eax+esi*4]
359
        add     esi, [esp+BLITTER.bitmap]
360
 
361
        mov     eax, ecx
362
        mov     ecx, [esp+BLITTER.h]
363
        mov     edx, [esp+BLITTER.w]
364
 
365
        test    ecx, ecx    ;FIXME check clipping
366
        jz      .L57
367
 
368
        test    edx, edx
369
        jz      .L57
370
 
371
        cmp     [_display.bpp], 32
372
        jne     .core_24
373
 
374
        lea     edi, [edi+ebx*4]
375
 
376
        mov     ebx, [CURRENT_TASK]
377
align 4
378
.outer32:
379
        xor     ecx, ecx
380
 
381
align 4
382
.inner32:
383
        cmp     [ebp+ecx], bl
2465 Serge 384
        jne     .skip
2434 Serge 385
;--------------------------------------
386
        push    eax
387
        mov     eax, [esi+ecx*4]
388
 
2465 Serge 389
; check for hardware cursor
390
        cmp     [_display.select_cursor], select_cursor
391
        je      @f
392
        cmp     [_display.select_cursor], 0
393
        jne     .no_mouseunder
394
;--------------------------------------
395
align 4
396
@@:
2434 Serge 397
        push    ecx
398
 
399
        mov     ecx, [esp+4]
400
        ror     ecx, 16
401
        sub     ecx, edx
402
        rol     ecx, 16
403
        sub     ecx, [esp+BLITTER.h + 8]
404
 
405
; check mouse area for putpixel
406
        call    [_display.check_mouse]
407
        pop     ecx
2465 Serge 408
;--------------------------------------
409
align 4
410
.no_mouseunder:
2434 Serge 411
; store to real LFB
412
        mov     [LFB_BASE+edi+ecx*4], eax
413
        pop     eax
414
;--------------------------------------
415
align 4
2465 Serge 416
.skip:
2434 Serge 417
        inc     ecx
418
        dec     edx
419
        jnz     .inner32
420
 
421
        add     esi, [esp+BLITTER.stride]
422
        add     edi, [_display.pitch]
423
        add     ebp, [_display.width]
424
 
425
        mov     edx, [esp+BLITTER.w]
426
        dec     [esp+BLITTER.h]
427
        jnz     .outer32
428
 
429
.done:
2465 Serge 430
;        call    [draw_pointer]
431
        call    __sys_draw_pointer
2434 Serge 432
.L57:
433
        add     esp, 72
434
        pop     ebx
435
        pop     esi
436
        pop     edi
437
        pop     ebp
438
        ret
439
 
440
.core_24:
441
        lea     ebx, [ebx+ebx*2]
442
        lea     edi, [LFB_BASE+edi+ebx]
443
        mov     ebx, [CURRENT_TASK]
444
 
445
align 4
446
.outer24:
447
        mov     [esp+64], edi
448
        xor     ecx, ecx
449
 
450
align 4
451
.inner24:
452
        cmp     [ebp+ecx], bl
2465 Serge 453
        jne     .skip_1
2434 Serge 454
;--------------------------------------
455
        push    eax
456
        mov     eax, [esi+ecx*4]
457
 
458
        lea     edi, [edi+ecx*2]
459
 
2465 Serge 460
; check for hardware cursor
461
        cmp     [_display.select_cursor], select_cursor
462
        je      @f
463
        cmp     [_display.select_cursor], 0
464
        jne     .no_mouseunder_1
465
;--------------------------------------
466
align 4
467
@@:
2434 Serge 468
        push    ecx
469
 
470
        mov     ecx, [esp+4]
471
        ror     ecx, 16
472
        sub     ecx, edx
473
        rol     ecx, 16
474
        sub     ecx, [esp+BLITTER.h + 8]
475
 
476
; check mouse area for putpixel
477
        call    [_display.check_mouse]
478
        pop     ecx
2465 Serge 479
;--------------------------------------
480
align 4
481
.no_mouseunder_1:
2434 Serge 482
        mov     [edi+ecx], ax
483
        shr     eax, 16
484
        mov     [edi+ecx+2], al
485
 
486
        pop     eax
487
;--------------------------------------
488
align 4
2465 Serge 489
.skip_1:
2434 Serge 490
        mov     edi, [esp+64]
491
        inc     ecx
492
        dec     edx
493
        jnz     .inner24
494
 
495
        add     esi, [esp+BLITTER.stride]
496
        add     edi, [_display.pitch]
497
        add     ebp, [_display.width]
498
 
499
        mov     edx, [esp+BLITTER.w]
500
        dec     [esp+BLITTER.h]
501
        jnz     .outer24
502
 
503
        jmp     .done