通用点阵显示代码

通用点阵显示代码

前几天,工作上需要在 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) &param);

DrawPoint<12, 12>(pBuffer, _DrawPoint, (unsigned long) &param);

DrawPoint<16, 16>(pBuffer, _DrawPoint, (unsigned long) &param);

DrawPoint<24, 24>(pBuffer, _DrawPoint, (unsigned long) &param);

DrawPoint<32, 32>(pBuffer, _DrawPoint, (unsigned long) &param);

DrawPoint<64, 64>(pBuffer, _DrawPoint, (unsigned long) &param);

 

除了以上几种字体大小,DrawPoint也支持非标准字体大小,只要提供的pBuffer是正确的,也可以把DrawPoint非模板函数,

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值