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