6.3 灰度矢量文字底色混合显示函数
带 Alpha 混合的灰度渲染
灰度矢量文字底色混合显示函数
GrayScale_DisplayChar 提供带 Alpha 混合的灰度矢量文字渲染功能。该函数将前景字模数据与背景图像数据按 Alpha 值进行混合,适合需要在 LCD 屏幕上渲染高质量文字的场合。
grayscale_display.c
#define DISMODE 0 // 1 刷RAM显示 0 打点显示
//描点函数
#if DISMODE
void LCD_WriteRAM(unsigned short RGB_Code)
#else //!DISMODE
static void Gui_DrawPoint(unsigned int x, unsigned int y, unsigned int color)
#endif //!DISMODE
#define GT_COLOR_GET_R(COLOR) (((COLOR) >> 11) & 0x1f)
#define GT_COLOR_GET_G(COLOR) (((COLOR) >> 5) & 0x3f)
#define GT_COLOR_GET_B(COLOR) (((COLOR)) & 0x1f)
#define GT_UDIV255(x) (((x) * 0x8081U) >> 0x17)
/**
* @brief 16位灰度颜色混合
* @param bg_color 背景色
* @param ft_color 字体颜色
* @param gray_scale 灰度值
* @return unsigned short
*/
static unsigned short gt_color_mix(unsigned short bg_color, unsigned short ft_color, unsigned char gray_scale)
{
unsigned short mix_color = 0, temp = 0;
//R
temp = GT_UDIV255(GT_COLOR_GET_R(ft_color) * gray_scale + GT_COLOR_GET_R(bg_color) * (0xff - gray_scale));
mix_color = (temp & 0x1f) << 11;
//G
temp = GT_UDIV255(GT_COLOR_GET_G(ft_color) * gray_scale + GT_COLOR_GET_G(bg_color) * (0xff - gray_scale));
mix_color = mix_color | ((temp & 0x3f) << 5);
//B
temp = GT_UDIV255(GT_COLOR_GET_B(ft_color) * gray_scale + GT_COLOR_GET_B(bg_color) * (0xff - gray_scale));
mix_color = mix_color | (temp & 0x1f);
return mix_color;
}
/**
* @brief 灰度矢量文字 底色混合 显示函数
* @param pdata 灰度文字数据
* @param x_y_w_h x,y 显示起始坐标; w 宽度, h 高度
* @param grade 灰度阶级[1阶/2阶/3阶/4阶]
* @param bg_color 背景颜色
* @param ft_color 字体颜色
*/
void display_gray_vector_font(unsigned char *pdata, unsigned short x, unsigned short y, unsigned short w, unsigned short h,
unsigned char grade, unsigned short bg_color, unsigned short ft_color)
{
unsigned short w_byte = (w + 7) >> 3;
unsigned short x_s = x, idx = 0, i = 0, j = 0;
unsigned short mix_color = 0;
unsigned char gray_data = 0, gray_scale = 0;
w = w_byte << 3;
#if DISMODE
LCD_Set_Window(x, y, w, h); //设置窗口
LCD_WriteRAM_Prepare(); //开始写入GRAM
#endif //!DISMODE
if (2 == grade || 4 == grade)
{
for (i = 0; i < h * w_byte * grade; i++)
{
gray_data = pdata[idx++];//取一个字节灰度数据
for (j = 0; j < (8 / grade); j++) {
gray_scale = (gray_data >> (8 - grade)) * (0xFF / ((1 << grade) - 1)); //获取该点灰阶值
gray_data <<= grade;
if (gray_scale == 0)
else if (0xff == gray_scale) else
#if DISMODE //显示
//写RAM的方式16位数据
LCD_WriteRAM(mix_color);
#else //!DISMODE
if (x < x_s + w) else
#endif //!DISMODE
}
}
}
else if (3 == grade) {
for (i = 0; i < h * w_byte; i++)
{
gray_data = pdata[idx];//取一个字节灰度数据
for (j = 0; j < 8; j++) {
if (2 == j) {//计算灰阶值
gray_data = (pdata[idx] & 0x03) << 1;
idx++;
gray_scale = (gray_data | (pdata[idx] >> 7)) * (0xFF / ((1 << 3) - 1)); //(前字节后两位 | 后字节前1位) * 每份比例
gray_data = pdata[idx] << 1;
}
else if (5 == j) {
gray_data = (pdata[idx] & 0x01) << 2;
idx++;
gray_scale = (gray_data | (pdata[idx] >> 6)) * (0xFF / ((1 << 3) - 1));//(前字节后1位 | 后字节前2位) * 每份比例
gray_data = pdata[idx] << 2;
} else
if (gray_scale == 0)
else if (0xfc == gray_scale) else
#if DISMODE //显示
//写RAM的方式16位数据
LCD_WriteRAM(mix_color);
#else //!DISMODE
if (x < x_s + w) else
#endif //!DISMODE
}
idx++;
}
} else {
for (i = 0; i < h * w_byte; i++)
{
gray_data = pdata[idx++];//取一个字节灰度数据
for (j = 0; j < 8; j++)
else
gray_data <<= 1;
#if DISMODE //显示
//写RAM的方式16位数据
LCD_WriteRAM(mix_color);
#else //!DISMODE
if (x < x_s + w) else
#endif //!DISMODE
}
}
}
}

