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

📄 draw_layer_algorithm.c

📁 MSP430z_f247.rar
💻 C
字号:
/*****************************************************************
*   函数库名称:AVR硬件资源配置函数源文件                        *
*   版本:      v0.01                                            *
*   作者:      I ROBOT                                          *
*   创建日期:  Copyright (C) 2008年10月14日                     *
*----------------------------------------------------------------*
*   [支持库]                                                     *
*   支持库名称:Hardware_Apply_Init.h(AVR硬件资源配置头文件)     *
*   支持库版本:v0.01                                            *
*   支持库说明:与本文件相应的函数声明                           *
*----------------------------------------------------------------*
*   [版本更新]                                                   *
*   更新:      I ROBOT                                          *
*   更新日期:                                                    *
*   版本:                                                       *
*----------------------------------------------------------------*
*   [版本历史]                                                   *
*        v0.01  创建版本,配置AVR硬件资源                        *
*----------------------------------------------------------------*
*   [使用说明]                                                   *
*            1.配置使用的AVR硬件资源                             *
*****************************************************************/

/********************
* 头 文 件 配 置 区 *
********************/
# include "Draw_Layer_Algorithm.h"
/********************
*   系 统 宏 定 义  *
********************/

/*------------------*
*   常 数 宏 定 义  *
*------------------*/

/*------------------*
*   动 作 宏 定 义  *
*------------------*/
                                                             
/********************
*  模块结构体定义区 *
********************/

/********************
*   函 数 声 明 区  *
********************/
BOOL Creat_Draw(Draw_Info *Queue,UINT8 *ptr_Queue_Len,
Draw_Info *Draw);

BOOL Destory_Draw(Draw_Info *Queue,UINT8 chCur_ID_Draw,
UINT8 *ptr_Queue_Len);

void Switch_Draw(Draw_Info *Queue,UINT8 *ptr_Queue_Len,
UINT8 chCur_ID_Draw);

void ReDraw_Self(Draw_Info *Queue,UINT8 chCur_ID_Draw);

void Reset_Pre_Mask(Draw_Info *Queue,UINT8 chCur_ID_Draw);

void Move_ReDraw(Draw_Info *Queue,UINT8 chCur_ID_Draw,
INT16 wx_Offiset,INT16 wy_Offiset);

/********************
*   模块函数声明区  *
********************/

/********************
*   模块变量声明区  *
********************/

/********************
*   全局变量声明区  *
********************/

/******************************************************************
*                       函  数  定  义  区                        *
******************************************************************/

/****************************************
*  函数说明: 图层创建函数               *
*  输入    :Queue(图层队列)            *
*            ptr_Queue_Len(队列长度指针)*
*            Draw(新图层信息结构体)     *
*  输出    :无                         *
*  调用函数:                            *
****************************************/
BOOL Creat_Draw(Draw_Info *Queue,UINT8 *ptr_Queue_Len,
Draw_Info *Draw)
{
    if ((*ptr_Queue_Len) == 12)////////////////////////固定内存长度宏替换 
    {
        return FALSE;
        //内存不足,退出
    }
    else
    {
        UINT8 chCounter = 0;
        for (chCounter = (*ptr_Queue_Len);chCounter > ID_MOUSE;chCounter--)
        {
            Queue[chCounter] = Queue[chCounter-1];
            Queue[chCounter].ID_Draw = chCounter+1;
        }
        //移动更新队列
        Draw->ID_Draw = ID_ACTIVE;
        //修改图层ID号为激活层
        Queue[ID_ACTIVE-1]  = *Draw;
        //添加到队列中
        (*ptr_Queue_Len)++;
        //替换为新队列                   //新建窗口生成算法
        Reset_Pre_Mask(Queue,ID_MOUSE);   //恢复鼠标遮盖
        ReDraw_Self(Queue,ID_ACTIVE);     //绘制新建窗口
        Reset_Pre_Mask(Queue,ID_MOUSE);   //恢复鼠标遮盖
        ReDraw_Self(Queue,ID_MOUSE);      //重绘鼠标    
        return TRUE;
        //申请成功
    }
}

