239 lines
8.4 KiB
C
239 lines
8.4 KiB
C
#ifndef __UI_EFFECT_H__
|
||
#define __UI_EFFECT_H__
|
||
|
||
|
||
#include "generic/typedef.h"
|
||
|
||
|
||
//注意!!!当有两个页面的时候,也就是滑屏的时候
|
||
//1.一个页面需要做特效,另外一个不需要特效,那么
|
||
//只需要配置做特效的那个页面的(effect_mode + copy)
|
||
//2.两个页面都需要做特效,那么两个页面配置的
|
||
//copy方式必须一致,但effect_mode可以不同
|
||
//3.如果两个页面都不需要做特效,effect_mode = 0,
|
||
//那么会默认以EFFECT_COPY_SPLIC方式拼接成一张大图
|
||
|
||
|
||
|
||
|
||
#define EFFECT_COPY_SIGLE 2//单独存放页面,滑屏的时候有两个页面单独存放
|
||
#define EFFECT_COPY_SPLIC 1//拼接成一个页面,不滑屏的时候只有一个页面
|
||
|
||
//effect_mode:高8位是effect_mode,低8位是进行特效前需要
|
||
//将合成的页面拼接成一张大图还是单独存放
|
||
//新加的特效宏要按顺序加1 !!!
|
||
#define EFFECT_MODE_NONE (u16)(0)
|
||
#define EFFECT_MODE_SCA (u16)((1 << 8) | EFFECT_COPY_SIGLE)//屏幕的宽和高都小于或者等于240时才可使用
|
||
#define EFFECT_MODE_USER0 (u16)((2 << 8) | EFFECT_COPY_SPLIC)
|
||
#define EFFECT_MODE_USER1 (u16)((3 << 8) | EFFECT_COPY_SIGLE)
|
||
#define EFFECT_MODE_FLIP_SCA_ALPHA (u16)((4 << 8) | EFFECT_COPY_SIGLE)
|
||
#define EFFECT_MODE_3D (u16)((5 << 8) | EFFECT_COPY_SIGLE)
|
||
#define EFFECT_MODE_SCA_ALPHA (u16)((6 << 8) | EFFECT_COPY_SIGLE)
|
||
#define EFFECT_MODE_REDRAW_PART (u16)((7 << 8) | EFFECT_COPY_SIGLE)
|
||
#define EFFECT_MODE_AUTO_SCA_WITH_BG (u16)((8 << 8) | EFFECT_COPY_SIGLE)//页面间子菜单缩放切换
|
||
#define EFFECT_MODE_GET_FRAME (u16)((9 << 8) | EFFECT_COPY_SIGLE)
|
||
#define EFFECT_MODE_AUTO_SCA_WITH_FRAME (u16)((10 << 8) | EFFECT_COPY_SIGLE)//同一个页面的布局层子菜单缩放切换
|
||
#define EFFECT_MODE_AUTO_PASS (u16)((11 << 8) | EFFECT_COPY_SIGLE)//子菜单滑动过渡切换效果
|
||
#define EFFECT_MODE_DRAWER (u16)((12 << 8) | EFFECT_COPY_SIGLE)//抽屉效果
|
||
#define EFFECT_MODE_AUTO_BIG_SCA (u16)((13 << 8) | EFFECT_COPY_SIGLE)//页面间缩放从2.0到1.0特效
|
||
#define EFFECT_MODE_PAGE_MOVE (u16)((14 << 8) | EFFECT_COPY_SIGLE)//page_move
|
||
|
||
|
||
|
||
#define EFFECT_MODE_MAX (u16)14
|
||
|
||
//注意!!!这里高8要随着最大值加1而动态改变
|
||
#define EFFECT_MODE_LIMIT (u16)(((EFFECT_MODE_MAX + 1) << 8) | EFFECT_COPY_SPLIC)
|
||
enum EFFECT_MASK {
|
||
EFFECT_MASK_NONE,
|
||
EFFECT_MASK_CIRCULAR_BORDER, //圆屏边框裁剪
|
||
EFFECT_MASK_ROUNDED_BORDER, //方屏边框裁剪
|
||
} ;
|
||
|
||
|
||
|
||
struct effect_ctrl {
|
||
// u8 copy_to_psram;//EFFECT_COPY_SIGLE / EFFECT_COPY_SPLIC
|
||
u8 *splicing_buf; //拼接buf
|
||
u8 *psbuf[2]; //单独buf
|
||
|
||
u8 *sca_obuf; //硬件缩放的输出buf,内部缩放特效使用
|
||
u8 *cache_buf[2]; //内部特效使用
|
||
|
||
int not_refresh;//特效处理完之后,是否推屏,置一表示不推屏
|
||
|
||
//由特效处理函数赋值,有特效时必须在特效处理函数里面赋值
|
||
//1.滑屏的时候,如果ps_obuf = splicing_buf,表示特效处理完
|
||
//之后还是放到原来的空间(对于那种不需要随着滑动而改变的特
|
||
//效,只做一次就可以不断来回滑动),否则就是新的一块空间(该
|
||
//空间只有一个页面大小)
|
||
//2.不滑屏的时候,该值由特效本身决定
|
||
u8 *ps_obuf;
|
||
int mix;
|
||
};
|
||
|
||
struct effect_part {
|
||
int group;
|
||
u8 *bg_addr;
|
||
};
|
||
|
||
//用户自定义回调原型
|
||
//ctrl:特效控制结构体 详细看结构体说明
|
||
//cur_head:当前需要做特效的页面结构体(struct imb_task_head)
|
||
//other_head:另外一个页面结构体,另外页面不一定需要做特效
|
||
typedef void *(*effect_cb)(struct effect_ctrl *ctrl, void *cur_head, void *other_head);
|
||
|
||
|
||
//EFFECT_MODE_SCA
|
||
//1.取值范围0.3~1
|
||
//2.可以不传该参数,内部使用1
|
||
//3.参数要静态或者全局变量
|
||
struct effect_ratio {
|
||
float ratio_w;
|
||
float ratio_h;
|
||
};
|
||
|
||
|
||
//EFFECT_MODE_SCA_ALPHA & EFFECT_MODE_FLIP_SCA_ALPHA
|
||
//1.当作为EFFECT_MODE_FLIP_SCA_ALPHA模式的参数时,表示起始
|
||
//的值 start_alpha,start_scale
|
||
//2.可以不传该参数,内部使用默认的值(sca = 0.7, alpha = 64)
|
||
//3.flip_all_en : 滑动时是否两页都做特效
|
||
//4.mask_mode :EFFECT_MASK,只对EFFECT_MODE_AUTO_SCA_WITH_BG/EFFECT_MODE_GET_FRAME生效,增加时间开销
|
||
//5.mask_priv : mask_mode == EFFECT_MASK_ROUNDED_BORDER 时,为方屏圆角半径
|
||
//6.参数要静态或者全局变量
|
||
struct effect_sca_alpha {
|
||
float sca;
|
||
int alpha;
|
||
int flip_all_en;
|
||
int cnt; // >=2 <=5
|
||
int wait_te;
|
||
int mask_mode;
|
||
int mask_priv;
|
||
};
|
||
|
||
//EFFECT_MODE_3D
|
||
//1.focal取值100~1000,值越小变化越明显
|
||
//2.可以不传该参数,内部使用默认的值(focal = 500)
|
||
//3.参数要静态或者全局变量
|
||
struct effect_3d {
|
||
int focal;
|
||
};
|
||
|
||
//EFFECT_MODE_REDRAW_PART
|
||
//1.只合成第一部分的那一次存放的地址,内部使用
|
||
//2.表示第一部分是否只合成一次,置一就只合成一次,然后做第一部分的特效时使用合成的那次作为输入
|
||
//3.reflesh表示做完该特效后是否刷新显示
|
||
//4.part1_effect_mode:该特效第一部分的特效模式
|
||
//5.part1_effect_priv:该特效第一部分的特效参数
|
||
//6.part1:第一部分的分组,分组是ui_core_set_group()函数分的组,只针对全屏布局
|
||
//7.patr2:第二部分的分组,分组是ui_core_set_group()函数分的组,只针对全屏布局
|
||
//8.参数要静态或者全局变量
|
||
struct effect_redraw_part {
|
||
u8 *part1_kick_buf;
|
||
u8 part1_one_kick;
|
||
u8 reflesh;
|
||
|
||
u16 part1_effect_mode;
|
||
void *part1_effect_priv;
|
||
struct effect_part part1;
|
||
struct effect_part part2;
|
||
};
|
||
|
||
//子菜单滑动过渡切换效果
|
||
struct effect_auto_pass {
|
||
int direction;//0:左到右 1:右到左
|
||
int pl;//0:页面间切换 1:布局间切换
|
||
};
|
||
|
||
//子菜单滑动过渡切换效果
|
||
//从2.0缩放到1.0,带alpha会慢很多
|
||
struct effect_auto_big_sca {
|
||
int has_alpha;//是否带alpha
|
||
int pl;//0:页面间切换 1:布局间切换
|
||
int cnt;//0:使用默认,其他:cnt > 2,次数越多越慢
|
||
};
|
||
|
||
|
||
//抽屉效果参数
|
||
struct drawer_item {
|
||
struct list_head entry;
|
||
int index;
|
||
int page_id;
|
||
struct rect ccoor;
|
||
u8 *org_img;
|
||
float sca;
|
||
void *sca_info;
|
||
};
|
||
|
||
struct drawer_ctl {
|
||
int init;
|
||
struct list_head head;
|
||
struct drawer_item *first_ditem; //显示出来的item中的第一个
|
||
struct drawer_item *cur_item;
|
||
int status;
|
||
|
||
u8 *buf[3];
|
||
u8 buf_busy;
|
||
u8 has_new_item;
|
||
|
||
int max_cy_limit;
|
||
int min_cy_limit;
|
||
float ratio;
|
||
};
|
||
|
||
|
||
struct page_move_ctl {
|
||
int l_left;
|
||
int r_left;
|
||
};
|
||
|
||
|
||
|
||
|
||
//页面设置特效的唯一入口,在页面的图层或者全局的布局初始化的时候(ON_CHANGE_INIT)可以调用,如果id为-1,则可以在滑屏之前调用:
|
||
//id:单个页面的id,如果为-1,则表示设置页面间滑动的特效
|
||
//effect_mode:某个页面需要的特效,宏定义在ui_effect.h里面
|
||
//user_effect:用户自定义特效处理的回调函数,可以为空,如果有值,库里面
|
||
//会优先使用这个函数去处理该页面的特效,一般配对EFFECT_MODE_USER 0~N 使用
|
||
//effect_priv:特效的私有值,可以为空,库里面会传递给特效处理函数
|
||
//或者自定义特效回调函数
|
||
int ui_window_effect(int id, u16 effect_mode, void *user_effect, void *effect_priv);
|
||
|
||
|
||
//做特效时,可以控制页面停止刷新
|
||
void ui_window_stop_redraw(int stop_redraw);
|
||
|
||
|
||
/**
|
||
* @brief ui_page_set_auto_sw_effect 使能页面跳转使用特效,只有psram版本能使用
|
||
*
|
||
* @param en 1:使能子菜单页面自动跳转特效 0:不使能
|
||
*/
|
||
void ui_page_set_auto_sw_effect(int en);
|
||
|
||
/**
|
||
* @brief ui_page_get_auto_sw_effect 获取页面跳转特效使能状态
|
||
*
|
||
* @return 页面跳转使能状态
|
||
*/
|
||
int ui_page_get_auto_sw_effect();
|
||
|
||
/**
|
||
* @brief ui_page_auto_sw_effect 页面跳转使用特效
|
||
* 注意:该函数只能在ui任务里面使用,因为里面调用了ui_core_redraw, ui_core_show等相关的ui立即刷新页面的函数
|
||
*
|
||
* @param curr_win:页面ID或者layout ID(必须是全屏的布局),必须和next_win类型保持一致
|
||
* @param next_win:页面ID或者layout ID(必须是全屏的布局),必须和curr_win类型保持一致
|
||
* @param effect_mode:页面跳转的特效模式
|
||
* @param user_effect:用户自定义页面跳转的特效处理的回调函数,可以为空
|
||
* @param effect_priv:特效的私有值,可以为空,传递给特效处理函数
|
||
*
|
||
* @return -1:页面切换失败 0:页面切换成功
|
||
*/
|
||
int ui_page_auto_sw_effect(int curr_win, int next_win, u16 effect_mode, void *user_effect, void *effect_priv);
|
||
|
||
|
||
#endif
|
||
|