sdrv_regioncopy.c
来自「MP3 整个 SDK」· C语言 代码 · 共 147 行
C
147 行
/*
********************************************************************************
* ACTOS
* ui dirver show picture
*
* (c) Copyright 2002-2003, Actions Co,Ld.
* All Right Reserved
*
* File : Sdrv_RegionCopy.c
* By : Rcmai
* Version: 1> v1.00 first version 10/17/2003 10:46PM
********************************************************************************
*/
#include "display.h"
#include "Drv_S6B33B0A.h"
#pragma memory=constseg(BBS_DW3)
#pragma memory=default
#pragma memory=dataseg(BBD_DW3)
#pragma memory=default
#pragma codeseg(BBC_DW3)
////*******************************************************************************/
///* void Sdrv_RegionCopy(region_t sregion, region_t tregion)
//** FUNCTION: Sdrv_RegionCopy
//**
//** Description: 把源区域的数据复制到目的区域
//** input
//** region_t *sregion: 指定源区域 ;
//** region_t *tregion: 指定目的区域
//**
//** output
//** none
//********************************************************************************/
void Sdrv_RegionCopy(region_t *sregion, region_t *tregion)
{
int block_pixel;//每一小块象素的个数
BYTE block_line; //每一小块的行数
int i;
//int height_cnt; //高度计数器
region_t sregionram;//临时使用
region_t tregionram;//临时使用
BYTE line_cnt;//行数计数器
BYTE sregiony_tmp;
BYTE tregiony_tmp;
//把源目区域数据放到临时区作运算
sregionram = *sregion;
tregionram = *tregion;
//下面强迫目标区域与源区域大小相同
tregionram.width = sregionram.width;
tregionram.height = sregionram.height;
if ( (sregionram.x + sregionram.width) > (region_win.x+region_win.width) //源区域横向是否超限
|| (sregionram.y + sregionram.height) > (region_win.y + region_win.height) //源区域纵向是否超限
|| (tregionram.x + sregionram.width) > (region_win.x+region_win.width) //目标区域横向是否超限(源与目宽度一样)
|| (tregionram.y + sregionram.height) > (region_win.y + region_win.height) ) //目标区域纵向是否超限(源与目宽度一样)
{
return; //超限返回
}
//把一个大的矩形分成N个小的矩形块,每个小矩形数据应能用一个page buf 传送完
// 这样可方便在源,目标间进行数据交换(不断换窗口)
block_line = DisplayBufLen/(2*(sregionram.width));
block_pixel = block_line * (sregionram.width);
line_cnt = sregionram.height;//保存高度值
sregionram.height = block_line;
tregionram.height = block_line;
if ((sregion->y) >= (tregion->y))
{
//源在目标的下面时,可从上面开始读数据(这样不会覆盖)
while (line_cnt > block_line)
{
//读出对应区域的图片内容放在暂存中
Hdrv_SetWindow(&sregionram);
Hdrv_GetBuffData (DisplayBuffer, block_pixel, NORTransMode_def);
//把暂时显存区的数据送到LCM
Hdrv_SetWindow(&tregionram);
Hdrv_BuffDataTrans(DisplayBuffer, block_pixel*2);
line_cnt -= block_line;
sregionram.y += block_line; //坐标增加
tregionram.y += block_line;
}
i = sregionram.width * line_cnt;//余下的象素个数
sregionram.height = line_cnt;
tregionram.height = line_cnt;
//读出余下不足一个块的区域内容
Hdrv_SetWindow(&sregionram);
Hdrv_GetBuffData(DisplayBuffer, i, NORTransMode_def);
//把暂时显存区的数据送到LCM
Hdrv_SetWindow(&tregionram);
Hdrv_BuffDataTrans(DisplayBuffer, i*2);
}
else
{
sregiony_tmp = sregionram.y;
tregiony_tmp = tregionram.y;
//源在目标的上面时,要从下面开始读数据(这样不会覆盖)
while (line_cnt > block_line)
{
//读出对应区域的图片内容放在暂存中
sregionram.y = sregiony_tmp + (line_cnt - block_line);//从下面开始读
tregionram.y = tregiony_tmp + (line_cnt - block_line);
Hdrv_SetWindow(&sregionram);
Hdrv_GetBuffData (DisplayBuffer, block_pixel, NORTransMode_def);
//把暂时显存区的数据送到LCM
Hdrv_SetWindow(&tregionram);
Hdrv_BuffDataTrans(DisplayBuffer, block_pixel*2);
line_cnt -= block_line;
}
i = sregionram.width * line_cnt;//余下的象素个数
sregionram.height = line_cnt;
tregionram.height = line_cnt;
sregionram.y = sregiony_tmp;
tregionram.y = tregiony_tmp;
//读出余下不足一个块的区域内容
Hdrv_SetWindow(&sregionram);
Hdrv_GetBuffData(DisplayBuffer, i, NORTransMode_def);
//把暂时显存区的数据送到LCM
Hdrv_SetWindow(&tregionram);
Hdrv_BuffDataTrans(DisplayBuffer, i*2);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?