Made bitblt work in 32bpp mode
This commit is contained in:
+24
-12
@@ -17,8 +17,8 @@ include errno
|
|||||||
; 101 - reserved
|
; 101 - reserved
|
||||||
; 110 - reserved
|
; 110 - reserved
|
||||||
; 111 - SRCALPHA (copies source over destination if: source != 0 (for 8bpp), source.alpha != 0 (for 32bpp))
|
; 111 - SRCALPHA (copies source over destination if: source != 0 (for 8bpp), source.alpha != 0 (for 32bpp))
|
||||||
; Stack argument 1: Width (in bytes)
|
; Stack argument 1: Width
|
||||||
; Stack argument 2: Height (in bytes)
|
; Stack argument 2: Height
|
||||||
; Result: None
|
; Result: None
|
||||||
; Clobbers: r1, r2, r3, r4, r5, r6, r7
|
; Clobbers: r1, r2, r3, r4, r5, r6, r7
|
||||||
; Errors: BUFFER_DEPTH_MISMATCH - if the buffers have different bit depths
|
; Errors: BUFFER_DEPTH_MISMATCH - if the buffers have different bit depths
|
||||||
@@ -40,22 +40,29 @@ pub bitblit:
|
|||||||
jmp r13
|
jmp r13
|
||||||
bitblit_depth_good:
|
bitblit_depth_good:
|
||||||
push r8
|
push r8
|
||||||
add sp, sp, 12
|
|
||||||
load_32 r8, [sp] ; r8 = height
|
|
||||||
add sp, sp, 4
|
|
||||||
load_32 r9, [sp] ; r9 = width
|
|
||||||
|
|
||||||
sub sp, sp, 16
|
|
||||||
push r10
|
push r10
|
||||||
push r11
|
push r11
|
||||||
push r12
|
push r12
|
||||||
push r13
|
push r13
|
||||||
|
push r7
|
||||||
|
mov r7, r8
|
||||||
|
lsr r7, r7, 4
|
||||||
|
|
||||||
add r10, r1, 4 ; r10 = pointer to destination stride
|
add r10, r1, 4 ; r10 = pointer to destination stride
|
||||||
load_16 r10, [r10] ; r10 = destination stride
|
load_16 r10, [r10] ; r10 = destination stride
|
||||||
|
lsl r10, r10, r7
|
||||||
|
|
||||||
add r11, r2, 4 ; r11 = pointer to source stride
|
add r11, r2, 4 ; r11 = pointer to source stride
|
||||||
load_16 r11, [r11] ; r11 = source stride
|
load_16 r11, [r11] ; r11 = source stride
|
||||||
|
lsl r11, r11, r7
|
||||||
|
|
||||||
|
add sp, sp, 32
|
||||||
|
load_32 r8, [sp] ; r8 = height
|
||||||
|
add sp, sp, 4
|
||||||
|
load_32 r9, [sp] ; r9 = width
|
||||||
|
lsl r9, r9, r7
|
||||||
|
sub sp, sp, 36
|
||||||
|
|
||||||
|
|
||||||
; Calculating destination index
|
; Calculating destination index
|
||||||
push r10
|
push r10
|
||||||
@@ -74,6 +81,7 @@ pub bitblit:
|
|||||||
add r4, r4, r12 ; Now r4 is dest_y * dest_stride
|
add r4, r4, r12 ; Now r4 is dest_y * dest_stride
|
||||||
load_32 r1, [r1] ; r1 = destination data pointer
|
load_32 r1, [r1] ; r1 = destination data pointer
|
||||||
add r1, r1, r4 ; Now r1 is dest_pointer + dest_y * dest_stride
|
add r1, r1, r4 ; Now r1 is dest_pointer + dest_y * dest_stride
|
||||||
|
lsl r3, r3, r7
|
||||||
add r1, r1, r3 ; Now r1 is dest_pointer + dest_y * dest_stride + dest_x
|
add r1, r1, r3 ; Now r1 is dest_pointer + dest_y * dest_stride + dest_x
|
||||||
pop r10
|
pop r10
|
||||||
|
|
||||||
@@ -94,8 +102,11 @@ pub bitblit:
|
|||||||
add r6, r6, r12 ; Now r6 is src_y * src_stride
|
add r6, r6, r12 ; Now r6 is src_y * src_stride
|
||||||
load_32 r2, [r2] ; r2 = source data pointer
|
load_32 r2, [r2] ; r2 = source data pointer
|
||||||
add r2, r2, r6 ; Now r2 is src_pointer + src_y * src_stride
|
add r2, r2, r6 ; Now r2 is src_pointer + src_y * src_stride
|
||||||
|
lsl r5, r5, r7
|
||||||
add r2, r2, r5 ; Now r2 is src_pointer + src_y * src_stride + src_x
|
add r2, r2, r5 ; Now r2 is src_pointer + src_y * src_stride + src_x
|
||||||
pop r11
|
pop r11
|
||||||
|
|
||||||
|
pop r7
|
||||||
|
|
||||||
; r3, r4, r5, r6 are now free
|
; r3, r4, r5, r6 are now free
|
||||||
|
|
||||||
@@ -133,8 +144,7 @@ pub bitblit:
|
|||||||
push r2
|
push r2
|
||||||
bitblit_copy_line_loop: ; Main loop that copies 4 bytes at a time
|
bitblit_copy_line_loop: ; Main loop that copies 4 bytes at a time
|
||||||
add r3, r3, 4
|
add r3, r3, 4
|
||||||
cmp r9, r3
|
cmp r9, r3
|
||||||
je bitblit_copy_line_finish
|
|
||||||
jb bitblit_copy_line_end
|
jb bitblit_copy_line_end
|
||||||
load_32 r6, [r5] ; r6 = [src]
|
load_32 r6, [r5] ; r6 = [src]
|
||||||
load_32 r13, [r4] ; r13 = [dest]
|
load_32 r13, [r4] ; r13 = [dest]
|
||||||
@@ -201,6 +211,8 @@ pub bitblit:
|
|||||||
mov r6, r13 ; If it was zero, we take [dest], i.e. don't overwrite
|
mov r6, r13 ; If it was zero, we take [dest], i.e. don't overwrite
|
||||||
bitblit_save_bits:
|
bitblit_save_bits:
|
||||||
store_32 [r4], r6
|
store_32 [r4], r6
|
||||||
|
cmp r9, r3
|
||||||
|
je bitblit_copy_line_finish
|
||||||
add r4, r4, 4
|
add r4, r4, 4
|
||||||
add r5, r5, 4
|
add r5, r5, 4
|
||||||
jmp bitblit_copy_line_loop
|
jmp bitblit_copy_line_loop
|
||||||
@@ -253,4 +265,4 @@ pub bitblit:
|
|||||||
pop r8
|
pop r8
|
||||||
add sp, sp, 8
|
add sp, sp, 8
|
||||||
mov flags, errno.OK
|
mov flags, errno.OK
|
||||||
jmp r13
|
jmp r13
|
||||||
|
|||||||
Reference in New Issue
Block a user