前几天,工作上需要在 YUV 图像上显示中英文混显的点阵,在网上一阵搜索,结果很不理想。后来,自己花时间考虑了一下,其实就是个点阵匹配的问题,完全可以写成通用的代码(网上要么是16X16,要么是24X24,12X12还没找到,有的还分中文和英文)。
以下便是个人完成的较为通用的点阵显示代码,也许叫点阵匹配更贴切一些,它完全和具体的绘图环境(GDI, DOS)无关,
// pTxt, 为点阵的 Buffer,
// funCallBack, 为回调函数,
// lUserData, 为传回给回调函数的参数,
template <size_t nTxtWidth, size_t nTxtHeight, class FunDrawPoint>
void DrawPoint(char *pTxt, FunDrawPoint funCallBack, unsigned long lUserData)
{
char cFlag = 0;
size_t nLineBytes = ((nTxtWidth >> 3) + ((nTxtWidth % 0x08) != 0));
if (pTxt == NULL) {
return;
}
for (long i = 0; i < nTxtHeight; ++i) {
for (long j = 0; j < nLineBytes; ++j) {
cFlag = pTxt[i * nLineBytes + j];
if (cFlag == 0) {
continue;
}
for (long k = 0; k < 8; ++k) {
if (cFlag & 0x01) {
funCallBack(j * 8 + 7 - k, i, lUserData);
}
cFlag >>= 1;
if (cFlag == 0) {
break;
}
}
}
}
}
使用方法如下:
// 上下文件环境参数(这里以GDI的环境为例)
struct Param
{
HDC hDC;
long x; // 目标图上的 X 坐标
long y; // 目标图上的 Y 坐标
};
// 回调函数
void _DrawPoint(long x, long y, unsigned long lUserData)
{
Param *pParam = (Param *) lUserData;
SetPixel(pParam->hDC, pParam->x + x, pParam->y + y, RGB(0, 0, 0));
}
// pBuffer, 为从点阵文件读出的字的 Buffer,
// _DrawPoint, 为回调函数,
// param, 为上下文环境,
DrawPoint<8, 8>(pBuffer, _DrawPoint, (unsigned long) ¶m);
DrawPoint<12, 12>(pBuffer, _DrawPoint, (unsigned long) ¶m);
DrawPoint<16, 16>(pBuffer, _DrawPoint, (unsigned long) ¶m);
DrawPoint<24, 24>(pBuffer, _DrawPoint, (unsigned long) ¶m);
DrawPoint<32, 32>(pBuffer, _DrawPoint, (unsigned long) ¶m);
DrawPoint<64, 64>(pBuffer, _DrawPoint, (unsigned long) ¶m);
除了以上几种字体大小,DrawPoint也支持非标准字体大小,只要提供的pBuffer是正确的,也可以把DrawPoint非模板函数,