bool idZeroRunLengthCompressor::WriteByte( uint8 value ) { if( value != 0 || zeroCount >= 255 ) { if( !WriteRun() ) { maxSize = -1; return false; } } if( value != 0 ) { if( compressed + 1 > maxSize ) { maxSize = -1; return false; } if( comp != NULL ) { comp->WriteByte( value ); } else { *dest++ = value; } compressed++; } else { zeroCount++; } return true; }
int idZeroRunLengthCompressor::End() { WriteRun(); if ( maxSize == -1 ) { return -1; } return compressed; }
// Write a 32-bit TGA file. void Save32BitTGA( FileHandle_t fp, FileImage *pImage) { TGAFileHeader hdr; int y, runStart, x; unsigned char *pLine; memset(&hdr, 0, sizeof(hdr)); hdr.m_PixelDepth = 32; hdr.m_ImageType = 10; // Run-length encoded RGB. hdr.m_Width = pImage->m_Width; hdr.m_Height = pImage->m_Height; g_pFullFileSystem->Write(&hdr, sizeof(hdr), fp ); // Lines are written bottom-up. for(y=pImage->m_Height-1; y >= 0; y--) { pLine = &pImage->m_pData[y*pImage->m_Width*4]; runStart = 0; for(x=0; x < pImage->m_Width; x++) { if((x - runStart) >= 128 || *((long*)&pLine[runStart*4]) != *((long*)&pLine[x*4])) { // Encode this Run. WriteRun(&pLine[runStart*4], fp, x - runStart); runStart = x; } } // Encode the last Run. if(x - runStart > 0) { WriteRun(&pLine[runStart*4], fp, x - runStart); } } }