Как 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 положительный)

Другие вопросы по тегам