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