Как endianess влияет на прорисовку пикселей в файле BMP, используя алгоритм Брезенхэма в MIPS?
Я хочу создать программу в сборке MIPS, которая создает и сохраняет BMP-файл размером 1 бит на дюйм, в котором будет нарисован круг переменной длины радиуса (предоставленный пользователем на консоли) с использованием алгоритма Брезенхэма.
На данный момент у меня есть четко определенный файл BMP для целочисленных значений диаметров, однако я борюсь с еще двумя вещами:
- рисование пикселей по правильному адресу растрового изображения
- Реализация правильного алгоритма Брезенхема применяется 8 баллов за раз
Вот часть моего кода в текстовом сегменте, отвечающая за рисование пикселей в правильных адресных местах:
# $t2 - length of row + padding
# $t3 - initial address of a bitmap (header)
# $t4 - pointer to move values from BMP header parameters onto the heap
.macro drawPixel(%x,%y)
addiu $t4, $t3, 62 # starting address of a pixel map
mult %y, $t2 # pixel y-value multiplied by row length
mflo $a2
addu $t4, $t4, $a2 # y-value pixel address computation
divu $a2, %x, 8 # pixel x-value divided by 8 to obtain number of bytes
addu $t4, $t4, $a2 # x-value pixel address computation
mfhi $a3
#addiu $a3, $a3, -1
li $a2, 1
srlv $a2, $a2, $a3
lb $a3, ($t4) # loading byte at the address of pixel map start (="white" byte)
or $a3, $a3, $a2 # adds a new coloured byte to a "white" byte
sb $a3, ($t4) # loads byte with a coloured pixel
.end_macro
enter code here
Часть ниже представляет собой простой пример для тестирования, показывающий, что пиксели отображаются не в целых местах:
li $a0, 0
li $a1, 0
drawPixel($a0, $a1)
li $a0, 4
li $a1, 0
drawPixel($a0, $a1)
Хотя моя программа рисует пиксели, они как-то в обратном порядке. Интересно, связано ли это с различными значениями big / little-endian в сборке MIPS, и если да, то как я могу это исправить?
Заранее большое спасибо за вашу помощь, и, возможно, если вам удастся направить меня в этой части, второй вопрос об алгоритме Брезенхэма не понадобится.
1 ответ
Big/little-endiannes - это порядок байтов в слове, а не биты.
Если ваши пиксели отражаются слева направо в каждой 8-пиксельной группе, посмотрите на пример установки пикселя в монохромном растровом изображении (x86 asm). Важная часть для вас - MaskToSetABit = 0x80 shr (X mod 8)
mov ecx,edx //X coordinate
and ecx, 7 //X mod 8
mov edx, $80
shr edx,cl //mask to isolate needed bit
or ebx,ebx
jz @@IsZero
or eax,edx //set bit to 1
Если все строки отражаются сверху вниз, то следует учитывать, что большинство растровых изображений содержат восходящие DIB, его исходная точка - левый нижний угол, а смещение строки - отрицательное ( когда biHeight положительный)