Subversion Repositories Kolibri OS

Rev

Rev 2480 | Rev 4444 | 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
2988 Serge 17
        dc              RECT
18
        sc              RECT
2384 hidnplayr 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
 
2988 Serge 31
 
1894 serge 32
align 4
2988 Serge 33
block_clip:
34
;esi= clip RECT ptr
35
;edi= RECT ptr
36
;return code:
37
;eax= 0 - draw, 1 - don't draw
1894 serge 38
 
2288 clevermous 39
        push    ebx
1894 serge 40
 
2988 Serge 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
1894 serge 45
 
2988 Serge 46
        cmp     eax, edx                ;left >= clip.right
47
        jge     .fail
1894 serge 48
 
2988 Serge 49
        cmp     ebx, ecx                ;right < clip.left
50
        jl      .fail
1894 serge 51
 
2988 Serge 52
        cmp     eax, ecx                ;left >= clip.left
53
        jae     @F
1894 serge 54
 
2988 Serge 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
2288 clevermous 88
        pop     ebx
2988 Serge 89
        xor     eax, eax
1894 serge 90
        ret
2988 Serge 91
.fail:
92
        pop     ebx
93
        mov     eax, 1
94
        ret
1894 serge 95
 
2988 Serge 96
 
1894 serge 97
align 4
98
blit_clip:
99
 
2988 Serge 100
.sx0   equ 8
101
.sy0   equ 12
102
.sx1   equ 16
103
.sy1   equ 20
1894 serge 104
 
2988 Serge 105
.dx0   equ 24
106
.dy0   equ 28
107
.dx1   equ 32
108
.dy1   equ 36
1894 serge 109
 
110
 
2288 clevermous 111
        push    edi
112
        push    esi
113
        push    ebx
114
        sub     esp, 40
1894 serge 115
 
2288 clevermous 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]
2988 Serge 122
        add     eax, [ecx+BLITTER.h]
2288 clevermous 123
        mov     [esp+.sx1], edx
124
        mov     [esp+.sy1], eax
1894 serge 125
 
2988 Serge 126
        lea     edi, [esp+.sx0]
127
        lea     esi, [ebx+BLITTER.sc]
1894 serge 128
 
2288 clevermous 129
        call    block_clip
2988 Serge 130
        test    eax, eax
2288 clevermous 131
        mov     esi, 1
2988 Serge 132
        jnz     .done
1894 serge 133
 
2288 clevermous 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
1894 serge 139
 
2288 clevermous 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
2988 Serge 145
 
2288 clevermous 146
        sub     edx, edi
147
        add     edx, [esp+.sx1]
148
        mov     [esp+.dx1], edx
1894 serge 149
 
2288 clevermous 150
        sub     eax, ecx
151
        add     eax, [esp+.sy1]
152
        mov     [esp+.dy1], eax
1894 serge 153
 
2988 Serge 154
        lea     edi, [esp+.dx0]
155
        lea     esi, [ebx+BLITTER.dc]
2288 clevermous 156
        call    block_clip
157
        test    eax, eax
2988 Serge 158
        mov     esi, 1
159
        jnz     .done
1894 serge 160
 
2288 clevermous 161
        mov     edx, [esp+.dx0]
162
        mov     eax, [esp+.dx1]
163
        sub     eax, edx
164
        mov     [ebx+BLITTER.w], eax
1894 serge 165
 
2288 clevermous 166
        mov     eax, [esp+.dy0]
167
        mov     ecx, [esp+.dy1]
168
        sub     ecx, eax
169
        mov     [ebx+BLITTER.h], ecx
1894 serge 170
 
2288 clevermous 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
1894 serge 175
 
2288 clevermous 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
2988 Serge 183
.done:
2288 clevermous 184
        mov     eax, esi
185
        add     esp, 40
186
        pop     ebx
187
        pop     esi
188
        pop     edi
1894 serge 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:
2288 clevermous 205
        push    ebp
206
        push    edi
207
        push    esi
208
        push    ebx
209
        sub     esp, 72
1894 serge 210
 
2288 clevermous 211
        mov     eax, [TASK_BASE]
212
        mov     ebx, [eax-twdw + WDATA.box.width]
213
        mov     edx, [eax-twdw + WDATA.box.height]
2988 Serge 214
        inc     ebx
215
        inc     edx
1894 serge 216
 
2288 clevermous 217
        xor     eax, eax
1894 serge 218
 
2988 Serge 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
1894 serge 223
 
2988 Serge 224
        mov     [esp+BLITTER.sc.left], eax
225
        mov     [esp+BLITTER.sc.top], eax
2288 clevermous 226
        mov     eax, [ecx+24]
2988 Serge 227
 
228
        mov     [esp+BLITTER.sc.right], eax
2288 clevermous 229
        mov     eax, [ecx+28]
1894 serge 230
 
2988 Serge 231
        mov     [esp+BLITTER.sc.bottom], eax
232
 
2288 clevermous 233
        mov     eax, [ecx]
234
        mov     [esp+BLITTER.dst_x], eax
235
        mov     eax, [ecx+4]
236
        mov     [esp+BLITTER.dst_y], eax
1894 serge 237
 
2288 clevermous 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
1894 serge 246
 
247
 
2288 clevermous 248
        mov     eax, [ecx+32]
249
        mov     [esp+56], eax
250
        mov     eax, [ecx+36]
251
        mov     [esp+60], eax
1894 serge 252
 
2288 clevermous 253
        mov     ecx, esp
254
        call    blit_clip