/****************************************
*  函数说明: 图层销毁函数               *
*  输入    :Queue(图层队列)            *
*            chCur_ID_Draw(当前图层的ID)*
*            ptr_Queue_Len(队列长度指针)*
*  输出    :无                         *
*  调用函数:                            *
****************************************/
BOOL Destory_Draw(Draw_Info *Queue,UINT8 chCur_ID_Draw,
UINT8 *ptr_Queue_Len)
{
    UINT8 chCounter = 0;
    if ((chCur_ID_Draw == ID_MOUSE) ||
     (chCur_ID_Draw == (*ptr_Queue_Len)))
     {
      //  return FALSE;
      //如果ID号是鼠标或者是桌面(桌面位于最底层)就返回FALSE
     }
    //扫描位于此图层上的所有图层,对于每个点找到第一个遮盖该点的图层A
    //将其从遮盖图层的chMask_Buffer中清除,并将自己的遮盖复制到A的遮盖中
    //如果没有图层遮盖该点,将其遮盖恢复
    {
        UINT8 chxPixel = 0,chyPixel = 0;
        UINT8 chScreen_x = 0,chScreen_y = 0;
        Draw_Info *Draw = &Queue[chCur_ID_Draw-1];
        for (chxPixel = 0;chxPixel < Draw->chx_Pixel;chxPixel++)
        {
            for (chyPixel = 0;chyPixel < Draw->chy_Pixel;chyPixel++)
            {
                chScreen_x = Draw->chCur_x+chxPixel;
                chScreen_y = Draw->chCur_y-chyPixel;
                //将局部点换算成屏幕上的点,并做越界处理
                if (chScreen_x <= 127 && chScreen_y <= 63)
                {   
                    Clear_Masked_Dot(Queue,chCur_ID_Draw,
                    chScreen_x,chScreen_y);
                }
            }
        }
    }
    for (chCounter = chCur_ID_Draw;
     chCounter < (*ptr_Queue_Len);chCounter++)
     {
        Queue[chCounter-1] = Queue[chCounter];
        Queue[chCounter-1].ID_Draw = chCounter;
     }
     (*ptr_Queue_Len)--;
     //切换成激活窗口,
     
     //销毁窗口
     //恢复遮盖
     return TRUE;
}

/****************************************
*  函数说明: 图层自身图形绘制函数       *
*  输入    :*Queue(图层队列)           *
*            chCur_ID_Draw(当前图层号)  *
*  输出    :无                         *
*  调用函数: DRAW_DOT()                *
*            CLEAR_DOT()                *
****************************************/
void ReDraw_Self(Draw_Info *Queue,UINT8 chCur_ID_Draw)
{
    UINT8 chScreen_x = 0,chScreen_y = 0;
    UINT8 chxPixel = 0,chyPixel = 0;
    Draw_Info *Draw = &Queue[chCur_ID_Draw-1];
    //获取当前图层的信息结构体
    for (chxPixel = 0;chxPixel < Draw->chx_Pixel;chxPixel++)
    {
        for (chyPixel = 0;chyPixel < Draw->chy_Pixel;chyPixel++)
        {
            chScreen_x = Draw->chCur_x+chxPixel;
            chScreen_y = Draw->chCur_y-chyPixel;
            //计算该点在此屏幕的位置 
            //越界(屏幕大小)过滤
            if (chScreen_x <= 127 && chScreen_y <= 63)
            {   
                UINT8 chRow = chyPixel >> 3;//chyPixel/8
                UINT8 chCol = chxPixel;
                UINT8 chBit = BIT(chyPixel&7);    // BIT(chyPixel%8);
                UINT8 chPosite = chRow*Draw->chx_Pixel+chCol;
                //如果是鼠标图形中点就不存储到chMask_Buffer中
                if (Dot_Is_Exist_12864(chScreen_x,chScreen_y))
                {
                    Draw->chMask_Buffer[chPosite] |= chBit;
                }
                else
                {
                    Draw->chMask_Buffer[chPosite] &= ~chBit;
                }
                //如果不是MOUSE,判断点是否是MOUSE的点,是就不存,不是就存
                //如果是MOUSE,直接存储
                //将将要被遮盖的图形存放到图层的遮盖缓存中去
                if (Draw->chSelf_Buffer[chPosite]&chBit)
                {
                    Draw_Dot(Queue,Draw->ID_Draw,chScreen_x,chScreen_y);

                }
                else if ((Draw->chAlpha_Buffer == NULL) || 
                (!(Draw->chAlpha_Buffer[chPosite]&chBit)))
                {
                    Clear_Dot(Queue,Draw->ID_Draw,chScreen_x,chScreen_y);
                }
                //如果不需要透明就清点,反之透明效果
                //存储过后绘制自身图形,并要考虑绘制的图形是否会被遮盖
            }
        }
    }
}
/****************************************
*  函数说明: 图层移动恢复遮盖图形      *
*  输入    :*Queue(图层队列)           *
*            chCur_ID_Draw(当前图层号)  *
*  输出    :无                         *
*  调用函数: DRAW_DOT()                *
*            CLEAR_DOT()                *
****************************************/
void Reset_Pre_Mask(Draw_Info *Queue,UINT8 chCur_ID_Draw)
{   
    UINT8 chScreen_x = 0,chScreen_y = 0;
    UINT8 chxPixel = 0,chyPixel = 0;
    Draw_Info *Draw = &Queue[chCur_ID_Draw-1];
    //获取当前图层的信息结构体
    for (chxPixel = 0;chxPixel < Draw->chx_Pixel;chxPixel++)
    {
        for (chyPixel = 0;chyPixel < Draw->chy_Pixel;chyPixel++)
        {
            chScreen_x = Draw->chPre_x+chxPixel;
            chScreen_y = Draw->chPre_y-chyPixel;
            //计算该点在此屏幕的位置 
            //越界(屏幕大小)过滤   
            if (chScreen_x <= 127 && chScreen_y <= 63)
            {
                UINT8 chRow = chyPixel >> 3;      
                UINT8 chCol = chxPixel;
                UINT8 chBit = BIT(chyPixel&7);    
                //计算点在遮盖缓存中的字节和位的位置  
                if (Draw->chMask_Buffer[(chRow*Draw->chx_Pixel+chCol)]
                &chBit)
                {
                   DRAW_DOT(chScreen_x,chScreen_y);
                }
                else
                {
                   CLEAR_DOT(chScreen_x,chScreen_y);
                }
                //直接在屏幕上绘制点
            }
        }
    }
}

