void CCodec_RLScanlineDecoder::UpdateOperator(uint8_t used_bytes) { if (used_bytes == 0) { return; } if (m_Operator < 128) { FXSYS_assert((FX_DWORD)m_Operator + 1 >= used_bytes); if (used_bytes == m_Operator + 1) { m_SrcOffset += used_bytes; GetNextOperator(); return; } m_Operator -= used_bytes; m_SrcOffset += used_bytes; if (m_SrcOffset >= m_SrcSize) { m_Operator = 128; } return; } uint8_t count = 257 - m_Operator; FXSYS_assert((FX_DWORD)count >= used_bytes); if (used_bytes == count) { m_SrcOffset++; GetNextOperator(); return; } count -= used_bytes; m_Operator = 257 - count; }
uint8_t* CCodec_RLScanlineDecoder::v_GetNextLine() { if (m_SrcOffset == 0) { GetNextOperator(); } else { if (m_bEOD) { return NULL; } } FXSYS_memset(m_pScanline, 0, m_Pitch); FX_DWORD col_pos = 0; FX_BOOL eol = FALSE; while (m_SrcOffset < m_SrcSize && !eol) { if (m_Operator < 128) { FX_DWORD copy_len = m_Operator + 1; if (col_pos + copy_len >= m_dwLineBytes) { copy_len = m_dwLineBytes - col_pos; eol = TRUE; } if (copy_len >= m_SrcSize - m_SrcOffset) { copy_len = m_SrcSize - m_SrcOffset; m_bEOD = TRUE; } FXSYS_memcpy(m_pScanline + col_pos, m_pSrcBuf + m_SrcOffset, copy_len); col_pos += copy_len; UpdateOperator((uint8_t)copy_len); } else if (m_Operator > 128) { int fill = 0; if (m_SrcOffset - 1 < m_SrcSize - 1) { fill = m_pSrcBuf[m_SrcOffset]; } FX_DWORD duplicate_len = 257 - m_Operator; if (col_pos + duplicate_len >= m_dwLineBytes) { duplicate_len = m_dwLineBytes - col_pos; eol = TRUE; } FXSYS_memset(m_pScanline + col_pos, fill, duplicate_len); col_pos += duplicate_len; UpdateOperator((uint8_t)duplicate_len); } else { m_bEOD = TRUE; break; } } return m_pScanline; }
uint8_t* CCodec_RLScanlineDecoder::v_GetNextLine() { if (m_SrcOffset == 0) { GetNextOperator(); } else { if (m_bEOD) { return nullptr; } } FXSYS_memset(m_pScanline, 0, m_Pitch); uint32_t col_pos = 0; bool eol = false; while (m_SrcOffset < m_SrcSize && !eol) { if (m_Operator < 128) { uint32_t copy_len = m_Operator + 1; if (col_pos + copy_len >= m_dwLineBytes) { copy_len = m_dwLineBytes - col_pos; eol = true; } if (copy_len >= m_SrcSize - m_SrcOffset) { copy_len = m_SrcSize - m_SrcOffset; m_bEOD = true; } FXSYS_memcpy(m_pScanline + col_pos, m_pSrcBuf + m_SrcOffset, copy_len); col_pos += copy_len; UpdateOperator((uint8_t)copy_len); } else if (m_Operator > 128) { int fill = 0; if (m_SrcOffset - 1 < m_SrcSize - 1) { fill = m_pSrcBuf[m_SrcOffset]; } uint32_t duplicate_len = 257 - m_Operator; if (col_pos + duplicate_len >= m_dwLineBytes) { duplicate_len = m_dwLineBytes - col_pos; eol = true; } FXSYS_memset(m_pScanline + col_pos, fill, duplicate_len); col_pos += duplicate_len; UpdateOperator((uint8_t)duplicate_len); } else { m_bEOD = true; break; } } return m_pScanline; }