lkdGui icon indicating copy to clipboard operation
lkdGui copied to clipboard

GuiBitMap函数在更新全屏位图时不会刷新显示屏的最后一行和最后一列像素

Open waterZDK opened this issue 4 years ago • 5 comments

我在自己的240*128显示屏上使用时发现了这个问题,这个问题貌似是函数中的坐标检查语句引起的,我对其进行了一些修改解决了这个问题

调用方式:GuiBitMap((uint8_t *)welcome_bitmap_bits, 0, 0, 240, 128, 0);

GuiBitMap函数参数检查部分修改前:

/* 检查坐标最大,超过不显示 */
	if(x0 + xlen >= GUIXMAX){
		xlen = GUIXMAX - x0 - 1;
	}
	if(y0 + ylen >= GUIYMAX){
		ylen = GUIYMAX - y0 - 1;
	}

GuiBitMap函数参数检查部分修改后:

/* 检查坐标最大,超过不显示 */
	if(x0 + xlen > GUIXMAX){
		xlen = GUIXMAX - x0 - 1;
	}
	if(y0 + ylen > GUIYMAX){
		ylen = GUIYMAX - y0 - 1;
	}

waterZDK avatar Jul 09 '20 07:07 waterZDK

函数原型

void GuiAreaBitMap(lkdBitmap *bitMap,\
	lkdCoord x0, lkdCoord y0, lkdCoord endx, lkdCoord endy, uint8_t flag)

1.画指定范围位图的函数存在当显示与屏幕尺寸大小相同的位图时,会直接返回。

if(x0 >= GUIXMAX || y0 >= GUIYMAX || endx >= GUIXMAX || endy >= GUIYMAX ||\
		 x0 < 0 || y0 < 0 || endx < 0 || endy < 0 || endx == x0 || endy == y0 ||\
		 bitMap->beginx >= bitMap->wide || bitMap->beginy >= bitMap->high)
	{
		return;
	}

改为以下后显示正常:

 if(x0 > GUIXMAX || y0 > GUIYMAX || endx > GUIXMAX || endy > GUIYMAX ||\
		 x0 < 0 || y0 < 0 || endx < 0 || endy < 0 || endx == x0 || endy == y0 ||\
		 bitMap->beginx >= bitMap->wide || bitMap->beginy >= bitMap->high)
	{
		return;
	}

2.另外,使用该函数显示160*160的位图数据时,函数调用为: GuiAreaBitMap(bitMapBuf,0, 0, 160, 160, 0); 我觉得可以把该函数内部实现略微修改,使得调用方式改为 GuiAreaBitMap(bitMapBuf,0, 0, 159, 159, 0); 这样更好一些,起点、终点坐标的使用与其他画图函数的使用方式保持一致。

这两个问题好像可以归结为一个问题,第2个改后就不会有1的问题了。 第一次使用Github,感觉码的有点混乱。。

yougedainifei avatar Sep 19 '20 13:09 yougedainifei

wocao?我写错地方了吧。

yougedainifei avatar Sep 19 '20 13:09 yougedainifei

wocao?我写错地方了吧。

emmmmm,好像是的

waterZDK avatar Sep 19 '20 14:09 waterZDK

函数原型

void GuiAreaBitMap(lkdBitmap *bitMap,\
	lkdCoord x0, lkdCoord y0, lkdCoord endx, lkdCoord endy, uint8_t flag)

1.画指定范围位图的函数存在当显示与屏幕尺寸大小相同的位图时,会直接返回。

if(x0 >= GUIXMAX || y0 >= GUIYMAX || endx >= GUIXMAX || endy >= GUIYMAX ||\
		 x0 < 0 || y0 < 0 || endx < 0 || endy < 0 || endx == x0 || endy == y0 ||\
		 bitMap->beginx >= bitMap->wide || bitMap->beginy >= bitMap->high)
	{
		return;
	}

改为以下后显示正常:

 if(x0 > GUIXMAX || y0 > GUIYMAX || endx > GUIXMAX || endy > GUIYMAX ||\
		 x0 < 0 || y0 < 0 || endx < 0 || endy < 0 || endx == x0 || endy == y0 ||\
		 bitMap->beginx >= bitMap->wide || bitMap->beginy >= bitMap->high)
	{
		return;
	}

2.另外,使用该函数显示160*160的位图数据时,函数调用为: GuiAreaBitMap(bitMapBuf,0, 0, 160, 160, 0); 我觉得可以把该函数内部实现略微修改,使得调用方式改为 GuiAreaBitMap(bitMapBuf,0, 0, 159, 159, 0); 这样更好一些,起点、终点坐标的使用与其他画图函数的使用方式保持一致。

这两个问题好像可以归结为一个问题,第2个改后就不会有1的问题了。 第一次使用Github,感觉码的有点混乱。。

好像部分位图相关函数的边界检查是有点问题,我们这两个问题是一样的

waterZDK avatar Sep 19 '20 14:09 waterZDK

函数原型

void GuiAreaBitMap(lkdBitmap *bitMap,\
	lkdCoord x0, lkdCoord y0, lkdCoord endx, lkdCoord endy, uint8_t flag)

1.画指定范围位图的函数存在当显示与屏幕尺寸大小相同的位图时,会直接返回。

if(x0 >= GUIXMAX || y0 >= GUIYMAX || endx >= GUIXMAX || endy >= GUIYMAX ||\
		 x0 < 0 || y0 < 0 || endx < 0 || endy < 0 || endx == x0 || endy == y0 ||\
		 bitMap->beginx >= bitMap->wide || bitMap->beginy >= bitMap->high)
	{
		return;
	}

改为以下后显示正常:

 if(x0 > GUIXMAX || y0 > GUIYMAX || endx > GUIXMAX || endy > GUIYMAX ||\
		 x0 < 0 || y0 < 0 || endx < 0 || endy < 0 || endx == x0 || endy == y0 ||\
		 bitMap->beginx >= bitMap->wide || bitMap->beginy >= bitMap->high)
	{
		return;
	}

2.另外,使用该函数显示160*160的位图数据时,函数调用为: GuiAreaBitMap(bitMapBuf,0, 0, 160, 160, 0); 我觉得可以把该函数内部实现略微修改,使得调用方式改为 GuiAreaBitMap(bitMapBuf,0, 0, 159, 159, 0); 这样更好一些,起点、终点坐标的使用与其他画图函数的使用方式保持一致。 这两个问题好像可以归结为一个问题,第2个改后就不会有1的问题了。 第一次使用Github,感觉码的有点混乱。。

好像部分位图相关函数的边界检查是有点问题,我们这两个问题是一样的

对。整屏刷的时候才会有问题。

yougedainifei avatar Sep 19 '20 14:09 yougedainifei