255
        test    eax, eax
256
        jne     .L57
1894 serge 257
 
2288 clevermous 258
        mov     eax, [TASK_BASE]
1894 serge 259
 
2288 clevermous 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]
2430 mario79 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
 
2288 clevermous 271
        mov     edi, ebp
1894 serge 272
 
2480 mario79 273
;        imul    edi, [_display.pitch]
274
        mov     edi, [BPSLine_calc_area+edi*4]
2446 mario79 275
;        imul    ebp, [_display.width]
2480 mario79 276
        mov     ebp, [d_width_calc_area+ebp*4]
2446 mario79 277
 
2288 clevermous 278
        add     ebp, ebx
279
        add     ebp, [_WinMapAddress]
1894 serge 280
 
2288 clevermous 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]
1894 serge 286
 
2430 mario79 287
        mov     eax, ecx
2288 clevermous 288
        mov     ecx, [esp+BLITTER.h]
289
        mov     edx, [esp+BLITTER.w]
1894 serge 290
 
2288 clevermous 291
        test    ecx, ecx    ;FIXME check clipping
292
        jz      .L57
1894 serge 293
 
2288 clevermous 294
        test    edx, edx
295
        jz      .L57
1894 serge 296
 
2288 clevermous 297
        cmp     [_display.bpp], 32
298
        jne     .core_24
1894 serge 299
 
2288 clevermous 300
        lea     edi, [edi+ebx*4]
1894 serge 301
 
2288 clevermous 302
        mov     ebx, [CURRENT_TASK]
1894 serge 303
align 4
304
.outer32:
2288 clevermous 305
        xor     ecx, ecx
1894 serge 306
 
307
align 4
308
.inner32:
2288 clevermous 309
        cmp     [ebp+ecx], bl
2449 mario79 310
        jne     .skip
2430 mario79 311
;--------------------------------------
312
        push    eax
313
        mov     eax, [esi+ecx*4]
1894 serge 314
 
2448 mario79 315
; check for hardware cursor
2451 mario79 316
        cmp     [_display.select_cursor], select_cursor
317
        je      @f
2448 mario79 318
        cmp     [_display.select_cursor], 0
319
        jne     .no_mouseunder
320
;--------------------------------------
321
align 4
322
@@:
2430 mario79 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
2448 mario79 334
;--------------------------------------
335
align 4
336
.no_mouseunder:
2430 mario79 337
; store to real LFB
2288 clevermous 338
        mov     [LFB_BASE+edi+ecx*4], eax
2430 mario79 339
        pop     eax
340
;--------------------------------------
341
align 4
2449 mario79 342
.skip:
2288 clevermous 343
        inc     ecx
344
        dec     edx
345
        jnz     .inner32
1894 serge 346
 
2288 clevermous 347
        add     esi, [esp+BLITTER.stride]
348
        add     edi, [_display.pitch]
349
        add     ebp, [_display.width]
1894 serge 350
 
2288 clevermous 351
        mov     edx, [esp+BLITTER.w]
352
        dec     [esp+BLITTER.h]
353
        jnz     .outer32
1894 serge 354
 
355
.done:
2453 mario79 356
;        call    [draw_pointer]
2988 Serge 357
;        call    __sys_draw_pointer
1894 serge 358
.L57:
2288 clevermous 359
        add     esp, 72
360
        pop     ebx
361
        pop     esi
362
        pop     edi
363
        pop     ebp
1894 serge 364
        ret
365
 
366
.core_24:
2288 clevermous 367
        lea     ebx, [ebx+ebx*2]
368
        lea     edi, [LFB_BASE+edi+ebx]
369
        mov     ebx, [CURRENT_TASK]
1894 serge 370
 
371
align 4
372
.outer24:
2288 clevermous 373
        mov     [esp+64], edi
374
        xor     ecx, ecx
1894 serge 375
 
376
align 4
377
.inner24:
2288 clevermous 378
        cmp     [ebp+ecx], bl
2449 mario79 379
        jne     .skip_1
2430 mario79 380
;--------------------------------------
381
        push    eax
2288 clevermous 382
        mov     eax, [esi+ecx*4]
1894 serge 383
 
2288 clevermous 384
        lea     edi, [edi+ecx*2]
2430 mario79 385
 
2448 mario79 386
; check for hardware cursor
2451 mario79 387
        cmp     [_display.select_cursor], select_cursor
388
        je      @f
2448 mario79 389
        cmp     [_display.select_cursor], 0
390
        jne     .no_mouseunder_1
391
;--------------------------------------
392
align 4
393
@@:
2430 mario79 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
2448 mario79 405
;--------------------------------------
406
align 4
407
.no_mouseunder_1:
2288 clevermous 408
        mov     [edi+ecx], ax
409
        shr     eax, 16
410
        mov     [edi+ecx+2], al
2430 mario79 411
 
412
        pop     eax
413
;--------------------------------------
414
align 4
2449 mario79 415
.skip_1:
2288 clevermous 416
        mov     edi, [esp+64]
417
        inc     ecx
418
        dec     edx
419
        jnz     .inner24
1894 serge 420
 
2288 clevermous 421
        add     esi, [esp+BLITTER.stride]
422
        add     edi, [_display.pitch]
423
        add     ebp, [_display.width]
1894 serge 424
 
2288 clevermous 425
        mov     edx, [esp+BLITTER.w]
426
        dec     [esp+BLITTER.h]
427
        jnz     .outer24
1894 serge 428
 
2288 clevermous 429
        jmp     .done