Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4429 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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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              RECT
18
        sc              RECT
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
 
32
align 4
33
block_clip:
34
;esi= clip RECT ptr
35
;edi= RECT ptr
36
;return code:
37
;eax= 0 - draw, 1 - don't draw
38
 
39
        push    ebx
40
 
41
        mov     eax, [edi+RECT.left]
42
        mov     ebx, [edi+RECT.right]
43
        mov     ecx, [esi+RECT.left]    ;clip.left
44
        mov     edx, [esi+RECT.right]   ;clip.right
45
 
46
        cmp     eax, edx                ;left >= clip.right
47
        jge     .fail
48
 
49
        cmp     ebx, ecx                ;right < clip.left
50
        jl      .fail
51
 
52
        cmp     eax, ecx                ;left >= clip.left
53
        jae     @F
54
 
55
        mov     eax, ecx
56
@@:
57
        mov     [edi+RECT.left], eax
58
 
59
        cmp     ebx, edx                ;right <= clip.right
60
        jle     @f
61
        mov     ebx, edx
62
@@:
63
        mov     [edi+RECT.right], ebx
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
77
        jae     @F
78
 
79
        mov     eax, ecx
80
@@:
81
        mov     [edi+RECT.top], eax
82
 
83
        cmp     ebx, edx                ;bottom <= clip.bottom
84
        jle     @f
85
        mov     ebx, edx
86
@@:
87
        mov     [edi+RECT.bottom], ebx
88
        pop     ebx
89
        xor     eax, eax
90
        ret
91
.fail:
92
        pop     ebx
93
        mov     eax, 1
94
        ret
95
 
96
 
97
align 4
98
blit_clip:
99
 
100
.sx0   equ 8
101
.sy0   equ 12
102
.sx1   equ 16
103
.sy1   equ 20
104
 
105
.dx0   equ 24
106
.dy0   equ 28
107
.dx1   equ 32
108
.dy1   equ 36
109
 
110
 
111
        push    edi
112
        push    esi
113
        push    ebx
114
        sub     esp, 40
115
 
116
        mov     ebx, ecx
117
        mov     edx, [ecx+BLITTER.src_x]
118
        mov     [esp+.sx0], edx
119
        mov     eax, [ecx+BLITTER.src_y]
120
        mov     [esp+.sy0], eax
121
        add     edx, [ecx+BLITTER.w]
122
        add     eax, [ecx+BLITTER.h]
123
        mov     [esp+.sx1], edx
124
        mov     [esp+.sy1], eax
125
 
126
        lea     edi, [esp+.sx0]
127
        lea     esi, [ebx+BLITTER.sc]
128
 
129
        call    block_clip
130
        test    eax, eax
131
        mov     esi, 1
132
        jnz     .done
133
 
134
        mov     edi, [esp+.sx0]
135
        mov     edx, [ebx+BLITTER.dst_x]
136
        add     edx, edi
137
        sub     edx, [ebx+BLITTER.src_x]
138
        mov     [esp+.dx0], edx
139
 
140
        mov     ecx, [esp+.sy0]
141
        mov     eax, [ebx+BLITTER.dst_y]
142
        add     eax, ecx
143
        sub     eax, [ebx+BLITTER.src_y]
144
        mov     [esp+.dy0], eax
145
 
146
        sub     edx, edi
147
        add     edx, [esp+.sx1]
148
        mov     [esp+.dx1], edx
149
 
150
        sub     eax, ecx
151
        add     eax, [esp+.sy1]
152
        mov     [esp+.dy1], eax
153
 
154
        lea     edi, [esp+.dx0]
155
        lea     esi, [ebx+BLITTER.dc]
156
        call    block_clip
157
        test    eax, eax
158
        mov     esi, 1
159
        jnz     .done
160
 
161
        mov     edx, [esp+.dx0]
162
        mov     eax, [esp+.dx1]
163
        sub     eax, edx
164
        mov     [ebx+BLITTER.w], eax
165
 
166
        mov     eax, [esp+.dy0]
167
        mov     ecx, [esp+.dy1]
168
        sub     ecx, eax
169
        mov     [ebx+BLITTER.h], ecx
