大学生
最后登录1970-1-1
在线时间 小时
注册时间2023-12-4
|
本帖最后由 微信用户-hQ3Q73 于 2024-10-4 08:51 编辑
在查看LTDC例程时,显示一个字符,计算偏移值offset,offset = 8 *((width + 7)/8) - width;感觉就是一个常数7啊,怎么会有变化呢?这句话怎么都看不懂。
还有导致下面的if语句: if(line & (1 << (width- j + offset- 1))) //根据每一行的像素值及偏移位置按照当前字体颜色进行绘点;也不能理解了。
求助大神,这句话怎么理解?
例程如下:
/**
* @brief 显示一个字符
* @param Xpos: 显示字符的行位置
* @param Ypos: 列起始位置
* @param c: 指向字体数据的指针
* @retval 无
*/
static void DrawChar(uint16_t Xpos, uint16_t Ypos, const uint8_t *c)
{
uint32_t i = 0, j = 0;
uint16_t height, width;
uint8_t offset;
uint8_t *pchar;
uint32_t line;
height = DrawProp[ActiveLayer].pFont->Height;//获取正在使用字体高度
width = DrawProp[ActiveLayer].pFont->Width; //获取正在使用字体宽度
offset = 8 *((width + 7)/8) - width ;//计算字符的每一行像素的偏移值,实际存储大小-字体宽度
for(i = 0; i < height; i++)//遍历字体高度绘点
{
pchar = ((uint8_t *)c + (width + 7)/8 * i);//计算字符的每一行像素的偏移地址
switch(((width + 7)/8))//根据字体宽度来提取不同字体的实际像素值
{
case 1:
line = pchar[0]; //提取字体宽度小于8的字符的像素值
break;
case 2:
line = (pchar[0]<< 8) | pchar[1]; //提取字体宽度大于8小于16的字符的像素值
break;
case 3:
default:
line = (pchar[0]<< 16) | (pchar[1]<< 8) | pchar[2]; //提取字体宽度大于16小于24的字符的像素值
break;
}
for (j = 0; j < width; j++)//遍历字体宽度绘点
{
if(line & (1 << (width- j + offset- 1))) //根据每一行的像素值及偏移位置按照当前字体颜色进行绘点
{
LCD_DrawPixel((Xpos + j), Ypos, DrawProp[ActiveLayer].TextColor);
}
else//如果这一行没有字体像素则按照背景颜色绘点
{
LCD_DrawPixel((Xpos + j), Ypos, DrawProp[ActiveLayer].BackColor);
}
}
Ypos++;
}
}
|
|