📄 rle.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 + -