170
 
171
        mov     ecx, [ebx+BLITTER.src_x]
172
        add     ecx, edx
173
        sub     ecx, [ebx+BLITTER.dst_x]
174
        mov     [ebx+BLITTER.src_x], ecx
175
 
176
        mov     ecx, [ebx+BLITTER.src_y]
177
        add     ecx, eax
178
        sub     ecx, [ebx+BLITTER.dst_y]
179
        mov     [ebx+BLITTER.src_y], ecx
180
        mov     [ebx+BLITTER.dst_x], edx
181
        mov     [ebx+BLITTER.dst_y], eax
182
        xor     esi, esi
183
.done:
184
        mov     eax, esi
185
        add     esp, 40
186
        pop     ebx
187
        pop     esi
188
        pop     edi
189
 
190
 
191
purge .sx0
192
purge .sy0
193
purge .sx1
194
purge .sy1
195
 
196
purge .dx0
197
purge .dy0
198
purge .dx1
199
purge .dy1
200
 
201
        ret
202
 
203
align 4
204
blit_32:
205
        push    ebp
206
        push    edi
207
        push    esi
208
        push    ebx
209
        sub     esp, 72
210
 
211
        mov     eax, [TASK_BASE]
212
        mov     ebx, [eax-twdw + WDATA.box.width]
213
        mov     edx, [eax-twdw + WDATA.box.height]
214
        inc     ebx
215
        inc     edx
216
 
217
        xor     eax, eax
218
 
219
        mov     [esp+BLITTER.dc.left], eax
220
        mov     [esp+BLITTER.dc.top], eax
221
        mov     [esp+BLITTER.dc.right], ebx
222
        mov     [esp+BLITTER.dc.bottom], edx
223
 
224
        mov     [esp+BLITTER.sc.left], eax
225
        mov     [esp+BLITTER.sc.top], eax
226
        mov     eax, [ecx+24]
227
 
228
        mov     [esp+BLITTER.sc.right], eax
229
        mov     eax, [ecx+28]
230
 
231
        mov     [esp+BLITTER.sc.bottom], eax
232
 
233
        mov     eax, [ecx]
234
        mov     [esp+BLITTER.dst_x], eax
235
        mov     eax, [ecx+4]
236
        mov     [esp+BLITTER.dst_y], eax
237
 
238
        mov     eax, [ecx+16]
239
        mov     [esp+BLITTER.src_x], eax
240
        mov     eax, [ecx+20]
241
        mov     [esp+BLITTER.src_y], eax
242
        mov     eax, [ecx+8]
243
        mov     [esp+BLITTER.w], eax
244
        mov     eax, [ecx+12]
245
        mov     [esp+BLITTER.h], eax
246
 
247
 
248
        mov     eax, [ecx+32]
249
        mov     [esp+56], eax
250
        mov     eax, [ecx+36]
251
        mov     [esp+60], eax
252
 
253
        mov     ecx, esp
254
        call    blit_clip
255
        test    eax, eax
256
        jne     .L57
257
 
258
        mov     eax, [TASK_BASE]
259
 
260
        mov     ebx, [esp+BLITTER.dst_x]
261
        mov     ebp, [esp+BLITTER.dst_y]
262
        add     ebx, [eax-twdw + WDATA.box.left]
263
        add     ebp, [eax-twdw + WDATA.box.top]
264
 
265
        mov     ecx, ebx
266
        add     ecx, [esp+BLITTER.w]
267
        shl     ecx, 16
268
        mov     cx, bp
269
        add     ecx, [esp+BLITTER.h]
270
 
271
        mov     edi, ebp
272
 
273
;        imul    edi, [_display.pitch]
274
        mov     edi, [BPSLine_calc_area+edi*4]
275
;        imul    ebp, [_display.width]
276
        mov     ebp, [d_width_calc_area+ebp*4]
277
 
278
        add     ebp, ebx
279
        add     ebp, [_WinMapAddress]
280
 
281
        mov     eax, [esp+BLITTER.src_y]
282
        imul    eax, [esp+BLITTER.stride]
283
        mov     esi, [esp+BLITTER.src_x]
284
        lea     esi, [eax+esi*4]
285
        add     esi, [esp+BLITTER.bitmap]
286
 
287
        mov     eax, ecx
288
        mov     ecx, [esp+BLITTER.h]
289
        mov     edx, [esp+BLITTER.w]
290
 
291
        test    ecx, ecx    ;FIXME check clipping
292
        jz      .L57
293
 
294
        test    edx, edx
295
        jz      .L57
296
 
297
        cmp     [_display.bpp], 32
298
        jne     .core_24
299
 
300
        lea     edi, [edi+ebx*4]
301
 
302
        mov     ebx, [CURRENT_TASK]
303
align 4
304
.outer32:
305
        xor     ecx, ecx
306
 
307
align 4
308
.inner32:
309
        cmp     [ebp+ecx], bl
310
        jne     .skip
311
;--------------------------------------
312
        push    eax
313
        mov     eax, [esi+ecx*4]
314
 
315
; check for hardware cursor
316
        cmp     [_display.select_cursor], select_cursor
317
        je      @f
318
        cmp     [_display.select_cursor], 0
319
        jne     .no_mouseunder
320
;--------------------------------------
321
align 4
322
@@:
323
        push    ecx
324
 
325
        mov     ecx, [esp+4]
326
        ror     ecx, 16
327
        sub     ecx, edx
328
        rol     ecx, 16
329
        sub     ecx, [esp+BLITTER.h + 8]
330
 
331
; check mouse area for putpixel
332
        call    [_display.check_mouse]
333
        pop     ecx
334
;--------------------------------------
335
align 4
336
.no_mouseunder:
337
; store to real LFB
338
        mov     [LFB_BASE+edi+ecx*4], eax
339
        pop     eax
340
;--------------------------------------
341
align 4
342
.skip:
343
        inc     ecx
344
        dec     edx
345
        jnz     .inner32
346
 
347
        add     esi, [esp+BLITTER.stride]
348
        add     edi, [_display.pitch]
349
        add     ebp, [_display.width]
350
 
351
        mov     edx, [esp+BLITTER.w]
352
        dec     [esp+BLITTER.h]
353
        jnz     .outer32
354
 
355
.done:
356
;        call    [draw_pointer]
357
;        call    __sys_draw_pointer
358
.L57:
359
        add     esp, 72
360
        pop     ebx
361
        pop     esi
362
        pop     edi
363
        pop     ebp
364
        ret
365
 
366
.core_24:
367
        lea     ebx, [ebx+ebx*2]
368
        lea     edi, [LFB_BASE+edi+ebx]
369
        mov     ebx, [CURRENT_TASK]
370
 
371
align 4
372
.outer24:
373
        mov     [esp+64], edi
374
        xor     ecx, ecx
375
 
376
align 4
377
.inner24:
378
        cmp     [ebp+ecx], bl
379
        jne     .skip_1
380
;--------------------------------------
381
        push    eax
382
        mov     eax, [esi+ecx*4]
383
 
384
        lea     edi, [edi+ecx*2]
385
 
386
; check for hardware cursor
387
        cmp     [_display.select_cursor], select_cursor
388
        je      @f
389
        cmp     [_display.select_cursor], 0
390
        jne     .no_mouseunder_1
391
;--------------------------------------
392
align 4
393
@@:
394
        push    ecx
395
 
396
        mov     ecx, [esp+4]
397
        ror     ecx, 16
398
        sub     ecx, edx
399
        rol     ecx, 16
400
        sub     ecx, [esp+BLITTER.h + 8]
401
 
402
; check mouse area for putpixel
403
        call    [_display.check_mouse]
404
        pop     ecx
405
;--------------------------------------
406
align 4
407
.no_mouseunder_1:
408
        mov     [edi+ecx], ax
409
        shr     eax, 16
410
        mov     [edi+ecx+2], al
411
 
412
        pop     eax
413
;--------------------------------------
414
align 4
415
.skip_1:
416
        mov     edi, [esp+64]
417
        inc     ecx
418
        dec     edx
419
        jnz     .inner24
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     .outer24
428
 
429
        jmp     .done