Hi @ccc_clive ,
感谢您提出的问题,抱歉我回复迟了。
您提到的这个问题更像是一个系统的问题,我没办法一一确定,但是我查看了您提供的源码,发现了几个问题点,可能需要注意:
1. _Malloc()中存在一个逻辑错误:
if (NumBytes > sizeof(_pxp_buffer))
{
_pBuffer = NULL;
}
_pBuffer = _pxp_buffer;
这里应当写为如下逻辑:
static void *_Malloc(U32 NumBytes)
{
#if USE_PXP_BUFFER
if (NumBytes > sizeof(_pxp_buffer))
{
_pBuffer = NULL;
return NULL;
}
_pBuffer = _pxp_buffer;
#else
...
#endif
return _pBuffer;
}
2. block size 配成 8x8,但 _PXP_CheckSizes() 却按 16x16 做补偿,需要统一;
3. GUI_DRAW_BMP8888 进入了错误的 PXP 输入路径
_LCD_PXP_SetAlphaSurface((void *)p, BytesPerLine, xSize, ySize, kPXP_AsPixelFormatARGB8888);
_LCD_PXP_AlphaBlending()->Mode = BLEND_MODE_NORMAL;
pCtx->pProcessSurface = pPS = &_PXP_aBuffer[BUFFER_TYPE_PROCESS_SURFACE];
*pPS = *pCtx->pOutputBuffer;
pPS->Format.Ps = kPXP_PsPixelFormatRGB565;
_LCD_PXP_DrawBitmap(pCtx);
需要确认 GUI_DRAW_BMP8888 是3Bpp还是4Bpp。
如果是 3Bpp:它更像 packed RGB888,不能直接喂给 PXP 的 PS/AS RGB888 输入。
正确做法是:先用 CPU 展开成 4Bpp(ARGB8888 或 unpacked RGB888),再喂给 PXP。
如果是 4Bpp:那它可能适合走 kPXP_PsPixelFormatRGB888 或 kPXP_AsPixelFormatARGB8888 之类 32-bit slot 路径。
另外,需要考虑把“带 alpha”和“不带 alpha”的 32bpp 图彻底分流
带透明 → 走 AS / ARGB8888
不带透明 → 优先考虑走 PS
Best regards,
Gavin