|
极具参考价值,腾出时间来我也研究下,我要解决的问题是把我下面的函数运行效率提高
//将矩形显存从源地址拷贝到目标地址,规定了起始地址、目标地址和矩形的面积:
//pFrom - 源显存首地址,即 (xFrom, yFrom) 为 (0, 0) 的位置
//xFrom - 源矩形左下角 X 轴坐标(基于像素)
//yFrom - 源矩形左下角 Y 轴坐标(基于像素)
//HeightFrom - 源显存行高度(该高度跟定位同行相邻字节有关)
//pTo - 目标显存首地址,即 (xTo, yTo) 为 (0, 0) 的位置
//xTo - 目标矩形左下角 X 轴坐标(基于像素)
//yTo - 目标矩形左下角 Y 轴坐标(基于像素)
//HeightTo - 目标显存行高度(该高度跟定位同行相邻字节有关)
//width - 矩形像素宽度
//height - 矩形像素高度
//
//目标: Y
// ...................................................................
// ...................................................................
// ...................................................................
// ...................................**********************..........
// ...................................**********************..........
// ...................................**********************..........
// ...................................**********************..........
// 0 ................................................................... X
// 0
//
//源: Y
// ...................................................................
// ...................................................................
// ...................................................................
// ...................................................................
// ...................................................................
// ...................................................................
// ...................................................................
// ...................................................................
// ...................................................................
// ..................**********************...........................
// ..................**********************...........................
// ..................**********************...........................
// ..................**********************...........................
// 0 ................................................................... X
// 0
//上面所示(单位:像素),将标有'*'的源矩形显存拷贝到目标矩形显存,则:
//xFrom - 18
//yFrom - 1
//HeightFrom - 14
//xTo - 35
//yTo - 1
//HeightTo - 8
//width - 22
//height - 4
////////////////////////////////////////////////////////////////////////////////
void CopyRectDisplayMemory(u8 *pFrom, u16 xFrom, u16 yFrom, u16 HeightFrom, u8* pTo, u16 xTo, u16 yTo, u16 HeightTo, u16 width, u16 height)
{
u8 *pRowHeadFrom, *pRowHeadTo; //指向源、目标矩形每一行点阵第1个字节的指针
u8 bitsLeftFrom, bitsRightFrom; //源矩形显存每个字节由左右两部分组成
u8 bitsLeftTo, bitsRightTo; //目标矩形显存每个字节由左右两部分组成
u8 byteFrom, byteBack; //源字节显存和目标字节备份显存
u16 i, j;
bitsLeftFrom = 8 - xFrom%8; //6,源矩形显存每个字节由左(侧字节低)6位和右(侧字节高)2位组成
bitsRightFrom = xFrom%8; //2
bitsLeftTo = 8 - xTo%8; //5,目标矩形显存每个字节由左(侧字节低)5位和右(侧字节高)3位组成
bitsRightTo = xTo%8; //3
for(i=0; i<height; i++) //height行
{
StaticScan();
pRowHeadFrom = pFrom;
pRowHeadFrom += (xFrom/8)*HeightFrom;
pRowHeadFrom += yFrom;
pRowHeadFrom += i; //每行源显存第一个(左6位所在)字节位置
pRowHeadTo = pTo;
pRowHeadTo += (xTo/8)*HeightTo;
pRowHeadTo += yTo;
pRowHeadTo += i; //每行目标显存第一个(左5位所在)字节位置
for(j=0; j<(width/8); j++) //先复制整8位列
{ //提取源字节数据(左6位+右2位 组成新的字节保存到 byteFrom)
byteFrom = (*pRowHeadFrom) << bitsRightFrom; //取左边字节的低6位
pRowHeadFrom += HeightFrom; //偏移到右边字节
byteFrom += (*pRowHeadFrom) >> bitsLeftFrom; //取右边字节的高2位
(*pRowHeadTo) &= (0xff << bitsLeftTo); //清掉目标字节低5位
(*pRowHeadTo) += (byteFrom >> bitsRightTo); //加上源字节高5位
pRowHeadTo += HeightTo; //偏移到右边字节
(*pRowHeadTo) &= (0xff >> bitsRightTo); //清掉目标字节高3位
(*pRowHeadTo) += (byteFrom << bitsLeftTo); //加上源字节低3位
}
if(width%8) //剩余不足8位需要复制
{
byteBack = (*pRowHeadTo) << bitsRightTo; //下面备份目标字节
byteBack += (*(pRowHeadTo + HeightTo)) >> bitsLeftTo;
byteBack &= (0xff >> (width%8)); //把要填充的目标位清掉
byteFrom = (*pRowHeadFrom) << bitsRightFrom; //取左边字节的低6位
pRowHeadFrom += HeightFrom; //偏移到右边字节
byteFrom += (*pRowHeadFrom) >> bitsLeftFrom; //取右边字节的高2位
byteFrom &= (0xff << (8 - width%8)); //只保留要复制的目标位
byteFrom += byteBack; //要复制的目标位+备份目标位 组成新字节,复制到目标字节
(*pRowHeadTo) &= (0xff << bitsLeftTo); //清掉目标字节低5位
(*pRowHeadTo) += (byteFrom >> bitsRightTo); //加上源字节高5位
pRowHeadTo += HeightTo; //偏移到右边字节
(*pRowHeadTo) &= (0xff >> bitsRightTo); //清掉目标字节高3位
(*pRowHeadTo) += (byteFrom << bitsLeftTo); //加上源字节低3位
}
}
} |
|