/****************************************
*  函数说明: 图层切换函数              *
*  输入    :*Queue(图层队列)           *
*            ptr_Queue_Len(图层队列长度)*
*            chCur_ID_Draw(当前图层号)  *
*  输出    :无                         *
*  调用函数: Destory_Draw()            *
*            Creat_Draw()               *
****************************************/
void Switch_Draw(Draw_Info *Queue,UINT8 *ptr_Queue_Len,
UINT8 chCur_ID_Draw)
{
   Draw_Info Draw = Queue[chCur_ID_Draw-1]; 
   Destory_Draw(Queue,chCur_ID_Draw,ptr_Queue_Len);
   Creat_Draw(Queue,ptr_Queue_Len,&Draw); 
     
}

/****************************************
*  函数说明: 激活图层移动重绘函数      *
*  输入    :*Queue(图层队列)           *
*            chCur_ID_Draw(当前图层号)  *
*  输出    :无                         *
*  调用函数: Reset_Pre_Mask()          *
*            ReDraw_Self()              *
****************************************/
void Move_ReDraw(Draw_Info *Queue,UINT8 chCur_ID_Draw,
INT16 wx_Offiset,INT16 wy_Offiset)
{
    
    Draw_Info *Draw = &Queue[ID_MOUSE-1];
    INT16 wx_Temp = Draw->chCur_x+wx_Offiset;
    INT16 wy_Temp = Draw->chCur_y+wy_Offiset;
	if (wx_Temp < 0)
	{
	  	wx_Offiset -= wx_Temp;
	}
	else if (wx_Temp > 127)
	{
	  	wx_Offiset -= wx_Temp-127;
	}
	if (wy_Temp < 0)
	{
	  	wy_Offiset -= wy_Temp;
	}
	else if (wy_Temp > 63)
	{
	  	wy_Offiset -= wy_Temp-63;
	}
	/*
    if ((wx_Temp < 0 || wx_Temp > 127) 
    || (wy_Temp < 0 || wy_Temp > 63))
    {   
        //预算偏移后越界返回
        return ;
    }
	*/
    {
        UINT8 chCounter = 0;
        for (chCounter = chCur_ID_Draw;chCounter >= ID_MOUSE;
        chCounter--)
        {
            Draw = &Queue[chCounter-1];
            Draw->chCur_x += wx_Offiset;
            Draw->chCur_y += wy_Offiset;
            Reset_Pre_Mask(Queue,Draw->ID_Draw);
            ReDraw_Self(Queue,Draw->ID_Draw);
            Draw->chPre_x = Draw->chCur_x;
            Draw->chPre_y = Draw->chCur_y;
        }
    }
}

⌨️ 快捷键说明

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