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;
}
Beispiel #3
0
// 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);
		}
	}
}