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 + -
显示快捷键?