⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rle.cpp

📁 大家好!这是一个网络游戏源码
💻 CPP
字号:
#include "runner.h"


LPWORD	GetRleDataFromSurfaceData(LPWORD pwSurfaceData , int w , int h , DWORD dwPitch , DWORD dwColorKey)
{
	
	DWORD  dwDataSize	= w * h;
	
	LPWORD pwRleData;GetMemory(pwRleData , WORD , dwDataSize + 4096); //预计的大小
	
	LPWORD pwCurSurData = pwSurfaceData;
	LPWORD pwCurRleData = pwRleData;
	
	//开始对整个表面进行扫描
	WORD	wValidColorCount   =  0;  //用于每行计数
	DWORD   dwValidColorAmount =  0;  //总计数		
	DWORD	dwRleByte		   =  0;  //当前rle数据位置 , 以字节为单位
	DWORD   dwLineStartByte    =  0;  //每行数据开始的位置记录
	WORD    wValidPieceCount   =  0;  //每行有效段计数
	DWORD	dwColorStartByte   =  0;  //颜色开始的位置记录
	WORD	wColorKey          =  (WORD)dwColorKey;
	
	short  left				=  w;  // 用来记录边界信息
	short  right			=  0;
	short  top				= -1;
	short  bottom			=  0;
	
	short  sx = 0 , first_x = 0 , count = 0;
	FILE *fp = fopen("test.txt" , "wt");

	
	dwRleByte+=sizeof(RLE_HEADER) / 2; 
	for(int y = 0 ; y < h ; y++)
	{
		LPWORD pwLineData = pwCurSurData;
	    count	= 0;
		*(pwCurRleData + dwRleByte) = 0;
		dwLineStartByte = dwRleByte;
		dwRleByte++;
		wValidColorCount = 0;
		wValidPieceCount = 0;
		for(int x = 0 ; x < w ; x++)
		{
			WORD color = *pwLineData;
			if(color!=wColorKey)
			{
				if(count==0) //有效颜色开始
				{
					if(x < left) left = x; 
					sx = x;
					*(pwCurRleData + dwRleByte) = x; //记住起点
					dwRleByte++;
					*(pwCurRleData + dwRleByte) = 0; //预留出来用来存储颜色个数
					dwColorStartByte     = dwRleByte;
					dwRleByte++;
					
					*(pwCurRleData + dwRleByte) = color;
					dwRleByte++;
					count                = 1;
				    if(wValidColorCount==0) first_x = x;
					fprintf(fp , "^");
					wValidColorCount++;
					wValidPieceCount++;
				}
			    else
				{
					*(pwCurRleData + dwRleByte) = color;
					dwRleByte++;  
					count++;
					fprintf(fp , "^");
				}
			}
			else
			{	
				if(count)
				{
					*(pwCurRleData + dwColorStartByte)   = count;
				    wValidColorCount+= (count - 1);
					if((sx + count) > right) right = sx + count;
					count                          = 0;
				}
			    fprintf(fp , "-");
			}
			pwLineData++;
		}
	    
	    if(count)
		{
			*(pwCurRleData + dwColorStartByte) = count;
		    wValidColorCount+=(count - 1);
			if( ( sx + count - 1) > right) right = sx + count - 1;
			count =	0;
		}
		
		if(wValidColorCount!=0) //记录最上和最下
		{
			if(top < 0 ) top = y;
		    bottom = y;
		}
		*(pwCurRleData + dwLineStartByte) = wValidColorCount + wValidPieceCount * 2;
        dwValidColorAmount+=wValidColorCount;
		fprintf(fp , "(%2d , %2d)\n" , first_x , wValidColorCount + wValidPieceCount * 2);
		pwCurSurData+=dwPitch;
	}

	fprintf(fp , "dwValidColorAmount = %d\n" , dwValidColorAmount);
	fclose(fp);
	
	RLE_HEADER RleHeader;
	RleHeader.dwSize	 = dwRleByte  * 2;
	RleHeader.wWidth	 = w;
	RleHeader.wHeight	 = h;
	RleHeader.wLeft		 = left;
	RleHeader.wRight	 = right;
	RleHeader.wTop		 = top;
	RleHeader.wBottom	 = bottom;
	RleHeader.dwColorKey = wColorKey;
	
	if(dwValidColorAmount==dwDataSize)	 RleHeader.bFlag = RLE_FLAG_FULL;
	if(dwValidColorAmount==0)			 RleHeader.bFlag = RLE_FLAG_NULL;
	
    memcpy(pwRleData , &RleHeader , sizeof(RLE_HEADER));
	
	LPWORD pwRleDataResult;GetMemory(pwRleDataResult , WORD , dwRleByte);
	memcpy(pwRleDataResult , pwRleData , dwRleByte * 2);
	FreeMemory(pwRleData);
	return pwRleDataResult;
}






VOID	GetSurfaceDataFromRleData(LPWORD pwSurfaceData , LPWORD pwRleData , DWORD dwPitch)
{
    RLE_HEADER RleHeader;
	GetRleHeader(pwRleData , &RleHeader);
	
	DWORD dwSize		= RleHeader.dwSize / 2; //以双字节为单位
    DWORD dwColorKey	= RleHeader.dwColorKey;
	WORD  wWidth		= RleHeader.wWidth;
	
	LPWORD	pwCurRleData = pwRleData + sizeof(RLE_HEADER) / 2;
	
	LPWORD  pwCurSurData = pwSurfaceData;
	
	DWORD	n = (sizeof(RLE_HEADER) / 2);
	WORD	wLineValid;
	WORD	wLineDataCount;
	WORD    wLineCount = 0;
	WORD    x , count;
	
	FILE *fp = fopen("test.txt" , "wt");
	
	while(n < dwSize)
	{
		wLineValid = *pwCurRleData;
		pwCurRleData++;
		fprintf(fp , "line <%d> : valid = %d  " , wLineCount , wLineValid);
		memset(pwCurSurData , dwColorKey , wWidth * 2);
		if(wLineValid) //该行有效
		{
		      wLineDataCount = 0;
		      while(1)   
			  { 
				//得到起点和个数
				x		= *pwCurRleData; pwCurRleData++; 
				count	= *pwCurRleData; pwCurRleData++;
				memcpy(pwCurSurData + x , pwCurRleData , count * 2);
				pwCurRleData+=count;
				wLineDataCount+=(count + 2);
				if(wLineDataCount==wLineValid) 
				{ 
				   fprintf(fp , "end at %d" , wLineDataCount); 
				   break; 
				}
			  }//行结束(end white(1))
		}
		n+=wLineValid;	n++;
		pwCurSurData+=dwPitch;
	    wLineCount++;
		fprintf(fp , "\n");
	}
	fclose(fp);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -