Как работает этот код по распаковке TGA файла? (unload_rle_data)

131
07 мая 2019, 10:30

Начал копать библиотеку уроков по тому как работает OpenGL и не могу разобраться с одним методом.
Ссылка на курс: https://github.com/ssloy/tinyrenderer/wiki
Ссылка на код: https://github.com/ssloy/tinyrenderer.git

bool TGAImage::unload_rle_data(std::ofstream &out) {//unload the compesed image map
const unsigned char max_chunk_length = 128;//max длинна куска
unsigned long npixels = width*height; 
unsigned long curpix = 0;
while (curpix<npixels) {
    unsigned long chunkstart = curpix*bytespp;//начальный кусок 
    unsigned long curbyte = curpix*bytespp;
    unsigned char run_length = 1;
    bool raw = true;
    while (curpix+run_length<npixels && run_length<max_chunk_length) {
        bool succ_eq = true;
        for (int t=0; succ_eq && t<bytespp; t++) {
            succ_eq = (data[curbyte+t]==data[curbyte+t+bytespp]);
        }
        curbyte += bytespp;
        if (1==run_length) {
            raw = !succ_eq;
        }
        if (raw && succ_eq) {
            run_length--;
            break;
        }
        if (!raw && !succ_eq) {
            break;
        }
        run_length++;
    }
    curpix += run_length;
    out.put(raw?run_length-1:run_length+127);
    if (!out.good()) {
        std::cerr << "can't dump the tga file\n";
        return false;
    }
    out.write((char *)(data+chunkstart), (raw?run_length*bytespp:bytespp));
    if (!out.good()) {
        std::cerr << "can't dump the tga file\n";
        return false;
    }
}
return true;

}

Насколько я понял это алгоритм кодирования данных и записи их в файл формата .tga. То есть берут массив Data (карту цветов) и совершая над ней какие-то манипуляции пихают в файл, но какие манипуляции я понять не смог.

READ ALSO
Доступ к элементам std::map по индексу

Доступ к элементам std::map по индексу

Интересует, как можно получить доступ к элементу map'ы с индексом iНо! К примеру, при перебирании map'ы при помощи итерататора она отсортирована...

154
passing ‘const std::map&lt;int, int&gt;’ as ‘this’ argument discards qualifiers

passing ‘const std::map<int, int>’ as ‘this’ argument discards qualifiers

Когда пытаюсь прочитать значение карты map в методе класса с помощью map[key], то получаю непонятную ошибку

135
Неправильно вычисляю выражение

Неправильно вычисляю выражение

В общем в одном из алгоритмов потребовалось вычислять квадратный корень из суммы квадратов двух аргументовКазалось бы, всё просто и я написал...

133