Вот, может сгодится... Код древний, поэтому что там к чему - уже не помню, но точно работает, потому как взят из работающей программы
| Код | void CPCXReader::DecodeLine8 (std::istream& in, LPBYTE pDst) { int nLineRemainder = m_Pcxh.bplin * m_Pcxh.plans; //счетчик числа байтов, к-рые нужно записать в строку if (m_nCnt && m_Pcxh.plans!=3) { //заполняем начало строки данными, оставшимися от предыдущей строки int nQBts = min ((int)m_nCnt, nLineRemainder); memset (pDst, m_nCur, nQBts); pDst += nQBts; nLineRemainder -= nQBts; m_nCnt -= nQBts; }
//цикл декомпрессии строки растра while (nLineRemainder > 0) { ASSERT (m_nCnt == 0); //текущий символ и счетчик повторений in.read ((char*)&m_nCur, 1);
//если текущий символ является счетчиком декомпрессии if ((m_nCur & 0xc0) == 0xc0) { //вычисляем его значение m_nCnt = max (1, m_nCur & 0x3f); //берем новый байт со следующей позиции файла in.read ((char*)&m_nCur, 1);
int nQBts = min ((int)m_nCnt, nLineRemainder); memset (pDst, m_nCur, nQBts); pDst += nQBts; nLineRemainder -= nQBts; m_nCnt -= nQBts; } else { *pDst++ = m_nCur; --nLineRemainder; } } }
| |