Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2540 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2011-2012. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2385 hidnplayr 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:
2382 hidnplayr 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
2540 hidnplayr 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]
349
        mov     edi, [BPSLine_calc_area+edi*4]
350
;        imul    ebp, [_display.width]
351
        mov     ebp, [d_width_calc_area+ebp*4]
352
 
353
        add     ebp, ebx
354
        add     ebp, [_WinMapAddress]
355
 
2382 hidnplayr 356
        mov     eax, [esp+BLITTER.src_y]
357
        imul    eax, [esp+BLITTER.stride]
358
        mov     esi, [esp+BLITTER.src_x]
2540 hidnplayr 359
        lea     esi, [eax+esi*4]
360
        add     esi, [esp+BLITTER.bitmap]
361
 
362
        mov     eax, ecx
363
        mov     ecx, [esp+BLITTER.h]
364
        mov     edx, [esp+BLITTER.w]
365
 
2382 hidnplayr 366
        test    ecx, ecx    ;FIXME check clipping
367
        jz      .L57
368
 
369
        test    edx, edx
370
        jz      .L57
371
 
372
        cmp     [_display.bpp], 32
373
        jne     .core_24
374
 
2540 hidnplayr 375
        lea     edi, [edi+ebx*4]
376
 
377
        mov     ebx, [CURRENT_TASK]
378
align 4
379
.outer32:
380
        xor     ecx, ecx
2382 hidnplayr 381
 
2540 hidnplayr 382
align 4
383
.inner32:
384
        cmp     [ebp+ecx], bl
385
        jne     .skip
386
;--------------------------------------
387
        push    eax
388
        mov     eax, [esi+ecx*4]
389
 
390
; check for hardware cursor
391
        cmp     [_display.select_cursor], select_cursor
392
        je      @f
393
        cmp     [_display.select_cursor], 0
394
        jne     .no_mouseunder
395
;--------------------------------------
396
align 4
397
@@:
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
409
;--------------------------------------
410
align 4
411
.no_mouseunder:
412
; store to real LFB
413
        mov     [LFB_BASE+edi+ecx*4], eax
414
        pop     eax
415
;--------------------------------------
416
align 4
417
.skip:
418
        inc     ecx
419
        dec     edx
420
        jnz     .inner32
2382 hidnplayr 421
 
422
        add     esi, [esp+BLITTER.stride]
423
        add     edi, [_display.pitch]
424
        add     ebp, [_display.width]
425
 
426
        mov     edx, [esp+BLITTER.w]
427
        dec     [esp+BLITTER.h]
2540 hidnplayr 428
        jnz     .outer32
429
 
430
.done:
431
;        call    [draw_pointer]
432
        call    __sys_draw_pointer
433
.L57:
434
        add     esp, 72
435
        pop     ebx
2382 hidnplayr 436
        pop     esi
437
        pop     edi
438
        pop     ebp
439
        ret
440
 
441
.core_24:
442
        lea     ebx, [ebx+ebx*2]
443
        lea     edi, [LFB_BASE+edi+ebx]
444
        mov     ebx, [CURRENT_TASK]
445
 
446
align 4
447
.outer24:
448
        mov     [esp+64], edi
449
        xor     ecx, ecx
450
 
2540 hidnplayr 451
align 4
452
.inner24:
453
        cmp     [ebp+ecx], bl
454
        jne     .skip_1
455
;--------------------------------------
456
        push    eax
457
        mov     eax, [esi+ecx*4]
458
 
459
        lea     edi, [edi+ecx*2]
460
 
461
; check for hardware cursor
462
        cmp     [_display.select_cursor], select_cursor
463
        je      @f
464
        cmp     [_display.select_cursor], 0
465
        jne     .no_mouseunder_1
466
;--------------------------------------
467
align 4
468
@@:
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
480
;--------------------------------------
481
align 4
482
.no_mouseunder_1:
483
        mov     [edi+ecx], ax
484
        shr     eax, 16
485
        mov     [edi+ecx+2], al
486
 
487
        pop     eax
488
;--------------------------------------
489
align 4
490
.skip_1:
491
        mov     edi, [esp+64]
492
        inc     ecx
493
        dec     edx
2382 hidnplayr 494
        jnz     .inner24
495
 
496
        add     esi, [esp+BLITTER.stride]
497
        add     edi, [_display.pitch]
498
        add     ebp, [_display.width]
499
 
500
        mov     edx, [esp+BLITTER.w]
501
        dec     [esp+BLITTER.h]
502
        jnz     .outer24
503
 
504
        jmp     .done